/*
*   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
  };
    
  this.each(function() {
    
    var obj = $(this);
    var o = $.extend(defaults, options);
    var pagination = $(o.pagination+' li a',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).parent().addClass('active');
    });
    
    $(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).parent().hasClass('active')) {return false;}
      else {
        t = $(this).attr('rel');
        $(pagination,obj).parent().siblings().removeClass('active');
        $(this).parent().addClass('active');
        animate('fade',t);
        if(o.autoStart){clearInterval(sliderIntervalID);}
      } 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).parent().siblings().removeClass('active');
      $(pagination+'[rel="' + (t) + '"]',obj).parent().addClass('active');
    };
    
    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);}
          $(o.slides,obj).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});
            u = false;
          });          
          break;
        case 'prev':
          t = t-1;
          m = (-(t*w-w));
          current(t);
          if(o.autoHeight){autoHeight(t);}
          $(o.slides,obj).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});
            u = false;
          });
          break;
        case 'fade':
          t = [t]*1;
          m = (-(t*w-w));
          current(t);
          if(o.autoHeight){autoHeight(t);}
          $(o.slides,obj).children().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;
          });
          break;
        default:
          break;
        }          
      };
    });
  };
})(jQuery);
