/*************************************************************
 *************************************************************
 * vxEventManager.js
 * 
 * Handles inter-object communication of data and events, and
 * allow subscription to events.
 *************************************************************
 *************************************************************/
 
 var _registeredObjects = {};
 var _registeredFunctions = [];
 var _listeners = {};
 
 function vxBoredcast(event)
 {
	for(var p in event)
	{
		debug("vxBoredcast: " + p + ": " + event[p]);
	}
 }
 
/*************************************************************
 *
 * vxBroadcast(eventType:String, payload:Object, source:String)
 *
 * Dispatches an event to all subscribed components.
 *
 *************************************************************/
 function vxBroadcast(eventType, payload, source) //(string, obj, string)
 {
	debug("vxBroadcast: " + eventType + ": source: " + source);	
	
	for(var p in payload)
	{
		debug("   " + p + ": " + payload[p]);
	}
	for(var p in _listeners[eventType])
	{
		debug("vxBroadcast: dispatching event: " + eventType + " to: " + p);
		getObjectByName(p).vxAPI(eventType, payload);
	}
	/*
	for(var i = 0; i < _registeredObjects.length; i++)
	{
		//Calling the vxAPI method on all registered objects (apart from source)
		if(_registeredObjects[i].name != source)
		{
			debug("vxBroadcast: dispatching event: " + eventType + " to: " + _registeredObjects[i].name);
			getObjectByName(_registeredObjects[i].name).vxAPI(eventType, payload);
		}
	}
	*/
	for(var p in _registeredFunctions[eventType])
	{
		_registeredFunctions[eventType][p](eventType, payload, source);
	}
 }
 
 /*************************************************************
 *
 * addSubscription(eventType:String, componentId:String)
 *
 * Called from within all KIT VX components when a child element
 * subscribes for an event. (So that only subscribed events are
 * dispatched to a Component.
 *
 *************************************************************/
 function addSubscription(eventType, componentId)
 {
	 if(!_listeners[eventType])
	 {
		_listeners[eventType] = {};
	 }
	_listeners[eventType][componentId] = true;
 }
 
  /*************************************************************
 *
 * removeSubscription(eventType:String, componentId:String)
 *
 * Called from within all KIT VX components when all child elements
 * have requested to stop listening for an event.
 *
 *************************************************************/
 function removeSubscription(eventType, componentId)
 {
	delete _listeners[eventType][componentId];
 }
 
 
/*************************************************************
 *
 * registerObject(name:String)
 *
 * Called from within all KIT VX components at init() to
 * register as subscribers to all events (via vxBroadcast)
 *
 *************************************************************/
 function registerObject(componentId, ready)
 {
	debug("registerObject: " + componentId + ": ADDED");
	_registeredObjects[componentId] = ready;
	
	/*
	_registeredObjects.push({
								name:name,
								ready:ready
							});
	*/
 }
 
/*************************************************************
*
* onComponentReady
*
* Dispatched from within all KIT VX components when the object
* is initialized and ready to receive events.
*
*************************************************************/
 function onComponentReady(eventType, payload, source)
 {
	debug("onComponentReady: " + source);
	_registeredObjects[source] = true;
	/*
	for(var i = 0; i < _registeredObjects.length; i++)
	{
		if(_registeredObjects[i].name == source)
		{
			_registeredObjects[i].ready = true;
		}
	}
	*/
	if(allRegisteredObjectsReady())
	{
		debug("onComponentReady: " + vxEvents.APPLICATION_INITIALIZED);
		vxBroadcast(vxEvents.APPLICATION_INITIALIZED, {}, "vxEventManager.js");
	}
	
 }
 
 
/*************************************************************
*
* allRegisteredObjectsReady()
*
* Returns true if all KIT VX components that have registered
* have declared themselves 'ready'.
*
*************************************************************/
 function allRegisteredObjectsReady()
 {
	for(var p in _registeredObjects)
	{
		if(!_registeredObjects[p])
		{
			return false;
		}
	}
	 /*
	for(var i = 0; i < _registeredObjects.length; i++)
	{
		if(!_registeredObjects[i].ready)
		{
			return false;
		}
	}
	*/
	return true;
 }
 
 
/*************************************************************
 *
 * addEventListener(eventType:String, callbackFunction:Function)
 *
 * Subscribes a function (callbackFunction) as a listener for
 * an event (eventType).
 *
 *************************************************************/
 function addEventListener(eventType, callbackFunction)
 {
	debug("addEventListener: " + eventType);
	for(var p in _registeredFunctions[eventType])
	{
		if(_registeredFunctions[eventType][p]) //if function is already registered for event
		{
			return;
		}
	}
	if(!_registeredFunctions[eventType]) //if no listeners for that event
	{
		_registeredFunctions[eventType] = [];
	}
	//debug("addEventListener: eventType: " + eventType + ": " + callbackFunction);
	_registeredFunctions[eventType].push(callbackFunction);
 }
 
 /*************************************************************
 *
 * removeEventListener(eventType:String, callbackFunction:Function)
 *
 * Unsubscribes a function (callbackFunction) as a listener for
 * an event (eventType).
 *
 *************************************************************/
 function removeEventListener(eventType, callbackFunction)
 {
	for(var p in _registeredFunctions[eventType])
	{
		if(_registeredFunctions[eventType][p])
		{
			delete _registeredFunctions[eventType][p];
		}
	}
 }
 
/*************************************************************
 *
 * getObjectByName(name:String)
 *
 * Returns a reference to and object on the page.
 * Used to allow us to call a function on a flash-swf.
 *
 *************************************************************/
 function getObjectByName(name)
 {
	if(window.document[name])
	{
		return window.document[name];
	}
	return document.getElementById(name);
 }