      var timeouts = new Object();
      var menu_grace_period = 100;

      function _resolve(id) {
        var obj = document.getElementById(id);
        if (! obj)
          alert("Sorry, missing object for: '" + id + "'");
        return obj;
      }

      function visibilize(id) {
        // if there are any visible other menus, close them on focusing new
        for (var ex_id in timeouts) {
          clearTimeout(timeouts[ex_id]);
          delete(timeouts[ex_id]);
          unvisibilize(ex_id);
        }
	var prn= _resolve(id+'-parent');
	pos=findPosition(prn);
        var obj = _resolve(id);
        obj.style.position="absolute";
        obj.style.left=pos[0];
        obj.style.visibility = 'visible';
      }

	function findPosition( oLink ) {
	  if( oLink.offsetParent ) {
	    for( var posX = 0, posY = 0; oLink.offsetParent; oLink = oLink.offsetParent ) {
	      posX += oLink.offsetLeft;
	      posY += oLink.offsetTop;
	    }
	    return [ posX, posY ];
	  } else {
	    return [ oLink.x, oLink.y ];
	  }
	}


      function unvisibilize(id) {
        var obj = _resolve(id);
        obj.style.visibility = 'hidden';
      }

      // after a grace period, kill the visible div`s unless cancelled
      function time_unvisibilize(id) {
        var closure = function() {
          unvisibilize(id);
          delete(timeouts[id]);
        }
        timeouts[id] = setTimeout(closure, menu_grace_period);
      }

      function cancel_unvisibilize(id) {
        var timer = timeouts[id];
        if (timer) {
          clearTimeout(timer);
          delete(timeouts[id]);
        }
      }
