/* WRITE THESE FUNCTIONS */

/**
* Crossbrowser event handling functions.
*
* A set of functions to easily attach and detach event handlers to HTML elements.
* These functions work around the shortcomings of the traditional method ( element.onevent = function; )
* where only 1 handler could be attached for a certain event on the object, and mimic the DOM level 2
* event methods addEventListener and removeEventListener for browsers that do not support these
* methods (e.g. Internet Explorer) without resorting to propriety methods such as attachEvent and detachEvent
* that have a whole set of their own shortcomings.
* Created as an entry for the 'contest' at quirksmode.org: http://www.quirksmode.org/blog/archives/2005/09/addevent_recodi.html
*
* @author Tino Zijdel ( crisp@xs4all.nl )
* @version 1.0
* @date 2005-09-09
*/


/**
* addEvent
*
* Generic function to attach event listeners to HTML elements.
* This function does NOT use attachEvent but creates an own stack of function references
* in the DOM space of the element. This prevents closures and therefor possible memory leaks.
* Also because of the way the function references are stored they will get executed in the
* same order as they where attached - matching the behavior of addEventListener.
*
* @param obj The object to which the event should be attached.
* @param evType The eventtype, eg. 'click', 'mousemove' etcetera.
* @param fn The function to be executed when the event fires.
* @param useCapture (optional) Whether to use event capturing, or event bubbling (default).
*/
function addEvent(obj, evType, fn, useCapture) {
    //-- Default to event bubbling
    if (!useCapture) useCapture = false;

    //-- DOM level 2 method
    if (obj.addEventListener) {
        obj.addEventListener(evType, fn, useCapture);
    }
    else {
        //-- event capturing not supported
        if (useCapture) {
            alert('This browser does not support event capturing!');
        }
        else {
            var evTypeRef = '__' + evType;

            //-- create function stack in the DOM space of the element; seperate stacks for each event type
            if (!obj[evTypeRef]) {
                //-- create the stack if it doesn't exist yet
                obj[evTypeRef] = [];

                //-- if there is an inline event defined store it in the stack
                var orgEvent = obj['on' + evType];
                if (orgEvent) obj[evTypeRef][0] = orgEvent;

                //-- attach helper function using the DOM level 0 method
                obj['on' + evType] = IEEventHandler;
            }
            else {
                //-- check if handler is not already attached, don't attach the same function twice to match behavior of addEventListener
                for (var ref in obj[evTypeRef]) {
                    if (obj[evTypeRef][ref] === fn) return;
                }
            }

            //-- add reference to the function to the stack
            obj[evTypeRef][obj[evTypeRef].length] = fn;
        }
    }
}

/**
* removeEvent
*
* Generic function to remove previously attached event listeners.
*
* @param obj The object to which the event listener was attached.
* @param evType The eventtype, eg. 'click', 'mousemove' etcetera.
* @param fn The listener function.
* @param useCapture (optional) Whether event capturing, or event bubbling (default) was used.
*/
function removeEvent(obj, evType, fn, useCapture) {
    //-- Default to event bubbling
    if (!useCapture) useCapture = false;

    //-- DOM level 2 method
    if (obj.removeEventListener) {
        obj.removeEventListener(evType, fn, useCapture);
    }
    else {
        var evTypeRef = '__' + evType;

        //-- Check if there is a stack of function references for this event type on the object
        if (obj[evTypeRef]) {
            //-- iterate through the stack
            for (var ref in obj[evTypeRef]) {
                //-- if function reference is found, remove it
                if (obj[evTypeRef][ref] === fn) {
                    try {
                        delete obj[evTypeRef][ref];
                    }
                    catch (e) {
                        obj[evTypeRef][ref] = null;
                    }

                    return;
                }
            }
        }
    }
}

/**
* IEEventHandler
* 
* IE helper function to execute the attached handlers for events.
* Because of the way this helperfunction is attached to the object (using the DOM level 0 method)
* the 'this' keyword will correctely point to the element that the handler was defined on.
*
* @param e (optional) Event object, defaults to window.event object when not passed as argument (IE).
*/
function IEEventHandler(e) {
    e = e || window.event;
    var evTypeRef = '__' + e.type, obj;

    //-- check if there is a custom function stack defined for this event type on the object
    if (this[evTypeRef]) {
        //-- iterate through the stack and execute each function in the scope of the object by using function.call
        var evTypeRefLen = this[evTypeRef].length
        for (var ref = 0; ref < evTypeRefLen; ref++) {
            //for (var ref in this[evTypeRef])
            //{
            if (Function.call) {
                this[evTypeRef][ref].call(this, e);
            }
            else {
                //-- IE 5.0 doesn't support call or apply, so use this
                this.__fn = this[evTypeRef][ref];
                this.__fn(e);
                this.__fn = null;
            }
        }
    }
}

/* DON'T TOUCH THESE FUNCTIONS */

function removeBorders() {
    var x = document.getElementById('navigation').getElementsByTagName('li');
    for (var i = 0; i < x.length; i++) {
        removeEvent(x[i], "mouseover", showBorder);
        removeEvent(x[i], "mouseout", hideBorder);
    }
}

function hoverImage(e) {
    this.src = makeHoverUrl(this);
}

function unHoverImage(e) {
    if (this.originalurl)
        this.src = this.originalurl;
}

function showSubNav(e) {
    var x = this.getElementsByTagName('li');
    if (x.length > 0) {
        //alert(x[0].outerHTML);
        //alert(this.getAttribute('collapse'));
        if (this.getAttribute('collapse') == 'true') {
            this.className += ' menu_hover';
        }
    }
}

function makeHoverUrl(el) {
    var url = el.src;
    el.originalurl = url;

    url = url.substring(0, url.length - 9)
    url += el.getAttribute('hovercolor');
    return url;
}

function hideSubNav(e) {
    this.className = this.className.replace(/menu_hover/g, '');
    //noBubble(e);
}

function showBorder(e) {
    this.className += ' current';
}

function hideBorder(e) {
    this.className = this.className.replace(/current/g, '');
    //noBubble(e);
}

function noBubble(e) {
    if (e && e.stopPropagation)
        e.stopPropagation();
    else
        window.event.cancelBubble = true;
}

function initWinMode(id, pageid) {
    var el = document.getElementById(id);
    if (el) {
        var x = el.getElementsByTagName('li');
        for (var i = 0; i < x.length; i++) {
            hrefObj = x[i].childNodes[0];
            if (hrefObj.tagName && hrefObj.tagName.toLowerCase() == 'a') {
                if (hrefObj.getAttribute('href').indexOf(pageid) > -1) {
                    x[i].className += ' menu_selected';
                }
            }
        }
    }
    enableMenu(id);
}

function initWebMode(id) {
    enableMenu(id);

    var el = document.getElementById(id);
    if (el) {
        var x = el.getElementsByTagName('li');
        for (var i = 0; i < x.length; i++) {
            addEvent(x[i], 'mouseover', showSubNav);
            addEvent(x[i], 'mouseout', hideSubNav);
            addEvent(x[i], 'mouseover', showBorder);
            addEvent(x[i], 'mouseout', hideBorder);
        }

        enableMenu(id);

        var y = el.getElementsByTagName('img');
        for (var i = 0; i < y.length; i++) {
            addEvent(y[i], 'mouseover', hoverImage);
            addEvent(y[i], 'mouseout', unHoverImage);

            if (y[i].parentNode.className.indexOf('selected') > -1) {
                y[i].src = makeHoverUrl(y[i]);
            }
        }
    }
}

function enableMenu(id) {
    var baseUrl = getBaseUrl(); if (!baseUrl) return; var el = document.getElementById(id); if (el) { if (document.location.href.toLowerCase().indexOf('aspx') > -1) { var cLi = document.getElementsByTagName('li'); var i = cLi.length; while (i--) { if (cLi[i].childNodes.length) { var el = getAnchor(cLi[i]); if (el && el.href.toLowerCase().indexOf(baseUrl) > -1) { var o = cLi[i]; while (o.tagName.toLowerCase() == 'ul' || o.tagName.toLowerCase() == 'li') { if (o.tagName.toLowerCase() == 'li') { var el = getAnchor(o); o.className += ' selected'; if (el) { el.className += ' selected'; } } var children = o.getElementsByTagName('li'); if (children.length > 0) { if (children[0].getAttribute('collapse') == 'true') o.className += ' collapsed'; } o = o.parentNode; } } } } } }
}

function getAnchor(parentEl) {
    var childs = parentEl.childNodes;
    var i = childs.length;
    while (i--) { if (childs[i].tagName && childs[i].tagName.toLowerCase() == 'a') { return childs[i]; break; } }
    return null;
}

function getBaseUrl() {
    var base = document.getElementsByTagName('base');

    if (base && base.length > 0) {
        var href = base[0].getAttribute('href');
        var split = href.split('/');
        var baseUrl = '/' + split[split.length - 2] + '/' + split[split.length - 1];
        return baseUrl.toLowerCase();
    }
    else return null;
}