/******************************************************************************
* Copyright 2000, 2001 by Mike Hall                                           *
* Please see http://www.brainjar.com for terms of use.                        *
*                                                                             *
* Code for the site menu.                                                     *
*                                                                             *
* Updated 11/20/2001 to add Opera support.                                    *
******************************************************************************/

// Determine browser and version.
function Browser() {
  var ua, s, i;
	this.isIE    = false;  // Internet Explorer
  this.isOP    = false;  // Opera
  this.isNS    = false;  // Netscape
  this.version = null;
	ua = navigator.userAgent;
	s = "Opera";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isOP = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }
	s = "MSIE";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isIE = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }
	s = "Netscape6/";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }
	// Treat any other "Gecko" browser as NS 6.1.
	s = "Gecko";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = 6.1;
    return;
  }
} 
var browser = new Browser();
// Negate width setting on menu style rule for IE and NS. Width must be set
// in style rule for Opera.
if (browser.isIE)
  document.styleSheets[document.styleSheets.length - 1].addRule(".menu", "width:auto");
if (browser.isNS)
  document.styleSheets[document.styleSheets.length - 1].insertRule(".menu { width:auto; }",
  document.styleSheets[document.styleSheets.length - 1].cssRules.length);
// Global variable for tracking the currently active button.
var activeButton = null;
// Capture mouse clicks on the page so any active button can be
// deactivated.
if (browser.isIE || browser.isOP)
  document.onmousedown = pageMousedown;
if (browser.isNS)
  document.addEventListener("mousedown", pageMousedown, true);
function pageMousedown(event) {
   var el;
	 // If there is no active menu, exit.
	 if (!activeButton)
     return;
   // Find the element that was clicked on.
   if (browser.isIE || browser.isOP)
     el = window.event.srcElement;
   if (browser.isNS)
     el = (event.target.className ? event.target : event.target.parentNode);
	 // If the active button was clicked on, exit.
	 if (el == activeButton)
     return;
   // If the element clicked on was not a menu button or item, close the
   // active menu.
	 if (el.className != "menuButton"  && el.className != "menuItem" && el.className != "menuItemSep" && el.className != "menu")
     resetButton(activeButton);
} 
function buttonClick(button, menuName) {
   // Blur focus from the link to remove that annoying outline.
	 button.blur();
   // Associate the named menu to this button if not already done.
   if (!button.menu)
     button.menu = document.getElementById(menuName);
   // Reset the currently active button, if any.
	 if (activeButton && activeButton != button)
     resetButton(activeButton);
   // Toggle the button's state.
	 if (button.isDepressed)
     resetButton(button);
   else
     depressButton(button);
	 return false;
} 
function buttonMouseover(button, menuName) {
   // If any other button menu is active, deactivate it and activate this one.
   // Note: if this button has no menu, leave the active menu alone.
   if (activeButton && activeButton != button) {
     resetButton(activeButton);
     if (menuName)
       buttonClick(button, menuName);
   }
}
function depressButton(button) {
   var w, dw, x, y;
   // Change the button's style class to make it look like it's depressed.
	 button.className = "menuButtonActive";
   // For IE, set an explicit width on the first menu item. This will
   // cause link hovers to work on all the menu's items even when the
   // cursor is not over the link's text.
	 if (browser.isIE && !button.menu.firstChild.style.width) {
     w = button.menu.firstChild.offsetWidth;
     button.menu.firstChild.style.width = w + "px";
     dw = button.menu.firstChild.offsetWidth - w;
     w -= dw;
     button.menu.firstChild.style.width = w + "px";
   }
   // Position the associated drop down menu under the button and
   // show it. Note that the position must be adjusted according to
   // browser, styling and positioning.
   x = getPageOffsetLeft(button);
   y = getPageOffsetTop(button) + button.offsetHeight;
   if (browser.isNS && browser.version < 6.1)
      y--;
   // Position the menu.
   button.menu.style.left = x + "px";
   button.menu.style.top  = y + "px";
	 // For Opera, need to use "pixel" properties due to bug with standard
   // style properties.
   if (browser.isOP) {
     y = getPageOffsetTop(button) + button.style.pixelHeight + 1;
     button.menu.style.pixelLeft = x;
     button.menu.style.pixelTop  = y;
   }
   else {
     button.menu.style.left = x + "px";
     button.menu.style.top  = y + "px";
   }
   button.menu.style.visibility = "visible";
   // Set button state and let the world know which button is
   // active.
   button.isDepressed = true;
   activeButton = button;
}
function resetButton(button) {
   // Restore the button's style class.
   button.className = "menuButton";
   // Hide the button's menu.
   if (button.menu)
     button.menu.style.visibility = "hidden";
   // Set button state and clear active menu global.
   button.isDepressed = false;
   activeButton = null;
}
function getPageOffsetLeft(el) {
   // Return the true x coordinate of an element relative to the page.
   return el.offsetLeft + (el.offsetParent ? getPageOffsetLeft(el.offsetParent) : 0);
}
function getPageOffsetTop(el) {
   // Return the true y coordinate of an element relative to the page.
	 return el.offsetTop + (el.offsetParent ? getPageOffsetTop(el.offsetParent) : 0);
}
