var Tooltip = function()
{
	var currentTooltip = null;

	var show = function(source, elementId, hovering)
	{
		if(currentTooltip != null)
			hide(currentTooltip);
			
		currentTooltip = elementId;
		
		var element = document.getElementById(elementId);
		element.style.display = "block";
		
		setPosition(source, element);
		
		if(!hovering)
		{
			element.onclick = element.onblur = function()
			{
				element.style.display = "none";
			};
			
			element.tabIndex = -1;
			element.focus();
		}
	};
	
	var hide = function(elementId)
	{							
		var element = document.getElementById(elementId);
		element.style.display = "none";
		
		currentTooltip = null;
	};
	
	var setPosition = function(source, overlay)
	{
		var position = { left: 0, top: source.offsetHeight + 4 };
		var element = source;
		
		for(var node = element.parentNode; node.tagName.toLowerCase() != "body"; node = node.parentNode)
		{
			position.left -= node.scrollLeft;
			position.top -= node.scrollTop;
		}
		
		while(element != null)
		{
			position.left += element.offsetLeft;
			position.top += element.offsetTop;
			element = element.offsetParent;
		}
		
		if(overlay.offsetWidth > source.offsetWidth)
			position.left -= (overlay.offsetWidth - source.offsetWidth) / 3;
		
		// Ensure that the tooltip overlay isn't positioned too far left or right.
		
		if(position.left < 10)
			position.left = 10;
		else if(position.left + overlay.offsetWidth > document.body.clientWidth - 10)
			position.left = document.body.clientWidth - overlay.offsetWidth - 10;
		
		document.body.appendChild(overlay);
		
		overlay.style.top = position.top + "px";
		overlay.style.left = position.left + "px";
		
		// Corrects the position if it appears to be out of the winsize
		var winHeight = 0;

		if( typeof( window.innerWidth ) == 'number' )
			winHeight = window.innerHeight;
			
		if(document.documentElement && document.documentElement.clientHeight) 
			winHeight = Math.max(winHeight, document.documentElement.clientHeight);
			
		if(document.body && document.body.clientHeight)
			winHeight = Math.max(winHeight, document.body.clientHeight);
		
		// If the tooltip doesn't fit underneath the source, dan blace it above the source.
		if(overlay.offsetHeight + position.top > winHeight)
		{
			var newTop = position.top - source.offsetHeight - overlay.offsetHeight - 4;
			
			if(newTop < 0)
			{
				newTop = 5;
				overlay.style.height = (winHeight - 10) + "px";
				overlay.style.paddingRight = "10px";
				overlay.style.overflowY = "scroll";
				overlay.style.overflowX = "hidden";
			}
		
			overlay.style.top = newTop + "px";
		}
	};

	return {
		show : show,
		hide : hide
	};
}();
