EventDispatcher = {
	listenerTable: [],
	
	implement: function(into){
		into.addListener = function(listener){
			EventDispatcher.addListener(listener, this);
		}
		into.removeListener = function(listener){
			EventDispatcher.removeListener(listener, this);
		}
		into.dispatch = function(event, params){
			EventDispatcher.dispatch(event, params, this);
		}
	},
	addListener: function(listener, subject){
		var child = this.findChild(subject);
		if(child)child.listeners.push(listener);
		else this.listenerTable.push({child:subject, listeners:[listener]});
	},
	removeListener: function(listener, subject){
		var child = this.findChild(subject);
		if(child){
			for(var x=0; x<child.listeners.length; x++){
				if(child.listeners[x]==listener)child.listeners.splice(x,1);
			}
		}
	},
	dispatch: function(event, params, subject){
		var x=0;
		var child = this.findChild(subject);
		if(child){
			while(x<child.listeners.length){
				var myListener = child.listeners[x]
				if(!myListener){
					child.listeners.splice(x,1);
					continue;
				}else x++;
				myListener[event].apply(myListener, params);
			}
		}
	},
	// private
	findChild: function(child){
		for(var x=0; x<this.listenerTable.length; x++){
			if(this.listenerTable[x].child==child)return this.listenerTable[x];
		}
	}
}