var MyEventDispatcher = {};

if(window.MyEventDispatcher){
	
	//Listeners list
	MyEventDispatcher.listeners = { };
	
	/**
	 * Adds event listener	 
	 *
	 * @param event_type - name of the event to listen
	 * @param func - function to call on this event
	 * @param obj - if function is a method of the object - specify this object using this param
	 */
	MyEventDispatcher.addEventListener = function(event_type, func, obj){
		with(this){
			var item = {obj: obj, func: func};
		
			if(!listeners[event_type]){				
				listeners[event_type] = [item];
			}else {				
				var items = listeners[event_type];
				for(var i = 0; i < items.length; i++){
					if(items[i].obj){						
						if(items[i].func == func && items[i].obj == obj){
							return;
						}
					}else {						
						if(items[i].func == func){
							return;
						}
					}
					
				}			
				listeners[event_type].push(item);
			}
		}
	}
	
	/**
	 * Removes screenshot maker event listener	 
	 *
	 * @param event_type - name of the event to listen
	 * @param func - function to call on this event
	 * @param obj - if function is a method of the object - specify this object using this param
	 */
	MyEventDispatcher.removeEventListener = function(event_type, func, obj){
		with(this){		
			if(listeners[event_type]){				
				listeners[event_type] = [item];			
				var items = listeners[event_type];
				for(var i = items.length - 1; i >= 0 ; i++){
					if(items[i].obj){						
						if(items[i].func == func && items[i].obj == obj){
							delete items[i];
						}
					}else if(items[i].func == func){
						delete items[i];					
					}
				}			
			}
		}
	}
		
	/** 
	 * Dispatches screenshot maker event
	 * @param mixed event - name of the event / or object to dispatch
	 */
	MyEventDispatcher.dispatchEvent = function(event){
		with(this){
			var eobj;//Event object to dispatch
			
			if(typeof(event) == "string"){
				eobj = {type: event};
			}else {
				eobj = event;
			}
			
			var items = listeners[eobj.type];
			if(!items || !items.length){
				return;
			}
			
			for(var i = 0; i < items.length; i++){
				items[i].func.call(items[i].obj, eobj);
			}
		}
	}	
}