function tooltip_init() {
  if(!document || !document.body) return;

  window.init_run = true;
  window.tooltipOffsetX = 15;
  window.tooltipOffsetY = 10;

  var tooltipDiv = document.createElement('div');
      tooltipDiv.setAttribute('id','tooltipDiv');
      tooltipDiv.style.position = "absolute";
      tooltipDiv.style.display = "none";
      tooltipDiv.style.width = "350px";
  document.body.appendChild(tooltipDiv);
  if (!window.mousepos_X) window.mousepos_X = 0;
  if (!window.mousepos_Y) window.mousepos_Y = 0;
  tooltip_move(tooltipDiv, window.mousepos_X+window.tooltipOffsetX, window.mousepos_Y+window.tooltipOffsetY);

  var whichbrowser = navigator.userAgent.toLowerCase();
  window.isnetscape = false;
  if (whichbrowser.indexOf('mozilla') != -1 && whichbrowser.indexOf('msie') == -1) {
    isnetscape = true;
  }

  if(isnetscape) {
    document.captureEvents(Event.MOUSEMOVE);
  }
}

function tooltip_getWindowSize() {
  var size = new Object();
  size.x = 0;
  size.y = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    size.x = window.innerWidth;
    size.y = window.innerHeight;
  } else if( document.documentElement &&
      ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    size.x = document.documentElement.clientWidth;
    size.y = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    size.x = document.body.clientWidth;
    size.y = document.body.clientHeight;
  }
  return size;
}

function tooltip_getWindowScroll() {
  var scroll = new Object();
  scroll.x = 0;
  scroll.y = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scroll.y = window.pageYOffset;
    scroll.x = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scroll.y = document.body.scrollTop;
    scroll.x = document.body.scrollLeft;
  } else if( document.documentElement &&
      ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scroll.y = document.documentElement.scrollTop;
    scroll.x = document.documentElement.scrollLeft;
  }
  return scroll;
}

function tooltip(text, title) {
  if(!window.init_run) {
    tooltip_init();
    return;
  }
  var div = document.getElementById('tooltipDiv');
  if (!div) return;
  var txt = "";
  txt = "<div id=\"tooltip_header\">"+title+"</div>\n" +
        "<div id=\"tooltip_text\">"+text+"</div>\n" +
        "<div id=\"tooltip_bottom\" style=\"line-height:0;\">&nbsp;</div>\n";
  div.innerHTML = txt;
  tooltip_show();
}

function tooltip_show() {
  var div = document.getElementById('tooltipDiv');
  if (!div) return;
  div.style.display = "block";
  if(window.tooltipTimer) {
  clearTimeout(window.tooltipTimer);
  }
}

// For backward compatibility (tv_*.html). Should use tooltip_hide() from now on.
function hidetooltip() {
  tooltip_hide();
}

function tooltip_hide() {
  var div = document.getElementById('tooltipDiv');
  window.tooltipTimer = setTimeout("tooltip_hide_action()", 250);
}

function tooltip_hide_action() {
  var div = document.getElementById('tooltipDiv');
  if (!div) return;
  if(div) {
  div.style.display = "none";
  }
  // Show those that were hidden when hiding tooltip...
  hideShowCovered(-10,-10,-10,-10);
}

function tooltip_MouseMove(evt) {
  var div = document.getElementById('tooltipDiv');
  var div_bottom = document.getElementById('tooltip_bottom');
  
  if (!div) return false;
  
  if(div.style.display != "none") {
    var e = window.event;
    if (!e) e = evt;
    var mouseoffsetX = 0;
    var mouseoffsetY = 0;
    var screenheight = 0;
    var screenwidth = 0;
    var x, y;

    var windowsize = tooltip_getWindowSize();

    if (isnetscape == true) {
      mouseoffsetX = e.pageX;
      mouseoffsetY = e.pageY;
      windowsize.x -= 20;
    } else {
      mouseoffsetX = e.x + window.document.body.scrollLeft;
      mouseoffsetY = e.y + window.document.body.scrollTop;
    }

    if (mouseoffsetX > windowsize.x - parseInt(div.style.width) - window.tooltipOffsetX) {
      x = parseInt(mouseoffsetX - (parseInt(div.style.width) + window.tooltipOffsetX * 2));
    } else {
      x = parseInt(mouseoffsetX);
    }

    if (mouseoffsetY > windowsize.y - div_bottom.offsetTop - window.tooltipOffsetY) {
      y = parseInt(mouseoffsetY - (div_bottom.offsetTop + window.tooltipOffsetY * 2));
    } else {
      y = parseInt(mouseoffsetY);
    }
    tooltip_move(div, x + window.tooltipOffsetX, y + window.tooltipOffsetY);

    // IE: hide covered elements that would stay on top
    if(navigator.userAgent.toLowerCase().indexOf('msie') != -1) {
      hideShowCovered(x + window.tooltipOffsetX, y + window.tooltipOffsetY, x + window.tooltipOffsetX + parseInt(div.style.width), y + window.tooltipOffsetY + div_bottom.offsetTop);
    }
  }
  return true;
}

function tooltip_move(obj, x_pos, y_pos) {
  obj.style.left = x_pos + 'px';
  obj.style.top = y_pos + 'px';
}

function getAbsolutePos(el) {
  var SL = 0, ST = 0;
  var is_div = /^div$/i.test(el.tagName);
  if (is_div && el.scrollLeft)
    SL = el.scrollLeft;
  if (is_div && el.scrollTop)
    ST = el.scrollTop;
  var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST};
  if (el.offsetParent) {
    var tmp = getAbsolutePos(el.offsetParent);
    r.x += tmp.x;
    r.y += tmp.y;
  }
  r.x2 = r.x + el.offsetWidth;
  r.y2 = r.y + el.offsetHeight;
  return r;
}

function hideShowCovered(area_x, area_y, area_x2, area_y2) {
  var p;
  var tags = new Array("applet", "iframe", "select");

  for (var k = tags.length; k > 0; ) {
    var ar = document.getElementsByTagName(tags[--k]);
    var cc = null;

    for (var i = ar.length; i > 0;) {
      cc = ar[--i];

      p = getAbsolutePos(cc);
      if ((p.x > area_x2) || (p.x2 < area_x) || (p.y > area_y2) || (p.y2 < area_y)) {
        classRemove(cc, 'covered_not_visible')
      } else {
        classAdd(cc, 'covered_not_visible')
      }
    }
  }
}


