(function($){
    $.ohslideshow = function(el, options){

        var base = this;
        
        base.$el = $(el);
        base.el = el;
        
        base.$slides = $(".ohslides", base.el);
        
        base.$el.data("ohslideshow", base);
        
        base.init = function(){
            base.options = $.extend({},$.ohslideshow.defaultOptions, options);
            base.size = parseInt($("li", base.$slides).size());            
            base.generateType();
        };
        
        base.generateType = function(){
        	var html = "<ol class=\"ohslidenav\">";
        	
        	switch(base.options.navType){
        		default:
        		case("buttons"):
        			for(var i=0;i<base.size;i++){
        				var text = (typeof base.options.navText[i] == "string") ? base.options.navText[i] : (i+1) + "";
        				html += "<li><a href=\"#\">" + text + "</a></li>";
        			}
        		break;
        		case("prevnext"):
        			html += "<li class=\"ohPrev\"><a href=\"#\">Previous</a></li>";
        			html += "<li class=\"ohNext\"><a href=\"#\">Next</a></li>";
        		break;
        	}
        	html += "</ol>"
        	
        	base.$el.append(html);
        	
        	base.bindEvents();
        }
        
        base.setInterval = function(){
        	
	    	 if(base.options.autoRotate) {
	    	 	clearInterval(base.rotateInterval);
	        	 base.rotateInterval = setInterval(function(){
	        	 	base.showSlide(++base.currentSlide);
	        	 }, base.options.timeout)	
	    	 } 
	    	 
        }
        
        base.bindEvents = function(){
        	 
        	 base.currentSlide = base.options.startingSlide;
        	 base.showSlide(base.currentSlide);
        	 
        	 base.setInterval();
        	
        	switch(base.options.navType){
        		default:
        		case("buttons"):
		        	//Nav buttons
		        	switch(base.options.transitionEvent){
		        		default:
		        		case("click"):
			        	$(".ohslidenav li", base.el).bind("click", function(e){
			        		e.preventDefault();
			        		var index = $(this).index();
			        		base.showSlide(++index, "mouseover");
			        	});
		        		break;
		        		case("hover"):
			        	$(".ohslidenav li", base.el).bind("mouseover", function(e){
			        		var index = $(this).index();
			        		base.showSlide(++index, "mouseover");
			        	});
		        		break;
		    		}
        		break;
        		case("prevnext"):
		        	switch(base.options.transitionEvent){
		        		default:
		        		case("click"):
			        	$(".ohslidenav .ohPrev", base.el).bind("click", function(e){
			        		e.preventDefault();
			        		base.showSlide(--base.currentSlide, "click");
			        	});
			        	$(".ohslidenav .ohNext", base.el).bind("click", function(e){
			        		e.preventDefault();
			        		base.showSlide(++base.currentSlide, "click");
			        	});
		        		break;
		        		case("hover"):
			        	$(".ohslidenav .ohPrev", base.el).bind("mouseover", function(e){
			        		e.preventDefault();
			        		base.showSlide(--base.currentSlide, "mouseover");
			        	});
			        	$(".ohslidenav .ohNext", base.el).bind("mouseover", function(e){
			        		e.preventDefault();
			        		base.showSlide(++base.currentSlide, "mouseover");
			        	});
		        		break;
		    		}
        		break;
    		}

        }
        
        base.showSlide = function(id, trigger){
        	
        	if(trigger && base.options.clearOnEvent){
        		clearInterval(base.rotateInterval);
        	}
        	
        	if(trigger && !base.options.clearOnEvent){
        		base.setInterval();
        	}
        	
        	if(trigger && (id == base.currentSlide) && base.options.navType != "prevnext"){
        		return false;
        	}
        	
        	base.currentSlide = id;
        	
        	if(base.currentSlide <= 0) base.currentSlide = base.size;
        	if(base.currentSlide > base.size) base.currentSlide = 1;
        	
        	if(base.options.navType != "prevnext"){
        		$(".ohslidenav li").removeClass(base.options.activeClass);
        		$(".ohslidenav li:nth-child("+base.currentSlide+")", base.el).addClass(base.options.activeClass);
        	}
        	
        	switch(base.options.transition){
        		case("fade"):
    			$("li", base.$slides).hide();
    			$("li:nth-child("+base.currentSlide+")", base.$slides).stop(true, true).fadeIn(350);
        		break;
        		case("slide"):
        		var w = $("li", base.$slides).width();
        		marginLeft = (base.currentSlide-1) * -w;
        		base.$slides.stop(true, true).animate({marginLeft : marginLeft}, 350);
        		break;
        	}
        	
        }

        // Run initializer
        base.init();
    };
    
    $.ohslideshow.defaultOptions = {
        timeout: 5000, //The time between slides rotating
        clearOnEvent : true, //Will the rotation stop when a button is clicked/hovered?
        transitionEvent : "click", //click, hover, etc
        transition : "fade", //fade, slide, etc
        navType : "buttons", //buttons, prevnext, etc
        navText : [], //An indexed array of html you can put into buttons
        autoRotate : true, //Does the rotate autostart
        startingSlide : 1,
        activeClass : "active"
    };
    
    $.fn.ohslideshow = function(options){
        return this.each(function(){
            (new $.ohslideshow(this, options));
        });
    };
    
})(jQuery);

