/*
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_scrollPageX = 0;
var domTip_scrollPageY = 0;
var domTip_viewPageX = 0;
var domTip_viewPageY = 0;
var domTip_viewScreenX = 0;
var domTip_viewScreenY = 0;

// The position and height of the tippy link
var domTip_tipLinkX = 0;
var domTip_tipLinkY = 0;
var domTip_tipLinkHeight = 0;

// Where to position the tooltip
var domTip_tipPosition = "mouse";
var domTip_tipOffsetX = 0;
var domTip_tipOffsetY = 0;

// Do we fade in and out?
var domTip_fadeRate = 300;
var domTip_timer;
var domTip_hiding = false;

var domTip_tipId = "";

var domTip_tipBox = "";
var domTip_tipHeader;
var domTip_tipBody;

var domTip_jQuery = jQuery.noConflict();

// Load tooltip settings
function domTip_setupTip(domTip_setFadeTip, domTip_setTipPosition, domTip_setTipOffsetX, domTip_setTipOffsetY)
{
	domTip_tipPosition = domTip_setTipPosition;
	domTip_tipOffsetX = domTip_setTipOffsetX;
	domTip_tipOffsetY = domTip_setTipOffsetY;
	
	if (domTip_setFadeTip == "fade")
	{
		domTip_fadeRate = 300;
	} else {
		domTip_fadeRate = 0;
	}
}

function domTip_initializeTip()
{
	// Initialize the tooltip singleton
	domTip_tipBox = domTip_jQuery('<div></div>')
		.hide()
		.css("display", "none")
		.css("position", "absolute")
		.css("height", "auto")
		.addClass("domTip_Tip")
		.attr("id", "domTip_tipBox")
		.mouseover(function() { domTip_freeze(); })
		.mouseout(function() { domTip_fadeTipOut(); })
		.appendTo('body');
	
	domTip_tipHeader = domTip_jQuery("<div></div>")
		.css("height", "auto")
		.addClass("domTip_tipHeader")
		.attr("id", "domTip_tipHeader")
		.appendTo(domTip_tipBox);
	
	domTip_tipBody = domTip_jQuery("<div></div>")
		.css("height", "auto")
		.addClass("domTip_tipBody")
		.attr("id", "domTip_tipBody")
		.appendTo(domTip_tipBox);
}

// Initialize all position data
function domTip_setPositions(domTip_tipElement, event)
{
	if (!event)
		var event = window.event;
		
	domTip_scrollPageX = domTip_jQuery(window).scrollLeft();
	domTip_scrollPageY = domTip_jQuery(window).scrollTop();
	
	domTip_viewScreenX = domTip_jQuery(window).width();
	domTip_viewScreenY = domTip_jQuery(window).height();
	
	domTip_curPageX = event.clientX + domTip_scrollPageX;
	domTip_curPageY = event.clientY + domTip_scrollPageY;

	domTip_viewPageX = event.clientX;
	domTip_viewPageY = event.clientY;
	
	domTip_tipLinkHeight = domTip_jQuery("#" + domTip_tipElement).height();
	domTip_tipLinkX = domTip_jQuery("#" + domTip_tipElement).offset().left;
	domTip_tipLinkY = domTip_jQuery("#" + domTip_tipElement).offset().top;
}

function domTip_fadeTipOut()
{
	clearTimeout(domTip_timer);
	domTip_tipId = "";
	domTip_hiding = true;
	domTip_timer = setTimeout("domTip_tipBox.fadeOut(" + domTip_fadeRate + ", 'swing', function() { domTip_hiding = false; })", 900);
}

function domTip_fadeTipIn()
{
	clearTimeout(domTip_timer);
	domTip_timer = setTimeout("domTip_tipBox.fadeIn(" + domTip_fadeRate + ")", 50);
}

function domTip_toolText(domTip_newTipId, domTip_tipText, domTip_headerText, domTip_headerLink, domTip_tipWidth, domTip_tipHeight, domTip_tipElement, domTip_event)
{
	if (domTip_tipBox == "")
	{
		domTip_initializeTip();
	}
	
	if (domTip_tipId != domTip_newTipId)
	{
		// If we have a domTip_tipId then a tooltip is currently showing
		if (domTip_tipId != "" || domTip_hiding == true)
		{
			domTip_tipBox.hide();
			domTip_freeze();
			domTip_tipId = "";
			domTip_hiding = false;
		}
		
		// Update location info
		domTip_setPositions(domTip_tipElement, domTip_event);
		
		// Change size
		
		// First, get calculated difference
		var domTip_tipElementDifferenceHeader = domTip_tipBox.width() - domTip_tipHeader.width();
		var domTip_tipElementDifferenceBody = domTip_tipBox.width() - domTip_tipBody.width();
		
		if (domTip_tipHeight != 0)
		{
			domTip_tipBody.css("height", domTip_tipHeight + "px");
			domTip_tipBody.css("min-height", domTip_tipHeight + "px");
			domTip_tipBody.css("max-height", domTip_tipHeight + "px");
		} else {
			domTip_tipBody.css("height", "auto");
			domTip_tipBody.css("min-height", "");
			domTip_tipBody.css("max-height", "");
		}

		if (domTip_tipWidth != 0)
		{
			domTip_tipBox.css("width", domTip_tipWidth + "px");
			domTip_tipHeader.css("width", domTip_tipWidth - domTip_tipElementDifferenceHeader + "px");
			domTip_tipBody.css("width", domTip_tipWidth - domTip_tipElementDifferenceBody + "px");
		} else {
			domTip_tipBox.css("width", "");
			domTip_tipHeader.css("width", "");
			domTip_tipBody.css("width", "");
		}
		
		domTip_tipId = domTip_newTipId;
		domTip_populateTip(domTip_tipText, domTip_headerText, domTip_headerLink);		
	} else {
		domTip_freeze();
	}
}

function domTip_populateTip(domTip_tipText, domTip_headerText, domTip_headerLink)
{
	// Build the tip header
	if (domTip_headerText != "")
	{
		domTip_tipHeader.show();
		
		var headerHTML = domTip_headerText;
		
		if (domTip_headerLink != undefined && domTip_headerLink != "")
		{
			headerHTML = '<a href="' + domTip_headerLink + '">' + domTip_headerText + '</a>';
		}
		
		domTip_tipHeader.html(headerHTML);
	} else {
		domTip_tipHeader.hide();
	}
	
	domTip_tipBody.html(domTip_tipText);
		
	domTip_moveTip();
	
	domTip_fadeTipIn();
}

function domTip_moveTip()
{
	// Specify the location of the tooltip.
	
	// Get the height and width of the tooltip container. Will use this when
	// calculating tooltip position.
	var domTip_tipHeight = domTip_tipBox.height();
	var domTip_tipWidth = domTip_tipBox.width();
	
	// domTip_tipXloc and domTip_tipYloc specify where the tooltip should appear.
	// By default, it is just below and to the right of the mouse pointer.
	if (domTip_tipPosition == "mouse")
	{
		// Position below the mouse cursor
		var domTip_tipXloc = domTip_curPageX + domTip_tipOffsetX;
		var domTip_tipYloc = domTip_curPageY + domTip_tipOffsetY;
	} else if (domTip_tipPosition == "link") {
		// Position below the link
		var domTip_tipXloc = domTip_tipLinkX + domTip_tipOffsetX;
		var domTip_tipYloc = domTip_tipLinkY + domTip_tipOffsetY + domTip_tipLinkHeight;
	}
	
	// If the tooltip extends off the right side, pull it over
	if ((domTip_tipXloc - domTip_scrollPageX) + 5 + domTip_tipWidth > domTip_viewScreenX)
	{
		var domTip_pageXDiff = ((domTip_tipXloc - domTip_scrollPageX) + 5 + domTip_tipWidth) - domTip_viewScreenX;
		domTip_tipXloc -= domTip_pageXDiff;
	}
	
	// If the tooltip will extend off the bottom of the screen, pull it back up.
	// alert(domTip_tipYloc + " " + domTip_viewScreenY + " " + domTip_tipHeight);
	if ((domTip_tipYloc - domTip_scrollPageY) + 5 + domTip_tipHeight > domTip_viewScreenY)
	{
		var domTip_pageYDiff = ((domTip_tipYloc - domTip_scrollPageY) + 5 + 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;
	}
	
	// Set the position in pixels.
	domTip_tipBox.css("left", domTip_tipXloc + "px");
	domTip_tipBox.css("top", domTip_tipYloc + "px");
}

function domTip_freeze()
{
	clearTimeout(domTip_timer);
	domTip_tipBox.stop();
	domTip_tipBox.css("opacity", 100);
}

