var POPUP = new Object();  //namespace to prevent conflict


POPUP.setup = function () {
// function run on load. Preloads and then hides definitions
	POPUP.sendRequest('/includes/definitions.html',createPopups);
	var links = document.getElementsByTagName('a');
	for (var i = 0; i < links.length; i++) {
		if (links[i].className=='lookup') {
			POPUP.addEvent(links[i], 'click', this.toggleCatcher, false);
		}
	}
	
	var headID = document.getElementsByTagName("head")[0];         
	var cssNode = document.createElement('link');
	cssNode.type = 'text/css';
	cssNode.rel = 'stylesheet';
	cssNode.href = '/includes/popup/popup.css';
	headID.appendChild(cssNode);
}
 
function createPopups(req)
// creates the definition divs on the pae
{	
	var container = document.createElement('div');
	container.innerHTML = req.responseText;
	var x = container.getElementsByTagName('dl');
	var xLength = x.length;
	for (i=0;i<xLength;i++)
	{
		var newEl = document.createElement('DIV');
		newEl.className = 'popup_definition';
		var top = document.createElement('DIV');
		top.className = 'popup_top';
		var a = document.createElement('A');
		a.setAttribute('href', '#');
		a.setAttribute('onclick', 'return false;');
		var closeButton = document.createElement('IMG');
		closeButton.className = 'close_button';
		closeButton.setAttribute('src', '/includes/popup/images/close_button.gif');
		POPUP.addEvent(closeButton, 'click', POPUP.toggleCatcher, false);
		a.appendChild(closeButton);
		top.appendChild(a);
		newEl.appendChild(top);
		newEl.id = x[0].id;
		x[0].id = null;
		newEl.appendChild(x[0]);
		var bottom = document.createElement('DIV');
		bottom.className = 'popup_bottom';
		newEl.appendChild(bottom);
		document.getElementsByTagName('body')[0].appendChild(newEl);
	}
}

POPUP.toggle = function (def, term) {
//toggles the definition div
	if (POPUP.getStyle(def,'display') != 'none')
		def.style.display="none";
		else {
			def.style.display="block";
			var coors = POPUP.findPos(term);
			coors[1] -= 55;
			coors[0] -= 45;
			var width;
			if (self.innerWidth) // all except Explorer
			{
				width = self.innerWidth;
			}
			else if (document.documentElement && document.documentElement.clientWidth)
				// Explorer 6 Strict Mode
			{
				width = document.documentElement.clientWidth;
			}
			else if (document.body) // other Explorers
			{
				width = document.body.clientWidth;
			}
			if ((width - coors[0]) <= 294)
				coors[0] -= 294 - (width - coors[0]) + 25;
			def.style.top = coors[1] + 'px';
			def.style.left = coors[0] + 'px';
		}
}


POPUP.toggleCatcher = function (e) {
// Used to pass appropriate paramaters from event listeners to the toggle function
	var targ = POPUP.getTarget(e);
	if (targ.tagName=="A")
	//def = document.getElementById(targ.hash.substring(1, targ.hash.length));
	var def = document.getElementById(targ.hash.replace(/.*[#]/i, ''));
	else
	def = targ.parentNode.parentNode.parentNode;
	POPUP.toggle(def, targ);
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	if (e && e.preventDefault)
	e.preventDefault();
	return false;
}

POPUP.addEvent = function (elm, evType, fn, useCapture) {
// used to add event listeners
	if (elm.addEventListener) {
      elm.addEventListener(evType, fn, useCapture);
      return true;
    } else if (elm.attachEvent) {
      var r = elm.attachEvent('on' + evType, fn);
      return r;
    } else {
      elm['on' + evType] = fn;
    }
}

POPUP.getTarget = function (e){
// gets the target of an event
	var target = window.event ? window.event.srcElement : e ? e.target : null;
	if (!target){return false;}
	while(target.nodeType!=1 && target.nodeName.toLowerCase()!='body'){
		target=target.parentNode;
	}
	return target;
}


POPUP.findPos = function (obj) {
// finds the current position of an object
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}


POPUP.getStyle = function (el,styleProp)
//checks to see if a certain css style is applied
{
	if (el.currentStyle)
		var y = el.currentStyle[styleProp];
	else if (window.getComputedStyle)
		var y = document.defaultView.getComputedStyle(el,null).getPropertyValue(styleProp);
	return y;
}

POPUP.sendRequest = function (url,callback,postData) {
	var req = createXMLHTTPObject();
	if (!req) return;
	var method = (postData) ? "POST" : "GET";
	req.open(method,url,true);
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	if (postData)
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
	req.onreadystatechange = function () {
		if (req.readyState != 4) return;
		if (req.status != 200 && req.status != 304) {
//			alert('HTTP error ' + req.status);
			return;
		}
		callback(req);
	}
	if (req.readyState == 4) return;
	req.send(postData);
}

var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}



window.onload = function () {
	POPUP.setup();
}