function addEvent(elem, type, handler) {
	//assign each event a unique id
	if(!handler.$$guid){
		handler.$$guid = addEvent.guid++;
	}
	//create hash table of event types for this element
	if (!elem.events) {
		elem.events = {};
	}
	//create hash table of event handlers for each element/event pair
	var handlers = elem.events[type];
	if (!handlers) {
		handlers = elem.events[type] = {};
		
		//store the existing event handler if there is one
		if (elem["on" + type]) {
			handlers[0] = elem["on" + type];
		}
	}
	//store the event handler in a hash table
	handlers[handler.$$guid] = handler;
	
	//assign a global event handler to do all the work
	elem["on" + type] = handleEvent;
}

addEvent.guid = 1;

function removeEvent(elem, type, handler) {
	//remove event from hash table
	if (elem.events && elem.events[type]) {
		delete elem.events[type][handler.$$guid];
	}
}

function handleEvent(event) {
	var returnValue = true;
	//grab event object (IE)
	event = event || fixEvent(window.event);
	
	//get reference to hash table of handlers
	var handlers = this.events[event.type];
	
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		if (this.$$handleEvent(event) === false) {
			returnValue = false;
		}
	}
	
	return returnValue;
}

//Add missing methods to IE
function fixEvent(event) {
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
}

fixEvent.preventDefault = function() {this.returnValue = false;};
fixEvent.stopPropagation = function() {this.cancelBubble = true;};
