/*
dom_tooltip.js

DOM Tooltip by Chris Roberts
columcille@gmail.com
http://www.musterion.net/
*/

// domTip_tipInitialized keeps things from happening before all the settings
// are set up.
var domTip_tipInitialized = 0;

// 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 tip object when only one is being displayed
var domTip_tipBox = "";

// domTip_multipleTips sets whether or not to allow multiple tooltips to
// open at the same time. Set to 1, several can open. Set to 0, a new tooltip
// will erase the previous tooltip. 
var domTip_multipleTips = 1;

// Should the user be allowed to drag around or resize divs? Note that some 
// of these may automatically be changed based on the move type you choose
// below.
var domTip_allowDrag = 1;
var domTip_allowResize = 1;

/*************************************************************************
 * domTip_moveType has several settings:			                     *
 *																		 *
 * 1. Normal method, tooltip follows pointer							 *
 * 2. While the pointer is over the link or tooltip the tooltip is       *
 *    frozen															 *
 * 3. Pointer freeze, tooltip opens and is frozen where it was first	 *
 *    triggered															 *
 * 4. Fixed freeze, tooltip opens and is frozen at a fixed position		 *
 *																		 *
 * When tooltip is frozen, clicks outside of the tooltip will close it.  *
 * Also clicking "close" (or X or something I haven't decided yet) will  *
 * also close it.														 *
 *																		 *
 *************************************************************************/

var domTip_moveType = 3;

// If you are specifying a fixed position for the tooltip, where should it
// go? Tooltip will be given a position attribute of Fixed and positioned
// relative to the screen based on these numbers. Value of 9999 will be
// ignored. Both must be set to something other than 9999 or both will be
// ignored and the default movetype changed to 3.
var domTip_fixedFreezeX = 10;
var domTip_fixedFreezeY = 20;

// Remaining variables should not be changed, they are used internally for
// handling tooltip data

// Various settings used when resizing or dragging around divs
var domTip_dragDiv = 0;
var domTip_resizeDiv = 0;
var domTip_firstDrag = 1;
var domTip_firstResize = 1;

var domTip_resizeId = "";
var domTip_dragId = "";

var domTip_currentTipIdentifier = 999999;

var domTip_Tips = new Array();

window.document.onmousemove = domTip_trackMouse;
window.document.onmouseup = domTip_mouseIsUp;

function domTip_mouseIsUp()
{
	domTip_dragEnd();
	domTip_resizeEnd();
}

function domTip_trackMouse(e)
{
	if (domTip_tipInitialized == 1)
	{
		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;
		}
	
		if (domTip_tipBox != "" && domTip_tipBox.style.display == "block" && (domTip_moveType == 1))
		{
			domTip_moveTip();
		}
		
		if (domTip_dragDiv == 1 && domTip_resizeDiv != 1)
		{
			domTip_dragTip();
		} else if (domTip_dragDiv == 1 && domTip_resizeDiv == 1) {
			domTip_dragDiv = 0;
		}
	
		if (domTip_resizeDiv == 1)
		{
			domTip_resizeTip();
		}
	}
}

// domTip_clearTip is used by the tippy plugin
function domTip_clearTip(forced)
{
	if (domTip_tipBox != "" && (domTip_moveType < 3 || forced == true))
	{
		while (domTip_tipBox.childNodes.length > 0)
		{
			domTip_tipBox.removeChild(domTip_tipBox.childNodes[0]);
		}
		
		document.body.removeChild(domTip_tipBox);
		domTip_tipIdentifier = domTip_tipBox.getAttribute("id");
		domTip_tipBox = "";
		
		domTip_Tips[domTip_tipIdentifier] = 0;

		domTip_currentTipIdentifier = 999999;
		
		domTip_widthOffset = 0;
		domTip_heightOffset = 0;
		domTip_tipBoxHeight = 0;
		domTip_tipBoxWidth = 0;
	}
}

function domTip_closeClick(domTip_tipId)
{
	var domTip_clicked = document.getElementById(domTip_tipId);
		
	while (domTip_clicked.childNodes.length > 0)
	{
		domTip_clicked.removeChild(domTip_clicked.childNodes[0]);
	}
	
	document.body.removeChild(domTip_clicked);
	
	domTip_currentTipIdentifier = 999999;
	
	domTip_widthOffset = 0;
	domTip_heightOffset = 0;
	domTip_tipBoxHeight = 0;
	domTip_tipBoxWidth = 0;
	
	domTip_Tips[domTip_tipId] = 0;
}

function domTip_closeAllTips()
{
	domTip_tipArrLen = domTip_Tips.length;
	for (var domTip_i = 0 ; domTip_tipArrLen ; domTip_i++)
	{
		domTip_closeClick(domTip_Tips[domTip_i]);
	}
	
	domTip_Tips = new Array();
}

// Create a new tooltip object
function domTip_newTip(domTip_tipIdentifier)
{
	// Juggle the flags. Some flags should be set, others should be unset
	// based on certain settings. These are coded based on my own preferences,
	// how I thought it should be done. Tweak it however you wish.
	
	// If movetype is 1 or 2 then multiple tips, dragging, and resizing should
	// be disabled
	if (domTip_moveType == 1 || domTip_moveType == 2)
	{
		domTip_multipleTips = 0;
		domTip_allowDrag = 0;
		domTip_allowResize = 0;
	}
	
	// Fixed tips should only be used if a position was specified. If
	// not specified, switch type to 3.
	//
	// If fixed is used, tips should not be dragable or resizable, and
	// only one at a time should be used.
	if (domTip_moveType == 4 && (domTip_fixedFreezeX == 9999 || domTip_fixedFreezeY == 9999))
	{
		domTip_moveType = 3;
	} else if (domTip_moveType == 4 && domTip_fixedFreezeX != 9999 && domTip_fixedFreezeY != 9999) {
		domTip_allowDrag = 0;
		domTip_allowResize = 0;
		domTip_multipleTips = 0;
		
		domTip_closeAllTips();
	}
	
	// If multiple tips can be opened, user should be able to drag them around
	// so they don't overlap each other
	if (domTip_multipleTips == 1)
	{
		domTip_allowDrag = 1;
	}
	
	if (domTip_multipleTips == 0 && domTip_currentTipIdentifier != 999999)
	{
		domTip_closeClick(domTip_currentTipIdentifier);
	}
	
	domTip_tipBox = document.createElement("div");
	domTip_tipBox.className = "domTip_Tip";
	domTip_tipBox.id = domTip_tipIdentifier;
	domTip_tipBox.style.position = "absolute";
	domTip_tipBox.style.display = "none";
	domTip_tipBox.onmousedown = function() { domTip_bringForward(domTip_tipIdentifier); };
	
	window.document.body.appendChild(domTip_tipBox);
	
	domTip_Tips[domTip_tipIdentifier] = 1;
}

// Allow settings to be passed into a function rather than set directly
function domTip_setSettings(domTip_setMultipleTips, domTip_setAllowDrag, domTip_setAllowResize, domTip_setMoveType)
{
	if (domTip_setMoveType == "follow")
	{
		domTip_moveType = 1;
	} else if (domTip_setMoveType == "sticky") {
		domTip_moveType = 2;
	} else {
		domTip_moveType = 3;
	}
	
	if (domTip_setMultipleTips == "true")
	{
		domTip_multipleTips = 1;
	} else {
		domTip_multipleTips = 0;
	}
	
	if (domTip_setAllowDrag == "true")
	{
		domTip_allowDrag = 1;
	} else {
		domTip_allowDrag = 0;
	}
	
	if (domTip_setAllowResize == "true")
	{
		domTip_allowResize = 1;
	} else {
		domTip_allowResize = 0;
	}
	
	domTip_tipInitialized = 1;
}

// A unique identifier should be passed to domTip_tipIdentifier so the script
// can tell the difference between tooltip requests.
function domTip_toolText(domTip_tipIdentifier, domTip_tipText, domTip_headerText, domTip_headerLink)
{
	if (domTip_Tips[domTip_tipIdentifier] != 1)
	{
		domTip_newTip(domTip_tipIdentifier);
		
		// If the tooltip follows mouse, remove the height style attributes so the tooltip
		// can resize to fit the content.
		if (domTip_moveType < 3)
		{
			domTip_tipBox.style.height = "auto";
		}

		// Build the tip header
		var domTip_tipHead = document.createElement("div");
		domTip_tipHead.className = "domTip_TipHeader";
		
		if (domTip_moveType < 3)
		{
			domTip_tipHead.style.height = "auto";
		}

		domTip_tipHead.id = "domTip_TipHeader_" + domTip_tipIdentifier;
			
		if (domTip_allowDrag == 1)
		{
			domTip_tipHead.onmousedown = function() { domTip_dragStart(domTip_tipIdentifier); };
		}
		
		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.setAttribute("title", domTip_tipHeadText);
				
				domTip_tipHeaderLink.appendChild(domTip_tipHeadText);
				domTip_tipHead.appendChild(domTip_tipHeaderLink);
			}
			
			domTip_tipBox.appendChild(domTip_tipHead);
		}
		
		if (domTip_moveType > 2)
		{
			var domTip_tipHeadClose = document.createElement("div");
			domTip_tipHeadClose.className = "domTip_tipHeadClose";
			domTip_tipHeadClose.id = "domTip_tipHeadClose_" + domTip_tipIdentifier;
			domTip_tipHeadClose.onmousedown = function() { domTip_closeClick(domTip_tipIdentifier); };
			
			domTip_tipBox.appendChild(domTip_tipHeadClose);
		}
		
		if (domTip_allowResize == 1)
		{
			var domTip_resizeBox = document.createElement("div");
			domTip_resizeBox.className = "domTip_resizeBox";
			domTip_resizeBox.id = "domTip_resizeBox_" + domTip_tipIdentifier;
			domTip_resizeBox.onmousedown = function() { domTip_resizeStart(domTip_tipIdentifier); };
			domTip_tipBox.appendChild(domTip_resizeBox);
		}
	
		var domTip_tipBody = document.createElement("div");
		domTip_tipBody.className = "domTip_TipBody";
		
		if (domTip_moveType < 3)
		{
			domTip_tipBody.style.height = "auto";
		}
		
		domTip_tipBody.id = "domTip_TipBody_" + domTip_tipIdentifier;
		domTip_tipBody.onmouseup = function() { };
	
		domTip_tipBody.innerHTML = domTip_tipText;
	
		domTip_tipBox.appendChild(domTip_tipBody);
	
		domTip_tipBox.style.visibility = "hidden";
		domTip_tipBox.style.display = "block";
	
		if (domTip_moveType == 4)
		{
			domTip_tipBox.style.position = "fixed";
			domTip_tipBox.style.top = domTip_fixedFreezeY + "px";
			domTip_tipBox.style.left = domTip_fixedFreezeX + "px";
		} else {
			domTip_moveTip();
		}
		
		domTip_bringForward(domTip_tipIdentifier);
		domTip_tipBox.style.visibility = "visible";
		
		domTip_currentTipIdentifier = domTip_tipIdentifier;
	}
}

var domTip_topIndex = 10;
var domTip_tipOnTop = "";
function domTip_bringForward(domTip_forwardId)
{
	if (domTip_forwardId != domTip_tipOnTop)
	{
		domTip_topIndex++;
		
		document.getElementById(domTip_forwardId).style.zIndex = domTip_topIndex;
		
		domTip_tipOnTop = domTip_forwardId;
	}
}

function domTip_resizeStart(domTip_tipIdentifier)
{
	domTip_resizeDiv = 1;
	domTip_resizeId = domTip_tipIdentifier;
	document.onmousedown = function() { return false; };
	document.onselectstart = function() { return false; };
}

function domTip_resizeEnd()
{
	domTip_resizeDiv = 0;
	domTip_firstResize = 1;
	domTip_widthOffset = 0;
	domTip_heightOffset = 0;
	domTip_tipBoxHeight = 0;
	domTip_tipBoxWidth = 0;
	domTip_resizeId = "";
	document.onmousedown = null;
	document.onselectstart = null;
}

function domTip_dragStart(domTip_tipIdentifier)
{
	domTip_dragDiv = 1;
	domTip_dragId = domTip_tipIdentifier;
	document.onmousedown = function() { return false; };
	document.onselectstart = function() { return false; };
}

function domTip_dragEnd()
{
	domTip_dragDiv = 0;
	domTip_firstDrag = 1;
	domTip_dragId = "";
	document.onmousedown = null;
	document.onselectstart = null;
}

function domTip_dragTip()
{
	domTip_tipBox = document.getElementById(domTip_dragId);
	
	if (domTip_firstDrag == 1)
	{
		domTip_offLeft = domTip_tipBox.offsetLeft;
		domTip_offTop = domTip_tipBox.offsetTop;

		domTip_modLeft = domTip_prevPosX - domTip_offLeft;
		domTip_modTop = domTip_prevPosY - domTip_offTop;

		domTip_firstDrag = 0;
	}

	var domTip_tipXloc = domTip_curPageX - domTip_modLeft;
	var domTip_tipYloc = domTip_curPageY - domTip_modTop;

	domTip_tipBox.style.left = domTip_tipXloc + "px";
	domTip_tipBox.style.top = domTip_tipYloc + "px";
	domTip_tipBox.blur();
}

var domTip_widthOffset = 0;
var domTip_heightOffset = 0;
var domTip_tipBoxHeight = 0;
var domTip_tipBoxWidth = 0;
function domTip_resizeTip()
{
	var domTip_ignoreHeight = 0;
	var domTip_ignoreWidth = 0;
	
	domTip_tipBox = document.getElementById(domTip_resizeId);
	
	if (domTip_firstResize == 1)
	{
		domTip_tipBoxWidth = domTip_tipBox.offsetWidth;
		domTip_tipBoxHeight = domTip_tipBox.offsetHeight;

		domTip_firstResize = 0;
	}

	if (domTip_curPageX > domTip_prevPosX)
	{
		domTip_widthOffset += (domTip_curPageX - domTip_prevPosX);
	} else {
		domTip_widthOffset -= (domTip_prevPosX - domTip_curPageX);
	}

	if (domTip_curPageY > domTip_prevPosY)
	{
		domTip_heightOffset += (domTip_curPageY - domTip_prevPosY);
	} else {
		domTip_heightOffset -= (domTip_prevPosY - domTip_curPageY);
	}

	domTip_newWidth = domTip_tipBoxWidth + domTip_widthOffset;
	domTip_newHeight = domTip_tipBoxHeight + domTip_heightOffset;
	
	if (domTip_newHeight < 100)
	{
		domTip_ignoreHeight = 1; 
	}

	if (domTip_newWidth < 100)
	{
		domTip_ignoreWidth = 1; 
	}
	
	if (domTip_ignoreHeight != 1)
	{
		domTip_tipBox.style.height = domTip_newHeight + "px";
		
		domTip_bbDivHeight = domTip_newHeight - 25;
		document.getElementById("domTip_TipBody_" + domTip_resizeId).style.height = domTip_bbDivHeight + "px";
		
		domTip_resizeButtonTop = domTip_newHeight - 6;
		document.getElementById("domTip_resizeBox_" + domTip_resizeId).style.top = domTip_resizeButtonTop + "px";
	}
	
	if (domTip_ignoreWidth != 1)
	{
		domTip_tipBox.style.width = domTip_newWidth + "px";
		
		domTip_bhDivWidth = domTip_newWidth - 6;
		document.getElementById("domTip_TipHeader_" + domTip_resizeId).style.width = domTip_bhDivWidth + "px";
		
		domTip_bbDivWidth = domTip_newWidth - 8;
		document.getElementById("domTip_TipBody_" + domTip_resizeId).style.width = domTip_bbDivWidth + "px";
	
		domTip_resizeButtonLeft = domTip_newWidth - 6;
		document.getElementById("domTip_resizeBox_" + domTip_resizeId).style.left = domTip_resizeButtonLeft + "px";
			
		domTip_closeButtonLeft = domTip_newWidth - 20;
		document.getElementById("domTip_tipHeadClose_" + domTip_resizeId).style.left = domTip_closeButtonLeft + "px";
	}	
}

function domTip_moveTip()
{
	var domTip_tipXloc = domTip_curPageX + 10;
	var domTip_tipYloc = domTip_curPageY + 10;

	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";
}
