/* slideBanners for jQuery
*
*  A plugin to slide elements
*
*  version 0.2 - 15/04/2009 
*  author: Renato Formato <rformato@gmail.com>
*  
*  double released under GPL and MIT license
*  copyright 2009 
*
*/

;(function($) {
  var px = "px";
  $.fn.slideBanners = function(options) {
    var self = this,
        $target,
        slide;
    options = $.extend({
      target:"img",
      direction:"rl",
      duration:1000,
      jump:200,
      delay:5000,
      easing: "swing"
    },options);
    options.element = self;
    $target = $(options.target,self), slide;
    if($target.length<2)
      return this;
    slide = new $.slideBanners(options);
    $(self).data("slideBanners",slide);
    this.css("overflow","hidden");
    slide.banners = $target.css("position","relative");
    slide.banners.not(":eq(0)").css(slide.animateProperty,slide.animatePropertyMult*slide.jump+px).hide();
    slide.banners.hover(function(){
      slide.slide_banner = false;
      window.clearTimeout(slide.timer_banner);
      slide.timer_banner = 0;
    },
    function() {
      slide.slide_banner = true;
      if(!slide.banners.filter(":animated").length)
        slide.timer_banner = window.setTimeout(function() {slide.slidebanner();},0);
    });
    slide.timer_banner = window.setTimeout(function() {slide.slidebanner();},slide.delay);
    return self;
  }
  
  $.fn.slideBannersTo = function(el,opts) {
    var $this = $(this),
        slide = $this.data("slideBanners"),
        index = slide.banners.index(el),
        old_delay = slide.delay,
        old_easing = slide.easing,
        old_duration = slide.duration,
        checkTo;
    slide.delay = 0;
    slide.easing = "linear";
    opts = $.extend({
      costant: false,
      duration: 0
    },opts);
    if(opts.costant)
      slide.duration = slide.duration/Math.abs((index!=slide.current_banner?index-slide.current_banner:1));
    else
      slide.duration = opts.duration;       
    window.clearTimeout(slide.timer_banner);
    slide.timer_banner = 0;
    checkTo = function(e) {
      if(slide.current_banner==index) {
        $this.unbind("afterSlideIn",checkTo);
        slide.delay = old_delay;
        slide.easing = old_easing;
        slide.duration = old_duration;
      }
    };
    $this.bind("afterSlideIn",checkTo);
    slide.slidebanner();
    return this;
  }
  
  $.slideBanners = function(opt){
    var self = this;
    self.banners = $([]);
    self.current_banner = 0;
    self.timer_banner = 0;
    self.slide_banner = true;
    self.options = opt;
    self.element = opt.element;     
    self.delay = opt.delay; 
    self.duration = opt.duration;
    self.jump = opt.jump;
    self.easing = opt.easing;
    switch(opt.direction) {
      case "rl":
        self.animateProperty = "left";
        self.animatePropertyMult = 1;
        break;
      case "lr":
        self.animateProperty = "left";
        self.animatePropertyMult = -1;
        break;
      case "tb":
        self.animateProperty = "top";
        self.animatePropertyMult = -1;
        break;
      case "bt":
        self.animateProperty = "top";
        self.animatePropertyMult = 1;
        break;
    };
  }
  
  $.slideBanners.prototype.slidebanner = function() {
    var self = this,
        prop = {},
        prop2 = {},
        animateProperty = self.animateProperty,
        animatePropertyMult = self.animatePropertyMult;
    prop[animateProperty] = -1*animatePropertyMult*self.jump+px;
    prop2[animateProperty] = "0"+px;
    self.banners.eq(self.current_banner).
    trigger("beforeSlideOut").
    animate(prop,self.duration,self.easing,function(){
      $(this).trigger("afterSlideOut").hide();
      self.current_banner++;
      if(self.current_banner>=self.banners.length)
        self.current_banner = 0;
      self.banners.eq(self.current_banner).css(animateProperty,animatePropertyMult*self.jump+px).show().
      trigger("beforeSlideIn").
      animate(prop2,self.duration,self.easing,function(){
        $(this).trigger("afterSlideIn");
        if(self.slide_banner)
          self.timer_banner = window.setTimeout(function() {self.slidebanner();},self.delay);
      });
    });
  }
})(jQuery);
