if (typeof(sonar) != "object" || sonar == null) sonar = {};
//==============================================================================
// @library
//      sonar.event
// @variables
//      EVENT_POOL[]
// @functions
//      addEvent(oid, name, func)
//      removeEvent(oid, name, func)
//      clearEvent()
//      validateEvent(thisObj, event)
//==============================================================================
sonar.event =
{
    /***************************************************************************
     * @variable
     *      EVENT_POOL[]
     **************************************************************************/
    EVENT_POOL : [],



    /***************************************************************************
     * @function
     *      addEvent(oid, name, func)
     * @used
     *      sonar.event.EVENT_POOL
     *      sonar.event.clearEvent()
     **************************************************************************/
    addEvent : function(oid, name, func)
    {
        oid  = typeof(oid) == "object" && oid != null ? oid : document.getElementById(oid);
        name = typeof(name) == "string" && name.length > 0 ? name : null;
        func = typeof(func) == "function" && (!Function.prototype.call || typeof(func.call) == "function") ? func : null;

        if (oid && name && func)
        {
            if (/^on/i.test(name)) name = name.substring(2);

            if (oid.addEventListener)
            {
                oid.addEventListener(name, func, false);
            }
            else if (oid.attachEvent)
            {
                if (sonar.event.EVENT_POOL.length == 0)
                {
                    window.attachEvent("onunload", sonar.event.clearEvent);
                    sonar.event.EVENT_POOL.push([window, "onunload", sonar.event.clearEvent]);
                }

                oid.attachEvent("on"+name, func);
                sonar.event.EVENT_POOL.push([oid, "on"+name, func]);
            }
        }
    },



    /***************************************************************************
     * @function
     *      removeEvent(oid, name, func)
     **************************************************************************/
    removeEvent : function(oid, name, func)
    {
        oid  = typeof(oid) == "object" && oid != null ? oid : document.getElementById(oid);
        name = typeof(name) == "string" && name.length > 0 ? name : null;
        func = typeof(func) == "function" && (!Function.prototype.call || typeof(func.call) == "function") ? func : null;

        if (oid && name && func)
        {
            if (/^on/i.test(name)) name = name.substring(2);

            if (oid.removeEventListener)
            {
                oid.removeEventListener(name, func, false);
            }
            else if (oid.detachEvent)
            {
                oid.detachEvent("on"+name, func);
            }
        }
    },



    /***************************************************************************
     * @function
     *      clearEvent()
     * @used
     *      sonar.event.EVENT_POOL
     *      sonar.event.removeEvent(oid, name, func)
     **************************************************************************/
    clearEvent : function()
    {
        while (sonar.event.EVENT_POOL.length > 0)
        {
            sonar.event.removeEvent.apply(sonar.event, sonar.event.EVENT_POOL.pop());
        }
    },



    /***************************************************************************
     * @function
     *      validateEvent(thisobj, event)
     **************************************************************************/
    validateEvent : function(thisObj, event)
    {
        var type, target, currentTarget, relatedTarget, IEtarget;

        if (!window.event)    //  FF, Safari, Chrome, Opera
        {
            type            =   event.type;
            target          =   event.target;
            currentTarget   =   event.currentTarget;
            relatedTarget   =   event.relatedTarget;

        }else if (window.event) //  IE
        {
            event           =   window.event;
            target          =   event.srcElement;
            switch (event.type)
            {
                case 'mouseover':
                    IEtarget    =   event.fromElement;
                    break;
                case 'mouseout' :
                    IEtarget    =   event.toElement;
                    break;
            }
        }

        var result  =   false;

        var _innerFinder    =   function( nodez ){

            var compareTarget   =   null;

            if (!window.event)          //  FF, Safari, Chrome, Opera
            {
                if (currentTarget === relatedTarget)    result  =   true;
                compareTarget   =   relatedTarget;

            } else if (window.event)    //  IE
            {
                if ( IEtarget === thisObj )     result  =   true;
                compareTarget   =   IEtarget;
            }

            if (!result)
            {
                for (var i = 0 ; i < nodez.childNodes.length ; i++ )
                {
                    if(nodez.childNodes[i] === compareTarget)   result  =   true;

                    if(result) break;

                    if(nodez.childNodes[i].hasChildNodes())
                        _innerFinder(nodez.childNodes[i]);
                }
            }

        };

        _innerFinder( (!window.event) ? currentTarget : thisObj );

        if( !result )   return true;

    }
}