	
	function addEvent(elm, evType, fn, useCapture) 
	{
		if (elm.addEventListener) { 
		elm.addEventListener(evType, fn, useCapture); 
		return true; 
		}
		else if (elm.attachEvent) { 
		var r = elm.attachEvent('on' + evType, fn); 
		EventCache.add(elm, evType, fn);
		return r; 
		}
		else {
		elm['on' + evType] = fn;
		}
	}
	
	
	function getEventSrc(e) 
	{
		if (!e) 
			e = window.event;	
			
		if (e.originalTarget)
			return e.originalTarget;
			
		else if (e.srcElement)
			return e.srcElement;
	}
	
	
	function addLoadEvent(func) 
	{		
		var oldonload = window.onload;
		
		if (typeof window.onload != 'function') 
			window.onload = func;
		else 
			window.onload = function() {oldonload();func();}
	}
	
	var EventCache = function()
	{
		var listEvents = [];
		
		return {
			listEvents : listEvents,
		
			add : function(node, sEventName, fHandler, bCapture){
				listEvents.push(arguments);
			},
		
			flush : function()
			{
				var i, item;
				
				for(i = listEvents.length - 1; i >= 0; i = i - 1)
				{
					item = listEvents[i];
					
					if(item[0].removeEventListener)
					{
						item[0].removeEventListener(item[1], item[2], item[3]);
					};
					
					/* From this point on we need the event names to be prefixed with 'on" */
					if(item[1].substring(0, 2) != "on")
					{
						item[1] = "on" + item[1];
					};
					
					if(item[0].detachEvent)
					{
						item[0].detachEvent(item[1], item[2]);
					};
					
					item[0][item[1]] = null;
				};
			}
		};
	}();
	
	
	addEvent(window,'unload',EventCache.flush, false);
