/**
 * Application: Chameleon
 * Revision:    $Id: cwc_events.js,v 1.4 2005/07/20 15:14:53 bartvde Exp $
 * Purpose:     Generic event manager for Chameleon components
 * Author:      DM Solutions Group Inc. (jfournier@dmsolutions.ca)
 * Copyright:   
 *
 * Widgets can create events for other widgets or user-applications
 * to use by registering events with the event manager:
 *
 * var gnSomeEventID = goEventManager.registerEventID( 'SOME_EVENT' );
 *
 * multiple widgets can register the same event name, the ID will be reused.
 *
 * Widgets can trigger an event using a previously registered event id
 * or event name:
 *
 * goEventManager.triggerEvent( gnSomeEventID );
 * goEventManager.triggerEvent( 'SOME_EVENT' );
 *
 * Widgets or user code that wishes to 'listen' for events use the 
 * registerForEvent function by eventID or event name:
 *
 * goEventManager.registerForEvent( gnSomeEventID, 'myEventHandler()' );
 * goEventManager.registerForEvent( 'SOME_EVENT', 'myEventHandler()' );
 *
 * Widgets or user code that does not want to receive events any more can
 * 'deregister' for an event by id or name:
 *
 * goEventManager.deregisterForEvent( gnSomeEventID, 'myEventHandler()' );
 * goEventManager.deregisterForEvent( 'SOME_EVENT', 'myEventHandler()' );
 */
goEventManager = new CWCEventManager();

function CWCEventManager( )
{
    this.eventIDs = new Array();
    this.events = new Array();
    this.lastEventID = 0;
    
    this.registerEventID = CWCEventManager_RegisterEventID;
    this.findEventID = CWCEventManager_FindEventID;
    this.registerForEvent = CWCEventManager_RegisterForEvent;
    this.deregisterForEvent = CWCEventManager_DeregisterForEvent;
    this.triggerEvent = CWCEventManager_TriggerEvent;
}

function CWCEventManager_RegisterEventID( eventName )
{
    var eventID = -1;
    for( i=0; i<this.lastEventID; i++)
    {
        if (this.eventIDs[i] == eventName)
            eventID = i;
    }
    
    if (eventID == -1)
    {
        eventID = this.lastEventID;
        this.eventIDs[eventID] = eventName;
        this.events[eventID] = new Array();
        this.lastEventID ++;
    }
    return eventID;
}

function CWCEventManager_FindEventID( eventName )
{
    var i;
    for( i=0; i<this.lastEventID; i++)
        if (this.eventIDs[i] == eventName)
            return i;
    return -1;
}

function CWCEventManager_RegisterForEvent(eventID, function_name)
{
    var rx = /\d+/i;
    if (!rx.test( eventID ))
    {
        eventID = this.findEventID( eventID );
    }
    
    if (eventID >= 0 && eventID <= this.lastEventID)
    {
        var lastEvent = (this.events[eventID]).length;
        this.events[ eventID ][ lastEvent ] = function_name;
        return true;
    }
    else
    {
        return false;
    }
}

function CWCEventManager_DeregisterForEvent( eventID, function_name )
{
    var rx = /\d+/i;
    var bFound = false;
    
    if (!rx.test( eventID ))
    {
        eventID = this.findEventID( eventID );
    }
    
    if (eventID >= 0 && eventID <= this.lastEventID)
    {
        var events = this.events[eventID];
        for( i=0; i<events.length; i++ )
        {
            if (this.events[i] == function_name )
            {
                this.events[i] = "";
                bFound = true;
            }
        }
    }
    return  bFound;
}

function CWCEventManager_TriggerEvent( eventID /* additional args are passed to the event handler */ )
{
    var rx = /\d+/i;
    var i = 0;
    if (!rx.test( eventID ))
    {
        eventID = this.findEventID( eventID );
    }
    
    if (eventID >= 0 && eventID <= this.lastEventID)
    {
        var args = "(";
        var sep = "";
        for(i=1; i<arguments.length; i++)
        {
            args = args + sep + "'" + arguments[i] + "'";
            sep = ",";
        }
        
        args = args + ")";
        
        var events = this.events[eventID];
        var nEvents = events.length;
        for (i=0; i<nEvents; i++)
        {
            var szFunction =  events[ i ];
            if (szFunction != "")
            {
                var rx_params = /\(.*\)/i;
                if (!rx_params.test( szFunction ))
                {
                    szFunction = szFunction + args;
                }
                eval(szFunction);
            }
        }
        return true;
    }
    else
        return false;
}
