

/**************************************************************

   Script      : Background Slider
   Version     : 1.1
   Authors     : Samuel Birch
   Desc     : Slides a layer to a given elements position and dimensions.
   Licence     : Open Source MIT Licence

**************************************************************/

var BackgroundSlider = new Class({

   getOptions: function(){
      return {
         duration: 300,
         wait: 500,
         transition: Fx.Transitions.sineInOut,
         className: false,
         fixHeight: false,
         fixWidth: false,
         id: false,
         padding: {top:0,right:0,bottom:0,left:0},
         onClick: this.setStart,
         mouseOver: true
      };
   },

   initialize: function(elements, options){
      this.setOptions(this.getOptions(), options);
      
      this.elements = $$(elements);
      this.timer = 0;

      if(this.options.id){
         this.bg = $(this.options.id);
      }else{
         this.bg = new Element('div').setProperty('id','BgSlider_'+new Date().getTime()).injectInside(document.body);
         if(this.options.className){
            this.bg.addClass(this.options.className); 
         }
      }
      
      this.effects = new Fx.Styles(this.bg, {duration: this.options.duration, transition: this.options.transition});
      
      this.elements.each(function(el,i){
         if(this.options.mouseOver){
            el.addEvent('mouseover', this.move.bind(this,el));
            el.addEvent('mouseout', this.reset.bind(this));
         }
         el.addEvent('click', this.options.onClick.bind(this, el))
         if(el.hasClass('bgStart')){
            this.set(el);
         }
      },this);
      
      window.addEvent('resize',function(){
         this.move(this.startElement);
      }.bind(this));
      
   },
   
   setStart: function(el){
      this.startElement = el;
   },
   
   set: function(el){
      this.setStart(el);
      var pos = el.getCoordinates();
      
      if(this.options.id){
         this.options.padding.top = this.bg.getStyle('paddingTop').toInt();
         this.options.padding.right = this.bg.getStyle('paddingRight').toInt();
         this.options.padding.bottom = this.bg.getStyle('paddingBottom').toInt();
         this.options.padding.left = this.bg.getStyle('paddingLeft').toInt();
         this.bg.setStyle('padding','0px');
      }
      
      var obj = {};
      obj.top = (pos.top-this.options.padding.top)+'px';
      obj.left = (pos.left-this.options.padding.left)+'px';
      if(!this.options.fixHeight){obj.height = (pos.height+this.options.padding.top+this.options.padding.bottom)+'px'};
      if(!this.options.fixWidth){obj.width = (pos.width+this.options.padding.left+this.options.padding.right)+'px'};
      
      this.bg.setStyles(obj);
   },
   
   reset: function(){
      if(this.options.wait){
         this.timer = this.move.delay(this.options.wait, this, this.startElement);
      }
   },
   
   move: function(el){
      $clear(this.timer);
      var pos = el.getCoordinates();
      
      this.effects.stop();
      
      var obj = {};
      obj.top = pos.top-this.options.padding.top;
      obj.left = pos.left-this.options.padding.left;
      if(!this.options.fixHeight){obj.height = pos.height+this.options.padding.top+this.options.padding.bottom};
      if(!this.options.fixWidth){obj.width = pos.width+this.options.padding.left+this.options.padding.right};
      
      this.effects.start(obj);
      
   }

});
BackgroundSlider.implement(new Options);
BackgroundSlider.implement(new Events);

/*************************************************************/

