////////////////  GLOBAL TOOPTIP CONFIGURATION /////////////////////

// note, so far, all that works in here are the offsets.

var ttAbove       = false;        // tooltip above mousepointer? Alternative: true
var ttDelay       = 500;          // time span until tooltip shows up [milliseconds]
var ttLeft        = false;        // tooltip on the left of the mouse? Alternative: true
var ttOffsetX     = 12;           // horizontal offset of left-top corner from mousepointer
var ttOffsetY     = 15;           // vertical offset                   "
var ttStatic      = false;        // tooltip NOT move with the mouse? Alternative: true
var ttSticky      = false;        // do NOT hide tooltip on mouseout? Alternative: true
var ttTemp        = 0;            // time span after which the tooltip disappears; 0 (zero) means "infinite timespan"
var ttWidth       = 300;
////////////////////  END OF TOOLTIP CONFIG  ////////////////////////

function tooltip()
{
	this._tooltipItem = null;
	this._tooltipContents = null;
}

tooltip.prototype.init = function()
{
	var tt = this;
	var helpItems = document.getElementsByClassName('tooltip');

	for (var i=0; i<helpItems.length; i++)
	{
		helpItems[i].onmousemove = function(e)
		{
			if (!e) var e = window.event;

			if (e.pageX || e.pageY)
			{
				tt.mousePosX = e.pageX;
				tt.mousePosY = e.pageY;
				tt.mouseMaxX = window.innerWidth+window.pageXOffset;
				tt.mouseMaxY = getWindowHeight()+window.pageYOffset;
			}
			else if (e.clientX || e.clientY)
			{
				tt.mousePosX = e.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
				tt.mousePosY = e.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
				tt.mouseMaxX = document.body.clientWidth + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
				tt.mouseMaxY = getWindowHeight() + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
			}

			tt.xDistance = tt.mouseMaxX - (tt.mousePosX + ttOffsetX);
			tt.yDistance = tt.mouseMaxY - (tt.mousePosY + ttOffsetY);

			tt._tooltipItem = this;
			tt._tooltipContents = document.getElementById(this.id+'Contents');

			tt.yLimit = tt.mouseMaxY - tt.mousePosY - (tt._tooltipContents.offsetHeight + ttOffsetY);
			tt.xLimit = tt.mouseMaxX - tt.mousePosX - (tt._tooltipContents.offsetWidth + ttOffsetX);

			if (tt.yLimit <= 0) {
				tt.offsetY = -1 * tt._tooltipContents.offsetHeight;
			}
			else tt.offsetY = ttOffsetY;

			// x limit is currently inactive.
			tt.offsetX = ttOffsetX;

			tt.move();
		}
		helpItems[i].onmouseout = function (e)
		{
			tt.out();
		}
	}
}

tooltip.prototype.out = function()
{
	this._tooltipContents.style.visibility = 'hidden';
	this._tooltipItem = null;
	this._tooltipContents = null;
}

tooltip.prototype.move = function()
{
	this._tooltipContents.style.visibility = 'visible';
	this._tooltipContents.style.top = this.mousePosY+this.offsetY+'px';
	this._tooltipContents.style.left = this.mousePosX+this.offsetX+'px';

	// uncomment this to overwrite contents with test variables
	//this._tooltipContents.innerHTML = 'Y LIMIT: '+this.yLimit+'<br>XR: '+this.xDistance+', YR: '+this.yDistance+'<br>X: '+this.mousePosX+', Y: '+this.mousePosY+'<br>MX: '+this.mouseMaxX+', MY: '+this.mouseMaxY+'<br>This Element Height: '+this._tooltipContents.offsetHeight+'<br>This Element Width: '+this._tooltipContents.offsetWidth;
}

addEvent(window, 'load', function()
{
	var tt = new tooltip();
	tt.init();
});

document.getElementsByClassName = function (needle)
{
  var	my_array = document.getElementsByTagName("*");
  var	retvalue = new Array();
  var	i;
  var	j;

  for (i = 0, j = 0; i < my_array.length; i++)
  {
    var c = " " + my_array[i].className + " ";
    if (c.indexOf(" " + needle + " ") != -1)
      retvalue[j++] = my_array[i];
  }
  return retvalue;
}

function addEvent(obj, evType, fn)
{
	if (obj.addEventListener)
	{
		obj.addEventListener(evType, fn, true);
		return true;
	}
	else if (obj.attachEvent)
	{
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	}
	// this condition satisfies Mac IE 5
	else if (obj == window && evType == "load") {
		window.onload=fn
	}
	else
	{
		return false;
	}
}

function getWindowHeight() {
	var height = 0;
	if(typeof(window.innerWidth) == 'number') {
		//Non-IE
		height = window.innerHeight;
	}
	else if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight)) {
		//IE 6+ in 'standards compliant mode'
		height = document.documentElement.clientHeight;
	}
	else if(document.body && (document.body.clientWidth || document.body.clientHeight)) {
		//IE 4 compatible
		height = document.body.clientHeight;
	}
	return height;
}
