/*
 * File: EventUtils.js
 *
 * Event Utils library  v0.1  
 * Supported browsers:
 *          - as always work's only with DOM compiliant browsers. 
 *              Old IE4 , Netscape 5 are not supported.
 *              Prefered are IE6, Mozilla, Firefox. 
 *              It seem's to work with Opera >8 too.
 *
 * Development Started at: 10.10.2005
 *
 * <script SRC="js/JSUtils/EventUtils.js"></script>
 *  
 */

/*
 *  JSEvents class constructor
 *
 *
 */



function JSEvents()
{    
    JSEvents.onLoadEvents = new Array();
    JSEvents.AttachEvent(window, "load", JSEvents.OnWindowLoad);
}

/*
 * Class members
 *
 */

/**
 *
 *
 *
 */
JSEvents.OnWindowLoad = function()
{    
    for ( var i = 0; i < JSEvents.onLoadEvents.length; i++ )
    {
        
        var event = JSEvents.onLoadEvents[i];
        JSEvents.AttachEvent(event.element, event.event, event.handler, event.toCapture);
    }
}

/**
 * Attach a event handler for a element , specified by ID or reference . 
 * 
 * @param element object|string 
 *      - Must be a string - get's element by ID,
 *        Or reference to element.
 * @param event string          - Name of the event to attach
 * @param handler reference     - reference to event handler 
 * @param toCapture boolean     
 *      - ** Not supported by IE **. Specifies whether to capture
 *      event, or not.
 * @return boolean              - true on success, false on failure.
 */
JSEvents.AttachEvent = function(element, event, handler, toCapture, AttachOnLoad)
{
    if ( AttachOnLoad)
    {   
        JSEvents.onLoadEvents.push(
            { element   : element, 
              event     : event, 
              handler   : handler, 
              toCapture : toCapture });        
        return true;
    }
    element = GetElement(element);
    //{DEBUG}
    //debug.Assert(!handler, "JSEvents.AttachEvent[ no handler ]");  
    //{ENDDEBUG}
    if ( element.addEventListener ) {
        element.addEventListener(event, handler, toCapture);
        return true;
    }
    else if ( element.attachEvent ) {
        return element.attachEvent("on" + event, handler); 
    }
    else {
        return false;
    }
};
/*
 * Dettach a event handler for a element , specified by ID or reference . 
 * 
 * @param element object/string - Must be a string - get's element by ID,
 *                                                              Or reference to element.
 * @param event string          - Name of the event to dettach
 * @param handler reference         - reference to event handler 
 * @param toCapture boolean         - ** Not supported by IE **. Specifies whether to capture
 *                                                              event, or not.
 * @return boolean                          - true on success, false otherwise.
 */
JSEvents.DetachEvent = function(element, event, handler, toCapture)
{
    if (!( document.getElementById && document.createTextNode )) {
        return false; 
    }
    if ( typeof(element) === "string" ) {
        element = document.getElementById(element);
    }
    if (!element || !handler) {
        return false;
    }
    if ( element.removeEventListener ) {
        Element.removeEventListener(event, handler, toCapture);
        return true;
    }
    else if ( element.detachEvent ) {
        return element.detachEvent("on" + event, handler);
    }
    else {
        return false;
    }
};

/*
 * class functions
 */
 
/*
 * Gets the right event object - Gecko , IE
 *
 * @param evt Object - Event object 
 */
JSEvents.GetEvent = function(evt)
{
    return (evt) ? evt : ((window.event) ? event : null);
};
/*
 * Gets the right event's target element - Gecko, IE
 *
 * @param evt object    -Event object
 * @return object       -Reference to the element wich recieves the most recent event.
 */
JSEvents.GetEvtTarget = function(evt)
{
    evt = JSEvents.GetEvent(evt);
    return (evt) ? 
        ( (evt.target) ? 
                evt.target : 
            ( (evt.srcElement) ? evt.srcElement : null) ) 
        : null;
};

/*
 * Gets the right event's releated target - Gecko, IE
 *
 * @param evt object        -Event object
 * @param inOut boolean -Because of IE , must specify wich elment to search :
 *                                              true for the element from wich cursor rolled into
 *                                              false for element to which the user rolled the cursor
 *
 * @return object -Reference to the event's releated target
 */
JSEvents.GetEvtReleatedTarget = function(evt, inOut)
{
    evt = GetEvent(evt);
    if (!evt) {
        return null;
    }
    if (inOut) {
        return (evt.relatedTarget) ? evt.relatedTarget : 
            ((evt.fromElement) ? evt.fromElement : null);
    }
    else {
        return (evt.relatedTarget) ? evt.relatedTarget : 
            ((evt.toElement) ? evt.toElement : null);
    }
};


JSEvents();
