/*
 * 	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 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>");
                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).click(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,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: false, //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
    };
  });
}
