/* These functions are adapted from one written by Simon Willison 
   (http://www.incutio.com/) and taken from Jeremy Keith's excellent book 
   "DOM Scripting", Friends of Ed, 2005
	 Event listener and event target functions come from James Edwards and
	 Cameron Adams' "The JavaScript Anthology", Sitepoint, 2006
*/
function addLoadEvent(p_fn) {
  var l_fnOldOnLoad = window.onload;
  if(typeof(window.onload) != "function") {
    window.onload = p_fn;
  }
  else {
    window.onload = function () {
      l_fnOldOnLoad();
      p_fn();
    }
  }
}

function addClickEvent(p_e, p_fn) {
	if(typeof(p_e) != 'undefined') {
	  var l_fnOldOnClick = p_e.onclick;
	  if(typeof(p_e.onclick) != "function") {
	    p_e.onclick = p_fn;
	  }
	  else {
	    p_e.onclick = function () {
	      l_fnOldOnClick();
	      p_fn();
	    }
	  }
	}
}

function addChangeEvent(p_e, p_fn) {
 if(typeof(p_e) != 'undefined') {
	 var l_fnOldOnChange = p_e.onchange;
	  if(typeof(p_e.onchange) != "function") {
	    p_e.onchange = p_fn;
	  }
	  else {
	    p_e.onchange = function () {
	      l_fnOldOnChange();
	      p_fn();
	    }
	  }
	}
}

function addResizeEvent(p_fn) {
  var l_fnOldOnResize = window.onresize;
  if(typeof(window.onresize) != "function") {
    window.onresize = p_fn;
  }
  else {
    window.onresize = function () {
      l_fnOldOnResize();
      p_fn();
    }
  }
}

function addLoadListener(p_fn) {
	if(typeof window.addEventListener != 'undefined') {
		window.addEventListener('load', p_fn, false);
	}
	else if(typeof document.addEventListener != 'undefined') {
	  document.addEventListener('load', p_fn, false);
	}
	else if(typeof window.attachEvent != 'undefined') {
		window.attachEvent('onload', p_fn);
	}
	else {
	  var l_fnOld = window.onload;
	  if(typeof window.onload != 'function') {
	    window.onload = p_fn;
	  }
	  else {
	  	window.onload = function() {
	  	  l_fnOld();
	  	  p_fn();
	  	}
	  }
	}
}

function attachEventListener(p_target, p_eventType, p_functionRef, p_capture) {
	
	if(typeof p_target.addEventListener != 'undefined') {
		p_target.addEventListener(p_eventType, p_functionRef, p_capture);
	}
	else if(typeof p_target.attachEvent != 'undefined') {
	  p_target.attachEvent('on' + p_eventType, p_functionRef);
	}
	else {
		p_eventType = 'on' + p_eventType;
		
		if(typeof p_target[p_eventType] == 'function') {
			var l_oldListener = p_target[p_eventType];
			p_target[p_eventType] = function() {
				l_oldListener();
				return p_functionRef();
			}
		}
		else {
			p_target[p_eventType] = p_functionRef;
		}
	}
}

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;
	
} // getEventTarget()


