/* Rotator
 * Version 1.0.4
 * Author Michael Neil
 * URI: http://www.fluxar.com/
 */
(function($){ //jQuery.noConflict()compliant  
  var fader_num_init_unique = 0;
  
  $.fn.rotator = function(o){
    $(this).each(function(el){
      if(el>0) fader_num_init_unique++;
      $(this).data( 'rotator', new Rotator( this, o, fader_num_init_unique ) );
    });
    fader_num_init_unique++;
  }
  
  var Rotator = function(element, o, el){
      o = $.extend({ /*defaults, can be overidden*/
        arrows    : {left:".leftarrow",right:".rightarrow"},
        tranSpeed : 800,/*ms transition speed*/
        delay   : 4000,/*ms delay before next transition*/
        auto    : true,/*sets auto scrolling through rotator*/
        loop    : true,/*infinite scroll on or off, default false rotates back to beginning*/
        backwards : false,/*sets the rotator to run backwards. Loop must be set to true to run backwards*/
        onChange : function(i){},/*onChange event fires when the animation begins*/
        endChange : function(i){}/*endChange event fires when the animation ends*/
        }, o ||
        {});

    var dontRun = false;
    if(!$(element)){alert("Must specify an object to target.");return false;}
    if($(element).children().length <= 1){dontRun = true;console.log(element+" has one or fewer children to fade");}
           
    var reverse = false;
    if(o.backwards)reverse = true;
    if(o.backwards && !o.loop){
      o.backwards = false;
    }
    
    
    var that = $(element);
    beforeN = $(element).children().length;
    
    var numbers = "";
      var beforeN = 0;
    var inner = "";
    
    addNumbers(el);
    
    if(o.loop){
      var curFade = 0;
      beforeN = $(element).children().length;
      inner = $(element).html();
      $(element).children("li:first").before(inner);
      $(element).children("li:last").after(inner);
    }
    
    var w = $(element).children().width();
    var n = $(element).children().length;
    var cur = beforeN;
    var animate = false;
    
    $(element).css({"margin-left": -cur * w});
    $(element).css({width: w * n});
    
    
    $(o.arrows.right).click(function(){
      if(dontRun)return;
      if(cur == n-1)return;      
      if(o.auto){clearInterval(interval);interval = setInterval(goNext,o.delay);o.backwards = false;}
      if(animate)return;cur++;animate = true;
      
      o.onChange(cur-beforeN);
      forwardNumbersReset();
      
      that.animate({marginLeft:-cur*w},o.tranSpeed,reset);
    });
    
    $(o.arrows.left).click(function(){
      if(dontRun)return;
      if(cur==0)return;
      if(o.auto){clearInterval(interval);interval = setInterval(goNext,o.delay);o.backwards = true;}
      if(animate)return;cur--;animate = true;
      
      o.onChange(cur-beforeN);
      forwardNumbersReset();  
            
      that.animate({marginLeft:-cur*w},o.tranSpeed,reset);
    });
    
    if(o.auto && !dontRun){
      var interval = setInterval(goNext,o.delay);
    }
    
    function goNext(){
      if(dontRun)return;
      if(cur == n-1){if(reverse){o.backwards = true}else{return}};
      if(cur == 0 && reverse)o.backwards = false;
      if(animate)return;if(!o.backwards){cur++}else{cur--};animate = true;
      
      o.onChange(cur-beforeN);
      forwardNumbersReset();
      
      that.animate({marginLeft:-cur*w},o.tranSpeed,reset);
      
    }
    
    function reset(){
      animate = false;
      if ((cur == 0 || cur == n - beforeN)) {
        cur = beforeN;
        $(element).css({"margin-left": -cur * w});
      }
      o.endChange(cur-beforeN);
    }
    
    /*
     * Change current active number.
     */
    function forwardNumbersReset(){
      
      $(numbers).removeClass("active");
      
      if((o.backwards && cur-beforeN == -1) || cur-beforeN == beforeN){
        if(o.backwards){
          $(numbers).eq($(numbers).length-1).addClass("active");
        }else{
          $(numbers).eq(0).addClass("active");
        }
      }else{
        $(numbers).eq(cur-beforeN).addClass("active");
      }
      
    }
    
    function addNumbers(el){
      if(dontRun)return;
      var len = $(element).children().length;
      numbers = "<ul class='slider-numbers slider-numbers-"+el+"'>";
      for(var i=0;i<len;i++)
        numbers +="<li><a href=''>"+(i+1)+"</a></li>";
      numbers += "</ul>";
      $(element).after(numbers);
      numbers = ".slider-numbers-"+el+" a";
      
      
      $(numbers).each(function(i){
        if(i==0)$(this).addClass("active");
        
        $(this).click(function(){
          
          clearInterval(interval);
          $(numbers).removeClass("active");
          $(this).addClass("active");
          cur = beforeN+i;
          if(o.backwards)cur = beforeN-i;
          
          that.animate({marginLeft:-cur*w},o.tranSpeed,reset);
          
          interval = setInterval(goNext,o.delay);
          return false;
        });
      })
      
    }
    
  
  }
})(jQuery);
