var MENU_VERTICAL = 0;
var MENU_HORIZONTAL = 1;
var MENU_ARROW_RIGHT = 'right.gif';
var MENU_ARROW_DOWN = 'down.gif';

var mfcmenus = new Array();
var hiddenselects = new Array();

function hideSelects(){
  if (hiddenselects.length > 0) return;
  hiddenselects = new Array();
  for (var i=0; i<document.forms.length; i++){
    var myform = document.forms[i];
    for (var j=0; j<myform.elements.length; j++){
      if ((myform.elements[j].type == 'select-one' || 
	     myform.elements[j].type == 'select-multiple') && 
	    (myform.elements[j].style.visibility == '' ||
           myform.elements[j].style.visibility == 'visible') ){
	  myform.elements[j].style.visibility = 'hidden';
	  hiddenselects[hiddenselects.length] = myform.elements[j];
      }
    }
  }
}

function showSelects(){
  for (var i=0; i<hiddenselects.length; i++){
    hiddenselects[i].style.visibility = 'visible';
  }
  hiddenselects = new Array();
}


function popupMenu(name, obj, offsetX, offsetY){
  var found = false;
  for (var i=0; i<mfcmenus.length; i++){
    if (mfcmenus[i].name != name) continue;
    found = true;
    mfcmenus[i].show(obj, offsetX, offsetY);
    //hideMenu(name, mfcmenus[i].timeout);  //schedule it hiding after its designed timeout
  }
  if (!found) alert('did not find menu '+name);
}

function hideMenu(name, timeout){
  if (timeout == undefined) timeout = 0;
  for (var i=0; i<mfcmenus.length; i++){
    if (mfcmenus[i].name != name) continue;
    mfcmenus[i].hide(timeout);
  }
}

function hideSubmenus(name){
  for (var i=0; i<mfcmenus.length; i++){
    if (mfcmenus[i].name != name) continue;
    for (var j=0; j<mfcmenus[i].items.length; j++){
      if (mfcmenus[i].items[j].submenu != null) mfcmenus[i].items[j].submenu.hide(0);
    }
  }
}

function cancelMenuHide(name){
  for (var i=0; i<mfcmenus.length; i++){
    if (mfcmenus[i].name != name) continue;
    mfcmenus[i].cancelHide();
  }
}


function debug(){
  //var divs = document.getElementsByTagName('DIV');
  //for (var i=0; i<divs.length; i++){
  //  alert('found div '+divs[i].id);
  //}
  //alert('first menu is '+mfcmenus[1].name+', with ID: '+mfcmenus[1].id);
  //alert(mfcmenus[1].getHTML());
  //alert('menu is '+document.getElementById(mfcmenus[1].id));
}



function MFCPopupMenu (name, width, fixed, timeout, type, hideselects, items){
  this.name= name;
  this.width = width;
  this.fixed = fixed;

  this.timeout = timeout;
  if (this.timeout == null) this.timeout = 0;

  this.type = type;
  if (this.type == null) this.type = 0;

  this.hideselects = hideselects;
  if (this.hideselects == null) this.hideselects = 1;

  this.items = items;
  if (items != null){
    for (var i=0; i<items.length; i++){
      items[i].menu = this;
    }
  }
  this.parentitem = null;
  this.currenthide = null

  this.getHTML = getHTML;
  this.show = show;
  this.hide = hide;
  this.cancelHide = cancelHide;
  mfcmenus[mfcmenus.length] = this;
}

function getHTML(){

  var html = '<div ID="'+this.name+'" style="';
  html += this.fixed? 'visibility: visible;' : 'position: absolute; visibility: hidden;';
  html += '">';
  html += '<table CLASS="MFCPopupMenu">';
  for (var i=0; i<this.items.length; i++){
    var item = this.items[i];
    var itemid = this.name+'item'+i;
    if (this.type == 0) html += '<tr>\n';
    html += '  <td CLASS="MFCPopupMenuItem" \n';
    html += '      ID="' + itemid + '" \n';
    if (item.link || item.submenu != null){
      html += '      style="cursor: hand;" \n';
      html += '      onMouseOver="this.className=\'MFCPopupMenuItem_Over\'; cancelMenuHide(\''+this.name+'\'); ';
      if (item.submenu != null){
	html += '      popupMenu(\''+item.submenu.name+'\', this, ';
        if (item.submenuoffsetX){
	  html += '\'' +  item.submenuoffsetX + '\', ';
        } else {
          html += (this.type == MENU_VERTICAL)? '\'right\', ' : '\'left\', ';
        }
        if (item.submenuoffsetY){
          html += '\'' +  item.submenuoffsetY + '\'';
        } else {
          html += (this.type == MENU_VERTICAL)? '\'top\'' : '\'bottom\'';
        }
        html += ');  ';
      } else {
        html += '      hideSubmenus(\''+item.menu.name+'\'); ';
      }
      html += '\n"';
      html += '      onMouseOut="this.className=\'MFCPopupMenuItem\'; hideMenu(\''+this.name+'\', '+this.timeout+');" \n>';
    } else {
      html += '\n>';
    }
    
    if (item.submenu != null && this.type==MENU_VERTICAL && MENU_ARROW_RIGHT != null){
      html += '<img src="'+MENU_ARROW_RIGHT+'" border=0 align="right"></div>';
    }
    if (item.submenu != null && this.type==MENU_HORIZONTAL && MENU_ARROW_DOWN != null){
      html += '<img src="'+MENU_ARROW_DOWN+'" border=0>';
    }
    if (item.link){
      if (item.target){
        html += '<a href="' + item.link + '" target="' + item.target + '">' + item.html + '</a>';
      } else {    
        html += '<a href="'+item.link+'">'+item.html+'</a>';
      }
    } else {
      html += item.html;
    }
    html += '</td>\n';
    if (this.type == 0) html += '</tr>\n';
  }
  html += '</table></div>';
  for (var i=0; i<this.items.length; i++){
    var item = this.items[i];
    if (item.submenu != null){
      html += "\n"+item.submenu.getHTML();
    }
  }
  return html;
} 

function show(obj, offsetX, offsetY){
  //alert('showing menu '+this.name+' at '+obj+' with offset '+offsetX+', '+offsetY);

  // make sure that this menu and all its parents don't have scheduled hides
  this.cancelHide();

  var menudiv = document.getElementById(this.name);

  if (this.parentitem != null){
    hideSubmenus(this.parentitem.menu.name);
  }
  var xy = getPosition(obj, offsetX, offsetY);
  if(obj != null)
    menudiv.style.position = 'absolute';
  else
    menudiv.style.position = 'relative';
  menudiv.style.left = xy[0]+'px';
  menudiv.style.top  = xy[1]+'px';
  menudiv.width = this.width+'px';
  menudiv.style.visibility = 'visible';
  if (this.hideselects) hideSelects();
}

function hide(timeout){
  //alert('hiding menu '+this.name+' after '+timeout);
  if (timeout > 0){
    //alert("hiding menu after "+timeout);
    if (this.currenthide != null) window.clearTimeout(this.currenthide);      
    this.currenthide = window.setTimeout('hideMenu("'+this.name+'",0)', timeout*1000);
    //recursively hide all the parents
    if (this.parentitem != null){
      //document.forms[0].debug.value += 'adding hide for parent menu '+this.parentitem.menu.name +'\n';
      if (this.parentitem.menu.timeout >= 0) this.parentitem.menu.hide(timeout);
    }
    return;
  }
  if (timeout < 0){
    //hide all children
    for (var i=0; i<this.items.length; i++){
      if (this.items[i].submenu == null) continue;
      this.items[i].submenu.hide(2);
    }
    return;
  }    
  //hide all children
  for (var i=0; i<this.items.length; i++){
    if (this.items[i].submenu == null) continue;
    this.items[i].submenu.hide(0);
  }
  var element = document.getElementById(this.name);
  if (element && (element.style.visibility == '' || element.style.visibility == 'visible')){
    element.style.visibility = 'hidden';
    if (this.hideselects) showSelects();
  }
}

function cancelHide(){
  if (this.currenthide != null){
    window.clearTimeout(this.currenthide);
    this.currenthide = null;
    
  }
  if (this.parentitem != null) this.parentitem.menu.cancelHide();
}



function MFCMenuItem(html, link, target, submenu, submenuoffsetX, submenuoffsetY){
  this.html = html;
  this.link = link;
  this.target = target;
  this.menu = null;
  this.submenu = submenu;
  this.submenuoffsetX = submenuoffsetX;
  this.submenuoffsetY = submenuoffsetY;
  if (this.submenu != null) this.submenu.parentitem = this;
}



function getPosition(obj, offsetX, offsetY){
  var x=0, y=0;
  
  //alert('computing with '+obj+' and dims: '+obj.offsetWidth+', '+obj.offsetHeight+', and offsets '+offsetX+', '+offsetY);
  if (obj != null){
    offsetX = ''+offsetX;
    offsetX = offsetX.replace(/right/ig, ''+obj.offsetWidth);
    offsetX = offsetX.replace(/middle/ig, ''+Math.round(obj.offsetWidth/2));
    offsetX = offsetX.replace(/left/ig, '0');
    offsetY = ''+offsetY;
    x = eval(offsetX);
    offsetY = ''+offsetY;
    offsetY = offsetY.replace(/top/ig, '0');
    offsetY = offsetY.replace(/center/ig, ''+Math.round(obj.offsetHeight/2));
    offsetY = offsetY.replace(/bottom/ig, ''+obj.offsetHeight);
    y = eval(offsetY);

    //alert('computed x and y: '+x+', '+y);
    
    var offsetp = obj.offsetParent;
    while (offsetp != null){
      //alert('got parent offset '+offsetp+' at '+offsetp.offsetLeft+', '+offsetp.offsetTop);
      if (!isNaN(obj.offsetLeft))  x += offsetp.offsetLeft;
      if (!isNaN(obj.offsetTop))   y += offsetp.offsetTop;
      offsetp = offsetp.offsetParent;
    }

    x += obj.offsetLeft;
    y += obj.offsetTop;

    //alert('computed x and y: '+x+', '+y);
    
    
  } else {
    x = offsetX;
    y = offsetY;
  }

  return [x, y];
}


