var httpRequest;
var myDiv;
var arrIDs = new Array(0);
var arrTexts = new Array(0);
var glossarySource = null;


// source: http://www.anyexample.com/webdev/javascript/javascript_getelementsbyclass_function.xml
function getElementsByClass( searchClass, domNode, tagName) {
	if (domNode == null) domNode = document;
	if (tagName == null) tagName = '*';
	var el = new Array();
	var tags = domNode.getElementsByTagName(tagName);
	var tcl = " "+searchClass+" ";
	for(i=0,j=0; i<tags.length; i++) {
		var test = " " + tags[i].className + " ";
		if (test.indexOf(tcl) != -1)
			el[j++] = tags[i];
	}
	return el;
}


// source: http://www.quirksmode.org/js/findpos.html
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		curwidth = obj.offsetWidth;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop,curwidth];
}


function HidePopUp(e)
{
    if(document.getElementById("glossaryTarget"))
    {
        var target = document.getElementById("glossaryTarget");
        target.style.display = "none";
        glossarySource = null;
    }
}


function ShowGlossaryPopup(evt)
{
	glossarySource = evt.srcElement ? evt.srcElement : evt.target;
	
	id = glossarySource.id;
	
	if (FindAndShowGlossaryEntry(id))
		return;

	var glossaryDirector = "/GetAVPopUpItem.aspx";
	if (window.XMLHttpRequest)
		httpRequest = new XMLHttpRequest();
	else if (window.ActiveXObject) 
		httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
	else
		return;

	try {
		httpRequest.open('GET', glossaryDirector + "?id=" + id, true);
		httpRequest.onreadystatechange = HttpCallback;
		httpRequest.send('');
	} catch(err) {}
}


function HttpCallback() 
{
	if (httpRequest.readyState == 4 && httpRequest.status == 200)
	{
		var arrGlossary = httpRequest.responseText.split('|');
		arrIDs.length = arrIDs.length + 1;
		arrTexts.length = arrIDs.length;
		arrIDs[arrIDs.length] = arrGlossary[0];
		arrTexts[arrTexts.length] = arrGlossary[1];
		RenderGlossaryPopup(arrGlossary[1]);
	}
}


function FindAndShowGlossaryEntry(id)
{
	for (i = 0; i < arrIDs.length; i++)
	{
		if (id == arrIDs[i])
		{
			RenderGlossaryPopup(arrTexts[i]);
			return true;
		}
	}	
	return false;
}


function RenderGlossaryPopup(glossaryText)
{
	if ((glossarySource == null) || (glossaryText == null) || (glossaryText == ""))
		return;

	// get location of glossary link
	pos = findPos(glossarySource);
	pos[1] += 18;	/* position balloon under glossary link */

	// update div style attributes
	var gdiv = document.getElementById("glossaryTarget");
	gdiv.style.left = pos[0] + "px";
	gdiv.style.top = pos[1] + "px";
	gdiv.style.display = "block";
	gdiv.style.position = "absolute";

	// replace crlf with proper paragraph enclosure
	text = '<p>' + glossaryText.replace(/\r\n/g, '</p><p>') + '</p>'; 

	document.getElementById("definition").innerHTML = text;
}


function initGlossary() {
	var glossaryLinks = getElementsByClass("pop_glossary");
	for(i = 0; i < glossaryLinks.length; i++) {
		l = glossaryLinks[i];

		// get current event handler and convert to string
		anonymous_function = l.onmouseover + '';
		// attempt to find glossary item guid
		pos = anonymous_function.search(/ShowGlossaryPopup/g);
		if (pos) {
			// extract glossary item guid and store in element id
			guid = anonymous_function.substr(pos + 19, 36);
			l.id = guid;
	
			// remove anonymous event handler
			l.onmouseover = null;

			// attach new event handlers
			if (l.addEventListener) {
				// DOM
				l.addEventListener("mouseover", ShowGlossaryPopup, false);
			//	l.addEventListener("mouseout", HidePopUp, false);
			} else {
				// IE
				l.attachEvent("onmouseover", ShowGlossaryPopup);
			//	l.attachEvent("onmouseout", HidePopUp);
			}
		}
	}
	// close popup on click rather than on mouseout
	if (i > 0) document.onclick = HidePopUp;
}
