// convert all characters to lowercase to simplify testing
var agt=navigator.userAgent.toLowerCase();

// *** BROWSER VERSION ***
// Note: On IE5, these return 4, so use is_ie5up to detect IE5.
var is_major = parseInt(navigator.appVersion, 10);

var is_ie     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_ie3    = (is_ie && (is_major < 4));
var is_ie4    = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
var is_ie5up  = (is_ie && !is_ie3 && !is_ie4);

// *** PLATFORM ***
var is_mac    = (agt.indexOf("mac")!=-1);

var lastDiv    = null;
var ksDHFlag   = false;
var ksAutoHide = true;
var ie_mac_y   = 5;
var ie_mac_x   = 7;
var hasHidden  = false;

window.ksHideMenuTimer = null;

function initTimer() {
	window.ksHideMenuTimer = null;
}

function jumpTo(URL_List) {            
	var URL = URL_List.options[URL_List.selectedIndex].value;            
	window.location.href = URL;            
}

function getDiv(div) {
  return document.getElementById(div);
}

function setDisplay(div, display) {
  if (document.layers) {
    div.visibility=display;
  } else {
    div.style.visibility=display;
  }
}

function setLastDiv(divId) {
  lastDiv=getDiv(divId);
}

function showhideAllDocumentSelects(hide, document) {
  var selects = document.getElementsByTagName('select');
  for (var idx = 0; idx < selects.length; idx++) {
    //If the kMenuNoHide property exists, then don't hide
    if (typeof selects[idx].kMenuNoHide == 'undefined') {
      selects[idx].style.visibility = hide;
    }
  }
}

function showhideAllSelects(hide) {
  if (hide == hasHidden) { return; }
  v = (hide)? 'hidden': 'visible';
  hasHidden = hide;
  
  showhideAllDocumentSelects(v, window.document);
  for (i=0; i<window.frames.length; i++) {
    showhideAllDocumentSelects(v, window.frames[i].document);
    for (j=0; j<window.frames[i].frames.length; j++) {
      showhideAllDocumentSelects(v, window.frames[i].frames[j].document);
      for (k=0; k<window.frames[i].frames[j].frames.length; k++) {
        showhideAllDocumentSelects(v, window.frames[i].frames[j].frames[k].document);
      }
    }
  }
}

function hideLast() {
  if (lastDiv) { setDisplay(lastDiv, 'hidden'); }
  showhideAllSelects(false);
}

function xDef() {
  for (var i=0; i<arguments.length; ++i) {
    if (typeof(arguments[i]) == "undefined") {
      return false;
    }
  }

  return true;
}

function findPosY(obj) {
	curtop = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	}
	else if (obj.y) {
		curtop += obj.y;
    }

	return curtop;
}

function findPosX(obj) {
	curLeft = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curLeft += obj.offsetLeft;
			obj      = obj.offsetParent;
		}
	}
	else if (obj.x) {
		curLeft += obj.x;
    }

	return curLeft;
}

function xHeight(e, uH) {
  if (! e)  { return 0; }
  uH = e.offsetHeight;
  return uH;
}

function xWidth(e, uW) {
  if (! e) { return 0; }
  uW = e.offsetWidth;
  return uW;
}

function xClientHeight() {
	h = 0;
    if (xDef(window.innerHeight, window.innerWidth, document.width)) {
		h = window.innerHeight;
		if (document.width > window.innerWidth) { h -= 16; }
        return h;
	}

	if (!window.opera && document.documentElement && document.documentElement.clientHeight) {
		return document.documentElement.clientHeight;
    }
	
    if (document.body && document.body.clientHeight) {
		return document.body.clientHeight;
    }
	 
	return 0;
}

function xScrollTop() {
  if (xDef(window.pageYOffset)) { return window.pageYOffset; }
  if (document.documentElement && document.documentElement.scrollTop) {
    return document.documentElement.scrollTop;
  }
  if (document.body && xDef(document.body.scrollTop)) {
    return document.body.scrollTop;
  }
  return 0;
}

function xSetTop(div, parent) {
  nTop     = findPosY(parent) - ie_mac_y;
  nLeft    = findPosX(parent) - ie_mac_x;
  nH       = xHeight(div);
  nW       = xWidth(parent)  - 3;
  nClientH = xClientHeight() - 3;

  if (nClientH > 0) { nClientH += xScrollTop(); }

  // Vertical placement
  nTmp = nClientH - (nTop + nH);
  if (nTmp < 0) {
      nTop = nTop + nTmp;
  }

  if (document.layers) {
    div.top  = nTop;
    div.left = nLeft + nW;
  } else {
    div.style.top  = nTop  + 'px';
    div.style.left = (nLeft + nW) + 'px';
  }
}

function xGetElementById(e) {
  if (typeof(e) != "string") { return e; }
  if (document.getElementById) {
    e = document.getElementById(e);
  }
  else {
    e = null;
  }

  return e;
}

function xTop(e, iY) {
  if (! (e = xGetElementById(e))) { return 0; }
  if (xDef(iY)) {
    e.style.top = iY + "px";
  }
  else {
    if (xDef(e.offsetTop)) {
      iY = e.offsetTop;
    }
    else {
      iY = parseInt(e.style.top, 10);
    }

    if (isNaN(iY)) {
      iY = 0;
    }
  }

  return iY;
}

function xLeft(e, iX) {
  if (! (e = xGetElementById(e))) { return 0; }
  if (xDef(iX)) {
    e.style.left = iX + "px";
  }
  else {
    if (xDef(e.offsetLeft)) {
      iX = e.offsetLeft;
    }
    else {
      iX = parseInt(e.style.left, 10);
    }

    if (isNaN(iX)) {
      iX = 0;
    }
  }

  return iX;
}

function xPageY(e) {
  if ( !(e = xGetElementById(e)) ) { return 0; }
  y = 0;
  while (e) {
    if (xDef(e.offsetTop)) { y += e.offsetTop; }
    else { break; }
    e = e.offsetParent;
  }
  return y;
}

function xPageX(e) {
  if ( !(e = xGetElementById(e)) ) { return 0; }
  
  x = 0;
  while (e) {
    if (xDef(e.offsetLeft)) { x += e.offsetLeft; }
    else { break; }
    e = e.offsetParent;
  }
  return x;
}

function setTop(div, parent, sideAligned) {
  nTop     = xTop(parent);
  nLeft    = xLeft(parent);
  nPageY   = xPageY(parent) - (nTop === 0? 5: nTop);
  nPageX   = xPageX(parent);
  nH       = xHeight(div);
  pH       = xHeight(parent);
  nW       = xWidth(parent);
  nClientH = xClientHeight() - 3;

  if (nClientH > 0) { nClientH += xScrollTop(); }

  // Will the drop down display below or to the side of the parent
  if (sideAligned) { pH = 0; }
  else { nW = 1; }

  // Vertical placement
  var nDiff = 0;
  if (nPageY < 0) {
    nDiff += -nPageY;
  } else {
    nTmp = nClientH - (nPageY + nH + nTop);
    if (nTmp < 0) {
      nDiff = nTmp;
    }
  }

  if (nDiff !== 0) {
    xTop(div, nPageY + nDiff + nTop - 16);
  }
  else {
    xTop(div, nPageY + nTop + pH);
  }

  xLeft(div, nPageX + nW);
}

//------------------------------------------------------------------------------
function KS_clearTimeout() {
  if (ksHideMenuTimer) { clearTimeout(ksHideMenuTimer); }
  ksHideMenuTimer = null;
  ksDHFlag = false;
}

//------------------------------------------------------------------------------
function KS_startTimeout() {
  ksStart = new Date();
  ksDHFlag = true;
  ksHideMenuTimer = setTimeout("ksDoHide()", 1000);
}

//------------------------------------------------------------------------------
function ksDoHide() {
  if (! ksAutoHide) { return; }
  if (! ksDHFlag  ) { return; }

  var elapsed = new Date() - ksStart;
  if (elapsed < 1000) {
    ksHideMenuTimer = setTimeout("ksDoHide()", 1100 - elapsed);
    return;
  }

  ksDHFlag = false;
  hideLast();
}

function noAutoHide() {
  ksAutoHide = false;
}

function autoHide() {
  ksAutoHide = true;
}

function onMenuItem () {
	KS_clearTimeout();
}

function hide_menu() {
  KS_clearTimeout();
  hideLast();
}

function delayed_hide_menu() {
  KS_startTimeout();
}

function displayMenu(parent, divId, sideAligned) {
  KS_clearTimeout();
  showhideAllSelects(true);

  var div = getDiv(divId);
  if (lastDiv) { setDisplay(lastDiv, 'hidden'); }
  setDisplay(div, 'inherit');

  if (is_mac && is_ie5up) {
    xSetTop(div, parent);
  }
  else {
    setTop(div, parent, sideAligned);
  }

  lastDiv = div;
}

// A call to this function displays the menu right aligned of the parent
function display(parent, divId) {
  displayMenu(parent, divId, true);
}

// A call to this function displays the menu below the parent
function displayBelow(parent, divId) {
  ie_mac_x = 206;
  ie_mac_y = 115;
  displayMenu(parent, divId, false);
  ie_mac_x = 7;
  ie_mac_y = 5;
}

