function EventDispatcher () {
  
  this.dispatchEvent = EventDispatcher_dispatchEvent;
  this.addEventListener = EventDispatcher_addEventListener;
  this.removeEventListener = EventDispatcher_removeEventListener;
}

EventDispatcher.initialize = function (object) {

  // singleton
  if (EventDispatcher.instance == undefined)
    EventDispatcher.instance = new EventDispatcher();
  
  var dispatcher = EventDispatcher.instance;
  
  object.listeners = new Array();
  object.dispatchEvent = dispatcher.dispatchEvent;
  object.addEventListener = dispatcher.addEventListener;
  object.removeEventListener = dispatcher.removeEventListener;
};

/**
  send events to all listeners registered to type event. Multiple parameters
  are allowed to be send
*/
function EventDispatcher_dispatchEvent (type) {
  
  var params = "";
  var list = this.listeners[type];
  
  if (list != undefined) {
    // create a comma seperated string with arguments
    var argumentsCount = arguments.length;
    if (argumentsCount > 1) {
      for (i = 1;i < argumentsCount;i++) {
        if (i > 1)
          params += ",";
        params += "arguments["+i+"]"; // when this is evaluated below it will produce multiple parameters
      }
    }
    var listLen = list.length;
    for (j = 0; j < listLen; j++) {
      // only send if the method exists
      if (list[j].receiver[list[j].method] != undefined)
        eval("list[j].receiver[\""+list[j].method+"\"]("+params+")");
    }
  }
}

/**
  adds object as a listener of event type
*/
function EventDispatcher_addEventListener (type,object,handler) {

  var event = new Object();
  event.receiver = object;
  event.method = (handler == undefined) ? type : handler;

  if (this.listeners[type] == undefined)
    this.listeners[type] = new Array();
  
  this.removeEventListener(type,object);
  this.listeners[type].push(event);
}

/**
  removes object as a listener of event type
*/
function EventDispatcher_removeEventListener (type,object) {

  var list = this.listeners[type];
  
  if (list != undefined) {
    var listLen = list.length;
    if (listLen > 0)
      for (i = 0;i < listLen;i++)
        if (list[i].receiver == object)
          list.splice(i,1);
  }
}