/*
	Utility functions for working with JS events.
	
	Based on code from http://blog.keithpatton.com/CommentView,guid,ea20813e-f68b-47ad-a2a9-8ef390adfe1d.aspx
	and http://simonwillison.net/2004/May/26/addLoadEvent/)
*/

// event worker object constructor
function EventUtils()
{
	this.addHandler = EventUtils.addHandler;
}
EventUtils.addHandler =
	function (objRefOrID, eventName, func) 
	{
		// Adds a new event handler to an event, maintaining any existing handlers already assigned.
		//	 objRefOrID: either an object reference or a DOM ID string
		//	 eventName: the event name to attach to (without the "on", e.g. for click event use "click")
		//	 func: a function pointer to the event handler to run
		
		var obj = null;
		var eventRef;
		var eventHandlers;

		try 
		{
			if (typeof objRefOrID == "object")
				obj = objRefOrID;
			else if (objRefOrID == "window")
				obj = window;
			else if (objRefOrID == "document")
				obj = document;
			else
				obj = document.getElementById(objRefOrID);
				
			if (obj == null)
				throw("Invalid object reference.");

			eventRef = "obj.on" + eventName;
			eventHandlers = eval(eventRef);
			
			if (typeof eventHandlers == "function") // not first handler
				eval(eventRef + " = function(event) {eventHandlers(event); func(event);}");  
			else // first handler
				eval(eventRef + " = func;");
		}
		catch (err)
		{
			/* Debug statements 
			var objID = "unknown";
			if (typeof objRefOrID == "string")
				objID = objRefOrID;
			else if ((typeof obj == "object") && (obj != null))
				objID = obj.id;

			alert("While adding handler to '" + objID + "." + eventName + "': " + err.description);
			*/
		}
	}
	
// Use EventUtils like:
// EventUtils.addHandler("window", "load", someEventHandler);
// function someEventHandler(e) { 
//	  if (!e) e = window.event; 	
// }
