// Copyright (c) 2005 CommonTown Pte Ltd. All rights reserved. 
// 2006-02-16 joel loo 
// ------- menu object -------

var ctmenu={
  show: function(menu,ohoming,where,delay) {
    if (typeof delay=="undefined") delay=200;
    // vvvv does not work, ff has no window.event?
    // if (typeof ohoming=="undefined") ohoming=window.event.srcElement;

    omenu=document.getElementById(menu);
    if (!omenu) return; 

    if (omenu.style.visibility=='visible') {
      this._clear_hide(omenu);
      return;
    }

    omenu.menu_data={delay: delay, homing:ohoming, otimeout:'none'}
    omenu.onmouseover=this._onmouseover;
    omenu.onmouseout=this._onmouseout;

    pos=this._get_edges(ohoming);

    switch (where) {
      case 'right': omenu.style.left=pos.right; omenu.style.top=pos.top; break;
      case 'top': omenu.style.left=pos.left; omenu.style.top=pos.top-omenu.offsetHeight; break;
      case 'left': omenu.style.left=pos.left-omenu.offsetWidth; omenu.style.top=pos.top; break;
      default: omenu.style.left=pos.left; omenu.style.top=pos.bottom; 
    }
//    omenu.style.left=0; omenu.style.top=0;

    omenu.style.visibility='visible';
  },

  hide: function (menu) {
    omenu=document.getElementById(menu);
    if (!omenu) return; 
    omenu.menu_data.otimeout=
      setTimeout("ctmenu._really_hide('"+menu+"')",omenu.menu_data.delay);
  },

  // 2006-04-28 joel: float menu to a corner ('ne' only now)
  float: function (menu,where) {
    omenu=document.getElementById(menu);
    if (!omenu) return;
    switch (where) {
      case 'NE':
      default:
	omenu.style.left=document.body.scrollLeft+document.body.clientWidth - omenu.offsetWidth - 5;
	omenu.style.top=document.body.scrollTop+2;
	break;
    }
  },

  dispatch_key: function (e) {
    if (typeof e!='String') {
      if (ctmenu._browser_type=='ie') e=window.event;
      if (!e.ctrlKey) return 0;
      ch=String.fromCharCode(e.keyCode);
    }
    else {
      ch=e;
    }
    ch=ch.toLowerCase();

    arr=document.getElementsByName('ctrl-'+ch);
    if (arr[0]) {
      // a tag has href use href, else run the onclick
      if (cmd=arr[0].href) document.location=cmd;
      else arr[0].onclick();
    }
  },

  // ----- internals ---------
  _really_hide: function (menu) {
    omenu=document.getElementById(menu);
    this._clear_hide(omenu);
    omenu.style.visibility='hidden';
  },

  _dynamic_hide: function (omenu,e){
    if ((this._browser_type=='ie')&&!omenu.contains(e.toElement)) 
      this.hide(omenu.id);
    else  {
      if ((this._browser_type=='ff')&&e.currentTarget!= e.relatedTarget&& !this._contains_ff(e.currentTarget, e.relatedTarget)) 
	this.hide(omenu.id);
    }
  },

  _clear_hide: function (omenu) {
    if (omenu.menu_data.otimeout!="none") {
      clearTimeout(omenu.menu_data.otimeout);
      omenu.menu_data.otimeout='none';
    }
  },

  _browser_type:
   (document.all?'ie':(document.getElementById&&!document.all?'ff':null)),

  _get_edges: function(what){
    var pos={left:what.offsetLeft, top:what.offsetTop}
    var parent=what.offsetParent;
    var buf='';
    // 2007-01-15 joel: add offsetParent positioning check 
    while (parent && parent.style.position!='absolute'){

      // fix a bug displaying elm which has relative parent or 'netcontent' (DE)
      dofix=true;
      granny=parent.offsetParent;
      if (granny) dofix=(granny.style.position!='relative' && granny.id!='netcontent');
      dofix&=(parent.style.position!='relative' && parent.id!='netcontent');

      // 2008-02-07  joel: fixed pages which has netbar which is position:relative
      if (dofix) {
	pos.left+=parent.offsetLeft;
	pos.top+=parent.offsetTop;
      }
      
      //buf+=parent.tagName+'#'+parent.id+'/'+parent.style.position+(dofix?'':'[ignore]')+'('+parent.offsetLeft+','+parent.offsetTop+')'+':'+pos.left+','+pos.top+' | ';
      parent=parent.offsetParent;
    }
    //alert(buf);
    pos.right=pos.left+what.offsetWidth;
    pos.bottom=pos.top+what.offsetHeight;
    return pos;
  },

  _contains_ff: function(a, b) {
    while (b.parentNode)
      if ((b = b.parentNode) == a) return true;
    return false;
  },

  // handlers for menu
  _onmouseout: function(e){
    if (ctmenu._browser_type=='ie') e=window.event;
    ctmenu._dynamic_hide(this,e);
  },
  _onmouseover: function(){ctmenu._clear_hide(this);}
}

