EventHandler = {
	addListener: function(element, type, callback, context)
	{
		var func;
		if(typeof(callback)=="function")
		{
			func = callback;
			//
		} else if(typeof(callback)=="string") {
			//console.log("add: "+element+"_"+type+"_"+callback);
			func = function(e){ context[callback](e); };
			EventHandler.Stack.addStack(element, type, callback, context, func);
			//
		} else {
			return;
		}
		if(element.addEventListener) element.addEventListener(type, func, false);
		else if(element.attachEvent) element.attachEvent("on"+type, func);
	},
	removeListener: function(element, type, callback, context)
	{
		if(!typeof(callback)=="string") return;
		//console.log("remove: "+element+"_"+type+"_"+callback);
		var num = EventHandler.Stack.findStack(element, type, callback, context);
		var func = EventHandler.Stack.getStack(num).func;
		EventHandler.Stack.removeStack(num);
		
		if(func==null) return;
		if(element.removeEventListener) element.removeEventListener(type, func, false);
		else if(element.detachEvent) element.detachEvent("on"+type, func);
	}
}
EventHandler.Stack = {
	_count: 0,
	_list: [],
	addStack: function(element, type, callback, context, func)
	{
		var obj = {
			id: EventHandler.Stack.getUID(),
			element: element,
			type: type,
			callback: callback,
			context: context,
			func: func
		};
		EventHandler.Stack._list.push(obj);
	},
	removeStack: function(num)
	{
		EventHandler.Stack._list.splice(num, 1);
	},
	getStack: function(num)
	{
		return EventHandler.Stack._list[num];
	},
	findStack: function(e, t, cb, ct)
	{
		for(var i=0; i<EventHandler.Stack._list.length; i++)
		{
			var s = EventHandler.Stack._list[i];
			if(s.element==e&&s.type==t&&s.callback==cb&&s.context==ct)
			{
				return i;
			}
		}
		return null;
	},
	getUID: function()
	{
		//console.log(EventHandler.Stack._count);
		return EventHandler.Stack._count++;
	}
}
