/*
dom_tooltip.js

DOM Tooltip by Chris Roberts
columcille@gmail.com
http://www.musterion.net/
*/

// The following variables track page/mouse position, etc
var domTip_curPageX = 0;
var domTip_curPageY = 0;
var domTip_prevPosX = 0;
var domTip_prevPosY = 0;
var domTip_scrollPageY = 0;
var domTip_viewPageX = 0;
var domTip_viewPageY = 0;
var domTip_viewScreenX = 0;
var domTip_viewScreenY = 0;
var domTip_totalScreenX = 0;
var domTip_totalScreenY = 0;

// Stores the tippy object
var domTip_tipBox = "";
var domTip_tipId = "";

// Remaining variables should not be changed, they are used internally for
// handling tooltip data

// Settings for tracking fadein and fadeout
var domTip_timer;
var domTip_opacity = 0;

// Do we fade in and out?
var domTip_doFade = 0;

window.document.onmousemove = domTip_trackMouse;

function domTip_trackMouse(e)
{
  var e = (e) ? e : ((event) ? event : null);
  
  domTip_prevPosX = domTip_curPageX;
  domTip_prevPosY = domTip_curPageY;
  
  // Functions do different things depending on whether or not a
  // doctype is present. Node type 10 is a doctype but IE reads
  // a doctype as Node type 8 - a comment.
  if (document.childNodes[0].nodeType == 10 || document.childNodes[0].nodeType == 8)
  {
    domTip_curPageX = e.clientX + document.documentElement.scrollLeft;
    domTip_curPageY = e.clientY + document.documentElement.scrollTop;

    domTip_scrollPageY = document.documentElement.scrollTop;

    domTip_viewPageX = e.clientX;
    domTip_viewPageY = e.clientY;

    domTip_viewScreenX = document.documentElement.clientWidth;
    domTip_viewScreenY = document.documentElement.clientHeight;

    domTip_totalScreenX = document.body.offsetWidth;
    domTip_totalScreenY = document.body.offsetHeight;
  } else {
    domTip_curPageX = e.clientX + document.body.scrollLeft;
    domTip_curPageY = e.clientY + document.body.scrollTop;

    domTip_scrollPageY = document.body.scrollTop;

    domTip_viewPageX = e.clientX;
    domTip_viewPageY = e.clientY;

    domTip_viewScreenX = document.body.clientWidth;
    domTip_viewScreenY = document.body.clientHeight;

    domTip_totalScreenX = document.documentElement.scrollWidth;
    domTip_totalScreenY = document.documentElement.scrollHeight;
  }
}

function domTip_clearTip(forced)
{
  if (domTip_tipBox != "")
  {
    domTip_fadeout();
  } else {
    clearTimeout(domTip_timer);
    domTip_tipId = "";
  }
}

function domTip_removeTip()
{
  while (domTip_tipBox.childNodes.length > 0)
  {
    domTip_tipBox.removeChild(domTip_tipBox.childNodes[0]);
  }
  
  document.body.removeChild(domTip_tipBox);
  
  domTip_widthOffset = 0;
  domTip_heightOffset = 0;
  domTip_tipBoxHeight = 0;
  domTip_tipBoxWidth = 0;
  domTip_opacity = 0;
  
  domTip_tipBox = "";
  domTip_tipId = "";
  
  clearTimeout(domTip_timer);
}

// Create a new tooltip object
function domTip_newTip(domTip_newTipId, domTip_tipText, domTip_headerText, domTip_headerLink)
{
  clearTimeout(domTip_timer);
  domTip_timer = setTimeout("domTip_createTip(\'"+ domTip_newTipId +"\', \'"+ domTip_tipText +"\', \'"+ domTip_headerText +"\', \'"+ domTip_headerLink +"\')", 100);
}

function domTip_createTip(domTip_newTipId, domTip_tipText, domTip_headerText, domTip_headerLink)
{
  if (domTip_tipBox != "")
  {
    domTip_removeTip();
    domTip_tipId = domTip_newTipId;
  }
  
  domTip_tipBox = document.createElement("div");
  domTip_tipBox.style.display = "none";
  domTip_tipBox.style.visibility = "hidden";
  domTip_tipBox.style.opacity = "0";
  domTip_tipBox.style.filter = "alpha(opacity:0)";
  domTip_tipBox.className = "domTip_Tip";
  domTip_tipBox.id = "domTip_tipBox";
  domTip_tipBox.style.position = "absolute";
  domTip_tipBox.onmouseover = function() { domTip_freeze(); };
  domTip_tipBox.onmouseout = function() { domTip_fadeout(); };
  
  window.document.body.appendChild(domTip_tipBox);
  
  domTip_initializeTip(domTip_tipText, domTip_headerText, domTip_headerLink);
}

function domTip_toolText(domTip_newTipId, domTip_tipText, domTip_headerText, domTip_headerLink)
{
  if (domTip_tipId != domTip_newTipId)
  {
    domTip_tipId = domTip_newTipId;
    domTip_newTip(domTip_tipId, domTip_tipText, domTip_headerText, domTip_headerLink);    
  } else {
    domTip_freeze();
  }
}

function domTip_initializeTip(domTip_tipText, domTip_headerText, domTip_headerLink)
{
  domTip_tipBox.style.height = "auto";

  // Build the tip header
  var domTip_tipHead = document.createElement("div");
  domTip_tipHead.className = "domTip_TipHeader";
  domTip_tipHead.style.height = "auto";
  
  domTip_tipHead.id = "domTip_TipHeader";
  
  if (domTip_headerText != "")
  {
    var domTip_tipHeadText = document.createTextNode(domTip_headerText);

    if (domTip_headerLink == undefined || domTip_headerLink == "")
    {
      domTip_tipHead.appendChild(domTip_tipHeadText);
    } else {
      var domTip_tipHeaderLink = document.createElement("a");
      domTip_tipHeaderLink.setAttribute("href", domTip_headerLink);
      
      domTip_tipHeaderLink.appendChild(domTip_tipHeadText);
      domTip_tipHead.appendChild(domTip_tipHeaderLink);
    }
    
    domTip_tipBox.appendChild(domTip_tipHead);
  }
  
  var domTip_tipBody = document.createElement("div");
  domTip_tipBody.className = "domTip_TipBody";
  domTip_tipBody.style.height = "auto";    
  domTip_tipBody.id = "domTip_TipBody";  
  domTip_tipBody.innerHTML = domTip_tipText;
  domTip_tipBox.appendChild(domTip_tipBody);

  domTip_tipBox.style.visibility = "visible";
  domTip_tipBox.style.display = "block";

  domTip_moveTip();
  
  domTip_fadein();    
}

function domTip_moveTip()
{
  var domTip_tipXloc = domTip_curPageX + 15;
  var domTip_tipYloc = domTip_curPageY + 20;

  var domTip_tipHeight = domTip_tipBox.offsetHeight;
  var domTip_tipWidth = domTip_tipBox.offsetWidth;

  // If the tooltip extends off the side, pull it over
  if (domTip_viewPageX + 10 + domTip_tipWidth > domTip_viewScreenX)
  {
    domTip_tipXloc -= (domTip_tipWidth + 15);
  }

  // If the tooltip will extend off the bottom of the screen, pull it back up.
  if (domTip_viewPageY + 10 + domTip_tipHeight > domTip_viewScreenY)
  {
    var domTip_pageDiff = (domTip_viewPageY + 10 + domTip_tipHeight - domTip_viewScreenY);
    domTip_tipYloc -= domTip_pageDiff;
  }

  // If the tooltip extends off the bottom and the top, line up the top of
  // the tooltip with the top of the page
  if (domTip_tipHeight > domTip_viewScreenY)
  {
    domTip_tipYloc = domTip_scrollPageY + 5;
  }

  domTip_tipBox.style.left = domTip_tipXloc + "px";
  domTip_tipBox.style.top = domTip_tipYloc + "px";
}

function domTip_fadein()
{
  clearTimeout(domTip_timer);

  if (domTip_doFade)
  {
    domTip_timer = setTimeout("domTip_incrOpacity()", 50);
  } else {
    domTip_opacity = 100;
    
    domTip_tipBox.style.opacity = 100;
    domTip_tipBox.style.filter = "alpha(opacity:100)";
  }
  
  domTip_tipBox.style.visibility = "visible";
}

function domTip_incrOpacity()
{
  if (domTip_tipBox != "")
  {
    domTip_opacity += 15;
    
    domTip_tipBox.style.opacity = domTip_opacity/100;
    domTip_tipBox.style.filter = "alpha(opacity:"+ domTip_opacity +")";
    
    if (domTip_opacity < 100)
    {
      domTip_timer = setTimeout("domTip_incrOpacity()", 50);
    }
  }
}

function domTip_fadeout()
{
  clearTimeout(domTip_timer);
  if (domTip_doFade)
  {
    domTip_timer = setTimeout("domTip_decrOpacity()", 900);
  } else {
    domTip_opacity = 100;
    
    domTip_tipBox.style.opacity = 100;
    domTip_tipBox.style.filter = "alpha(opacity:100)";
    
    domTip_tipBox.style.visibility = "hidden";
    domTip_removeTip();
  }
}

function domTip_decrOpacity()
{
  if (domTip_tipBox != "")
  {
    domTip_opacity -= 15;
    
    domTip_tipBox.style.opacity = domTip_opacity/100;
    domTip_tipBox.style.filter = "alpha(opacity:"+ domTip_opacity +")";
    
    if (domTip_opacity > 0)
    {
      domTip_timer = setTimeout("domTip_decrOpacity()", 50);
    } else {
      domTip_tipBox.style.visibility = "hidden";
      domTip_removeTip();
    }
  }
}

function domTip_freeze()
{
  clearTimeout(domTip_timer);
  domTip_fadein();
}

