/**
 *	EventListener - V1.00.050530 - may 30, 2005
 *	---------------------------------------------
 *	Author - Peter Nederlof
 *  Hacker - Martin Reurings
 *  Updated: Small change in the returned event object returned by
 *  attachElementEvent to accomodate a global removeListener. 
 */

function attachElementEvent(element, type, handler) {
	try {
		element.addEventListener(type, handler, false)
	} catch (e) { 
		if(element.attachEvent) { 
			element.attachEvent('on' + type, handler);
		} else { element['on' + type] = handler; }
	}	return {type:type, handler:handler, element:element};
}

function removeElementEvent(event) {
	var element = event.element;
	try {
		element.removeEventListener(event.type, event.handler, false);
	} catch (e) {
		if(element.detachEvent) {
			element.detachEvent('on' + event.type, event.handler);
		} else { element['on' + event.type] = null;	}
	}
}

var EventListener = {
	setListener:function(listener) { this.listener = listener; },
	addListener:function(type, handler) {
		return attachElementEvent(this.listener, type, handler);
	},

	removeListener:function(event) {
		removeElementEvent(event);
	},

	cancelEvent:function(event) {
		try {
			event.preventDefault();
			event.stopPropagation();
		} catch (e) {
			event.returnValue = false;
		}	return false;
	},

	invoke:function(listener) {
		for(var i in this) {
			listener[i] = this[i];
		}	listener.setListener(listener);
	}
}
	EventListener.invoke(window);
	EventListener.invoke(document);