
var DomFx_aaEvents = new Array();
var DomFx_aElementsTargets = new Array();
var DomFx_aElementsEnabled = new Array();
var DomFx_aElementsEventsEnabled = new Array();

function CDomFxEvent()
{
}
/*
function CDomFxElement()
{
	this.sElementID;
	this.aoEvents = new Arrays();
}
function CDomFxEvent()
{
	this.sEvent;
	this.aoHandlers = new Array();
}
function CDomFxEventHandler()
{
	this.fHandler;
	this.vParameter;
}
*/

function DomFx_EnableElement(sID,bEnable)
{
	DomFx_aElementsEnabled[sID] = bEnable;
}

function DomFx_EnableElementEvent(sID,sEvent,bEnable)
{
	DomFx_aElementsEventsEnabled[sID+"_"+sEvent] = bEnable;
}

function DomFx_IsATarget(sElementID)
{
	return (typeof(DomFx_aaEvents[sElementID]) == "undefined");
}

/*
 *	Start silently listening of events to a 
 */
function DomFx_StartEventsListening()
{
	var asEvents = new Array('onclick','onmousedown','onmouseup','onmouseover','onmouseout');
	for(var i=0;i<asEvents.length;i++)
	{
		document.body.attachEvent(asEvents[i],DomFx_EventsHandler);
	}
}

function DomFx_GenerateGUID()
{
	return "guid_"+Math.round(Math.random()*10000);
}

function DomFx_DefineElementEvent(oElement,sEvent,fHandler,vParameter)
{
	// Generate ID if needed
	if( oElement.id == "" )
	{
		oElement.id = DomFx_GenerateGUID();
	}
	// Register element if needed
	if( DomFx_IsATarget(oElement.id) )
	{
		DomFx_aaEvents[oElement.id] = new Array();
		DomFx_EnableElement(oElement.id,true);
		DomFx_EnableElementEvent(oElement.id,sEvent,true);
	}
	// Register event if needed
	if( typeof(DomFx_aaEvents[oElement.id][sEvent]) == "undefined" )
	{
		DomFx_aaEvents[oElement.id][sEvent] = new Array();
	}
	// Add event handler
	DomFx_aaEvents[oElement.id][sEvent][DomFx_aaEvents[oElement.id][sEvent].length] = new Array(oElement.id,fHandler,vParameter);
}

/*
 *	This function receive and dispatch all activated events
 */
function DomFx_EventsHandler(e)
{
	var sID;
	var sEvent = "on"+e.type;
	var oSourceElement = e.srcElement;

	if( oSourceElement != document.body && oSourceElement.id == "" )
	{
		oSourceElement.id = DomFx_GenerateGUID();
	}

	if( typeof(DomFx_aElementsTargets[oSourceElement.id]) != "undefined" )
	{
		// element have a know target
		sID = DomFx_aElementsTargets[oSourceElement.id];
	}
	else if( !DomFx_IsATarget(oSourceElement.id) )
	{
		// element is the target
		sID = oSourceElement.id;
	}
	else
	{
		// search potential target of element
		sID = DomFx_GetTargetOfElement(oSourceElement,sEvent);
	}

	if( typeof(sID) != "undefined" )
	{
		var bElementEnabled = (typeof(DomFx_aElementsEnabled[sID]) == "undefined" || DomFx_aElementsEnabled[sID] == true);
		var bElementEventEnabled = (typeof(DomFx_aElementsEventsEnabled[sID+"_"+sEvent]) == "undefined" || DomFx_aElementsEventsEnabled[sID+"_"+sEvent] == true);

		if( bElementEnabled && bElementEventEnabled )
		{
			if( typeof(DomFx_aaEvents[sID][sEvent]) != "undefined" )
			{
				for(var i=0;i<DomFx_aaEvents[sID][sEvent].length;i++)
				{
					if( typeof(DomFx_aaEvents[sID][sEvent][i][1]) == "function" )
					{
						if( DomFx_aaEvents[sID][sEvent][i][1](DomFx_aaEvents[sID][sEvent][i][0],sEvent,DomFx_aaEvents[sID][sEvent][i][2]) )
						{
						}
						else
						{
						}
					}
					else
					{
						window.status = "'"+sEvent+"' event handler for '"+sID+"' element is not a function.";
					}
				}
			}
			else
			{
				window.status = "'"+sEvent+"' event is not handled by '"+sID+"' element.";
			}
		}
		else
		{
			if( !bElementEnabled )
			{
				window.status = "All events are disabled for '"+sID+"' element (including '"+sEvent+"')";
			}
			else if( !bElementEventEnabled )
			{
				window.status = "'"+sEvent+"' is disabled for '"+sID+"' element.";
			}
		}
	}
}

function DomFx_GetTargetOfElement(oSourceElement,sEvent)
{
	var sID;
	var oTargetElement = oSourceElement;
	if( oTargetElement != document.body )
	{
		var bContinue = true;
		while( bContinue )
		{
			if( oTargetElement == document.body )
			{
				bContinue = false;
			}
			else
			{
				if( oTargetElement == null )
				{
					bContinue = false;
				}
				else
				{
					if( DomFx_IsATarget(oTargetElement.id) )
					{
						oTargetElement = oTargetElement.parentElement;
					}
					else
					{
						bContinue = false;
					}
				}
			}
		}
		if( oTargetElement != document.body && typeof(DomFx_aaEvents[oTargetElement.id][sEvent]) != "undefined" )
		{
			sID = oTargetElement.id;
			DomFx_aElementsTargets[oSourceElement.id] = sID;
		}
	}
	return sID;
}

