/**
 * @namespace GlobalResources
 * @requires /js/common.js
 */

/**
 * Класс для обработки событий
 */
GlobalResources.EventDispatcher = function() {
    this._eventStack = new Array();
};

GlobalResources.EventDispatcher.prototype = {
    /**
     * Добавить событие
     * @param {String} name Название события
     * @param {Function} handler Функция-обработчик
     */
    attachEvent: function(name, handler) {
        this._eventStack.push(new $G.Event(name, handler));
    },

    /**
     * Убрать событие из стэка
     * @param {String} name
     * @param {Function} [handler] Функция-обработчик
     */
    removeEvent: function(name, handler) {
        for (var i = 0; i < this._eventStack.length; i++) {
            var event = this._eventStack[i];
            if ((event.name == name) && ((handler === null) || (event.handler === handler))) {
                this._eventStack.splice(i, 1);
            }
        }
    },

    /**
     * Выполнить события
     * @param {String} name Название события
     */
    dispatchEvent: function(name) {
        var args = Array.prototype.slice.call(arguments, 1);
        for (var i = 0; i < this._eventStack.length; i++) {
            var event = this._eventStack[i];
            if (event.name == name)
                event.fire(args);
        }
    }
};

/**
 * Класс Событие
 * @param {String} name Название события
 * @param {Function} handler обработчик события
 */
GlobalResources.Event = function(name, handler) {
    this.name = name;
    this.handler = handler;
};

GlobalResources.Event.prototype = {
    fire: function(args) {
        this.handler.apply(this, args);
    }
};

