/**
 * @author Peter Swan
 */
var HoverItem = Class.create({
	timeout: null,
	initialize: function(item, trigger){
		this.item = $(item);
		if( !this.item ){
			throw 'HoverItem: invalid item';
		}
		this.trigger = $(trigger);
		if( !this.trigger ){
			throw 'HoverItem: invalid trigger element';
		}
		this.options = Object.extend({
			timeout: 0.5,
			align_to_trigger: true,
			zIndex: 100
		}, arguments[1] || {});
		this.item.hide();
		if( this.options.align_to_trigger ){
			var trigger_pos = this.trigger.positionedOffset();
			var trigger_dims = this.trigger.getDimensions();
			this.item.setStyle({position: 'absolute', top: trigger_pos.top + trigger_dims.height + 'px', left: trigger_pos.left + 'px', zIndex: this.options.zIndex});
		}
		[this.item, this.trigger].invoke('observe', 'custom:mouseleave', this.closeItem.bindAsEventListener(this))
		                         .invoke('observe', 'custom:mouseenter', this.openItem.bindAsEventListener(this));	
	},
	openItem: function(){
		this.stopClose();
		this.item.show();
	},
	closeItem: function(){
		if (!this.timeout) {
			this.timeout = this._closeItem.bind(this).delay(this.options.timeout);
		}
	},
	_closeItem: function(){
		this.item.hide();
	},
	stopClose: function(){
		if (this.timeout) {
			clearTimeout(this.timeout);
			this.timeout = null;
		}
	}
});