/*

 * 	loopedSlider 0.5.7 - jQuery plugin

 *	written by Nathan Searles	

 *	http://nathansearles.com/loopedslider/

 *

 *	Copyright (c) 2010 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 $j("#loopedSlider").loopedSlider();

 *

 *	<div id="loopedSlider">	

 *		<div class="container">

 *			<div class="slides">

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

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

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

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

 *			</div>

 *		</div>

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

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

 *	</div>

 *

*/



if(typeof jQuery != 'undefined') {

	jQuery(function($j) {

		$j.fn.extend({

			loopedSlider: function(options) {

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

			

				return this.each(

					function() {

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

					var $t = $j(this);

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

					

					var distance = 0;

					var times = 1;

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

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

					var position = 0;

					var active = false;

					var number = 0;

					var interval = 0;

					var restart = 0;

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



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

						var buttons = slides;

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

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

							if (number<buttons) {

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

								number = number+1;

							} else {

								number = 0;

								return false;

							}

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

						});

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

					} else {

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

							number=number+1;

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

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

						});

					}



					if (slides===1) {

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

						return;

					}



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



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

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

						position=position+width;

					});



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



					if (slides>3) {

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

					}



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



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

						if(active===false) {

							animate("next",true);

							if(o.autoStart){

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

								else {clearInterval(sliderIntervalID);}

							}

						} return false;

					});



					$j(".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) {

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

							if(active===false) {

								animate("next",true);

								if(o.autoStart){

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

									else {clearInterval(sliderIntervalID);}

								}

							} return false;

						});

					}



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

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

						else {

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

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

							$j(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);

						function autoStart() {

							if (o.restart) {

							clearInterval(sliderIntervalID);

							clearInterval(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);

							}

						};

						if (o.hoverPause) {

							$j(o.slides,$t).mouseenter(function(){

								clearInterval(sliderIntervalID);

								clearInterval(interval);

								clearTimeout(restart);

							});

							$j(o.slides,$t).mouseleave(function(){

								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;}

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

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

					};



					function autoHeight(times) {

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

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

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

						$j(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){$j(o.slides,$t).children(":eq(0)").css({left:(slides*width)});}

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

								}

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

									if (times===slides+1) {

										times = 1;

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

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

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

									}

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

									if (times===slides-1) $j(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){$j(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:(-width)});}

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

								}

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

									if (times===0) {

										times = slides;

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

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

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

									}

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

									if (times===1) $j(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);}

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

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

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

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

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

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

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

										//removing filter from IE

										if(jQuery.browser.msie) {

											$j(this).get(0).style.removeAttribute('filter');

										}

									});

									active = false;

								});

								break; 

							default:

								break;

							}					

						};

					}

				);

			}

		});

		$j.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: true, //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.

			hoverPause: false, //Set to true to pause on hover, if autoStart is also true

			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

		};

	});

}
