/*
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;

// 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 = 1;

window.document.onmousemove = domTip_trackMouse;

function domTip_trackMouse(e)
{
	var e = (e) ? e : ((event) ? event : null);
	
	domTip_prevPosX = domTip_curPageX;
	domTip_prevPosY = domTip_curPageY;
	
	if (window.pageXOffset > 0) {
		domTip_scrollPageX = window.pageXOffset
	} else if (document.documentElement.scrollLeft > 0) {
		domTip_scrollPageX = document.documentElement.scrollLeft
	} else if (document.body.scrollLeft > 0) {
		domTip_scrollPageX = document.body.scrollLeft
	} else {
		domTip_scrollPageX = 0;
	}
	
	if (window.pageYOffset > 0) {
		domTip_scrollPageY = window.pageYOffset
	} else if (document.documentElement.scrollTop > 0) {
		domTip_scrollPageY = document.documentElement.scrollTop
	} else if (document.body.scrollTop > 0) {
		domTip_scrollPageY = document.body.scrollTop
	} else {
		domTip_scrollPageY = 0;
	}
	
	if (window.innerWidth > 0) {
		domTip_viewScreenX = window.innerWidth
	} else if (document.documentElement.clientWidth > 0) {
		domTip_viewScreenX = document.documentElement.clientWidth
	} else if (document.body.clientWidth > 0) {
		domTip_viewScreenX = document.body.clientWidth
	} else {
		domTip_viewScreenX = 0;
	}
	
	if (window.innerHeight > 0) {
		domTip_viewScreenY = window.innerHeight
	} else if (document.documentElement.clientHeight > 0) {
		domTip_viewScreenY = document.documentElement.clientHeight
	} else if (document.body.clientHeight > 0) {
		domTip_viewScreenY = document.body.clientHeight
	} else {
		domTip_viewScreenY = 0;
	}
	
	domTip_curPageX = e.clientX + domTip_scrollPageX;
	domTip_curPageY = e.clientY + domTip_scrollPageY;

	domTip_viewPageX = e.clientX;
	domTip_viewPageY = e.clientY;
}

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 + 20 + domTip_tipWidth > domTip_viewScreenX)
	if (domTip_viewPageX + 20 + domTip_tipWidth > domTip_viewScreenX)
	{
		var domTip_pageXDiff = (domTip_viewPageX + 20 + domTip_tipWidth) - domTip_viewScreenX;
		domTip_tipXloc -= domTip_pageXDiff;
		// domTip_tipXloc -= (domTip_tipWidth + 20);
	}

	// If the tooltip will extend off the bottom of the screen, pull it back up.
	if (domTip_viewPageY + 25 + domTip_tipHeight > domTip_viewScreenY)
	{
		var domTip_pageYDiff = (domTip_viewPageY + 25 + domTip_tipHeight - domTip_viewScreenY);
		domTip_tipYloc -= domTip_pageYDiff;
	}

	// 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()", 30);
	} 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()", 30);
		}
	}
}

function domTip_fadeout()
{
	clearTimeout(domTip_timer);
	if (domTip_doFade)
	{
		domTip_timer = setTimeout("domTip_decrOpacity()", 90);
	} 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()", 30);
		} else {
			domTip_tipBox.style.visibility = "hidden";
			domTip_removeTip();
		}
	}
}

function domTip_freeze()
{
	clearTimeout(domTip_timer);
	domTip_fadein();
}
