
var Nudger = new Class({
 
	Implements : [Options],
 
	options : {
		transition : Fx.Transitions.linear,
		duration : 400,
		amount : 60,
		lowfade : 0,
		highfade: 1
	},
 
	initialize : function(selector,options){
		this.setOptions(options); 
		this.elements = $$(selector);
		this.elements.each(function(el){
 
			var nudge = {
				'enter' : this.enter.bind(this,el),
				'leave' : this.leave.bind(this,el)
			};
 
			el.addEvents({
				'mouseenter' : nudge.enter,
				'mouseleave' : nudge.leave
			});
	 		el.store('enterLeaving',0);
 			el.store('text',el.innerHTML);
			el.store('nudge',nudge);
		},this);
	},
 
	enter : function(el){
		if(el.retrieve('tween1') !=null)
			el.retrieve('tween1').cancel();
		if(el.retrieve('started')==null || el.retrieve('started')==0){
			el.innerHTML="";
			el.store('className',el.className);
			el.className=el.className+'-hover';
			el.addClass('hover');
			el.fade('show');
		}
	},
 
	leave : function(el){

		var myFx = new Fx.Tween(el,{property: 'opacity', duration: this.options.duration});
		el.store('tween1',myFx);
		myFx.set('onCancel',function(){
			if(el.retrieve('started')==1){
				el.store('started',0);
				el.removeClass('hover');
				el.innerHTML=el.retrieve('text');
				el.className=el.retrieve('className');																									         		el.fade('show');				
			}
		});
		myFx.start(this.options.lowfade,this.options.highfade).chain(function(){
			el.store('started',0)									 
			el.removeClass('hover');
			el.innerHTML=el.retrieve('text');
			el.className=el.retrieve('className');																					         	el.fade('show');

		});
		el.store('started',1);
	},
 
	destroy : function(){
		this.elements.each(function(el){
			var nudge = el.retrieve('nudge');
			el.removeEvents({
				'mouseenter' : nudge.enter,
				'mouseleave' : nudge.leave
			});
		});
	}

});
