// basic  class that allows declaring, subscribing and firing custom events
// TODO - extend/modify

(function(){
  
  var E = {
    
    addEventListener:function(name,handler){
      
      if (!name || typeof name != 'string' || !handler || typeof handler != 'function')    
        return false;
      
      if (this.events === undefined)
        this.events = [];
        
      if (!this.events[name])
        this.events[name] = [];
        
      Array.prototype.push.call(this.events[name],handler);
      return true;
    },
    
    removeEventListener:function(name,handler){
      if (this.events === null || !name || typeof name != 'string' || !handler || typeof handler != 'function' || !this.events[name])    
        return false;
      var arr = this.events[name];
      var i = $.inArray(handler,arr);
      if (i > -1) {
        Array.prototype.splice.call(arr,i,1);
        return true;
      }
      else
        return false;
      
    },
    
    declareEvent:function(){
      
      if (this.events === undefined)
        this.events = [];
      
      for (var i = 0; i < arguments.length; i++)
        if (typeof arguments[i] == 'string' && !this.events[name])
          this.events[name] = [];
    },
    
    dispatchEvent:function(name, args){
      if (this.events === undefined || !name || typeof name != 'string' || !this.events[name])    
        return false;
      
      if (!args) args = [];
        
      var arr = this.events[name];
      var l = arr.length;
      var i = 0;
      
      for (i = 0 ; i<l; i++ )
        arr[i].apply(this,args);
      
      return true;
    },
    
    clearEventListeners:function(name){
      if (this.events === undefined || !name || typeof name != 'string' || !this.events[name])    
        return false;
      
      this.events[name] = null;
    }
  }
  
  this.EventStatic = Class.create(E,{});

  this.Event = Class.create({},E,[Base]);
  
})();