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

// mouse coordinates
var mousePos = { x: null, y: null };

// global events handlers arrays
var __globalEvents_OnClick      = new Array();
var __globalEvents_OnMouseMove  = new Array();
var __globalEvents_OnMouseUp    = new Array();
var __globalEvents_OnMouseDown  = new Array();
var __globalEvents_OnScroll     = new Array();
var __globalEvents_OnDblClick   = new Array();
var __globalEvents_OnBlur       = new Array();


/*-------------------------------------------------------------------------------------*/
/* Attach global events handlers                                                       */
/*-------------------------------------------------------------------------------------*/

window.document.onmousemove = __globalEvents_onMouseMove
window.document.onmouseup   = __globalEvents_onMouseUp;
window.document.onmousedown = __globalEvents_onMouseDown;
window.document.onclick     = __globalEvents_onClick;
window.onscroll             = __globalEvents_onScroll;
window.document.ondblclick  = __globalEvents_onDblClick;
window.onblur               = __globalEvents_onBlur;


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function globalEvents_RegisterHandler(aName, aEventType, aHandler, aUserData)
{
    aEventType = aEventType.toLowerCase();

    switch (aEventType)
    {
        case 'mousemove':
            __globalEvents_OnMouseMove[aName] = {
                name     : aName,
                handler  : aHandler,
                userData : aUserData
            }
        break;

        case 'mouseup':
            __globalEvents_OnMouseUp[aName] = {
                name     : aName,
                handler  : aHandler,
                userData : aUserData
            }
        break;

        case 'mousedown':
            __globalEvents_OnMouseDown[aName] = {
                name     : aName,
                handler  : aHandler,
                userData : aUserData
            }
        break;

        case 'click':
            __globalEvents_OnClick[aName] = {
                name     : aName,
                handler  : aHandler,
                userData : aUserData
            }
        break;

        case 'scroll':
            __globalEvents_OnScroll[aName] = {
                name     : aName,
                handler  : aHandler,
                userData : aUserData
            }
        break;

        case 'dblclick':
            __globalEvents_OnDblClick[aName] = {
                name     : aName,
                handler  : aHandler,
                userData : aUserData
            }
        break;

        case 'blur':
            __globalEvents_OnDblClick[aName] = {
                name     : aName,
                handler  : aHandler,
                userData : aUserData
            }
        break;

        default: return false;
    }

    return true;
}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function globalEvents_UnregisterHandler(aName, aEventType)
{
    aEventType = aEventType.toLowerCase();

    switch (aEventType)
    {
        case 'mousemove':
            return delete __globalEvents_OnMouseMove[aName];
        break;

        case 'mouseup':
            return delete __globalEvents_OnMouseUp[aName];
        break;

        case 'mousedown':
            return delete __globalEvents_OnMouseDown[aName];
        break;

        case 'click':
            return delete __globalEvents_OnClick[aName];
        break;

        case 'scroll':
            return delete __globalEvents_OnClick[aName];
        break;

        case 'dblclick':
            return delete __globalEvents_OnClick[aName];
        break;

        case 'blur':
            return delete __globalEvents_OnClick[aName];
        break;

        default: return false;
    }
}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function __globalEvents_onMouseMove(aEvent)
{
	if (!aEvent)
        var aEvent = window.event;

    try
    {
	    if (aEvent.pageX || aEvent.pageY)
	    {
		    mousePos.x = aEvent.pageX;
		    mousePos.y = aEvent.pageY;
	    }
	    else if (aEvent.clientX || aEvent.clientY)
	    {
		    mousePos.x = aEvent.clientX + getDocumentScroll().x;
		    mousePos.y = aEvent.clientY + getDocumentScroll().y;
	    }
    }
    catch (e)
    {
        return;
    }

    bubbleEvent(aEvent, false);
    
    try
    {
        for (handlerId in __globalEvents_OnMouseMove)
            if (__globalEvents_OnMouseMove[handlerId])
                if (isFunction(__globalEvents_OnMouseMove[handlerId].handler))
                    __globalEvents_OnMouseMove[handlerId].handler(aEvent, __globalEvents_OnMouseMove[handlerId].userData);
    }
    catch (e) {}

}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function __globalEvents_onClick(aEvent)
{
    ///trace("[click]");
    bubbleEvent(aEvent, false);
    try
    {
        for (handlerId in __globalEvents_OnClick)
            if (isFunction(__globalEvents_OnClick[handlerId].handler))
                __globalEvents_OnClick[handlerId].handler(aEvent, __globalEvents_OnClick[handlerId].userData);
    }
    catch (e) {}
}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function __globalEvents_onMouseUp(aEvent)
{
    //trace("[mouseup]");
    bubbleEvent(aEvent, false);
    try
    {
        for (handlerId in __globalEvents_OnMouseUp)
            if (isFunction(__globalEvents_OnMouseUp[handlerId].handler))
                __globalEvents_OnMouseUp[handlerId].handler(aEvent, __globalEvents_OnMouseUp[handlerId].userData);
    }
    catch (e) {}
}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function __globalEvents_onMouseDown(aEvent)
{
    //trace("[mousedown]");
    bubbleEvent(aEvent, false);
    try
    {
        for (handlerId in __globalEvents_OnMouseDown)
            if (isFunction(__globalEvents_OnMouseDown[handlerId].handler))
                __globalEvents_OnMouseDown[handlerId].handler(aEvent, __globalEvents_OnMouseDown[handlerId].userData);
    }
    catch (e) {}
}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function __globalEvents_onScroll(aEvent)
{
    ///trace("[onscroll]");
    bubbleEvent(aEvent, false);
    try
    {
        for (handlerId in __globalEvents_OnScroll)
            if (isFunction(__globalEvents_OnScroll[handlerId].handler))
                __globalEvents_OnScroll[handlerId].handler(aEvent, __globalEvents_OnScroll[handlerId].userData);
    }
    catch (e) {}
}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function __globalEvents_onDblClick(aEvent)
{
    ///trace("[dblclick]");
    bubbleEvent(aEvent, false);
    try
    {
        for (handlerId in __globalEvents_OnDblClick)
            if (isFunction(__globalEvents_OnDblClick[handlerId].handler))
                __globalEvents_OnDblClick[handlerId].handler(aEvent, __globalEvents_OnDblClick[handlerId].userData);
    }
    catch (e) {}
}


/*-------------------------------------------------------------------------------------*/
/**
 *
 */
function __globalEvents_onBlur(aEvent)
{
    //trace("[onblur]");
    bubbleEvent(aEvent, false);
    try
    {
        for (handlerId in __globalEvents_OnBlur)
            if (isFunction(__globalEvents_OnBlur[handlerId].handler))
                __globalEvents_OnBlur[handlerId].handler(aEvent, __globalEvents_OnBlur[handlerId].userData);
    }
    catch (e) {}
}
