
(function($){

	$.fn.mbSlider = function(settings){
		
		//defaults
		var defaults = {
			autoplay: true,
			showControls: { 
				next: true, 
				prev: true, 
				play: true, 
				pause: true, 
				first: true, 
				last: true 
			},
			playPauseButtonSeperate: false,
			controlsText: {
				next: "Next",
				prev: "Previous",
				play: "Play",
				pause: "Pause",
				first: "First",
				last: "Last"
			},
			slideDuration: 5000,
			slideSpeed: 800,
			backToStart: true,
			backToStartSpeed: 200,
			backToEnd: true,
			backToEndSpeed: 200,
			startSlide: 1,
			pagination: true,
			pauseOnHover: true,
			
		};
 
		//load settings (taking into account user defined setting)
		var settings = $.extend(defaults, settings);
		
 		//core
		this.each(function(){
			
			//variables
			var numOfSlides = $(".mbSlider li").length
			var slideWidth = $(".mbSlider li").width()
			var clickable = true
			var currentSlide = settings.startSlide
			var status;
			var timer;
			var pausedByHover;
			
			//actions
			function movenext(){
				if(currentSlide == numOfSlides){
					if(settings.backToStart) movefirst();
				}
				else {
					animate(1);
				}
			}
			
			function moveprev(){
				if(currentSlide == 1){
					if(settings.backToEnd) movelast();
				}
				else {
					animate(-1);
				}
			}
			
			function movefirst(){
				clickable = false
				$(".mbSlider ul").animate({ marginLeft: 0 },settings.backToStartSpeed,function(){
					clickable = true
					currentSlide = 1
				})
			}
			
			function movelast(){
				clickable = false
				$(".mbSlider ul").animate({ 
					marginLeft: slideWidth - (numOfSlides * slideWidth) 
				},settings.backToStartSpeed,function(){
					clickable = true
					currentSlide = numOfSlides
				})
			}
			
			function pause(){
					clearTimeout(timer)
					status = 0
			}
			
			function play(){
				movenext()
				status = 1
				timer = setTimeout( function(){ play() }, settings.slideDuration )
			}
			
			function goto(slide){
				clickable = false
				$(".mbSlider ul").animate({ 
					marginLeft: 0 - ((slide * slideWidth) - slideWidth)
				},settings.slideSpeed,function(){
					clickable = true
					currentSlide = slide
				})
			}
			
			function animate(direction){
				if(clickable){
					clickable = false
					if(direction==1){
						$(".mbSlider ul").animate({
							marginLeft: 0 - (currentSlide * slideWidth) 
						},settings.slideSpeed,function(){
							clickable = true
							currentSlide++
						})
					}
					
					if(direction==-1){
						currentSlide--
						$(".mbSlider ul").animate({
							marginLeft: 0 - ((currentSlide * slideWidth) - slideWidth)
						},settings.slideSpeed,function(){
							clickable = true
							//currentSlide--
						})
					}	
				}
			}
			
			//INIT
			
			//init controls structure
			if(settings.showControls){
				var controlsStructure = "<div id='_mbSlider_controls'>"
				switch(true){
					case settings.showControls.next:
				    controlsStructure += "<a href='javascript:void(0);' id='_mbSlider_movenext'>"+settings.controlsText.next+"</a>";
					case settings.showControls.prev:
						controlsStructure += "<a href='javascript:void(0);' id='_mbSlider_moveprev'>"+settings.controlsText.prev+"</a>";
					case settings.showControls.play:
						controlsStructure += "<a href='javascript:void(0);' id='_mbSlider_play'>"+settings.controlsText.play+"</a>";
					case settings.showControls.pause:
						controlsStructure += "<a href='javascript:void(0);' id='_mbSlider_pause'>"+settings.controlsText.pause+"</a>";
					case settings.showControls.first:
						controlsStructure += "<a href='javascript:void(0);' id='_mbSlider_movefirst'>"+settings.controlsText.first+"</a>";
					case settings.showControls.last:
						controlsStructure += "<a href='javascript:void(0);' id='_mbSlider_movelast'>"+settings.controlsText.last+"</a>";
				}
				controlsStructure += "</div>"
				$(this).append(controlsStructure)
				$("#_mbSlider_movenext").click(function(){ movenext() })
				$("#_mbSlider_moveprev").click(function(){ moveprev() })
				$("#_mbSlider_play").click(function(){
					if(status != 1){
						play()
					}
				})
				$("#_mbSlider_pause").click(function(){
					if(status != 0){
						pause()
					}				
				})
				$("#_mbSlider_movefirst").click(function(){ movefirst() })
				$("#_mbSlider_movelast").click(function(){ movelast() })
				
				if(!settings.playPauseButtonSeperate){
					$("#_mbSlider_play,#_mbSlider_pause").wrapAll("<div id='temp'></div>")
					$("#temp").replaceWith("<a id='_mbslider_playpause' href='javascript:void(0);'></a>")
				
				$("#_mbslider_playpause").click(function(){ 
					if( status == 1 ){
						pause()
						$(this).html(settings.controlsText.play).removeClass("playing").addClass("paused")
					}
					else {
						play()
						$(this).html(settings.controlsText.pause).removeClass("paused").addClass("playing")
					}
				})
				
				}
			}
			
			//init pagination
			if(settings.pagination){
				paginationStructure = "<div id='_mb_slider_pagination'>"
				for(var i=1; i<=numOfSlides; i++){
					paginationStructure += "<a href='javascript:void(0);'>"+i+"</a>"
				}
				paginationStructure += "</div>"
				$(this).append(paginationStructure)
				$("#_mb_slider_pagination a").click(function(){ goto( $(this).html() ) })
			}
			
			//init slide to start on
			$(".mbSlider ul").css("margin-left",0 - ((currentSlide * slideWidth) - slideWidth))
			
			//init autoplay
			if(settings.autoplay){
				setTimeout( function(){ play(); }, settings.slideDuration )
				status = 1
			}
			else {
				status = 0	
			}
			
			//init play/pause button (if not using seperate play / pause buttons
			if( status == 1 ){
				$("#_mbslider_playpause").html(settings.controlsText.pause).addClass("playing")
			}
			else {
				$("#_mbslider_playpause").html(settings.controlsText.play).addClass("paused")
			}
			
			//init onhover pause (if enabled)
			if(settings.pauseOnHover){
					$(this).find("li").hover(function(){
						if( status == 1 ){
							pause()
							pausedByHover = 1
						}
					},function(){
						if( pausedByHover == 1 ){
								play()
								pausedByHover = 0
						}
					})
			}
			
			//init user defineable control classes
			$("._mbSlider_movenext").click(function(){ movenext() })
			$("._mbSlider_moveprev").click(function(){ moveprev() })
			$("._mbSlider_play").click(function(){ 
				if(status != 1){
					play()
				}
			})
			$("._mbSlider_pause").click(function(){ 
				if(status != 0){
					pause()
				}
			})
			$("._mbSlider_movefirst").click(function(){ movefirst() })
			$("._mbSlider_movelast").click(function(){ movelast() })	
			$("[class*='_mbSlider_slide']").click(function(){
				var y = $(this).attr("class").substring($(this).attr("class").lastIndexOf("_mbSlider_slide")+16,$(this).attr("class").indexOf("]"))
				goto(y) 
			})
		});
		
		
		
		//return object for chaining
		return this;
	}
		
		
 })(jQuery);

