/*
	Author:	Chris Phillips
	Date:	Aug. 21, 2006
	
	NOTE:
		Any events that you will broadcast or listen for 
		should be added to /Javascript/Event/Events.js
	
	Example Usage:
	
	<!-- The Event Manager Is Include In The Head Of The Agent Layout Already -->
	<script language="javascript" src="/Javascript/Event/_EventManager.js"></script>
	
	<!-- The Catalog Of Events Is Included Like This -->
	<script language="javascript" src="/Javascript/Event/Events.js"></script>
	
	<!-- Example Script -->
	<script type="text/javascript" language="javascript">
	// <![CDATA[
		
		// Add An Event Listener For The Event 'Task_Update'
		window.EventManager.addEventListener('Task_Update',function(event){alert('Event Handler One - ' + event.TaskID);});	
		// Add Another Event Listener For The Event 'Task_Update'
		window.EventManager.addEventListener('Task_Update',function(event){alert('Event Handler Two - ' + event.TaskID);});	
		
		// THE WAY IT SHOULD BE DONE
		function doStrict() {
			var TaskID = '#createUUID()#';
			// Example of using an actual Task_Update Event Object
			window.EventManager.dispatchEvent(new Task_Update(TaskID));
		}
		
		// THE HACK WAY IT CAN BE DONE
		function doLoose() {
			var TaskID = '#createUUID()#';
			// Example of using a generic Object that conforms to the Task_Update Event spec.
			window.EventManager.dispatchEvent({EventType:'Task_Update',TaskID:TaskID});
		}
	// ]]>
	</script>
	<button onclick="doStrict();">BroadCast Strict Event</button><br/>
	<button onclick="doLoose();">BroadCast Loose Event</button>
*/
function _EventManager() {
	
	this.listeners = new Object();
	
	_EventManager.prototype.addEventListener = function(types, callback) { 
		/* A list of EventTypes to listen for can be passed in */
		if (typeof types == "string") { 
			var types = types.split(","); 
		}
		/* Add the listener to the array for each EventType */
		for (var i=0; i<types.length; i++) { 
			var _type = types[i];
			if (typeof this.listeners[_type] == "undefined") { 
				this.listeners[_type] = []; 
			}
			this.listeners[_type].push(callback); 
		}
	}
	
	_EventManager.prototype.dispatchEvent = function(event) { 
		/* Each event carries with it it's type */
		var type = event.EventType;
		/* If there are listeners for this EventType, then call them. */
		if (typeof this.listeners[type] != "undefined") { 
			var listeners = this.listeners[type];
			for (var i=0; i<listeners.length; i++) { 
				var listener = listeners[i];
				listener.call(listener, event); 
			}
		} 
	}
	
}

/* MAKE SURE THIS WINDOW CONTAINS ONE EventManager */
if (typeof window.EventManager != 'object') {
	// alert('initializing window.EventManager.');
	window.EventManager = new _EventManager();
} else {
	// alert('window.EventManager is loaded.');
}