// $Revision: 1.44 $:
var ie5 = (document.getElementById && document.all && navigator.appVersion.toUpperCase().indexOf("MSIE 5") != -1);
var ie6 = (document.getElementById && document.all && navigator.appVersion.toUpperCase().indexOf("MSIE") != -1);
var ns6  = (document.getElementById && !document.all);
var el = null;
var pageW = 0;
var pageH = 0;
var menuId = null;
var hideMenuTimeout = 0;
var menuObjects = new Collection();
var mouseOver = false;
var newDiv = null;
var section508 = false;
var bannerMenuItem = false;
var helpToolbarItem = false;

var returnFocusId = null;

if(ie5 || ie6) {
  document.attachEvent("onclick", decideToHideMenu);
  document.attachEvent("onkeydown", decideToExecuteOrHideMenu);
}
else {
  document.addEventListener("click", decideToHideMenu, false);
  document.addEventListener("onkeydown", decideToExecuteOrHideMenu, false);
}

/********************************************************************************************************************/
function setHelpToolbarItem(helpToolbarItem) {
  this.helpToolbarItem = helpToolbarItem;
}
/********************************************************************************************************************/
function setBannerMenuItem(bannerMenuItem) {
  this.bannerMenuItem = bannerMenuItem;
}
/********************************************************************************************************************/
function setSection508(section508) {
  this.section508 = section508;
}
/********************************************************************************************************************/
function isSection508() {
  return this.section508;
}
/********************************************************************************************************************/
function decideToExecuteOrHideMenu() {
  try{
	  if(window.event.keyCode == 27 /* Esc key */) {  
	    decideToHideMenu();
	    setFocus(); 
	    return;
	  }
	  if(window.event.keyCode == 13 /* Enter key */) {
	    /** do nothing -- let menu execute **/
	    
	    return;
	  }
  }
  catch(e){
  alert(e);
  	return;
  }
}
/********************************************************************************************************************/
function setFocus(id) {
		
	if(id == null)
		id = returnFocusId;
	else
		returnFocusId = id;
		
	var focusItem = document.getElementById(id);	
//alert("id="+id);
//alert("focusItem="+focusItem);
	if(focusItem != null){
		focusItem.focus();
		focusItem.selected;
		returnFocusId = null;
	}
}

/********************************************************************************************************************/
function decideToHideMenu() {
  if(this.menuId != null){      
    hideIt();
  }
}
/********************************************************************************************************************/
function addMenuObject(menuObject) {
  menuObjects.add(menuObject);
}
/********************************************************************************************************************/

function setFocusId(id){
	returnFocusId = id;
}
/********************************************************************************************************************/
function showMenu(menuId, event, x, y, tabIndex, fireDefaultAction) {

//alert("menuId="+menuId + ", "+"tabIndex="+tabIndex);

  if(!ie5 && !ie6 && !ns6) {
    alert("Current Browser < " + navigator.appName + " " + navigator.appVersion + " > Not Supported");
    return;
  }
  if(!document.getElementById(menuId)) {
    return;
  }
  // hide any existing menus
  if(this.menuId != null) {
    hideIt();
  }
  /**
   * check if this menu has only one item or menu option is disabled (doesn't apply to banner items).
   * If so, fire event without showing menu
  **/
  var menuObject = getMenuObject(menuId);
  if(menuObject != null && (menuObject.itemsCount() == 1 || fireDefaultAction || (!isPopupMenuEnabled() && !this.bannerMenuItem))) {
    var menuItem = menuObject.getMenuItems().first();
    var onClickEvent = menuItem.getOnClickEvent();
    eval(onClickEvent);
    return;
  }
  this.menuId = menuId;
  pageW = (ns6 ? window.innerWidth : document.body.offsetWidth) + document.body.scrollLeft;
  pageH = (ns6 ? window.innerHeight : document.body.offsetHeight) + document.body.scrollTop;
  el = document.getElementById(this.menuId);
 
  if(x == null) {
	  var elWidth = el.offsetWidth;	      
	  if(this.bannerMenuItem) {
      	if(ns6) {
  	    	x = ((event.clientX - event.target.offsetWidth) + event.clientX) / 2;
	    }else {

	      x = ((event.clientX - event.srcElement.offsetWidth) + event.clientX) / 2;

	    }
	  }else if(event.type == 'keypress' || event.type == 'keydown') {

      	if(ns6) {
        	x = getElementOffsetLeftForNS(event.target);
      	}
      	else {
        	x = getElementOffsetLeftForIE(event.srcElement);
      	}
      }else {
	    // align menu at event.clientX 	
	    x = event.clientX + document.body.scrollLeft;
	  }
	  // adjust popup so it won't go out of bounds
	  if((x + elWidth) > pageW) {
	    var diff = (x + elWidth) - pageW;
	    x -= diff;
	    // subtract an additional 5px
	    if(!this.bannerMenuItem) {
	      x -= 15;
  	  }
  	  else if(this.helpToolbarItem) {
	      x -= 20;
	    }
  	  
	  }
	  // subtract an additional 2px
	  x -= 2;
  }
  // now do the same thing for y co-ordinate
  if(y == null) {
	  var elHeight = el.offsetHeight;
	  // align menu underneath srcElement 	
	  if(ns6) {
	    if(event.type == 'keypress' || event.type == 'keydown') {
        y = getElementOffsetTopForNS(event.target);
	    }
	    else {
		    y = event.clientY + document.body.scrollTop;
		  }  
	    if(event.layerY < event.target.offsetHeight) {
  	    y += (event.target.offsetHeight - event.layerY);
	    }
	    else {
        y += (event.target.offsetHeight - (Math.floor(event.layerY % event.target.offsetHeight)));  
      }
      y += 2;
    }
	  else {
  	  y = event.clientY + document.body.scrollTop + (event.srcElement.offsetHeight - event.offsetY) + event.srcElement.offsetTop;
	  }
	  // adjust popup so it won't go out of bounds
	  if((y + elHeight) > pageH) {
	    // go up
   	  if(ns6) {
  	    y -= (elHeight + event.target.offsetHeight);
   	  }
   	  else {
  	    y -= (elHeight + event.srcElement.offsetHeight);
   	  }
	    if(y < 0) {
	      // align menu at the best possible position
	      y += Math.abs(y);
	    }
	    if(!this.bannerMenuItem) {
	      // add an additional 2px
	      y += (ns6 ? 0 : 2);
	    }
	  }
	  else {
	    if(!this.bannerMenuItem) {
	      // subtract an additional 2px
	      y -= (ns6 ? 0 : 2);
	    }
	  }
  }
  var parentObj = ns6 ? event.target : event.srcElement;
  newDiv = el.cloneNode(true);
  if(ns6) {
    document.body.insertBefore(newDiv, el);
  }
  else {
    el.insertAdjacentElement('AfterEnd', newDiv);
  }
  newDiv.id = "newDivId";
  newDiv.style.left = x + "px";
  newDiv.style.top = y + "px";
  newDiv.style.visibility = 'visible';
  var hrefList = newDiv.getElementsByTagName("A");
  for (i = 0; i < hrefList.length; i++) {
    hrefList[i].setAttribute("tabIndex", tabIndex);
    hrefList[i].setAttribute("id", hrefList[i].childNodes[0].nodeValue + menuId);
  }
  hrefList[0].focus();
  event.cancelBubble = true;
}

/********************************************************************************************************************/

function showIt() {

  var divEl = document.getElementById(this.menuId);
    divEl.style.visibility = 'visible';

}

/********************************************************************************************************************/

function hideMenu() {

  // clean up
  clearTimeout(hideMenuTimeout);
  hideMenuTimeout = setTimeout("hideIt()", 500);

}

/********************************************************************************************************************/

function killMenu() {
  // clean up
  clearTimeout(hideMenuTimeout);
  hideIt();
}

/********************************************************************************************************************/

function hideIt() {

  if (newDiv != null) {
    if (ns6)
      document.body.removeChild(newDiv);
    else
      newDiv.removeNode(true);
  }

  newDiv = null;
}

/********************************************************************************************************************/

function mouseOverEvent() {
  if(!ns6) {
    menuHref = event.srcElement;
    if(event.srcElement.disabled) {
      event.srcElement.disabled = false;
      menuHref.focus();
      event.srcElement.disabled = true;
    }
    else {
      menuHref.focus();
    }
  }
}

/********************************************************************************************************************/

function mouseOutEvent() {
}

/********************************************************************************************************************/

function keepFocused() {
  // clean up
  clearTimeout(hideMenuTimeout);

}

/********************************************************************************************************************/

function getMenuObject(menuId) {

  if(menuObjects.size == 0) {

    return null;

  }

  var iterator = menuObjects.iterator();

  while(iterator.hasNext()) {

    var menuObject = iterator.next();

    if(menuObject.getMenuId() == menuId) {

      return menuObject;

    }

  }

  return null;

}

/********************************************************************************************************************/

function runDefaultAction()
{
  var menuObject = getMenuObject(menuId);
  var menuItem = menuObject.getMenuItems().first();
  var onClickEvent = menuItem.getOnClickEvent();
  eval(onClickEvent);
  return;
}

/********************************************************************************************************************/
function showAlert1() {
  var hrefList = document.getElementsByTagName("A");
  var links = "";
  for (i = 0; i < hrefList.length; i++) {
    links += "text="+hrefList[i].title+";tab="+hrefList[i].getAttribute("tabIndex") + " || ";
  }
}
/********************************************************************************************************************/
function getElementOffsetLeftForIE(element) {
  if(element.offsetLeft > 0) {
    return element.offsetLeft;
  }
  return element.parentElement == null ? element.offsetLeft : getElementOffsetLeftForIE(element.parentElement);
}
/********************************************************************************************************************/
function getElementOffsetTopForIE(element) {
  if(element.nodeName.toUpperCase() != "A" && element.offsetTop > 0) {
    return element.offsetTop;
  }
  return getElementOffsetTopForIE(element.parentElement);
}
/********************************************************************************************************************/
function getElementOffsetLeftForNS(element) {
  return element.offsetLeft;
}
/********************************************************************************************************************/
function getElementOffsetTopForNS(element) {
  if(element == null) {
    return 0;
  }
  if(element.nodeName.toUpperCase() != "A" && element.offsetTop > 0) {
    return element.offsetTop;
  }
  return getElementOffsetTopForNS(element.parentElement);
}
/********************************************************************************************************************/
