﻿var titles = new Array();
var activeBubbleId = -1;

function initBubbles (elems, delim)
{
	if (delim == null)
	{
		delim = "(?:(?:\r?\n|\r){2,})";
	}
	
	if (!document.getElementById("infobubble"))
	{
		var infoBubble = document.createElement("div");
		infoBubble.id = "infobubble";
		infoBubble.className = "off";
		infoBubble.setAttribute("id", "infobubble");
		
		var m = document.createElement("h1");
		m.appendChild(document.createTextNode("Description"));
		infoBubble.appendChild(m);
		
		document.body.appendChild(infoBubble);
	}
	
	splitExp = new RegExp(delim);
	
	elems = elems.split(" ");
	for (var i in elems)
	{
		var l = document.getElementsByTagName(elems[i]);
		for (var i=0; i < l.length; i++)
		{
			var m = l.item(i);
			if (m.title != "")
			{
				addEvent(m, "mousemove", bubblePosition);
				addEvent(m, "mouseout", bubbleOff);
				addEvent(m, "mouseover", bubbleOn);
				m.bubbleId = i;
				titles[i] = m.title.split(splitExp);
				m.removeAttribute("title");
				m.className += (m.className != "" ? " " : "")+"hastitle";
			}
		}
	}
}

/* Information bubble */

function bubbleOn (e)
{
	var obj = e.target !== undefined ? e.target : (e.srcElement !== undefined ? e.srcElement : this);
	
	obj = bubbleGetRefElement(obj);
	
	if (obj === null || obj.bubbleId == activeBubbleId)
	{
		return;
	}
	
	activeBubbleId = obj.bubbleId;
	
	var infoBubble = document.getElementById("infobubble");
	
	var l = infoBubble.getElementsByTagName("*");
	for (var i=l.length - 1; i >= 0; i--)
	{
		if (l.item(i).tagName.toLowerCase() != "h1")
		{
			l.item(i).parentNode.removeChild(l.item(i));
		}
	}
	
	var content = titles[obj.bubbleId];
	
	if (content.length > 0)
	{
		for (var i in content)
		{
			var lines = content[i].split(/(?:\r?\n|\r)+/);
			
			if (lines.length > 1)
			{
				var start = 0;
				
				if (lines[0].substring(lines[0].length - 1) == ":")
				{
					var m = document.createElement("h2");
					m.appendChild(document.createTextNode(lines[0]));
					infoBubble.appendChild(m);
					
					start = 1;
				}
				
				if (lines[start].charAt(0) == "*")
				{
					var m = document.createElement("ul");
					
					if (start != 0)
					{
						m.className = "after-heading";
					}
					
					for (var j=start; j < lines.length; j++)
					{
						var n = document.createElement("li");
						n.appendChild(document.createTextNode(lines[start].replace(/^\* */, "")));
						m.appendChild(n);
					}
					
					infoBubble.appendChild(m);
				}
				else
				{
					var isol = true;
					
					for (var j=start; j < lines.length; j++)
					{
						var exp = new RegExp("^"+(j - start + 1)+"[.:) ] *");
						if (!lines[j].match(exp))
						{
							isol = false;
							break;
						}
					}
					
					if (isol)
					{
						var m = document.createElement("ol");
						
						if (start != 0)
						{
							m.className = "after-heading";
						}
						
						for (var j=start; j < lines.length; j++)
						{
							var n = document.createElement("li");
							n.appendChild(document.createTextNode(lines[j].replace(/^[0-9]+[.:) ] */, "")));
							m.appendChild(n);
						}
						
						infoBubble.appendChild(m);
					}
					else
					{
						var m = document.createElement("p");
						
						if (start != 0)
						{
							m.className = "after-heading";
						}
						
						for (var j=start; j < lines.length; j++)
						{
							if (j != start)
							{
								var n = document.createElement("br");
								m.appendChild(n);
							}
							
							m.appendChild(document.createTextNode(lines[j]));
						}
						
						infoBubble.appendChild(m);
					}
				}
			}
			else
			{
				var m = document.createElement("p");
				m.appendChild(document.createTextNode(lines[0]));
				infoBubble.appendChild(m);
			}
		}
		
		if (infoBubble.childNodes.length > 1)
		{
			infoBubble.childNodes.item(1).className += (infoBubble.childNodes.item(1).className != "" ? " " : "")+"first-child";
			
			infoBubble.lastChild.className += (infoBubble.lastChild.className != "" ? " " : "")+"last-child";
		}
		
		bubblePosition(e);
		
		infoBubble.className = "on";
	}
}

function bubbleOff (e)
{
	var obj = e.target !== undefined ? e.target : (e.srcElement !== undefined ? e.srcElement : this);
	
	obj = bubbleGetRefElement(obj);
	
	if (obj === null)
	{
		return;
	}
	
	var destObj = e.relatedTarget !== undefined ? e.relatedTarget : (e.toElement !== undefined ? e.toElement : null);
	
	destObj = bubbleGetRefElement(destObj);
	
	if (destObj === null || destObj.bubbleId !== obj.bubbleId)
	{
		var infoBubble = document.getElementById("infobubble");
		
		if (infoBubble !== undefined)
		{
			infoBubble.className = "off";
		}
		
		activeBubbleId = -1;
	}
}

function bubblePosition (e)
{
	var obj = e.target !== undefined ? e.target : (e.srcElement !== undefined ? e.srcElement : this);
	
	obj = bubbleGetRefElement(obj);
	
	if (obj === null)
	{
		return;
	}
	
	var infoBubble = document.getElementById("infobubble");
	
	infoBubble.style.left = e.clientX+"px";
	
	if (infoBubble.style.minHeight !== undefined && infoBubble.style.maxHeight === undefined)
	{
		// Cheap IE 6 hack
		infoBubble.style.position = "absolute";
		infoBubble.style.top = (e.clientY + document.getElementsByTagName("html").item(0).scrollTop)+"px";
	}
	else
	{
		infoBubble.style.top = e.clientY+"px";
	}
}

function bubbleGetRefElement (obj)
{
	while ((obj.nodeType == 1 || obj.nodeType == 3 || obj.nodeType == 4) && obj.bubbleId === undefined && obj.parentNode != null)
	{
		obj = obj.parentNode;
	}
	
	if ((obj.nodeType != 1 && obj.nodeType != 3 && obj.nodeType != 4) || obj.bubbleId === undefined)
	{
		return null;
	}
	
	return obj;
}

/* Stock functions */

function addEvent (obj, e, f)
{
	if (obj.addEventListener) // Standard method
	{
		obj.addEventListener(e, f, false);
	}
	else if (obj.attachEvent) // Trident
	{
		obj.attachEvent("on"+e, f);
	}
}

