/**
 * Adds an event handler to a DOM element, returning whether it was successful.
 * 
 * @param object element - The DOM element.
 * @param string type - The type of event, without the "on" prefix.
 * @param object handler - The event handler function.
 * @return boolean
 */
function _add_event_handler(element, type, handler)
{
    if (element.addEventListener)
    {
        element.addEventListener(type, handler, false);
        return true;
    }
    else if (element.attachEvent)
    {
        return element.attachEvent('on' + type, handler);
    }
    else
    {
        return false;
    }
}

/**
 * Adds a window "onload" event handler without removing any existing onload handlers,
 * returning whether it was successful.
 * 
 * @param object handler - The event handler function.
 * @return boolean
 */
function _add_onload(handler)
{
    return _add_event_handler(window, 'load', handler);
}

// SpryMenuBar.js - version 0.12 - Spry Pre-Release 1.6.1
//
// Copyright (c) 2006. Adobe Systems Incorporated.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//   * Redistributions of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//   * Redistributions in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//   * Neither the name of Adobe Systems Incorporated nor the names of its
//     contributors may be used to endorse or promote products derived from this
//     software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
 
/*******************************************************************************
 
 SpryMenuBar.js
 This file handles the JavaScript for Spry Menu Bar.  You should have no need
 to edit this file.  Some highlights of the MenuBar object is that timers are
 used to keep submenus from showing up until the user has hovered over the parent
 menu item for some time, as well as a timer for when they leave a submenu to keep
 showing that submenu until the timer fires.
 
 *******************************************************************************/
 
var Spry; if (!Spry) Spry = {}; if (!Spry.Widget) Spry.Widget = {};
 
Spry.BrowserSniff = function()
{
    var b = navigator.appName.toString();
    var up = navigator.platform.toString();
    var ua = navigator.userAgent.toString();
 
    this.mozilla = this.ie = this.opera = this.safari = false;
    var re_opera = /Opera.([0-9\.]*)/i;
    var re_msie = /MSIE.([0-9\.]*)/i;
    var re_gecko = /gecko/i;
    var re_safari = /(applewebkit|safari)\/([\d\.]*)/i;
    var r = false;
 
    if ( (r = ua.match(re_opera))) {
        this.opera = true;
        this.version = parseFloat(r[1]);
    } else if ( (r = ua.match(re_msie))) {
        this.ie = true;
        this.version = parseFloat(r[1]);
    } else if ( (r = ua.match(re_safari))) {
        this.safari = true;
        this.version = parseFloat(r[2]);
    } else if (ua.match(re_gecko)) {
        var re_gecko_version = /rv:\s*([0-9\.]+)/i;
        r = ua.match(re_gecko_version);
        this.mozilla = true;
        this.version = parseFloat(r[1]);
    }
    this.windows = this.mac = this.linux = false;
 
    this.Platform = ua.match(/windows/i) ? "windows" :
                    (ua.match(/linux/i) ? "linux" :
                    (ua.match(/mac/i) ? "mac" :
                    ua.match(/unix/i)? "unix" : "unknown"));
    this[this.Platform] = true;
    this.v = this.version;
 
    if (this.safari && this.mac && this.mozilla) {
        this.mozilla = false;
    }
};
 
Spry.is = new Spry.BrowserSniff();
 
// Constructor for Menu Bar
// element should be an ID of an unordered list (<ul> tag)
// preloadImage1 and preloadImage2 are images for the rollover state of a menu
Spry.Widget.MenuBar = function(element, opts)
{
    this.init(element, opts);
};
 
Spry.Widget.MenuBar.prototype.init = function(element, opts)
{
    this.element = this.getElement(element);
 
    // represents the current (sub)menu we are operating on
    this.currMenu = null;
    this.showDelay = 250;
    this.hideDelay = 600;
    if(typeof document.getElementById == 'undefined' || (navigator.vendor == 'Apple Computer, Inc.' && typeof window.XMLHttpRequest == 'undefined') || (Spry.is.ie && typeof document.uniqueID == 'undefined'))
    {
        // bail on older unsupported browsers
        return;
    }
 
    // Fix IE6 CSS images flicker
    if (Spry.is.ie && Spry.is.version < 7){
        try {
            document.execCommand("BackgroundImageCache", false, true);
        } catch(err) {}
    }
 
    this.upKeyCode = Spry.Widget.MenuBar.KEY_UP;
    this.downKeyCode = Spry.Widget.MenuBar.KEY_DOWN;
    this.leftKeyCode = Spry.Widget.MenuBar.KEY_LEFT;
    this.rightKeyCode = Spry.Widget.MenuBar.KEY_RIGHT;
    this.escKeyCode = Spry.Widget.MenuBar.KEY_ESC;
 
    this.hoverClass = 'MenuBarItemHover';
    this.subHoverClass = 'MenuBarItemSubmenuHover';
    this.subVisibleClass ='MenuBarSubmenuVisible';
    this.hasSubClass = 'MenuBarItemSubmenu';
    this.activeClass = 'MenuBarActive';
    this.isieClass = 'MenuBarItemIE';
    this.verticalClass = 'MenuBarVertical';
    this.horizontalClass = 'MenuBarHorizontal';
    this.enableKeyboardNavigation = true;
 
    this.hasFocus = false;
    // load hover images now
    if(opts)
    {
        for(var k in opts)
        {
            if (typeof this[k] == 'undefined')
            {
                var rollover = new Image;
                rollover.src = opts[k];
            }
        }
        Spry.Widget.MenuBar.setOptions(this, opts);
    }
 
    // safari doesn't support tabindex
    if (Spry.is.safari)
        this.enableKeyboardNavigation = false;
 
    if(this.element)
    {
        this.currMenu = this.element;
        var items = this.element.getElementsByTagName('li');
        for(var i=0; i<items.length; i++)
        {
            if (i > 0 && this.enableKeyboardNavigation)
                items[i].getElementsByTagName('a')[0].tabIndex='-1';
 
            this.initialize(items[i], element);
            if(Spry.is.ie)
            {
                this.addClassName(items[i], this.isieClass);
                items[i].style.position = "static";
            }
        }
        if (this.enableKeyboardNavigation)
        {
            var self = this;
            this.addEventListener(document, 'keydown', function(e){self.keyDown(e); }, false);
        }
 
        if(Spry.is.ie)
        {
            if(this.hasClassName(this.element, this.verticalClass))
            {
                this.element.style.position = "relative";
            }
            var linkitems = this.element.getElementsByTagName('a');
            for(var i=0; i<linkitems.length; i++)
            {
                linkitems[i].style.position = "relative";
            }
        }
    }
};
Spry.Widget.MenuBar.KEY_ESC = 27;
Spry.Widget.MenuBar.KEY_UP = 38;
Spry.Widget.MenuBar.KEY_DOWN = 40;
Spry.Widget.MenuBar.KEY_LEFT = 37;
Spry.Widget.MenuBar.KEY_RIGHT = 39;
 
Spry.Widget.MenuBar.prototype.getElement = function(ele)
{
    if (ele && typeof ele == "string")
        return document.getElementById(ele);
    return ele;
};
 
Spry.Widget.MenuBar.prototype.hasClassName = function(ele, className)
{
    if (!ele || !className || !ele.className || ele.className.search(new RegExp("\\b" + className + "\\b")) == -1)
    {
        return false;
    }
    return true;
};
 
Spry.Widget.MenuBar.prototype.addClassName = function(ele, className)
{
    if (!ele || !className || this.hasClassName(ele, className))
        return;
    ele.className += (ele.className ? " " : "") + className;
};
 
Spry.Widget.MenuBar.prototype.removeClassName = function(ele, className)
{
    if (!ele || !className || !this.hasClassName(ele, className))
        return;
    ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
};
 
// addEventListener for Menu Bar
// attach an event to a tag without creating obtrusive HTML code
Spry.Widget.MenuBar.prototype.addEventListener = function(element, eventType, handler, capture)
{
    try
    {
        if (element.addEventListener)
        {
            element.addEventListener(eventType, handler, capture);
        }
        else if (element.attachEvent)
        {
            element.attachEvent('on' + eventType, handler);
        }
    }
    catch (e) {}
};
 
// createIframeLayer for Menu Bar
// creates an IFRAME underneath a menu so that it will show above form controls and ActiveX
Spry.Widget.MenuBar.prototype.createIframeLayer = function(menu)
{
    var layer = document.createElement('iframe');
    layer.tabIndex = '-1';
    layer.src = 'javascript:""';
    layer.frameBorder = '0';
    layer.scrolling = 'no';
    menu.parentNode.appendChild(layer);
    
    layer.style.left = menu.offsetLeft + 'px';
    layer.style.top = menu.offsetTop + 'px';
    layer.style.width = menu.offsetWidth + 'px';
    layer.style.height = menu.offsetHeight + 'px';
};
 
// removeIframeLayer for Menu Bar
// removes an IFRAME underneath a menu to reveal any form controls and ActiveX
Spry.Widget.MenuBar.prototype.removeIframeLayer =  function(menu)
{
    var layers = ((menu == this.element) ? menu : menu.parentNode).getElementsByTagName('iframe');
    while(layers.length > 0)
    {
        layers[0].parentNode.removeChild(layers[0]);
    }
};
 
// clearMenus for Menu Bar
// root is the top level unordered list (<ul> tag)
Spry.Widget.MenuBar.prototype.clearMenus = function(root)
{
    var menus = root.getElementsByTagName('ul');
    for(var i=0; i<menus.length; i++)
        // BUG FIX:  only call hideSubmenu() if the submenu is actually visible.
        //this.hideSubmenu(menus[i]);
        if (this.hasClassName(menus[i], this.subVisibleClass))
            this.hideSubmenu(menus[i]);
 
    this.removeClassName(this.element, this.activeClass);
};
 
// bubbledTextEvent for Menu Bar
// identify bubbled up text events in Safari so we can ignore them
Spry.Widget.MenuBar.prototype.bubbledTextEvent = function()
{
    return Spry.is.safari && (event.target == event.relatedTarget.parentNode || (event.eventPhase == 3 && event.target.parentNode == event.relatedTarget));
};
 
// showSubmenu for Menu Bar
// set the proper CSS class on this menu to show it
Spry.Widget.MenuBar.prototype.showSubmenu = function(menu)
{
    if(this.currMenu)
    {
        this.clearMenus(this.currMenu);
        this.currMenu = null;
    }
    
    if(menu)
    {
        this.addClassName(menu, this.subVisibleClass);
        if(typeof document.all != 'undefined' && !Spry.is.opera && navigator.vendor != 'KDE')
        {
            if(!this.hasClassName(this.element, this.horizontalClass) || menu.parentNode.parentNode != this.element)
            {
                menu.style.top = menu.parentNode.offsetTop + 'px';
            }
        }
        if(Spry.is.ie && Spry.is.version < 7)
        {
            this.createIframeLayer(menu);
        }
    }
    this.addClassName(this.element, this.activeClass);
};
 
// hideSubmenu for Menu Bar
// remove the proper CSS class on this menu to hide it
Spry.Widget.MenuBar.prototype.hideSubmenu = function(menu)
{
    if(menu)
    {
        this.removeClassName(menu, this.subVisibleClass);
        if(typeof document.all != 'undefined' && !Spry.is.opera && navigator.vendor != 'KDE')
        {
            menu.style.top = '';
            menu.style.left = '';
        }
        if(Spry.is.ie && Spry.is.version < 7)
            this.removeIframeLayer(menu);
    }
};
 
// initialize for Menu Bar
// create event listeners for the Menu Bar widget so we can properly
// show and hide submenus
Spry.Widget.MenuBar.prototype.initialize = function(listitem, element)
{
    var opentime, closetime;
    var link = listitem.getElementsByTagName('a')[0];
    var submenus = listitem.getElementsByTagName('ul');
    var menu = (submenus.length > 0 ? submenus[0] : null);
 
    if(menu)
        this.addClassName(link, this.hasSubClass);
 
    if(!Spry.is.ie)
    {
        // define a simple function that comes standard in IE to determine
        // if a node is within another node
        listitem.contains = function(testNode)
        {
            // this refers to the list item
            if(testNode == null)
                return false;
 
            if(testNode == this)
                return true;
            else
                return this.contains(testNode.parentNode);
        };
    }
 
    // need to save this for scope further down
    var self = this;
    this.addEventListener(listitem, 'mouseover', function(e){self.mouseOver(listitem, e);}, false);
    this.addEventListener(listitem, 'mouseout', function(e){if (self.enableKeyboardNavigation) self.clearSelection(); self.mouseOut(listitem, e);}, false);
 
    if (this.enableKeyboardNavigation)
    {
        this.addEventListener(link, 'blur', function(e){self.onBlur(listitem);}, false);
        this.addEventListener(link, 'focus', function(e){self.keyFocus(listitem, e);}, false);
    }
};
Spry.Widget.MenuBar.prototype.keyFocus = function (listitem, e)
{
    this.lastOpen = listitem.getElementsByTagName('a')[0];
    this.addClassName(this.lastOpen, listitem.getElementsByTagName('ul').length > 0 ? this.subHoverClass : this.hoverClass);
    this.hasFocus = true;
};
Spry.Widget.MenuBar.prototype.onBlur = function (listitem)
{
    this.clearSelection(listitem);
};
Spry.Widget.MenuBar.prototype.clearSelection = function(el){
    //search any intersection with the current open element
    if (!this.lastOpen)
        return;
 
    if (el)
    {
        el = el.getElementsByTagName('a')[0];
        
        // check children
        var item = this.lastOpen;
        while (item != this.element)
        {
            var tmp = el;
            while (tmp != this.element)
            {
                if (tmp == item)
                    return;
                try{
                    tmp = tmp.parentNode;
                }catch(err){break;}
            }
            item = item.parentNode;
        }
    }
    var item = this.lastOpen;
    while (item != this.element)
    {
        // BUG FIX:  only call hideSubmenu() if the submenu is actually visible.
        //this.hideSubmenu(item.parentNode);
        if (this.hasClassName(item.parentNode, this.subVisibleClass))
            this.hideSubmenu(item.parentNode);
        var link = item.getElementsByTagName('a')[0];
        this.removeClassName(link, this.hoverClass);
        this.removeClassName(link, this.subHoverClass);
        item = item.parentNode;
    }
    this.lastOpen = false;
};
Spry.Widget.MenuBar.prototype.keyDown = function (e)
{
    if (!this.hasFocus)
        return;
 
    if (!this.lastOpen)
    {
        this.hasFocus = false;
        return;
    }
 
    var e = e|| event;
    var listitem = this.lastOpen.parentNode;
    var link = this.lastOpen;
    var submenus = listitem.getElementsByTagName('ul');
    var menu = (submenus.length > 0 ? submenus[0] : null);
    var hasSubMenu = (menu) ? true : false;
 
    var opts = [listitem, menu, null, this.getSibling(listitem, 'previousSibling'), this.getSibling(listitem, 'nextSibling')];
    
    if (!opts[3])
        opts[2] = (listitem.parentNode.parentNode.nodeName.toLowerCase() == 'li')?listitem.parentNode.parentNode:null;
 
    var found = 0;
    switch (e.keyCode){
        case this.upKeyCode:
            found = this.getElementForKey(opts, 'y', 1);
            break;
        case this.downKeyCode:
            found = this.getElementForKey(opts, 'y', -1);
            break;
        case this.leftKeyCode:
            found = this.getElementForKey(opts, 'x', 1);
            break;
        case this.rightKeyCode:
            found = this.getElementForKey(opts, 'x', -1);
            break;
        case this.escKeyCode:
        case 9:
            this.clearSelection();
            this.hasFocus = false;
        default: return;
    }
    switch (found)
    {
        case 0: return;
        case 1:
            //subopts
            this.mouseOver(listitem, e);
            break;
        case 2:
            //parent
            this.mouseOut(opts[2], e);
            break;
        case 3:
        case 4:
            // left - right
            this.removeClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass);
            break;
    }
    var link = opts[found].getElementsByTagName('a')[0];
    if (opts[found].nodeName.toLowerCase() == 'ul')
        opts[found] = opts[found].getElementsByTagName('li')[0];
 
    this.addClassName(link, opts[found].getElementsByTagName('ul').length > 0 ? this.subHoverClass : this.hoverClass);
    this.lastOpen = link;
    opts[found].getElementsByTagName('a')[0].focus();
  
        //stop further event handling by the browser
    return Spry.Widget.MenuBar.stopPropagation(e);
};
Spry.Widget.MenuBar.prototype.mouseOver = function (listitem, e)
{
    var link = listitem.getElementsByTagName('a')[0];
    var submenus = listitem.getElementsByTagName('ul');
    var menu = (submenus.length > 0 ? submenus[0] : null);
    var hasSubMenu = (menu) ? true : false;
    if (this.enableKeyboardNavigation)
        this.clearSelection(listitem);
 
    if(this.bubbledTextEvent())
    {
        // ignore bubbled text events
        return;
    }
 
    if (listitem.closetime)
        clearTimeout(listitem.closetime);
 
    if(this.currMenu == listitem)
    {
        this.currMenu = null;
    }
 
    // move the focus too
    if (this.hasFocus)
        link.focus();
 
    // show menu highlighting
    this.addClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass);
    this.lastOpen = link;
    // BUG FIX:  subHoverClass is used for links, not menus; check for subVisibleClass instead.
    //if(menu && !this.hasClassName(menu, this.subHoverClass))
    if(menu && !this.hasClassName(menu, this.subVisibleClass))
    {
        var self = this;
        listitem.opentime = window.setTimeout(function(){self.showSubmenu(menu);}, this.showDelay);
    }
};
Spry.Widget.MenuBar.prototype.mouseOut = function (listitem, e)
{
    var link = listitem.getElementsByTagName('a')[0];
    var submenus = listitem.getElementsByTagName('ul');
    var menu = (submenus.length > 0 ? submenus[0] : null);
    var hasSubMenu = (menu) ? true : false;
    if(this.bubbledTextEvent())
    {
        // ignore bubbled text events
        return;
    }
 
    var related = (typeof e.relatedTarget != 'undefined' ? e.relatedTarget : e.toElement);
    if(!listitem.contains(related))
    {
        if (listitem.opentime) 
            clearTimeout(listitem.opentime);
        this.currMenu = listitem;
 
        // remove menu highlighting
        this.removeClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass);
        // BUG FIX:  only call hideSubmenu() if the submenu is actually visible.
        //if(menu)
        if(menu && this.hasClassName(menu, this.subVisibleClass))
        {
            var self = this;
            listitem.closetime = window.setTimeout(function(){self.hideSubmenu(menu);}, this.hideDelay);
        }
        if (this.hasFocus)
            link.blur();
    }
};
Spry.Widget.MenuBar.prototype.getSibling = function(element, sibling)
{
    var child = element[sibling];
    while (child && child.nodeName.toLowerCase() !='li')
        child = child[sibling];
 
    return child;
};
Spry.Widget.MenuBar.prototype.getElementForKey = function(els, prop, dir)
{
    var found = 0;
    var rect = Spry.Widget.MenuBar.getPosition;
    var ref = rect(els[found]);
 
    var hideSubmenu = false;
    //make the subelement visible to compute the position
    // BUG FIX:  this.MenuBarSubmenuVisible doesn't exist, refer to this.subVisibleClass instead.
    //if (els[1] && !this.hasClassName(els[1], this.MenuBarSubmenuVisible))
    if (els[1] && !this.hasClassName(els[1], this.subVisibleClass))
    {
        els[1].style.visibility = 'hidden';
        this.showSubmenu(els[1]);
        hideSubmenu = true;
    }
 
    var isVert = this.hasClassName(this.element, this.verticalClass);
    var hasParent = els[0].parentNode.parentNode.nodeName.toLowerCase() == 'li' ? true : false;
    
    for (var i = 1; i < els.length; i++){
        //when navigating on the y axis in vertical menus, ignore children and parents
        if(prop=='y' && isVert && (i==1 || i==2))
        {
            continue;
        }
        //when navigationg on the x axis in the FIRST LEVEL of horizontal menus, ignore children and parents
        if(prop=='x' && !isVert && !hasParent && (i==1 || i==2))
        {
            continue;
        }
            
        if (els[i])
        {
            var tmp = rect(els[i]); 
            if ( (dir * tmp[prop]) < (dir * ref[prop]))
            {
                ref = tmp;
                found = i;
            }
        }
    }
    
    // hide back the submenu
    if (els[1] && hideSubmenu){
        this.hideSubmenu(els[1]);
        els[1].style.visibility =  '';
    }
 
    return found;
};
Spry.Widget.MenuBar.camelize = function(str)
{
    if (str.indexOf('-') == -1){
        return str;    
    }
    var oStringList = str.split('-');
    var isFirstEntry = true;
    var camelizedString = '';
 
    for(var i=0; i < oStringList.length; i++)
    {
        if(oStringList[i].length>0)
        {
            if(isFirstEntry)
            {
                camelizedString = oStringList[i];
                isFirstEntry = false;
            }
            else
            {
                var s = oStringList[i];
                camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
            }
        }
    }
 
    return camelizedString;
};
 
Spry.Widget.MenuBar.getStyleProp = function(element, prop)
{
    var value;
    try
    {
        if (element.style)
            value = element.style[Spry.Widget.MenuBar.camelize(prop)];
 
        if (!value)
            if (document.defaultView && document.defaultView.getComputedStyle)
            {
                var css = document.defaultView.getComputedStyle(element, null);
                value = css ? css.getPropertyValue(prop) : null;
            }
            else if (element.currentStyle) 
            {
                    value = element.currentStyle[Spry.Widget.MenuBar.camelize(prop)];
            }
    }
    catch (e) {}
 
    return value == 'auto' ? null : value;
};
Spry.Widget.MenuBar.getIntProp = function(element, prop)
{
    var a = parseInt(Spry.Widget.MenuBar.getStyleProp(element, prop),10);
    if (isNaN(a))
        return 0;
    return a;
};
 
Spry.Widget.MenuBar.getPosition = function(el, doc)
{
    doc = doc || document;
    if (typeof(el) == 'string') {
        el = doc.getElementById(el);
    }
 
    if (!el) {
        return false;
    }
 
    if (el.parentNode === null || Spry.Widget.MenuBar.getStyleProp(el, 'display') == 'none') {
        //element must be visible to have a box
        return false;
    }
 
    var ret = {x:0, y:0};
    var parent = null;
    var box;
 
    if (el.getBoundingClientRect) { // IE
        box = el.getBoundingClientRect();
        var scrollTop = doc.documentElement.scrollTop || doc.body.scrollTop;
        var scrollLeft = doc.documentElement.scrollLeft || doc.body.scrollLeft;
        ret.x = box.left + scrollLeft;
        ret.y = box.top + scrollTop;
    } else if (doc.getBoxObjectFor) { // gecko
        box = doc.getBoxObjectFor(el);
        ret.x = box.x;
        ret.y = box.y;
    } else { // safari/opera
        ret.x = el.offsetLeft;
        ret.y = el.offsetTop;
        parent = el.offsetParent;
        if (parent != el) {
            while (parent) {
                ret.x += parent.offsetLeft;
                ret.y += parent.offsetTop;
                parent = parent.offsetParent;
            }
        }
        // opera & (safari absolute) incorrectly account for body offsetTop
        if (Spry.is.opera || Spry.is.safari && Spry.Widget.MenuBar.getStyleProp(el, 'position') == 'absolute')
            ret.y -= doc.body.offsetTop;
    }
    if (el.parentNode)
            parent = el.parentNode;
    else
        parent = null;
    if (parent.nodeName){
        var cas = parent.nodeName.toUpperCase();
        while (parent && cas != 'BODY' && cas != 'HTML') {
            cas = parent.nodeName.toUpperCase();
            ret.x -= parent.scrollLeft;
            ret.y -= parent.scrollTop;
            if (parent.parentNode)
                parent = parent.parentNode;
            else
                parent = null;
        }
    }
    return ret;
};
 
Spry.Widget.MenuBar.stopPropagation = function(ev)
{
    if (ev.stopPropagation)
        ev.stopPropagation();
    else
        ev.cancelBubble = true;
    if (ev.preventDefault) 
        ev.preventDefault();
    else 
        ev.returnValue = false;
};
 
Spry.Widget.MenuBar.setOptions = function(obj, optionsObj, ignoreUndefinedProps)
{
    if (!optionsObj)
        return;
    for (var optionName in optionsObj)
    {
        if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
            continue;
        obj[optionName] = optionsObj[optionName];
    }
};

/*
    Lightbox JS: Fullsize Image Overlays
    by Lokesh Dhakar - http://www.huddletogether.com
 
    For more information on this script, visit:
    http://huddletogether.com/projects/lightbox/
 
    Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
    (basically, do anything you want, just leave my name and link)
    
    Table of Contents
    -----------------
    Configuration
    
    Functions
    - getPageScroll()
    - getPageSize()
    - pause()
    - getKey()
    - listenKey()
    - showLightbox()
    - hideLightbox()
    - initLightbox()
    - addLoadEvent()
    
    Function Calls
    - addLoadEvent(initLightbox)
*/
 
//
// Configuration
//
// If you would like to use a custom loading image or close button reference them in the next two lines.
var loadingImage = '';
var closeButton = 'http://www.pps.k12.or.us/css/images/lightbox-close.gif';
 
//
// getPageScroll()
// Returns array with x,y page scroll values.
// Core code from - quirksmode.org
//
function getPageScroll(){
 
    var yScroll;
 
    if (self.pageYOffset) {
        yScroll = self.pageYOffset;
    } else if (document.documentElement && document.documentElement.scrollTop){  // Explorer 6 Strict
        yScroll = document.documentElement.scrollTop;
    } else if (document.body) {// all other Explorers
        yScroll = document.body.scrollTop;
    }
 
    arrayPageScroll = new Array('',yScroll)
    return arrayPageScroll;
}
 
//
// getPageSize()
// Returns array with page width, height and window width, height
// Core code from - quirksmode.org
// Edit for Firefox by pHaez
//
function getPageSize(){
    
    var xScroll, yScroll;
    
    if (window.innerHeight && window.scrollMaxY) {
        xScroll = document.body.scrollWidth;
        yScroll = window.innerHeight + window.scrollMaxY;
    } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
        xScroll = document.body.scrollWidth;
        yScroll = document.body.scrollHeight;
    } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
        xScroll = document.body.offsetWidth;
        yScroll = document.body.offsetHeight;
    }
    
    var windowWidth, windowHeight;
    if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
        windowWidth = document.documentElement.clientWidth;
    } else if (self.innerHeight) { // all except Explorer
        windowWidth = self.innerWidth;
    } else if (document.body) { // other Explorers
        windowWidth = document.body.clientWidth;
    }
    if (self.innerHeight) { // all except Explorer
        windowHeight = self.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
        windowHeight = document.documentElement.clientHeight;
    } else if (document.body) { // other Explorers
        windowHeight = document.body.clientHeight;
    }
    
    // for small pages with total height less then height of the viewport
    if(yScroll < windowHeight){
        pageHeight = windowHeight;
    } else {
        pageHeight = yScroll;
    }
 
    // for small pages with total width less then width of the viewport
    if(xScroll < windowWidth){
        pageWidth = windowWidth;
    } else {
        pageWidth = xScroll;
    }
 
    arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
    return arrayPageSize;
}
 
//
// pause(numberMillis)
// Pauses code execution for specified time. Uses busy code, not good.
// Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602
//
function pause(numberMillis) {
    var now = new Date();
    var exitTime = now.getTime() + numberMillis;
    while (true) {
        now = new Date();
        if (now.getTime() > exitTime)
            return;
    }
}
 
//
// getKey(key)
// Gets keycode. If 'x' is pressed then it hides the lightbox.
//
function getKey(e){
    if (e == null) { // ie
        keycode = event.keyCode;
    } else { // mozilla
        keycode = e.which;
    }
    key = String.fromCharCode(keycode).toLowerCase();
    
    if(key == 'x'){ hideLightbox(); }
}
 
//
// listenKey()
//
function listenKey () { document.onkeypress = getKey; }
 
//
// showLightbox()
// Preloads images. Pleaces new image in lightbox then centers and displays.
//
function showLightbox(objLink)
{
    // prep objects
    var objOverlay = document.getElementById('overlay');
    var objLightbox = document.getElementById('lightbox');
    var objCaption = document.getElementById('lightboxCaption');
    var objImage = document.getElementById('lightboxImage');
    var objLoadingImage = document.getElementById('loadingImage');
    var objLightboxDetails = document.getElementById('lightboxDetails');
 
    var arrayPageSize = getPageSize();
    var arrayPageScroll = getPageScroll();
 
    // center loadingImage if it exists
    if (objLoadingImage) {
        objLoadingImage.style.top = (arrayPageScroll[1] + ((arrayPageSize[3] - 35 - objLoadingImage.height) / 2) + 'px');
        objLoadingImage.style.left = (((arrayPageSize[0] - 20 - objLoadingImage.width) / 2) + 'px');
        objLoadingImage.style.display = 'block';
    }
 
    // set height of Overlay to take up whole page and show
    objOverlay.style.height = (arrayPageSize[1] + 'px');
    objOverlay.style.display = 'block';
 
    // preload image
    imgPreload = new Image();
 
    imgPreload.onload=function(){
        objImage.src = objLink.href;
 
        // center lightbox and make sure that the top and left values are not negative
        // and the image placed outside the viewport
        var lightboxTop = arrayPageScroll[1] + ((arrayPageSize[3] - 35 - imgPreload.height) / 2);
        var lightboxLeft = ((arrayPageSize[0] - 20 - imgPreload.width) / 2);
        
        objLightbox.style.top = (lightboxTop < 0) ? "0px" : lightboxTop + "px";
        objLightbox.style.left = (lightboxLeft < 0) ? "0px" : lightboxLeft + "px";
 
        objLightboxDetails.style.width = imgPreload.width + 'px';
        
        if(objLink.getAttribute('title')){
            objCaption.style.display = 'block';
            //objCaption.style.width = imgPreload.width + 'px';
            objCaption.innerHTML = objLink.getAttribute('title');
        } else {
            objCaption.style.display = 'none';
        }
        
        // A small pause between the image loading and displaying is required with IE,
        // this prevents the previous image displaying for a short burst causing flicker.
        if (navigator.appVersion.indexOf("MSIE")!=-1){
            pause(250);
        }
 
        if (objLoadingImage) {  objLoadingImage.style.display = 'none'; }
 
        // Hide select boxes as they will 'peek' through the image in IE
        selects = document.getElementsByTagName("select");
        for (i = 0; i != selects.length; i++) {
                selects[i].style.visibility = "hidden";
        }
 
        objLightbox.style.display = 'block';
 
        // After image is loaded, update the overlay height as the new image might have
        // increased the overall page height.
        arrayPageSize = getPageSize();
        objOverlay.style.height = (arrayPageSize[1] + 'px');
        
        // Check for 'x' keypress
        listenKey();
 
        return false;
    }
 
    imgPreload.src = objLink.href;
    
}
 
//
// hideLightbox()
//
function hideLightbox()
{
    // get objects
    objOverlay = document.getElementById('overlay');
    objLightbox = document.getElementById('lightbox');
 
    // hide lightbox and overlay
    objOverlay.style.display = 'none';
    objLightbox.style.display = 'none';
 
    // make select boxes visible
    selects = document.getElementsByTagName("select");
    for (i = 0; i != selects.length; i++) {
        selects[i].style.visibility = "visible";
    }
 
    // disable keypress listener
    document.onkeypress = '';
}
 
//
// initLightbox()
// Function runs on window load, going through link tags looking for rel="lightbox".
// These links receive onclick events that enable the lightbox display for their targets.
// The function also inserts html markup at the top of the page which will be used as a
// container for the overlay pattern and the inline image.
//
function initLightbox()
{
    
    if (!document.getElementsByTagName){ return; }
    var anchors = document.getElementsByTagName("a");
 
    // loop through all anchor tags
    for (var i=0; i<anchors.length; i++){
        var anchor = anchors[i];
 
        if (anchor.getAttribute("href") && (anchor.getAttribute("rel") == "lightbox")){
            anchor.onclick = function () {showLightbox(this); return false;}
        }
    }
 
    // the rest of this code inserts html at the top of the page that looks like this:
    //
    // <div id="overlay">
    //      <a href="#" onclick="hideLightbox(); return false;"><img id="loadingImage" /></a>
    //  </div>
    // <div id="lightbox">
    //      <a href="#" onclick="hideLightbox(); return false;" title="Click anywhere to close image">
    //          <img id="closeButton" />
    //          <img id="lightboxImage" />
    //      </a>
    //      <div id="lightboxDetails">
    //          <div id="lightboxCaption"></div>
    //          <div id="keyboardMsg"></div>
    //      </div>
    // </div>
    
    var objBody = document.getElementsByTagName("body").item(0);
    
    // create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)
    var objOverlay = document.createElement("div");
    objOverlay.setAttribute('id','overlay');
    objOverlay.onclick = function () {hideLightbox(); return false;}
    objOverlay.style.display = 'none';
    objOverlay.style.position = 'absolute';
    objOverlay.style.top = '0';
    objOverlay.style.left = '0';
    objOverlay.style.zIndex = '90';
    objOverlay.style.width = '100%';
    objBody.insertBefore(objOverlay, objBody.firstChild);
    
    var arrayPageSize = getPageSize();
    var arrayPageScroll = getPageScroll();
 
    // preload and create loader image
    var imgPreloader = new Image();
    
    // if loader image found, create link to hide lightbox and create loadingimage
    imgPreloader.onload=function(){
 
        var objLoadingImageLink = document.createElement("a");
        objLoadingImageLink.setAttribute('href','#');
        objLoadingImageLink.onclick = function () {hideLightbox(); return false;}
        objOverlay.appendChild(objLoadingImageLink);
        
        var objLoadingImage = document.createElement("img");
        objLoadingImage.src = loadingImage;
        objLoadingImage.setAttribute('id','loadingImage');
        objLoadingImage.style.position = 'absolute';
        objLoadingImage.style.zIndex = '150';
        objLoadingImageLink.appendChild(objLoadingImage);
 
        imgPreloader.onload=function(){};   //  clear onLoad, as IE will flip out w/animated gifs
 
        return false;
    }
 
    imgPreloader.src = loadingImage;
 
    // create lightbox div, same note about styles as above
    var objLightbox = document.createElement("div");
    objLightbox.setAttribute('id','lightbox');
    objLightbox.style.display = 'none';
    objLightbox.style.position = 'absolute';
    objLightbox.style.zIndex = '100';
    objBody.insertBefore(objLightbox, objOverlay.nextSibling);
    
    // create link
    var objLink = document.createElement("a");
    objLink.setAttribute('href','#');
    objLink.setAttribute('title','Click to close');
    objLink.onclick = function () {hideLightbox(); return false;}
    objLightbox.appendChild(objLink);
 
    // preload and create close button image
    var imgPreloadCloseButton = new Image();
 
    // if close button image found,
    imgPreloadCloseButton.onload=function(){
 
        var objCloseButton = document.createElement("img");
        objCloseButton.src = closeButton;
        objCloseButton.setAttribute('id','closeButton');
        objCloseButton.style.position = 'absolute';
        objCloseButton.style.zIndex = '200';
        objLink.appendChild(objCloseButton);
 
        return false;
    }
 
    imgPreloadCloseButton.src = closeButton;
 
    // create image
    var objImage = document.createElement("img");
    objImage.setAttribute('id','lightboxImage');
    objLink.appendChild(objImage);
    
    // create details div, a container for the caption and keyboard message
    var objLightboxDetails = document.createElement("div");
    objLightboxDetails.setAttribute('id','lightboxDetails');
    objLightbox.appendChild(objLightboxDetails);
 
    // create caption
    var objCaption = document.createElement("div");
    objCaption.setAttribute('id','lightboxCaption');
    objCaption.style.display = 'none';
    objLightboxDetails.appendChild(objCaption);
 
    // create keyboard message
    var objKeyboardMsg = document.createElement("div");
    objKeyboardMsg.setAttribute('id','keyboardMsg');
    objKeyboardMsg.innerHTML = 'press <a href="#" onclick="hideLightbox(); return false;"><kbd>x</kbd></a> to close';
    objLightboxDetails.appendChild(objKeyboardMsg);
}

_add_onload(function ()
{
    // Enable the navbar's drop-down menus.
    var MenuBar = new Spry.Widget.MenuBar("nav-bar", {imgDownHover:"http://www.pps.k12.or.us/css/images/SpryMenuBarDown.gif"});
    
    if (document.getElementById)
    {
        // Style the Google search box.
        var f = document.getElementById('cse-search-box');
        
        if (f && f.q)
        {
            var q = f.q;
            
            if (navigator.platform == 'Win32')
            {
                q.style.cssText = 'border: 1px solid #7e9db9; padding: 2px;';
            }
            
            q.onfocus = function ()
            {
                this.style.background = '#ffffff';
            };
            
            q.onblur = function ()
            {
                if (this.value == '')
                {
                    this.style.background = '#ffffff url(http://www.pps.k12.or.us/css/images/google_custom_search_watermark.gif) left no-repeat';
                }
            };
            
            if (!/[&?]q=[^&]/.test(location.search))
            {
                q.onblur();
            }
            
            
            
            // Avoid Internet Explorer memory leaks.
            f = null;
            q = null;
        }
        
        // Handle the "How do I?" form.
        var how_do_i = document.getElementById('how-do-i');
        
        if (how_do_i)
        {
            how_do_i.onsubmit = function ()
            {
                if (this.address.selectedIndex > 0)
                {
                    
                    
                    location = this.address.options[this.address.selectedIndex].value;
                }
                
                return false;
            };
            
            // Avoid Internet Explorer memory leaks.
            how_do_i = null;
        }
    }
    
    // Enable optional lightbox functionality for image links.
    initLightbox();
    
    
});

