Function.prototype.bind = function(object) {
    var method = this; return function() {
        return method.apply(object, arguments);
    }; 
};

function EventBroadcaster() {
    this.x = {};
    this.events = [];
    this.builtinEvts = [];
}

EventBroadcaster.prototype.getActionIdx = function(obj, evt, action, binding) {
    if (obj && evt) {
        var curel = this.events[obj][evt];
        if (curel) {
            var len = curel.length;
            for (var i = len - 1; i >= 0; i--) {
                if (curel[i].action == action && curel[i].binding == binding) {
                    return i;
                } 
            } 
        }
        else { return -1; } 
    } return -1;
};

EventBroadcaster.prototype.addListener = function(evt, action, binding) {
    obj = this;
    if (this.events[obj]) {
        if (this.events[obj][evt]) {
            if (this.getActionIdx(obj, evt, action, binding) == -1) {
                var curevt = this.events[obj][evt];
                curevt[curevt.length] = { action: action, binding: binding };
            }
        } else {
            this.events[obj][evt] = [];
            this.events[obj][evt][0] = {action: action, binding: binding};
        } 
    }
    else {
        this.events[obj] = [];
        this.events[obj][evt] = [];
        this.events[obj][evt][0] = { action: action, binding: binding };
    } 
};
    
EventBroadcaster.prototype.removeListener = function(obj, evt, action, binding) {
    obj = this;
    if (this.events[obj]) {
        if (this.events[obj][evt]) {
            var idx = this.actionExists(obj, evt, action, binding);
            if (idx >= 0) {
                this.events[obj][evt].splice(idx, 1);
            } 
        } 
    } 
};

EventBroadcaster.prototype.fireEvent = function(evt, e, args) {
    obj = this;
    if (!e) { e = window.event; }
    if (obj && this.events) {
        var evtel = this.events[obj];
        if (evtel) {
            var curel = evtel[evt];
            if (curel) {
                for (var act in curel) {
                    var action = curel[act].action;
                    if (curel[act].binding) {
                        action = action.bind(curel[act].binding);
                    }
                    action(e, args);
                } 
            } 
        } 
    } 
};
                    