﻿var Listener;

if(window.addEventListener){
	Listener = {
		add : function(node,type,func){
			node.addEventListener(type,func,false);		
		},
		remove : function(node,type,func){
			node.removeEventListener(type,func,false);
		},
		addCapture : function(node,type,func){
			node.addEventListener(type,func,true);
		},
		removeCapture : function(node,type,func){
			node.removeEventListener(type,func,true);
		}
	}
}
else if(window.attachEvent){
	Listener = {
		add : function(node,type,func){
			if(Listener._search(node,type,func) != -1) return ;
			
			var wrap = function(e){
				if(!e) e = window.event;
							
				var event = {
					ieevent : e,
					type : e.type,
					target : e.srcElement,
					eventPhase : (e.srcElement == node)?2:3,
					currentTarget : node,
					relatedTarget : e.fromElement?e.fromElement:e.toElement,
					preventDefault : function(){this.ieevent.returnValue = false;},
					stopPropagation : function(){this.ieevent.cancelBubble = true;},
					screenX : e.screenX , screenY : e.screenY ,
					clientX : e.clientX , clientY : e.clientY ,
					ctrlKey : e.ctrlKey , shiftKey : e.shiftKey , altKey : e.altKey
				};
				
				if(Function.prototype.call) func.call(node,event);
				else {
					node._f = func;
					node._f(event);
					delete node._f;			
				}
			}
			node.attachEvent("on" + type,wrap);
			
			var data = {
				toString : function(){return "[ListenerData Object]"},
				node : node,
				type : type,
				func : func,
				wrap : wrap
			}; 
			
			var id = Listener._uid();
			if(!Listener.collection) Listener.collection = {};
			Listener.collection[id] = data ;
		},
		remove : function(node,type,func){
			var id = Listener._search(node,type,func);
			if(id == -1) return ;
			
			var data = Listener.collection[id];
			data.node.detachEvent("on" + data.type,data.wrap);
	
			delete Listener.collection[id];
		},
		addCapture : function(node,type,func){
		
		},
		removeCapture : function(node,type,func){
		
		},
		_search : function(node,type,func){
			var value = -1 ;
			if(!Listener.collection) return value ;
			
			for(var prop in Listener.collection){
				if(Listener.collection[prop].node != node) continue ;
				if(Listener.collection[prop].type != type) continue ;
				if(Listener.collection[prop].func != func) continue ;
				value = prop ;
			}
			return value;
		},
		_uid : (function(){
			var count = 0 ;
			return function(){return "id" + count++};
		})()
	}
	
	window.attachEvent("onunload",function(){
		for(var id in Listener.collection){
			var data = Listener.collection[id];
			data.node.detachEvent("on" + data.type,data.wrap);
		}
		delete Listener.collection;
	});
}