/*
 * 	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 pagination = $("."+o.pagination+" li a",$t);
					var current = 1;

					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});
					}

					$(".next",$t).css({opacity: 0.4});
					$(".previous",$t).css({opacity: 0.4});

					$(".next",$t).click(function(){
						if(active===false) {
							if(o.fadeMode == 1){
								current = current == slides ? 1 : current+1;
								animate(Number(current),true);
							}else{
								animate("next",true);
							}
							if(o.autoStart != 0){
								if (o.restart != 0) {autoStart();}
								else {clearInterval(sliderIntervalID);}
							}
						} return false;
					});
					$(".next",$t).hover(
						function () {
							$(this).animate({opacity: 1}, 100 )
						}, 
  						function () {
							$(this).animate({opacity: 0.4}, 100 )
						}
					);

					$(".previous",$t).click(function(){
						if(active===false) {	
							if(o.fadeMode == 1){
								current = current == 1 ? slides : current-1;
								animate(Number(current),true);
							}else{
								animate("prev",true);
							}
							if(o.autoStart){
								if (o.restart) {autoStart();}
								else {clearInterval(sliderIntervalID);}
							}
						} return false;
					});
					$(".previous",$t).hover(
						function () {
							$(this).animate({opacity: 1}, 100 )
						}, 
  						function () {
							$(this).animate({opacity: 0.4}, 100 )
						}
					);

					if (o.containerClick) {
						$(o.container,$t).click(function(){
							if(active===false) {
								if(o.fadeMode == 1){
									current = current == slides ? 1 : current+1;
									animate(Number(current),true);
								}else{
									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 {
							current = Number(this.rel);
							if(o.fadeMode == 1){
									animate(Number(current),true);
								}else{
									animate(Number(this.rel),true);
								}
							if(o.autoStart){
								if (o.restart) {autoStart();}
								else {clearInterval(sliderIntervalID);}
							}
						} return false;
					});

					// Interval
					if (o.autoStart != 0) {
						sliderIntervalID = setInterval(function(){
							if(active===false) {
								if(o.fadeMode == 1){
									current = current == slides ? 1 : current+1;
									animate(Number(current),true);
								}else{
									animate("next",true);
								}
							}
						},o.autoStart);
						function autoStart() {
							clearInterval(sliderIntervalID);
							if (o.restart != 0) {
								sliderIntervalID = setInterval(	function(){
									if(active===false) {
										if(o.fadeMode == 1){
											current = current == slides ? 1 : current+1;
											animate(Number(current),true);
										}else{
											animate("next",true);
										}
									}
								},o.restart);
							} else {
								sliderIntervalID = setInterval(function(){
									if(active===false) {
										if(o.fadeMode == 1){
											current = current == slides ? 1 : current+1;
											animate(Number(current),true);
										}else{
											animate("next",true);
										}
									}
								},o.autoStart);
							}
						};
					}

					function changeCurrentIco(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 animate(dir,clicked){	
						active = true;	
						switch(typeof(dir)){
							case "number":
								if(o.fadeMode == 1){
								distance = (-(dir*width-width));
								times = dir;
								changeCurrentIco(times);
								$(o.slides,$t).children().fadeOut(o.fadespeed*0.3, 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;
								});
								}else{
								distance = (-(dir*width-width));
								times = dir;
								changeCurrentIco(times);
								if(slides<3){
									if (times===3){$(o.slides,$t).children(":eq(0)").css({left:(times*width)});}
									if (times===2){$(o.slides,$t).children(":eq("+(times)+")").css({position:"absolute",left:width});}
								}
								$(o.slides,$t).children(":eq(0)").css({left:0});
								$(o.slides,$t).children(":eq("+(slides-1)+")").css({left:((slides-1)*width)});
								$(o.slides,$t).animate({left: distance}, o.slidespeed,function(){
									active = false;
								});	
								break;
								}
								break;
							case "string":
								if(dir == "next"){
									times = times+1;
									distance = (-(times*width-width));
									changeCurrentIco(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});}
									}
									if (times==(slides+1)) $(o.slides,$t).children(":eq(0)").css({left:(slides*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; 
								}else if(dir == "prev"){
									if (times==1) $(o.slides,$t).children(":eq("+(slides-1)+")").css({left:-width});
									times = times-1;
									distance = (-(times*width-width));
									changeCurrentIco(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;
								}else if(dir == "fade"){
									times = [times]*1;
									distance = (-(times*width-width));
									changeCurrentIco(times);
									$(o.slides,$t).children().fadeOut(o.fadespeed*0.2, 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;
								}else {
									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: 6000,  // First
			restart: 9000, // Interval
			slidespeed: 350, //Speed of slide animation, 1000 = 1second.
			fadespeed: 2200, //Speed of fade animation, 1000 = 1second.
			addPagination: false //Add pagination links based on content? true/false
		};
	});
}


