/**
 * mouseEvent.js
 */
window.addMouseEventHandler = function( element, eventType, handler )
{
	var	mem = element.mouseEventManager;
	if( ! mem )
	{
		element.mouseEventManager = new MouseEventManager( element );
		mem = element.mouseEventManager;
		window.addEventHandler( element, MouseEventManager.MOUSE_OVER, createDelegate( mem, mem.onMouseOver ) );
		window.addEventHandler( element, MouseEventManager.MOUSE_OUT, createDelegate( mem, mem.onMouseOut ) );
	}
	if( eventType == MouseEventManager.ROLL_OVER )
	{
		mem.rollOverHandlers.push( handler );
	}else if( eventType == MouseEventManager.ROLL_OUT )
	{
		mem.rollOutHandlers.push( handler );
	}else
	{
		window.addEventHandler( element, eventType, handler );
	}
};
window.removeMouseEventHandler = function( element, eventType, handler )
{
	var	mem = element.mouseEventManager;
	if( ! mem )
	{
		window.removeEventHandler( element, eventType, handler );
		return;
	}
	if( eventType == MouseEventManager.ROLL_OVER )
	{
		var	rollOverHandlers = mem.rollOverHandlers;
		for( var i = 0, len = rollOverHandlers.length; i < len; i++ )
		{
			if( rollOverHandlers[i] == handler )
			{
				rollOverHandlers.splice( i, 1 );
				break;
			}
		}
	}else if( eventType == MouseEventManager.ROLL_OUT )
	{
		var	rollOutHandlers = mem.rollOutHandlers;
		for( var i = 0, len = rollOutHandlers.length; i < len; i++ )
		{
			if( rollOutHandlers[i] == handler )
			{
				rollOutHandlers.splice( i, 1 );
				break;
			}
		}
	}else
	{
		window.removeEventHandler( element, eventType, handler );
	}
};

/**
 * MouseEventManager
 * @param {Object} element
 */
function MouseEventManager( element )
{
	this.status = 'out';
	this.element = element;
	this.rollOverHandlers = [];
	this.rollOutHandlers = [];
}
MouseEventManager.MOUSE_OVER = 'mouseover';
MouseEventManager.MOUSE_OUT = 'mouseout';
MouseEventManager.ROLL_OVER = 'rollover';
MouseEventManager.ROLL_OUT = 'rollout';
MouseEventManager.prototype = 
{
	onMouseOver : function( e )
	{
		if( ! e ) e = window.event;
		if( ! e ) return;
		if( this.status == 'over' ) return;
		
		this.onRollOver( e );
	},
	onMouseOut : function( e )
	{
		if( ! e ) e = window.event;
		if( ! e ) return;
		if( this.status == 'out' ) return;
		
		var node = e.toElement || e.relatedTarget;
		var element = this.element;
		while( node )
		{
			if( node == element ) return;
			node = node.parentNode;
		}
		
		this.onRollOut( e );
	},
	onRollOver : function( e )
	{
		this.executeHandlers( this.rollOverHandlers, e );
		this.status = 'over';
	},
	onRollOut : function( e )
	{
		this.executeHandlers( this.rollOutHandlers, e );
		this.status = 'out';
	},
	executeHandlers : function( handlers, event  )
	{
		var element = this.element;
		for( var i = 0, len = handlers.length; i < len; i++ )
		{
			handlers[i].apply( element, [event] );
		}
	}
};



