﻿/*
* 	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.
*
*/
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>");
					    $("." + o.pagination, $t).append("<li><a rel=" + (number + 1) + " href=\"#\" ></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).mouseover(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);
					  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);
					   }
					  };
					 }

					 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: 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.
   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
  };
 });
}
