var EventManager = {

	_events: [],

	addListener: function(element, eventType, callback, opts) {
		var eventHandler = function(evt){
			if(!evt){
				var evt = window.event;
			}
			if(evt.target) evt.srcElement = evt.target;
			if(!evt.stopPropagation) evt.stopPropagation = function(){this.cancelBubble = true;}
			if(!evt.preventDefault) evt.preventDefault = function(){this.returnValue = false;}
			
			var scope = opts && opts.scope ? opts.scope : element;
			var args = opts && opts.args ? [evt].concat(opts.args) : [evt];
			
			callback.apply(scope, args);
		};
		
		if (element.addEventListener) {
			element.addEventListener(eventType, eventHandler, false);
		} else if (element.attachEvent) {
			element.attachEvent('on' + eventType, eventHandler);
		} else {
			return false;
		}
		var evtInfo = {el:element, et:eventType, eh:eventHandler};
		this._events.push(evtInfo);
		return evtInfo;
	},
	
	removeListener: function(evtInfo){
		with(evtInfo){
			if (el.removeEventListener){
				el.removeEventListener(et, eh, false);
				eh = null;
			}
			else if (el.detachEvent){
				el.detachEvent("on" + et, eh);
				eh = null;
			}	
		}
	},
	
	unload: function(){
		for(var x = 0; x < this._events.length; x++){
			this.removeListener(this._events[x]);
		}
		this._events = null;
	}
};
EventManager.addListener(window,'unload',EventManager.unload,{scope:EventManager});