/* slideBanners for jQuery
*
*  A plugin to slide elements
*
*  version 0.4.1 - 08/04/2010 
*  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",
      hover:true,
      animation:"single"
    },options);
    options.element = self;
    $target = $(options.target,self);
    if($target.length<2)
      return this.click(function(){return false;});
    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();
    if(options.hover) 
      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.slideBannersStop = function() {
		var slide = this.data("slideBanners");
		slide.slide_banner = false;
    window.clearTimeout(slide.timer_banner);
    slide.timer_banner = 0;
		return this;	
	}
	
	$.fn.slideBannersNext = function() {
		var slide = this.data("slideBanners");
		slide.slidebanner();
		return this;		
	}
    
	$.fn.slideBannersPrev = function() {
		var slide = this.data("slideBanners");
		slide.slidebanner(true);
		return this;		
	}

  $.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,
        old_slide_banner = slide.slide_banner,
        checkTo;
    slide.delay = 0;
    slide.easing = "linear";
    slide.slide_banner = true;
    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;
        slide.slide_banner = old_slide_banner;
      }
    };
    $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;
    self.animation = opt.animation;
    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(back) {
    var self = this,
        prop = {},
        prop2 = {},
        animateProperty = self.animateProperty,
        animatePropertyMult = (back?-1:1)*self.animatePropertyMult;
    prop[animateProperty] = -1*animatePropertyMult*self.jump+px;
    prop2[animateProperty] = "0"+px;
    var banner = self.banners.eq(self.current_banner).
    trigger("beforeSlideOut");
    if(self.animation=="single") {
	    banner.animate(prop,self.duration,self.easing,function(){
	      $(this).trigger("afterSlideOut").hide();
	      if(back) {
					self.current_banner--;
		      if(self.current_banner<0)
		        self.current_banner = self.banners.length-1;
				} else {
					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);
	      });
	    });
	  } else if(self.animation=="multiple") {
	    banner.animate(prop,self.duration,self.easing,function(){
	      $(this).trigger("afterSlideOut").hide();
	    });
      if(back) {
				self.current_banner--;
	      if(self.current_banner<0)
	        self.current_banner = self.banners.length-1;
			} else {
				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);

