/**
 * 
 */
function EventDispatcher(){
	this.listeners = {};
}

/**
 * @param String eventType 
 * @param Function listener
 */
EventDispatcher.prototype.addEventListener = function(eventType, listener){
	if(typeof eventType == "string" && typeof listener =="function"){
		if(this.listeners[eventType]){
			if(this.getListenerIndex(eventType, listener)==-1){
				this.listeners[eventType].push(listener);
			}
		}else{
			this.listeners[eventType] = [listener];
		}
	}
}

/**
 * @param String eventType 
 * @param Function listener
 */
EventDispatcher.prototype.removeEventListener = function(eventType, listener){
	if(this.listeners[eventType]){
		var index = this.getListenerIndex(eventType, listener);
		if(index>-1 ){
			this.listeners[eventType].splice(index, 1);	
		}
	}
}

/**
 * @param String eventType 
 * @param Function listener
 * @return Boolean
 */
EventDispatcher.prototype.hasEventListener = function(eventType, listener){
	return typeof eventType == "string" 
		&& typeof listener == "function" 
		&& this.listeners[eventType]
		&& this.getListenerIndex(eventType, listener) != -1;
}

/**
 * @param String event 
 */
EventDispatcher.prototype.dispatchEvent = function(event){
	if(event && this.listeners[event.type]){
		var listeners = this.listeners[event.type];
		for(var i=0; i<listeners.length; i++){
			listeners[i](event);
		}
	}
}

/**
 * @private 
 */
EventDispatcher.prototype.getListenerIndex = function(eventType, listener){
	var listeners = this.listeners[eventType];
	for(var i=0; i<listeners.length; i++){
		if(listeners[i]==listener){
			return i;
		}
	}
	return -1;
}

