/**
 * 	Easy Slider 1.8 - jQuery plugin
 *	written by Alen Grakalic (modified by Kyle Florence - kyle.florence@gmail.com)
 *	http://cssglobe.com/post/4004/easy-slider-15-the-easiest-jquery-plugin-for-sliding
 *
 *	Copyright (c) 2009 Alen Grakalic (http://cssglobe.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 $("#slider").easySlider();
 *
 * 	<div id="slider">
 *		<ul>
 *			<li><img src="images/01.jpg" alt="" /></li>
 *			<li><img src="images/02.jpg" alt="" /></li>
 *			<li><img src="images/03.jpg" alt="" /></li>
 *			<li><img src="images/04.jpg" alt="" /></li>
 *			<li><img src="images/05.jpg" alt="" /></li>
 *		</ul>
 *	</div>
 */

(function($) {
	$.fn.easySlider = function(options) {
		// default configuration properties
		var defaults = {
			prevId: 'prevBtn',
			prevText: 'Previous',
			nextId: 'nextBtn',
			nextText: 'Next',
			controlsShow: true,
			controlsBefore: '',
			controlsAfter: '',
			controlsFade: true,
			insertAfter: true,
			firstId: 'firstBtn',
			firstText: 'First',
			firstShow: false,
			lastId: 'lastBtn',
			lastText: 'Last',
			lastShow: false,
			vertical: false,
			speed: 800,
			ease: 'swing',
			auto: false,
			pause: 2000,
			continuous: false,
			prevNext: true,
			numeric: false,
			numericId: 'controls'
		};

		var options = $.extend(defaults, options);

		this.each(function() {
			var obj = $(this);

			// Fix for nested list items
				var ul = obj.children("ul");
				var li = ul.children("li");

				var s = li.length;
				var w = obj.width();
				var h = obj.height();

				var t = 0;
				var ts = s - 1;
				var clickable = true;

				// Set obj overflow to hidden
				obj.css("overflow", "hidden");

				// Set width/height of list items based on width/height of obj
				li.each(function() {
					if (options.vertical) {
						$(this).height(h);
					} else {
						$(this).width(w);
					}
				});

				// Float items to the left
				li.css('float', 'left');

				// Set width/height of ul
				if (options.vertical) {
					ul.height(s * w);
				} else {
					ul.width(s * h);
				}

				// Clone elements for continuous scrolling
				if (options.continuous) {
					if (options.vertical) {
						ul.prepend(li.filter(":last-child").clone().css(
								"margin-top", "-" + h + "px"));
						ul.append(li.filter(":nth-child(2)").clone());
						ul.height((s + 1) * h);
					} else {
						ul.prepend(li.filter(":last-child").clone().css(
								"margin-left", "-" + w + "px"));
						ul.append(li.filter(":nth-child(2)").clone());
						ul.width((s + 1) * w);
					}
				};

				if (options.controlsShow) {
					var html = options.controlsBefore;
					if (options.numeric) {
						html += '<ol id="' + options.numericId + '"></ol>';
					}

					if (options.firstShow) {
						html += '<span id="' + options.firstId
								+ '"><a href="#">' + options.firstText
								+ '</a></span>';
					}

					if (options.prevNext) {
						html += '<span id="' + options.prevId
								+ '"><a href="#">' + options.prevText
								+ '</a></span>';
						html += '<span id="' + options.nextId
								+ '"><a href="#">' + options.nextText
								+ '</a></span>';
					}

					if (options.lastShow) {
						html += '<span id="' + options.lastId
								+ '"><a href="#">' + options.lastText
								+ '</a></span>';
					}

					html += options.controlsAfter;

					if (options.insertAfter) {
						$(obj).after(html);
					} else {
						$(obj).before(html);
					}
				};

				if (options.numeric) {
					for ( var i = 0; i < s; i++) {
						$(document.createElement("li")).attr('id',
								options.numericId + (i + 1)).html(
								'<a rel="' + i + '" href="#"><span>' + (i + 1)
										+ '</span></a>').appendTo(
								$("#" + options.numericId)).click(function() {
							animate($("a", $(this)).attr('rel'), true);
							return false;
						});
					};
				}

				if (options.prevNext) {
					$("a", "#" + options.nextId).click(function() {
						animate("next", true);
						return false;
					});

					$("a", "#" + options.prevId).click(function() {
						animate("prev", true);
						return false;
					});

					$("a", "#" + options.firstId).click(function() {
						animate("first", true);
						return false;
					});

					$("a", "#" + options.lastId).click(function() {
						animate("last", true);
						return false;
					});
				};

				function setCurrent(i) {
					i = parseInt(i) + 1;
					$("li", "#" + options.numericId).removeClass("current");
					$("li#" + options.numericId + i).addClass("current");
				};

				function adjust() {
					if (t > ts) {
						t = 0;
					}

					if (t < 0) {
						t = ts;
					}

					if (!options.vertical) {
						ul.css("margin-left", (t * w * -1));
					} else {
						ul.css("margin-top", (t * h * -1));
					}

					clickable = true;
					if (options.numeric)
						setCurrent(t);
				};

				function animate(dir, clicked) {
					if (clickable) {
						clickable = false;

						var ot = t;
						switch (dir) {
							case "next":
								t = (ot >= ts) ? (options.continuous ? t + 1 : ts) : t + 1;
								break;
							case "prev":
								t = (t <= 0) ? (options.continuous ? t - 1 : 0) : t - 1;
								break;
							case "first":
								t = 0;
								break;
							case "last":
								t = ts;
								break;
							default:
								t = parseInt(dir);
								break;
						};

						var diff = Math.abs(ot - t);
						var speed = diff * options.speed;

						if (!options.vertical) {
							p = (t * w * -1);
							ul.animate( {
								marginLeft : p
							}, {
								queue : false,
								duration : speed,
								easing : options.ease,
								complete : adjust
							});
						} else {
							p = (t * h * -1);
							ul.animate( {
								marginTop : p
							}, {
								queue : false,
								duration : speed,
								easing : options.ease,
								complete : adjust
							});
						};

						if (!options.continuous && options.controlsFade) {
							if (t == 0) {
								$("a", "#" + options.prevId).fadeOut('slow');
								$("a", "#" + options.firstId).fadeOut('slow');
							} else if (t == ts) {
								$("a", "#" + options.nextId).fadeOut('slow');
								$("a", "#" + options.lastId).fadeOut('slow');
							} else {
								$("a", "#" + options.prevId).fadeIn('slow');
								$("a", "#" + options.firstId).fadeIn('slow');
								$("a", "#" + options.nextId).fadeIn('slow');
								$("a", "#" + options.lastId).fadeIn('slow');
							};
						};

						if (clicked)
							clearTimeout(timeout);
						if (options.auto && dir == "next" && !clicked) {
							;
							timeout = setTimeout(function() {
								animate("next", false);
							}, diff * options.speed + options.pause);
						};
					};
				};

				// init
				var timeout;
				if (options.auto) {
					;
					timeout = setTimeout(function() {
						animate("next", false);
					}, options.pause);
				};

				if (options.numeric)
					setCurrent(0);

				if (!options.continuous && options.controlsFade) {
					$("a", "#" + options.prevId).hide();
					$("a", "#" + options.firstId).hide();
				};

			});

	};
})(jQuery);