
/*-------------------------------------------------------------------------------------*/
/* Global variables                                                                    */
/*-------------------------------------------------------------------------------------*/

var __objectsEvents_Handlers = new Array();


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function objectEvents_AttachHandler(aObject, aEventType, aHandler, aUserData, aNoBubble)
{
    if (!isObject(aObject)) return;

    // find or create new object handler
    var oHandler = __objectEvents_getObjectHandler(aObject);

    try
    {
        var objectEvent = null,
            eventTriggers;

        // get object event
        eval("objectEvent = aObject." + aEventType);

        // if this event has no triggers yet, create first one
        if (!isArray(oHandler.triggers[aEventType]))
        {
            // create triggers array for this event
            eventTriggers = oHandler.triggers[aEventType] = [];
            // add a handler
            eventTriggers[eventTriggers.length] = {
                handler  : aHandler,
                userData : aUserData,
                noBubble : aNoBubble
            }
        }
        else
        {
            var eventHandler = __objectEvents_FindEventHandler(oHandler.triggers[aEventType], aHandler);
            if (eventHandler)
            {
                eventHandler.handler  = aHandler;
                eventHandler.userData = aUserData;
                eventhandler.noBubble = aNoBubble;
            }
            else
            {
                eventTriggers = oHandler.triggers[aEventType];
                eventTriggers[eventTriggers.length] = {
                    handler  : aHandler,
                    userData : aUserData,
                    noBubble : aNoBubble
                }
            }
        }

        // attach oryginal object event
        eval("aObject."+aEventType+" = function(aEvent) { return __objectEvents_TriggerObjectEvent(aEvent, '" + oHandler.id + "', '" + aEventType + "'); }");

        return true;
    }
    catch (e)
    {
        return false;
    }
}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function objectEvents_DetachHandler(aObject, aEventType)
{
    var oHandler = __objectEvents_getObjectHandler(aObject);
    try
    {
        delete (oHandler.triggers[aEventType]);
    }
    catch (e) {}
}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function __objectEvents_FindEventHandler(aTriggers, aHandler)
{
    try
    {
        for (key in aTriggers)
            if (isObject(aTriggers[key]))
                if (aTriggers[key].handler === aHandler)
                    return aTriggers[key];
    }
    catch (e) { return false; }

    return false;
}

/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function __objectEvents_getObjectHandler(aObject)
{
    for (key in __objectsEvents_Handlers)
        if (isObject(__objectsEvents_Handlers[key]))
            if (__objectsEvents_Handlers[key].object === aObject)
                return __objectsEvents_Handlers[key];

    return __objectsEvents_Handlers[__objectsEvents_Handlers.length] = {
        id       : __objectsEvents_Handlers.length,
        object   : aObject,
        triggers : []
    }
}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function __objectEvents_TriggerObjectEvent(aEvent, aObjectHandlerId, aEventType)
{
    try
    {
        //trace("["+aEvent+"-"+aObjectHandlerId+"-"+aEventType+"]\n");
        var result = true,
            triggers = __objectsEvents_Handlers[aObjectHandlerId].triggers[aEventType];

        //trace("[looping triggers...]\n");
        for (id in triggers)
        {
            if (isFunction(triggers[id].handler))
            {
                //trace("[running trigger '"+id+"-"+triggers[id].handler+"-"+triggers[id].userData+"']\n");
                result = result && triggers[id].handler(triggers[id].userData);
            }
            bubbleEvent(aEvent, !triggers[id].noBubble);
        }

        return result;
    }
    catch (e) { return result; }
}
