/*
 * 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 = JSEvents.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);
    }
};

/**
 * Get the mouse cursor coordinates inside the events target
 * @param evt       - Event object
 * @return object   - in the form {left: , top:}
 */
JSEvents.GetClientMousePos = function(evt) {
    var elem = (evt.target) ? evt.target : evt.srcElement;
    var coords = {left:0, top:0};
    if (evt.layerX) {
        var borders = {left:parseInt(getElementStyle("progressBar",
                       "borderLeftWidth", "border-left-width")),
                       top:parseInt(getElementStyle("progressBar",
                       "borderTopWidth", "border-top-width"))};
        coords.left = evt.layerX - borders.left;
        coords.top = evt.layerY - borders.top;
    } else if (evt.offsetX) {
        coords.left = evt.offsetX;
        coords.top = evt.offsetY;
    }
    evt.cancelBubble = true;
    return coords;
}

/**
 * Get the current's mouse cursor coordinates in the page layout
 * @param evt object    - Event object
 * @return object       - in the form {left: , top: }
 */
JSEvents.GetMousePos = function(evt)
{
    evt = JSEvents.GetEvent(evt);
    var coords = {left:0, top:0};
    if (evt.pageX) {
        coords.left = evt.pageX;
        coords.top = evt.pageY;
    }
    else if (evt.clientX) {
        coords.left =
            evt.clientX + document.body.scrollLeft - document.body.clientLeft;
        coords.top =
            evt.clientY + document.body.scrollTop - document.body.clientTop;
        // include html element space, if applicable
        if (document.body.parentElement && document.body.parentElement.clientLeft) {
            var bodParent = document.body.parentElement;
            coords.left += bodParent.scrollLeft - bodParent.clientLeft;
            coords.top += bodParent.scrollTop - bodParent.clientTop;
        }
    }
    return coords;
}

/**
 * Stop propagation of the event ( needed because of the stuped IE )
 * @param evt object    - Event object
 * @return void
 */

JSEvents.StopPropagation = function(evt)
{
    if ( evt.stopPropagation ) evt.stopPropagation();
    else if ( evt.cancelBubble !== undefined  ) evt.cancelBubble = true;
}
/**
 * Prevents default handling of the event
 * @param evt object    - Event object
 * @return void
 */
JSEvents.PreventDefault = function(evt)
{

    if ( evt.preventDefault )
    {
 //alert("ee");
        evt.preventDefault();
    }
    else evt.returnValue = false;
}


JSEvents();