﻿/*
    unFocus.Utilities.EventManager, version 1.0b (beta) (2005/12/16)
    Copyright: 2005, Kevin Newman (http://www.unfocus.com/Projects/)
    License: http://creativecommons.org/licenses/LGPL/2.1/
*/
// make sure faux-namespace is available before adding to it
if (typeof unFocus == "undefined") var unFocus = {};
if (!unFocus.Utilities) unFocus.Utilities = {};
/* Class EventManager
    Provides the interface and functionality to a Subscriber/Subscriber Pattern interface for
    classes to easily inherit or use. Event types are passed in during instantiation. I'm not
    sure that's the best way to do it, but that's how it is for now (comments are welcome). */
unFocus.Utilities.EventManager = function(arg) {
    this._listeners = {};
    for (var i = arguments.length; -1 < --i;) {
        this._listeners[arguments[i]] = [];
    }
};
/* Method: addEventListener
    A public method that adds an event listener to be called when the hash changes. */
unFocus.Utilities.EventManager.prototype.addEventListener = function($type, $listener) {
    // check that listener is not in list
    for (var i = this._listeners[$type].length; -1 < --i;)
        if (this._listeners[$type][i] == $listener) return;
    // add listener to appropriate list
    this._listeners[$type].push($listener);
};
/* Method: removeListener
    A public method that removes an event listener. */
unFocus.Utilities.EventManager.prototype.removeEventListener = function($type, $listener) {
    // search for the listener method
    for (var i = this._listeners[$type].length; -1 < --i;) {
        if (this._listeners[$type][i] == $listener) {
            this._listeners.splice(i,1);
            break;
        }
    }
};
/* Method: notifyListeners
    Notifies listeners when an event accurs. */
unFocus.Utilities.EventManager.prototype.notifyListeners = function($type, $data) {
    for (var i = this._listeners[$type].length; -1 < --i;)
        this._listeners[$type][i]($data);
};