Event = {
	listeners: {},
	
	add: function (element, eventType, fn) {
		var wrapper = function (e) {
			e = Event.fix(e);
			return fn.apply(element, [e]);
		};
		Event.listeners[fn] = wrapper;
		
		if (element.attachEvent) {
			element.attachEvent("on" + eventType, wrapper);
		} else if (element.addEventListener) {
			element.addEventListener(eventType, wrapper, false);
		}
	},
	
	remove: function (element, eventType, fn) {
		var wrapper = Event.listeners[fn];
		if (! wrapper) {
			return;
		}
		
		if (element.detachEvent) {
			element.detachEvent("on" + eventType, wrapper);
		} else if (element.addEventListener) {
			element.removeEventListener(eventType, wrapper, false);
		}
		
		delete Event.listeners[fn];
	},
	
	fix: function(e) {
		e = e || window.event;
		e.preventDefault = e.preventDefault || function() {
			e.returnValue = false;
		};
		e.stopPropagation = e.stopPropagation || function() {
			e.cancelBubble = true;
		};
		
		return e;
	}
};