//Implementation:
//  Create a class for the custom event, and create the actual event:
//    var ConfigEvent = {};
//    ConfigEvent.DATA_LOADED = "dataloaded";

//  1. Attach an event listener: Events.addEventListener(ConfigEvent.DATA_LOADED, Config.dataLoaded, Config);
//  2. Dispatch the event: Events.dispatchEvent(ConfigEvent.DATA_LOADED);    

var Events = {
  _listeners: [],
    
  //Add an event listener
  addEventListener: function(oEvent, oAction, oTarget, oInstance) { 
    this._listeners.push({
      event: oEvent,
      action: oAction,
      target: oTarget,
      instance: ((typeof(oInstance) == 'undefined') ? 'Global' : oInstance)
    });
  },
  
  //Remove an event listener
  removeEventListener: function(oEvent, oInstance) {
    for (var i=0; i<this._listeners.length; i++) {
      if (this._listeners[i].event == oEvent) {
	oInstance = ((typeof(oInstance) == 'undefined') ? 'Global' : oInstance)
        if(oInstance == this._listeners[i].instance) this._listeners.splice(i, 1);
      }
    }
  },
    
  //Dispatch an event listener
  dispatchEvent: function(oEvent, oInstance) {
    for (var i=0; i<this._listeners.length; i++) {
      if (this._listeners[i].event == oEvent) {
	oInstance = ((typeof(oInstance) == 'undefined') ? 'Global' : oInstance);
        if(oInstance == this._listeners[i].instance || oInstance == 'Global') this._listeners[i].action.call(this._listeners[i].target, oEvent);
      }
    }
  }
}
