// JavaScript Document




/**************************************************************



	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);





