/*

 * 	loopedSlider 0.5.6 - jQuery plugin

 *	written by Nathan Searles	

 *	http://nathansearles.com/loopedslider/

 *

 *	Copyright (c) 2009 Nathan Searles (http://nathansearles.com/)

 *	Dual licensed under the MIT (MIT-LICENSE.txt)

 *	and GPL (GPL-LICENSE.txt) licenses.

 *

 *	Built for jQuery library

 *	http://jquery.com

 *	Compatible with jQuery 1.3.2+

 *

 */



/*

 *	markup example for $("#loopedSlider").loopedSlider();

 *

 *	<div id="loopedSlider">	

 *		<div class="container">

 *			<div class="slides">

 *				<div><img src="01.jpg" alt="" /></div>

 *				<div><img src="02.jpg" alt="" /></div>

 *				<div><img src="03.jpg" alt="" /></div>

 *				<div><img src="04.jpg" alt="" /></div>

 *			</div>

 *		</div>

 *		<a href="#" class="previous">previous</a>

 *		<a href="#" class="next">next</a>	

 *	</div>

 *

*/



if(typeof jQuery != 'undefined') {

	jQuery(function($) {

		$.fn.extend({

			loopedSlider: function(options) {

				var settings = $.extend({}, $.fn.loopedSlider.defaults, options);

			

				return this.each(

					function() {

					if($.fn.jquery < '1.3.2') {return;}

					var $t = $(this);

					var o = $.metadata ? $.extend({}, settings, $t.metadata()) : settings;

					

					var distance = 0;

					var times = 1;

					var slides = $(o.slides,$t).children().size();

					var width = $(o.slides,$t).children().outerWidth();

					var position = 0;

					var active = false;

					var number = 0;

					var interval = 0;

					var restart = 0;

					var pagination = $("."+o.pagination+" li a",$t);



					if(o.addPagination && !$(pagination).length){

						var buttons = slides;

						$($t).append("<ul class="+o.pagination+">");

						$(o.slides,$t).children().each(function(){

							if (number<buttons) {

								$("."+o.pagination,$t).append("<li><a rel="+(number+1)+" href=\"#\" >"+(number+1)+"</a></li>");

								number = number+1;

							} else {

								number = 0;

								return false;

							}

							$("."+o.pagination+" li a:eq(0)",$t).parent().addClass("active");

						});

						pagination = $("."+o.pagination+" li a",$t);

					} else {

						$(pagination,$t).each(function(){

							number=number+1;

							$(this).attr("rel",number);

							$(pagination.eq(0),$t).parent().addClass("active");

						});

					}



					if (slides===1) {

						$(o.slides,$t).children().css({position:"absolute",left:position,display:"block"});

						return;

					}



					$(o.slides,$t).css({width:(slides*width)});



					$(o.slides,$t).children().each(function(){

						$(this).css({position:"absolute",left:position,display:"block"});

						position=position+width;

					});



					$(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:-width});



					if (slides>3) {

						$(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:-width});

					}



					if(o.autoHeight){autoHeight(times);}



					$(".next",$t).click(function(){

						if(active===false) {

							animate("next",true);

							if(o.autoStart){

								if (o.restart) {autoStart();}

								else {clearInterval(sliderIntervalID);}

							}

						} return false;

					});



					$(".previous",$t).click(function(){

						if(active===false) {	

							animate("prev",true);

							if(o.autoStart){

								if (o.restart) {autoStart();}

								else {clearInterval(sliderIntervalID);}

							}

						} return false;

					});



					if (o.containerClick) {

						$(o.container,$t).click(function(){

							if(active===false) {

								animate("next",true);

								if(o.autoStart){

									if (o.restart) {autoStart();}

									else {clearInterval(sliderIntervalID);}

								}

							} return false;

						});

					}



					$(pagination,$t).click(function(){

						if ($(this).parent().hasClass("active")) {return false;}

						else {

							times = $(this).attr("rel");

							$(pagination,$t).parent().siblings().removeClass("active");

							$(this).parent().addClass("active");

							animate("fade",times);

							if(o.autoStart){

								if (o.restart) {autoStart();}

								else {clearInterval(sliderIntervalID);}

							}

						} return false;

					});



					if (o.autoStart) {

						sliderIntervalID = setInterval(function(){

							if(active===false) {animate("next",true);}

						},/*o.autoStart*/5000);

						function autoStart() {

							if (o.restart) {

							clearInterval(sliderIntervalID,interval);

							clearTimeout(restart);

								restart = setTimeout(function() {

									interval = setInterval(	function(){

										animate("next",true);

									},o.autoStart);

								},o.restart);

							} else {

								sliderIntervalID = setInterval(function(){

									if(active===false) {animate("next",true);}

								},o.autoStart);

							}

						};

					}



					function current(times) {

						if(times===slides+1){times = 1;}

						if(times===0){times = slides;}

						$(pagination,$t).parent().siblings().removeClass("active");

						$(pagination+"[rel='" + (times) + "']",$t).parent().addClass("active");

					};



					function autoHeight(times) {

						if(times===slides+1){times=1;}

						if(times===0){times=slides;}	

						var getHeight = $(o.slides,$t).children(":eq("+(times-1)+")",$t).outerHeight();

						$(o.container,$t).animate({height: getHeight},o.autoHeight);					

					};		



					function animate(dir,clicked){	

						active = true;	

						switch(dir){

							case "next":

								times = times+1;

								distance = (-(times*width-width));

								current(times);

								if(o.autoHeight){autoHeight(times);}

								if(slides<3){

									if (times===3){$(o.slides,$t).children(":eq(0)").css({left:(slides*width)});}

									if (times===2){$(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:width});}

								}

								$(o.slides,$t).animate({left: distance}, o.slidespeed,function(){

									if (times===slides+1) {

										times = 1;

										$(o.slides,$t).css({left:0},function(){$(o.slides,$t).animate({left:distance})});							

										$(o.slides,$t).children(":eq(0)").css({left:0});

										$(o.slides,$t).children(":eq("+(slides-1)+")").css({ position:"absolute",left:-width});				

									}

									if (times===slides) $(o.slides,$t).children(":eq(0)").css({left:(slides*width)});

									if (times===slides-1) $(o.slides,$t).children(":eq("+(slides-1)+")").css({left:(slides*width-width)});

									active = false;

								});					

								break; 

							case "prev":

								times = times-1;

								distance = (-(times*width-width));

								current(times);

								if(o.autoHeight){autoHeight(times);}

								if (slides<3){

									if(times===0){$(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:(-width)});}

									if(times===1){$(o.slides,$t).children(":eq(0)").css({position:"absolute",left:0});}

								}

								$(o.slides,$t).animate({left: distance}, o.slidespeed,function(){

									if (times===0) {

										times = slides;

										$(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:(slides*width-width)});

										$(o.slides,$t).css({left: -(slides*width-width)});

										$(o.slides,$t).children(":eq(0)").css({left:(slides*width)});

									}

									if (times===2 ) $(o.slides,$t).children(":eq(0)").css({position:"absolute",left:0});

									if (times===1) $(o.slides,$t).children(":eq("+ (slides-1) +")").css({position:"absolute",left:-width});

									active = false;

								});

								break;

							case "fade":

								times = [times]*1;

								distance = (-(times*width-width));

								current(times);

								if(o.autoHeight){autoHeight(times);}

								$(o.slides,$t).children().fadeOut(o.fadespeed, function(){

									$(o.slides,$t).css({left: distance});

									$(o.slides,$t).children(":eq("+(slides-1)+")").css({left:slides*width-width});

									$(o.slides,$t).children(":eq(0)").css({left:0});

									if(times===slides){$(o.slides,$t).children(":eq(0)").css({left:(slides*width)});}

									if(times===1){$(o.slides,$t).children(":eq("+(slides-1)+")").css({ position:"absolute",left:-width});}

									$(o.slides,$t).children().fadeIn(o.fadespeed);

									active = false;

								});

								break; 

							default:

								break;

							}					

						};

					}

				);

			}

		});

		$.fn.loopedSlider.defaults = {

			container: ".container", //Class/id of main container. You can use "#container" for an id.

			slides: ".slides", //Class/id of slide container. You can use "#slides" for an id.

			pagination: "pagination", //Class name of parent ul for numbered links. Don't add a "." here.

			containerClick: false, //Click slider to goto next slide? true/false

			autoStart: 0, //Set to positive number for true. This number will be the time between transitions.

			restart: 0, //Set to positive number for true. Sets time until autoStart is restarted.

			slidespeed: 300, //Speed of slide animation, 1000 = 1second.

			fadespeed: 200, //Speed of fade animation, 1000 = 1second.

			autoHeight: 0, //Set to positive number for true. This number will be the speed of the animation.

			addPagination: false //Add pagination links based on content? true/false

		};

	});

}
