var Event = function () {
	var listeners = [];
	
	return {
		addEvent: function(el, eventType, fn, scope) {
			if (this._isCollection(el)) {
				var isOk = true;
				for (var i=0; i< el.length; ++i) {
						isOk = ( this.addEvent(el[i], eventType, fn, scope) && isOk );
				}
				return isOk;
			
			}
			else if (typeof el == "string") {
				el = document.getElementById(el);
			}
			
			if (!el) {
					return false;
			}
			
			var wrappedFn = function(e) {
				return fn.call(el,e,scope);
			};

			var li = [el, eventType, fn, wrappedFn, scope];
			var index = listeners.length;
			listeners[index] = li;
			
			if (el.addEventListener) {
				el.addEventListener(eventType, wrappedFn, false);
			} else if (el.attachEvent) {
				el.attachEvent("on"+eventType, wrappedFn);
			}
			wrappedFn = null;
			return true;
		},
		removeEvent: function(el, eventType, fn) {
			if (this._isCollection(el)) {
				var isOk = true;
				for (var i=0; i< el.length; ++i) {
						isOk = ( this.removeEvent(el[i], eventType, fn) && isOk );
				}
				return isOk;
			
			}
			else if (typeof el == "string") {
				el = document.getElementById(el);
			}

			var cacheItem = null;
			var index = this._getCacheIndex(el, eventType, fn);

			if (index >= 0) {
					cacheItem = listeners[index];
			}

			if (!el || !cacheItem) {
					return false;
			}
			
			var cachedFunction = cacheItem[3];
			
			if (el.removeEventListener) {
					el.removeEventListener(eventType, cachedFunction, false);
			} else if (el.detachEvent) {
					el.detachEvent("on" + eventType, cachedFunction);
			}
			
			delete listeners[index][3];
			delete listeners[index][2];
			delete listeners[index];
			
			return true;
		},
		stopEvent: function(ev) {
				this.stopPropagation(ev);
				this.preventDefault(ev);
		},
		
		stopPropagation: function(ev) {
				if (ev.stopPropagation) {
						ev.stopPropagation();
				} else {
						ev.cancelBubble = true;
				}
		},
		preventDefault: function(ev) {
				if (ev.preventDefault) {
						ev.preventDefault();
				} else {
						ev.returnValue = false;
				}
		},		
		getPageX: function(el) {
			return this.getPageXY(el).pageX;
		},
		
		getPageY: function(el) {
			return this.getPageXY(el).pageY;
		},
		
		getPageXY: function(elem) {
			var offsetTrail = elem;
			var offsetLeft = 0;
			var offsetTop = 0;
			while (offsetTrail) {
					offsetLeft += offsetTrail.offsetLeft;
					offsetTop += offsetTrail.offsetTop;
					offsetTrail = offsetTrail.offsetParent;
			}
			if (navigator.userAgent.indexOf("Mac") != -1 && 
					typeof document.body.leftMargin != "undefined") {
					offsetLeft += parseInt(document.body.leftMargin);
					offsetTop += parseInt(document.body.topMargin);
			}
			return {pageX:offsetLeft, pageY:offsetTop};
		},
		removeAllEvents: function(el,obj) {
			
			if (listeners && listeners.length > 0) {
				for (var i = 0; i < listeners.length; ++i) {
					var l = listeners[i];
					if (l) {
						obj.removeEvent(l[0], l[1],l[2]);
					}
				}
				listeners = null;
			}
		},
		getListeners: function() {
			return listeners;
		},
		_getCacheIndex: function(el, sType, fn) {
				for (var i=0; i< listeners.length; ++i) {
						var li = listeners[i];
						if ( li           &&
								 li[2] == fn  &&
								 li[0] == el  &&
								 li[1] == sType ) {
								return i;
						}
				}
				return -1;
		},
		_isCollection: function(obj) {
			return ( obj										&&
							 obj.length							&&
							 typeof obj != "string"	&&
							 !obj.tagName						&&
							 !obj.alert							&&
							 typeof obj[0] != "undefined");
		}
	};
} ();

//Event.addEvent(window,"unload",Event.removeAllEvents,Event);
