var ToolTipArray = new Object;
var ToolTip_debugging = false;
var currentToolTip = null;
var waitingToDestroy = false;

function addToolTip(tt_name,tt_contents,tt_class)
{
	if(!tt_class)
		tt_class = "ToolTipDefault";
	ToolTipArray[tt_name] = 
	{
		className: tt_class,
		contents: tt_contents
	}
}

var currentTarg;
function ToolTip(tipName,waitTime,e)
{
	if(!currentToolTip)
	{
		timeToTip = setTimeout("startToolTip('"+tipName+"')",waitTime);
		var targ;
		if (!e) var e = window.event;
		if (e.target) targ = e.target;
		else if (e.srcElement) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
		targ.setAttribute("onmouseout","cancelToolTip("+timeToTip+")");
		currentTarg = targ;
		document.body.onmousemove = updateMousePos;
		return true;
	}
	return false;
}

function cancelToolTip(timeoutId)
{
	clearTimeout(timeoutId);
	currentTarg.removeAttribute("onmouseout");
}

function startToolTip(tipName)
{
	currentTarg.removeAttribute("onmouseout");
	
	if(!ToolTipArray[tipName])
	{
		if(ToolTip_debugging)
			alert("No tip found with name '"+tipName+"'!");
		return null;
	}
	
	currentToolTip = document.createElement("div");
	currentToolTip.className = ToolTipArray[tipName].className;
	currentToolTip.innerHTML = ToolTipArray[tipName].contents;
	currentToolTip.style.position = "absolute";
	currentToolTip.owner = currentTarg;
	
	//currentTarg.setAttribute("onmouseout","destroyToolTip()");
	
	document.body.appendChild(currentToolTip);
	updateToolTipPos();
}

function destroyToolTip()
{
	if(!mouseInEl(currentToolTip) && !mouseInEl(currentToolTip.owner))
	{
		//currentToolTip.owner.removeAttribute("onmouseout");
		document.body.removeChild(currentToolTip);
		currentToolTip = null;
		document.body.onmousemove = null;
	}
	waitingToDestroy = false;
}


function updateToolTipPos()
{
//	if(mouseInEl(currentToolTip))
//	{
//		destroyToolTip();
//	}
//	else
//	{
	var tt_x = mouseX;
	if(tt_x + currentToolTip.offsetWidth > window.innerWidth)
		tt_x = tt_x - (currentToolTip.offsetWidth + 4);
	currentToolTip.style.left = (tt_x+2) + "px";
	currentToolTip.style.top = (mouseY-currentToolTip.offsetHeight-2) + "px";
//	}
}

function mouseInEl(el)
{
	var elLeft = fullOffsetLeft(el);
	var elRight = fullOffsetLeft(el) + el.offsetWidth;
	var elTop = fullOffsetTop(el);
	var elBottom = fullOffsetTop(el) + el.offsetHeight;
	
	if(mouseX >= elLeft && mouseX <= elRight && mouseY >= elTop && mouseY <= elBottom)
		return true;
	else
		return false;
}

function fullOffsetLeft(el)
{
	if(el.tagName == "BODY")
		return 0;
	else
	{
		return el.offsetLeft + fullOffsetLeft(el.parentNode);
	}
}

function fullOffsetTop(el)
{
	if(el.tagName == "BODY")
		return 0;
	else
	{
		return el.offsetTop + fullOffsetTop(el.parentNode);
	}
}

var mouseX = 0;
var mouseY = 0;

function updateMousePos(e)
{
	mousePos = getMouseXY(e);
	mouseX = mousePos[0];
	mouseY = mousePos[1];
	if(currentToolTip && !waitingToDestroy && !mouseInEl(currentToolTip) && !mouseInEl(currentToolTip.owner))
	{
		setTimeout("destroyToolTip()",300);
		waitingToDestroy = true;
	}
//	if(currentToolTip)
//		updateToolTipPos();
}

function getMouseXY(e)
{
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		posx = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}
	
	return [posx,posy];
}

