function add_event(elem, event_type, handler){
	if(document.addEvent){
		elem.addEvent(event_type, handler);
	}
	else{
		if(!elem.eventHandlers) elem.eventHandlers = [];
		if(!elem.eventHandlers[event_type]){
			elem.eventHandlers[event_type] = [];
			if(elem['on' + event_type]) elem.eventHandlers[event_type].push(elem['on' + event_type]);
			elem['on' + event_type] = handle_event;
		}
		elem.eventHandlers[event_type].push(handler);
	}
}

function remove_event(elem, event_type, handler){
	if(document.removeEvent){
		elem.removeEvent(event_type, handler);
	}
	else{
		var handlers = elem.eventHandlers[event_type];
		for (var i in handlers) if(handlers[i] == handler) delete handlers[i];
	}
}

function handle_event(e){
	var return_value = true;
	
	if(!e) e = fix_event(event);

	var handlers = this.eventHandlers[e.type]

	for(var i in handlers){
		this.$$handle_event = handlers[i];
		return_value = !((return_value && this.$$handle_event(e)) === false);
	}
	
	return return_value;
}

function fix_event(e){
	//add W3C standard event methods
	e.prevent_default = fix_event.prevent_default;
	e.stop_propagation = fix_event.stop_propagation;
	return event;
};

fix_event.prevent_default = function(){
	this.returnValue = false;
};

fix_event.stop_propagation = function(){
	this.cancelBubble = true;
};