

(function($){

	$.fn.mbSlider = function(settings){
		
		//defaults
		var defaults = {
			autoplay: true,
			showControls: { 
				next: false, 
				prev: false, 
				play: false, 
				pause: false, 
				first: false, 
				last: false 
			},
			playPauseButtonSeperate: false,
			controlsText: {
				next: "Next",
				prev: "Previous",
				play: "Play",
				pause: "Pause",
				first: "First",
				last: "Last"
			},
			controlsLocation: "external",
			slideDuration: 5000,
			slideSpeed: 800,
			backToStart: true,
			backToStartSpeed: 200,
			backToEnd: true,
			backToEndSpeed: 200,
			startSlide: 1,
			pagination: false,
			paginationLocation: "external",
			pauseOnHover: true,
			orientation: "horizontal",
			continuous: true,
			easing: "easeOutQuad"
		};
 
		//load settings (taking into account user defined setting)
		var settings = $.extend(defaults, settings);
		
 		//core
		return this.each(function(){
			
			$(this).addClass("mbSlider"); //do this first to calculate how many sliders there are going to be.
			$(this).find("ul:first").addClass("mbSlider_Slides") //do this so can use UL inside Slider
			$(this).find("ul:first > li").addClass("mbSlider_Slide") //do this so can use LI inside Slider
			
			//variables
			var numOfSlides = $(this).find("li.mbSlider_Slide").length;
			var slideWidth = $(this).find("li.mbSlider_Slide").width();
			var slideHeight = $(this).find("li.mbSlider_Slide").height();
			var clickable = true;
			var currentSlide = settings.startSlide;
			var status;
			var timer;
			var pausedByHover;
			var obj = this //for use inside functions
			var numOfSliders = $(".mbSlider").length;
			
			//functions
			function movenext(){
				if(currentSlide == numOfSlides){
					if(settings.backToStart){
						if(settings.continuous){
							if(clickable){
								clickable = false
								if(settings.orientation=="horizontal"){
									$(obj).find("ul.mbSlider_Slides").css("width", (numOfSlides*slideWidth)+slideWidth+"px")
									$(obj).find("li.mbSlider_Slide:first").clone().appendTo( $(obj).find("ul.mbSlider_Slides") )
									$(obj).find("ul.mbSlider_Slides").animate({ marginLeft: 0 - (( (numOfSlides+1) * slideWidth) - slideWidth) },
									{
										duration: settings.slideSpeed,
										easing: settings.easing,
										complete: function(){
											$(obj).find("ul.mbSlider_Slides").css("margin-left","0px")
											$(obj).find("li.mbSlider_Slide:last").remove()
											$(obj).find("ul.mbSlider_Slides").css("width", numOfSlides*slideWidth)
											clickable = true
											currentSlide = 1
											paginationCurrentSlide()
										}
									})	
								}
								if(settings.orientation=="vertical"){
									$(obj).find("ul.mbSlider_Slides").css("height", (numOfSlides*slideHeight)+slideHeight+"px")
									$(obj).find("li.mbSlider_Slide:first").clone().appendTo( $(obj).find("ul.mbSlider_Slides") )
									$(obj).find("ul.mbSlider_Slides").animate({ marginTop: 0 - (( (numOfSlides+1) * slideHeight) - slideHeight) },
									{
										duration: settings.slideSpeed,
										easing: settings.easing,
										complete: function(){
											$(obj).find("ul.mbSlider_Slides").css("margin-top","0px")
											$(obj).find("li.mbSlider_Slide:last").remove()
											$(obj).find("ul.mbSlider_Slides").css("height", numOfSlides*slideHeight)
											clickable = true
											currentSlide = 1
											paginationCurrentSlide()
										}
									})	
								}
							}
						}
						else{
							goto(1);
						}
					}
				}
				else {
					animate(1);
				}
			}
			
			function moveprev(){
				if(currentSlide == 1){
					if(settings.backToEnd){
						if(settings.continuous){
							if(clickable){
								clickable = false
								if(settings.orientation=="horizontal"){
									$(obj).find("ul.mbSlider_Slides").css("width", (numOfSlides*slideWidth)+slideWidth+"px")
									$(obj).find("li.mbSlider_Slide:last").clone().prependTo( $(obj).find("ul.mbSlider_Slides") )
									$(obj).find("ul.mbSlider_Slides").css("margin-left","-200px" )
									$(obj).find("ul.mbSlider_Slides").animate({ marginLeft: 0 },
									{
										duration: settings.slideSpeed,
										easing: settings.easing,
										complete: function(){
											$(obj).find("li.mbSlider_Slide:first").remove()
											$(obj).find("ul.mbSlider_Slides").css("margin-left",0 - ((numOfSlides*slideWidth)-slideWidth) )
											clickable = true
											currentSlide = numOfSlides
											paginationCurrentSlide()
										}
									})
								}
								if(settings.orientation=="vertical"){
									$(obj).find("ul.mbSlider_Slides").css("height", (numOfSlides*slideHeight)+slideHeight+"px")
									$(obj).find("li.mbSlider_Slide:last").clone().prependTo( $(obj).find("ul.mbSlider_Slides") )
									$(obj).find("ul.mbSlider_Slides").css("margin-top","-200px" )
									$(obj).find("ul.mbSlider_Slides").animate({  marginTop: 0 },
									{
										duration: settings.slideSpeed,
										easing: settings.easing,
										complete: function(){
											$(obj).find("li.mbSlider_Slide:first").remove()
											$(obj).find("ul.mbSlider_Slides").css("margin-top",0 - ((numOfSlides*slideHeight)-slideHeight) )
											clickable = true
											currentSlide = numOfSlides
											paginationCurrentSlide()
										}
									})
								}
							}
						}
						else{
							goto(numOfSlides);
						}
					}
				}
				else {
					animate(-1);
				}
			}
			
			
			function pause(){
					clearTimeout(timer)
					status = 0
			}
			
			function play(){
				movenext()
				status = 1
				timer = setTimeout( function(){ play() }, settings.slideDuration )
			}
			
			function goto(slide){
				if(clickable){
					clickable = false
					if(settings.orientation=="horizontal"){
						$(obj).find("ul.mbSlider_Slides").animate({ 
							marginLeft: 0 - ((slide * slideWidth) - slideWidth) },
							{
								duration: settings.slideSpeed,
								easing: settings.easing,
								complete: function(){
									clickable = true
									currentSlide = slide
									paginationCurrentSlide()
								}
							})
					}
					if(settings.orientation=="vertical"){
							$(obj).find("ul.mbSlider_Slides").animate({ marginTop: 0 - ((slide * slideHeight) - slideHeight) },
							{
								duration: settings.slideSpeed,
								easing: settings.easing,
								complete: function(){
									clickable = true
									currentSlide = slide
									paginationCurrentSlide()
								}
							})
					}
				}
			}


			function animate(direction){
				if(clickable){
					clickable = false
					if(settings.orientation=="horizontal"){
						if(direction==1){
							$(obj).find("ul.mbSlider_Slides").animate({ marginLeft: 0 - (currentSlide * slideWidth) },
							{
								duration: settings.slideSpeed,
								easing: settings.easing,
								complete: function(){
									clickable = true
									currentSlide++
									paginationCurrentSlide()
								}
							})
						}
						if(direction==-1){
							currentSlide--
							$(obj).find("ul.mbSlider_Slides").animate({ marginLeft: 0 - ((currentSlide * slideWidth) - slideWidth) },
							{
								duration: settings.slideSpeed,
								easing: settings.easing,
								complete: function(){
									clickable = true
									paginationCurrentSlide()
								}
							})
						}
					}
					if(settings.orientation=="vertical"){
						if(direction==1){
							$(obj).find("ul.mbSlider_Slides").animate({ marginTop: 0 - (currentSlide * slideHeight) },
							{
								duration: settings.slideSpeed,
								easing: settings.easing,
								complete: function(){
									clickable = true
									currentSlide++
									paginationCurrentSlide()
								}
							})
						}
						if(direction==-1){
							currentSlide--
							$(obj).find("ul.mbSlider_Slides").animate({ marginTop: 0 - ((currentSlide * slideHeight) - slideHeight) },
							{
								duration: settings.slideSpeed,
								easing: settings.easing,
								complete: function(){
									clickable = true;
									paginationCurrentSlide()
								}
							})
						}
					}
				}
			}
			
			function paginationCurrentSlide(){
				if(settings.pagination){
					$("._current-slide").removeClass("_current-slide")
					$("#"+$(obj).attr("id")+"_pagination").find("a:contains('"+currentSlide+"')").addClass("_current-slide")
				}
			}
			
			//INIT
			//init controls structure
			if(settings.showControls){
				var controlsStructure = "<div id='"+$(this).attr("id")+"_controls'>";
				switch(true){
					case settings.showControls.next:
				    controlsStructure += "<a href='javascript:void(0);' id='"+$(this).attr("id")+"_movenext'>"+settings.controlsText.next+"</a>";
					case settings.showControls.prev:
						controlsStructure += "<a href='javascript:void(0);' id='"+$(this).attr("id")+"_moveprev'>"+settings.controlsText.prev+"</a>";
					case settings.showControls.play:
						controlsStructure += "<a href='javascript:void(0);' id='"+$(this).attr("id")+"_play'>"+settings.controlsText.play+"</a>";
					case settings.showControls.pause:
						controlsStructure += "<a href='javascript:void(0);' id='"+$(this).attr("id")+"_pause'>"+settings.controlsText.pause+"</a>";
					case settings.showControls.first:
						controlsStructure += "<a href='javascript:void(0);' id='"+$(this).attr("id")+"_movefirst'>"+settings.controlsText.first+"</a>";
					case settings.showControls.last:
						controlsStructure += "<a href='javascript:void(0);' id='"+$(this).attr("id")+"_movelast'>"+settings.controlsText.last+"</a>";
				}
				controlsStructure += "</div>";
				
				if(settings.controlsLocation=="external"){
					$(this).after(controlsStructure);
				}
				if(settings.controlsLocation=="internal"){
					$(this).append(controlsStructure)
				}
				
				$("#"+$(this).attr("id")+"_movenext").click(function(){ movenext() });
				$("#"+$(this).attr("id")+"_moveprev").click(function(){ moveprev() });
				$("#"+$(this).attr("id")+"_play").click(function(){
					if(status != 1){
						play();
					}
				})
				$("#"+$(this).attr("id")+"_pause").click(function(){
					if(status != 0){
						pause();
					}				
				})
				$("#"+$(this).attr("id")+"_movefirst").click(function(){ goto(1) });
				$("#"+$(this).attr("id")+"_movelast").click(function(){ goto(numOfSlides) });
				
				if(!settings.playPauseButtonSeperate){
					$("#"+$(this).attr("id")+"_play,#"+$(this).attr("id")+"_pause").wrapAll("<div id='temp'></div>");
					$("#temp").replaceWith("<a id='"+$(this).attr("id")+"_playpause' href='javascript:void(0);'></a>");
				
					$("#"+$(this).attr("id")+"_playpause").click(function(){ 
						if( status == 1 ){
							pause();
							$(this).html(settings.controlsText.play).removeClass("playing").addClass("paused");
						}
						else {
							setTimeout( function(){ play(); }, settings.slideDuration );
							$(this).html(settings.controlsText.pause).removeClass("paused").addClass("playing");
						}
					});
				}
			}
			
			//init user defineable control classes
			$("."+$(this).attr("id")+"_movenext").click(function(){ movenext() });
			$("."+$(this).attr("id")+"_moveprev").click(function(){ moveprev() });
			$("."+$(this).attr("id")+"_play").click(function(){ 
				if(status != 1){
					play();
				}
			})
			$("."+$(this).attr("id")+"_pause").click(function(){ 
				if(status != 0){
					pause();
				}
			})
			$("."+$(this).attr("id")+"_movefirst").click(function(){ goto(1) });
			$("."+$(this).attr("id")+"_movelast").click(function(){ goto(numOfSlides) });	
			$("[class*='"+$(this).attr("id")+"_gotoSlide']").click(function(){
				var classes = $(this).attr("class").split(" ")
				for(var i=0; i<=classes.length-1; i++){
					if(classes[i].search($(this).attr("id")+"_gotoSlide")>0){
						var gotoslide = classes[i].substring(classes[i].indexOf("[")+1,classes[i].indexOf("]")); 
					}
				}
				goto(gotoslide);
			})

			
			//init pagination
			if(settings.pagination){
				paginationStructure = "<div id='"+$(this).attr("id")+"_pagination'>";
				for(var i=1; i<=numOfSlides; i++){
					if(i==settings.startSlide){
						paginationStructure += "<a href='javascript:void(0);' class='_current-slide'>"+i+"</a>";
					}
					else {
						paginationStructure += "<a href='javascript:void(0);'>"+i+"</a>";
					}
				}
				paginationStructure += "</div>";
				
				if(settings.paginationLocation=="external"){
					$(this).after(paginationStructure);
				}
				if(settings.paginationLocation=="internal"){
					$(this).append(paginationStructure)
				}

				$("#"+$(this).attr("id")+"_pagination a").click(function(){ goto( $(this).html() ) })
			}
			
			//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 ){
				$("#"+$(this).attr("id")+"_playpause").html(settings.controlsText.pause).addClass("playing");
			}
			else {
				$("#"+$(this).attr("id")+"_playpause").html(settings.controlsText.play).addClass("paused");
			}
			
			//init onhover pause (if enabled)
			if(settings.pauseOnHover){
					$(this).find("li.mbSlider_Slide").hover(function(){
						if( status == 1 ){
							pause();
							pausedByHover = 1;
						}
					},function(){
						if( pausedByHover == 1 ){
							setTimeout( function(){ play(); }, settings.slideDuration );
							pausedByHover = 0;
						}
					});
			}
						
			//set up styling
			$(this).find("ul.mbSlider_Slides").css({
				"list-style":"none",
				"margin-left":"0px",
				"padding-left":"0px",
				"float":"left"
			});
			
			if(settings.orientation == "vertical"){
				$(this).find("ul.mbSlider_Slides").css("height", numOfSlides * slideHeight + "px");
				//init slide to start on
				$(this).find("ul.mbSlider_Slides").css("margin-top",0 - ((currentSlide * slideHeight) - slideHeight));
			}
			
			if(settings.orientation == "horizontal"){
				$(this).find("ul.mbSlider_Slides").css("width", numOfSlides * slideWidth + "px");
				//init slide to start on
				$(this).find("ul.mbSlider_Slides").css("margin-left",0 - ((currentSlide * slideWidth) - slideWidth));
			}
			
			$(this).css({
				"overflow":"hidden",
				"height": slideHeight + "px",
				"width": slideWidth + "px",
				"position": "relative"
				
			});
		
		});
	}
	
 })(jQuery);
