/* 
 * Version 1.1 - 18th July 2006
 * -----------------------------------------
 * Changes: added detachEventLister function - JB
 
  * Version 1.2 - 2nd August 2006
 * -----------------------------------------
 * Changes: added if (target) test to attachEventListener to prevent errors when this function is applied against a non-object 
 *  Added new function getEventType to return the type of event that was triggered- JB
 * 
 */

function addLoadListener(fn)
{
 if (typeof window.addEventListener != 'undefined')
 {
   window.addEventListener('load', fn, false);
 }
 else if (typeof document.addEventListener != 'undefined')
 {
   document.addEventListener('load', fn, false);
 }
 else if (typeof window.attachEvent != 'undefined')
 {
   window.attachEvent('onload', fn);
 }
 else
 {
   var oldfn = window.onload;
   if (typeof window.onload != 'function')
   {
     window.onload = fn;
   }
   else
   {
     window.onload = function()
     {
       oldfn();
       fn();
     };
   }
 }
}

function attachEventListener(target, eventType, functionRef, capture)
{
	if (target) {
	
		 if (typeof target.addEventListener != "undefined")
		 {
		   target.addEventListener(eventType, functionRef, capture);
		 }
		 else if (typeof target.attachEvent != "undefined")
		 {
		   target.attachEvent("on" + eventType, functionRef);
		 }
		 else
		 {
		   eventType = "on" + eventType;
		
		   if (typeof target[eventType] == "function")
		   {
			 var oldListener = target[eventType];
		
			 target[eventType] = function()
			 {
			   oldListener();
		
			   return functionRef();
			 };
		   }
		   else
		   {
			 target[eventType] = functionRef;
		   }
		 }
 }
}

function detachEventListener(target, eventType, functionRef, capture)
{
 if (typeof target.removeEventListener != "undefined")
 {
   target.removeEventListener(eventType, functionRef, capture);
 }
 else if (typeof target.detachEvent != "undefined")
 {
   target.detachEvent("on" + eventType, functionRef);
 }
 else
 {
   target["on" + eventType] = null;
 }
}

function getEventTarget(event)
{
 var targetElement = null;

 if (typeof event.target != "undefined")
 {
   targetElement = event.target;
 }
 else
 {
   targetElement = event.srcElement;
 }

 while (targetElement.nodeType == 3 &&
     targetElement.parentNode != null)
 {
   targetElement = targetElement.parentNode;
 }

 return targetElement;
}

function getCallingElement(event,elementTag){

	if (typeof event == "undefined")
	 {
	   event = window.event;
	 }
	
	 var target = getEventTarget(event);
	
	 while(target.nodeName.toLowerCase() != elementTag)
	 {
	   target = target.parentNode;
	 }
	
	 return target;
	
}

function getEventType(event){

	if (typeof event == "undefined")
	 {
	   event = window.event;
	 }
	
	 var type = (event.type);
	
	 return type;
	
}

function stopDefaultAction(event)
{
 event.returnValue = false;

 if (typeof event.preventDefault != "undefined")
 {
   event.preventDefault();
 }
}