var Event = (function(){
	var ev = {};
	
	// Cross Browser Add Event Function
	ev.addEvent = function( obj, evname, fn ) {
		//console.log("Name: " + evname + ", Function: " + fn.name);
		if(evname=="load" && obj == window && window.registerOnLoadHandler) {
			registerOnLoadHandler(fn);
			EventCache.add(obj, evname, fn);
			return;
		}
		if (obj.addEventListener) {
			obj.addEventListener( evname, fn, false );
			EventCache.add(obj, evname, fn);
		}
		else if (obj.attachEvent) {
			obj["e"+evname+fn] = fn;
			obj[evname+fn] = function() { obj["e"+evname+fn]( window.event ); }
			obj.attachEvent( "on"+evname, obj[evname+fn] );
			EventCache.add(obj, evname, fn);
		}
		else {
			obj["on"+evname] = obj["e"+evname+fn];
		}
	}; 
	
	ev.cancelEvent = function(e){
		if(!e) var e = window.event;
		if(typeof e=='undefined') return false;
		e.returnValue=false; 
		if(typeof(e.preventDefault)!='undefined') e.preventDefault();
		return false;
	};
	
	ev.EventCache = function(){
		var listEvents = [];
		return {
			listEvents : listEvents,
			add : function(node, sEventName, fHandler){
				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]);
					};
					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;
				};
			}
		};
	}();
	
	ev.getEvent = function(e) {
		return (e?e:window.event);
	}
	
	ev.getElementFromEvent = function(e){
		if(!e) var e = window.event; 
		if(e.target) return e.target;
		return e.srcElement;
	};
	
	ev.getKeyFromEvent = function(e) {
		if(!e) var e = window.event;    
		if (e.keyCode) return e.keyCode;
		if (e.which) return code = e.which;
	};
	
	// Get the Mouse position of an event.
	ev.getMouseX = function(e) {
		if(!e) var e = window.event;   
		if(e.pageX) return e.pageX;
		if(e.clientX) return e.clientX+ev.getScrollLeft();
		return null;
	};	
	ev.getMouseY = function(e) {
		if(!e) var e = window.event;
		if (e.pageY) return e.pageY;
		if (e.clientY) return e.clientY+ev.getScrollTop();
		return null;
	};
		
	ev.getScrollTop = function() {
		if (document.documentElement && document.documentElement.scrollTop && document.documentElement.scrollTop>0) {
			return document.documentElement.scrollTop;
		}
		if (document.body && document.body.scrollTop) { return document.body.scrollTop;	}
		return null;
	};
	
	ev.getScrollLeft = function() {
		if (document.documentElement && document.documentElement.scrollLeft && document.documentElement.scrollLeft>0) {
			return document.documentElement.scrollLeft;
		}
		if (document.body && document.body.scrollLeft) { return document.body.scrollLeft; }
		return null;
	};
	
	// Remove an event.
	ev.removeEvent = function(obj, evname, fn) {
		if (obj.detachEvent) { 
			obj.detachEvent("on"+evname, fn);
			try{ obj.detachEvent("on"+evname, obj[evname+fn] ); } catch(e) {}
			obj[evname+fn] = null;
		} else if (obj.removeEventListener) {
			obj.removeEventListener(evname, fn, false);
		} else {
			obj["on" + evname] = null;
		}
	};
	ev.cancelBubble = function(e) {
		if(!e) var e = window.event; 
		if (typeof(e.stopPropagation)=="function") { e.stopPropagation(); } 
		if (defined(e.cancelBubble)) { e.cancelBubble = true; }
	};
	ev.stopPropagation = ev.cancelBubble;
	
	return ev;
})();

function getElementFromEvent(event){
	if(event.target){
		element =  event.target;
	}
	else{
		element =  event.srcElement;
	}
	
	return element;
}

// Make functions public.
addEvent=Event.addEvent;
cancelEvent=Event.cancelEvent;
getElementFromEvent=Event.getElementFromEvent;
getKeyFromEvent=Event.getKeyFromEvent;
getMouseX=Event.getMouseX;
getMouseY=Event.getMouseY;
getEvent=Event.getEvent;
removeEvent=Event.removeEvent;
EventCache=Event.EventCache;

addEvent(window, 'unload', EventCache.flush);