obj = null;
document.onmousemove = updateDiv;
intervalId=-1;

function showDiv(e, id) {
  if ((obj != document.getElementById(id)) && obj != null)
    hideDiv();
  
  obj = document.getElementById(id);
  if (intervalId != -1) {
    window.clearInterval(intervalId);
  }
  updateDiv(e);
  obj.style.visibility = 'visible';
  obj.style.display = 'block';
}

function updateDiv(e) {
  xOffset = 15;
  yOffset = 15;

  if (obj == null)
    return;
  var docEl =  (document.documentElement && document.all)? "documentElement" : "body";
  var width=350;
  var height=200;
  
  if (window.event) {
    x = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
    y = window.event.clientY + document.documentElement.scrollTop +
      + document.body.scrollTop;
  }
  else {
    x = e.pageX; 
    y = e.pageY;
  }
  if (window.innerWidth) {
    winW   =  self.innerWidth;
    winH    =  self.innerHeight;
  } else {
    winW   =  document[docEl].clientWidth;
    winH    =  document[docEl].clientHeight;
  }
  if (x + width + xOffset > winW) {
    // maybe we should pop up at the left side
    if (width + xOffset < x) {
      x -= (width + 2*xOffset);
    }
    else { 
      x = winW - width;
      if (x > xOffset)
	x -= xOffset;
    }
  } else {
    x += xOffset;
  }

  if (y + height + yOffset > winH) {
    if (height + yOffset < y) {
	     y -= (height + 2*yOffset);
    } else {
      y = winH - height;
      if (y > yOffset)
	y -= yOffset;
    }
  } else {
    y += yOffset;
  }
  
  obj.style.left = x + "px";
  obj.style.top  = y + "px";	
  obj.style.width = width + "px";
  obj.style.height = height + "px";
}


function triggerHide() {
	intervalId = window.setInterval(hideDiv, 200);
}

function hideDiv() {
	obj.style.visibility = 'hidden';
	obj.style.display = 'none';
	window.clearInterval(intervalId);
}

function add(obj, evType, fn, useCapture) {
  // Opera hack
  if (window.opera && (obj == window)) {
    obj = document;
  }
		
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
			return r;
  } else {
    return false;
  }
}
