// JavaScript Document
/**
 * @author    Matthew Foster
 * @date    June 6th 2007
 * @purpose   To have a base class to extend subclasses from to inherit event dispatching functionality.
 * @procedure Use a hash of event "types" that will contain an array of functions to execute.  The logic is if any function explicitally returns false the chain will halt execution.
 */
var EventDispatcher = Class.create( {});

Object.extend(EventDispatcher.prototype, {

  buildListenerChain: function() {

    if(!this.listenerChain)
      this.listenerChain = {};

  },
  addEventListener: function(type, listener) {

    this.buildListenerChain();

    if(!this.listenerChain[type])
      this.listenerChain[type] = [ listener ];
    else
      this.listenerChain[type].push(listener);

  },
  hasEventListener: function(type) {

    return(typeof this.listenerChain[type] != "undefined");

  },
  removeEventListener: function(type, listener) {
    if(!this.hasEventListener(type))
      return false;

    for( var i = 0; i < this.listenerChain[type].length; i++)
      if(this.listenerChain[type][i] == listener)
        this.listenerChain[type].splice(i, 1);

  },
  dispatchEvent: function(type, args) {
    this.buildListenerChain();

    if(!this.hasEventListener(type))
      return false;

    this.listenerChain[type].any(function(f) {
      return(f(args) == false ? true : false);
    });
  },
  on: function(type, listener) {
    this.addEventListener(type, listener);
  },
  fire: function(type, args) {
    this.dispatchEvent(type, args);
  }
}

);