/*
 * 	loopedSlider 0.5.1 - 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
 *
 */

/*
 *	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>
 *		<ul class="pagination">
 *			<li><a href="#">1</a></li>
 *			<li><a href="#">2</a></li>
 *			<li><a href="#">3</a></li>
 *			<li><a href="#">4</a></li>
 *		</ul>	
 *	</div>
 *
*/

(function($) {
	$.fn.loopedSlider = function(options) {

		var defaults = {
			container: '.container',
			slides: '.slides',
			pagination: '.pagination',
			containerClick: true, // Click container for next slide
			autoStart: 0, // Set to positive number for auto interval and interval time
			slidespeed: 300, // Speed of slide animation
			fadespeed: 300, // Speed of fade animation
			autoHeight: false, // Set to positive number for auto height and animation speed
			autoResume: false
		};

		this.each(function() {

			var obj = $(this);
			var o = $.extend(defaults, options);
			//var pagination = $(o.pagination+' li a',obj);
			var pagination = $(o.pagination + ' li', obj);
			var m = 0;
			var t = 1;
			var s = $(o.slides, obj).children().size();
			var w = $(o.slides, obj).children().outerWidth();
			var p = 0;
			var u = false;
			var n = 0;

			$(o.slides, obj).css({ width: (s * w) });

			$(o.slides, obj).children().each(function() {
				$(this).css({ position: 'absolute', left: p, display: 'block' });
				p = p + w;
			});

			$(pagination, obj).each(function() {
				n = n + 1;
				$(this).attr('rel', n);
				$(pagination.eq(0), obj).addClass('on');
			});

			$(o.slides, obj).children(':eq(' + (s - 1) + ')').css({ position: 'absolute', left: -w });

			if (o.autoHeight) { autoHeight(t); }

			$('.next', obj).click(function() {
				if (u === false) {
					animate('next', true);
					if (o.autoStart) { clearInterval(sliderIntervalID); }
				} return false;
			});

			$('.previous', obj).click(function() {
				if (u === false) {
					animate('prev', true);
					if (o.autoStart) { clearInterval(sliderIntervalID); }
				} return false;
			});

			if (o.containerClick) {
				$(o.container, obj).click(function() {
					if (u === false) {
						animate('next', true);
						if (o.autoStart) { clearInterval(sliderIntervalID); }
					} return false;
				});
			}

			$(pagination, obj).click(function() {
				if ($(this).hasClass('on')) { return false; }
				else {
					t = $(this).attr('rel');
					$(pagination, obj).siblings().removeClass('on');
					$(this).addClass('on');
					animate('fade', t);
					if (o.autoStart) {
						clearInterval(sliderIntervalID); if (o.autoResume) {
							sliderIntervalID = setInterval(function() {
								if (u === false) { animate('next', true); }
							}, o.autoStart);
						}
					}
				} return false;
			});

			if (o.autoStart) {
				sliderIntervalID = setInterval(function() {
					if (u === false) { animate('next', true); }
				}, o.autoStart);
			}

			function current(t) {
				if (t === s + 1) { t = 1; }
				if (t === 0) { t = s; }
				$(pagination, obj).siblings().removeClass('on');
				$(pagination + '[rel="' + (t) + '"]', obj).addClass('on');
			};

			function autoHeight(t) {
				if (t === s + 1) { t = 1; }
				if (t === 0) { t = s; }
				var getHeight = $(o.slides, obj).children(':eq(' + (t - 1) + ')', obj).outerHeight();
				$(o.container, obj).animate({ height: getHeight }, o.autoHeight);
			};

			function animate(dir, clicked) {
				u = true;
				switch (dir) {
					case 'next':
						t = t + 1;
						m = (-(t * w - w));
						current(t);
						if (o.autoHeight) { autoHeight(t); }
						$('.coda-nav-left, .coda-nav-right', obj).css("display", "none");
						$(o.slides, obj).stop().animate({ left: m }, o.slidespeed, function() {
							if (t === s + 1) {
								t = 1;
								$(o.slides, obj).css({ left: 0 }, function() { $(o.slides, obj).animate({ left: m }) });
								$(o.slides, obj).children(':eq(0)').css({ left: 0 });
								$(o.slides, obj).children(':eq(' + (s - 1) + ')').css({ position: 'absolute', left: -w });
							}
							if (t === s) $(o.slides, obj).children(':eq(0)').css({ left: (s * w) });
							if (t === s - 1) $(o.slides, obj).children(':eq(' + (s - 1) + ')').css({ left: s * w - w });
							$('.coda-nav-left, .coda-nav-right', obj).css("display", "block");
							u = false;
						});
						break;
					case 'prev':
						t = t - 1;
						m = (-(t * w - w));
						current(t);
						if (o.autoHeight) { autoHeight(t); }
						$('.coda-nav-left, .coda-nav-right', obj).css("display", "none");
						$(o.slides, obj).stop().animate({ left: m }, o.slidespeed, function() {
							if (t === 0) {
								t = s;
								$(o.slides, obj).children(':eq(' + (s - 1) + ')').css({ position: 'absolute', left: (s * w - w) });
								$(o.slides, obj).css({ left: -(s * w - w) });
								$(o.slides, obj).children(':eq(0)').css({ left: (s * w) });
							}
							if (t === 2) $(o.slides, obj).children(':eq(0)').css({ position: 'absolute', left: 0 });
							if (t === 1) $(o.slides, obj).children(':eq(' + (s - 1) + ')').css({ position: 'absolute', left: -w });
							$('.coda-nav-left, .coda-nav-right', obj).css("display", "block");
							u = false;
						});
						break;
					case 'fade':
						t = [t] * 1;
						m = (-(t * w - w));
						current(t);
						if (o.autoHeight) { autoHeight(t); }
						$(pagination, obj).css("display", "none");
						$(o.slides, obj).stop().children().stop().fadeOut(o.fadespeed, function() {
							$(o.slides, obj).css({ left: m });
							$(o.slides, obj).children(':eq(' + (s - 1) + ')').css({ left: s * w - w });
							$(o.slides, obj).children(':eq(0)').css({ left: 0 });
							if (t === s) { $(o.slides, obj).children(':eq(0)').css({ left: (s * w) }); }
							if (t === 1) { $(o.slides, obj).children(':eq(' + (s - 1) + ')').css({ position: 'absolute', left: -w }); }
							$(o.slides, obj).children().fadeIn(o.fadespeed);
							u = false;
							$(pagination, obj).css("display", "block");
						});
						break;
					default:
						break;
				}
			};
		});
	};
})(jQuery);
