/*
 * This script was written fairly quickly.
 * Then I spent hours and days and a lot of nerves of making it
 * work in Internet Exploder :-(
 * Someone please pass a law that prohibits the use of this crappy software.
 */

/* 
 * Init
 */

function constantInit() {
	TABLE_WIDTH = 764;
	XML_FILE = "/redesign2009/js/glossary.xml";
	// XML_FILE = "glossary.xml";
	XML_ENTRY = "e";
	XML_NAME = "n";
	XML_INFO = "i";
	XML_CATEGORY = "c";
	XML_SPLITSTRING = ", ";
	ELM_DETAIL = "glossarySearch";
	ELM_DETAIL2 = "glossarySearch2";
	ELM_GLOSSARY = "glossaryPopup";
	ELM_GLOSSARY_HEADER = "glossaryPopupHeader";
	ELM_GLOSSARY_MAIN = "glossaryPopupMain";
	OFFSET_X = 2;
	OFFSET_Y = 12;
}

function glossaryInit() {
	constantInit();
	var element = document.getElementById(ELM_DETAIL);
	var element2 = document.getElementById(ELM_DETAIL2);
	if (element != null || element2 != null) {
		popupEnabled = false;
		document.onmousemove = popupPositionSet;
		loadXML(XML_FILE, highlight, element, element2); // sets global var xmlDoc
	}
}

function loadXML(url, handler, element, element2) {
	var xmlHttp = false;
	// For nice browsers
	if (typeof XMLHttpRequest != 'undefined') {
		xmlHttp = new XMLHttpRequest();
	}
	if (xmlHttp) {
		xmlHttp.open('GET', url, true);
		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 4) {
				xmlDoc = xmlHttp.responseXML;
				handler(xmlDoc, element);
				handler(xmlDoc, element2);
			}
		};
		xmlHttp.send(null);
	} else if (window.ActiveXObject) {
		// For horrible browsers
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.onreadystatechange = function() {
			if (xmlDoc.readyState == 4) {
				handler(xmlDoc, element);
				handler(xmlDoc, element2);
			}
		}
		xmlDoc.load(url);
	}
}

/*
 * Popups
 */

function popupShow(id, subid) {
	var glossary = document.getElementById(ELM_GLOSSARY);
	var glossaryHeader = document.getElementById(ELM_GLOSSARY_HEADER);
	var glossaryMain = document.getElementById(ELM_GLOSSARY_MAIN);
	var entry = xmlDoc.getElementsByTagName(XML_ENTRY)[id];
	var pattern = entry.getElementsByTagName(XML_NAME)[0].firstChild.data.split(XML_SPLITSTRING)[subid];
	var info = entry.getElementsByTagName(XML_INFO)[0].firstChild.data;

	glossaryHeader.innerHTML = pattern;
	glossaryMain.innerHTML = info;
	popupEnabled = true;
}

function popupHide() {
	var glossary = document.getElementById(ELM_GLOSSARY);
	popupEnabled = false
	glossary.style.visibility = "hidden"
	glossary.style.left = "-9999px"
}

function popupPositionSet(e) {
	if (popupEnabled) {
		if (!e)
			e = window.event; // f.cking IE fix
		var glossary = document.getElementById(ELM_GLOSSARY);
		var mouseX = e.clientX + getScrollWidth();
		var mouseY = e.clientY + getScrollHeight();
		var glossaryHeight = glossary.offsetHeight + OFFSET_Y;
		var updown = (e.clientY < glossaryHeight) ? 2 * OFFSET_Y : -glossaryHeight;
		var glossaryX = mouseX + OFFSET_X;
		var glossaryY = mouseY + updown;
		glossary.style.left = glossaryX + "px";
		glossary.style.top = glossaryY + "px";
		glossary.style.visibility = "visible";
	}
}

/*
 * Glossary
 */

/**
 * The function scans innerHTML for terms which are found in the XML and replaces
 * them with a popup link.
 * This is done in 3 steps:
 * 1. Masking: We do not want any popups inside links, so we do some crazy magic
 *             here inside link tags.
 * 2. Pre-Replacing: In order to avoid doulbe replacement (e.g. "Ethernet" would
 *             be found inside "Gigabit Ethernet") we first replace entries
 *             of the glossary with a special ID.
 * 3. Replacing: In the final step we replace the special ID with the actual code.
 * The whole thing is very fragile and prone to errors. But at least it is fast.
 * @param xmlDoc the XML document
 * @param element the div tag to be searched for terms
 * @return nothing
 */
function highlight(xmlDoc, element) {
	if (element != null) {
		var code = element.innerHTML;
		var entries = xmlDoc.getElementsByTagName(XML_ENTRY);
		code = mask(xmlDoc, code);
		for ( var i = 0; i < entries.length; i++) {
			var pattern = entries[i].getElementsByTagName(XML_NAME)[0].firstChild.data.split(XML_SPLITSTRING);
			for ( var j =0; j<pattern.length; j++) {
				var rexp = new RegExp("\\b" + pattern[j] + "\\b", "g");
				code = code.replace(rexp, "GlosID-"+i+"-"+j+"-");
			}
		}
		for ( var i = 0; i < entries.length; i++) {
			var pattern = entries[i].getElementsByTagName(XML_NAME)[0].firstChild.data.split(XML_SPLITSTRING);
			for ( var j =0; j<pattern.length; j++) {
				var rexp = new RegExp("GlosID-"+i+"-"+j+"-", "g");
				code = code.replace(rexp, '<a class="glossary" onmouseover="popupShow(' + i + ',' + j +')" onmouseout="popupHide()">' + pattern[j] + '</a>');
			}
		}
		element.innerHTML = code;
	}
}

/**
 * This function masks all those parts where we do not want to have popups These
 * things get masked:
 * <ul>
 * <li>anything that is within a link tag</li>
 * </ul>
 * This is a very fragile process that can be broken easily.
 * @param xmlDoc the XML document
 * @param code innerHTML to be scanned
 */
function mask(xmlDoc, code) {
	var rexp = new RegExp("(<a.*href[^>]*>)([^<]*[\\b\\s])(.)([^<]*)(.{2})</a>", "gi");
	code = code.replace(rexp, "$1$2$3<!---->$4<!---->$5</a>");
	return code;
}

/**
 * Lib
 */

function getScrollWidth() {
	var w = window.pageXOffset ||
					document.body.scrollLeft ||
					document.documentElement.scrollLeft;
	return w ? w : 0;
}

function getScrollHeight() {
	var h = window.pageYOffset ||
					document.body.scrollTop ||
					document.documentElement.scrollTop;

	return h ? h : 0;
}

