//*************************************
//
// Glossary Functions
// This file needs to be added to any page that 
// needs to use a glossary.
//
//*************************************
function GlossaryLayer()
{
	document.writeln('<style type="text/css">');
	document.writeln("#Glossary{position:absolute; left:0px; top:0px;z-index:10;width:275px; background-color: #CCEAFF; layer-background-color: #CCEAFF; border: 1px solid #000000;padding : 3px;visibility:hidden;cursor:help;}");
	document.writeln("</style>");

	if (top.is.nav4up)
	{
		document.writeln('<div id="Glossary">&nbsp;</div>');	

		document.layers['Glossary'].captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
		document.layers['Glossary'].onmouseover=cancelHideTimer;
		document.layers['Glossary'].onmouseout=setHideTimer;

		window.captureEvents(Event.MOUSEOVER);
		window.onmouseover=doGloss;
	}
	else
	{
		document.writeln('<div id="Glossary" onMouseOver="cancelHideTimer()" onMouseOut="setHideTimer()"></div>');

		document.body.onmouseover=doGloss;
	}
}

// Nasty hack so that if you are viewing a page offline it won't give errors.
// Assumes that if you have netscape it is >=4.0 and if you don't you must have
// IE >=5.0
if (!top.is)
{
	top.is = new Object;
	if (navigator.appName == "Netscape")
	{
		top.is.nav4up=true;
		top.is.ie4up = false;
	}
	else
	{
		top.is.nav4up=false;
		top.is.ie4up = true;
	}
}

var glossID = -1;
var timer = -1;
var mouseIsOver = null;

function jumpGlossary()
{
	if (glossID >= 0)
	{
		//alert("got here");
		top.jumpGlossary(glossID);
	}
}


function nothing()
{
	return false;
}

function lookup(entryName)
{
	return top.glossary.TraceEntry(entryName.toLowerCase());
}

function makeLayer(entry)
{
	if (!entry)
	{
		return "<span style='font-family: Arial, Helvetica, sans-serif;font-size:10pt'>Undefined</span>";
	}

	var splitDef = entry.definition.split("%"); //split it up to look for internal references

	var theString = "";

	for (var i = 0;i < splitDef.length;i++)
	{
		if (i % 2 == 0)  //even, therefore it's a string part
		{
			theString += splitDef[i];
		}
		else if (splitDef[i] == "")	// odd and empty, just print the % character
		{
			theString += "%";	
		}
		else // otherwise it's a reference
		{
			var temp = top.glossary.theGlossary[splitDef[i].toLowerCase()];
			if (temp)
			{
				theString += '<a href="javascript:top.jumpGlossary(' + temp.id + ')">' + splitDef[i] + '</a>';
			}
			else
			{
				theString += splitDef[i] + '[bad link]';
			}
		}
	}

	var returnString="";

	if (top.is.nav)
		returnString += "<div style='border: 1px solid #000000;'><table width='275'><tr><td>"; 

	returnString += "<span style='font-family: Arial, Helvetica, sans-serif;font-size:10pt'><b>" + entry.entry + ":</b> " + theString + "</span>";

	if (top.is.nav)
		returnString += "</td></tr></table></div>";

	return returnString;
}

function rect()
{
	this.left = 0;
	this.right = 0;
	this.top = 0;
	this.bottom = 0;

	this.toString = rectToString;
}
function rectToString()
{
	return this.left + ", " + this.top + ", " + this.right + ", " + this.bottom;
}

function doGloss(evt)
{
	if (top.is.nav)
	{
		if(evt.target.hash != "#gloss")
		{
			routeEvent(evt);
			return true;
		}
	}
	else
	{
		if (window.event.srcElement.hash != "#gloss")
		{
			return true;
		}
	}

	cancelHideTimer(evt); //otherwise it might trigger after we display the layer

	var elem;
	var glossEntry = "";

	if (top.is.ie4up)
	{
		elem = window.event.srcElement;

		if (elem.search)
			glossEntry = unescape(elem.search.substr(1));
		else
			glossEntry = elem.innerText;

		elem.onmouseout = setHideTimer;
	}
	else if (top.is.nav4up)
	{
		elem = evt.target;

		if (elem.search)
			glossEntry = unescape(elem.search.substr(1));
		else
			glossEntry = elem.text;
			
		elem.onmouseout = setHideTimer;
	}
	else
		return;

	if (glossEntry)
	{
		var theEntry = lookup(glossEntry);

		MM_setTextOfLayer('Glossary','',makeLayer(theEntry));
	}
	else
		MM_setTextOfLayer('Glossary','','Could not get the text to look up.');
	
	var mouseUpFunc = false;

	if (theEntry)
	{
		glossID = theEntry.id;
		mouseUpFunc = true;
	}

	elem.onmousedown = nothing;
	elem.onmouseup = mouseUpFunc ? jumpGlossary : nothing;

	var layer = MM_findObj("Glossary");
	
	var x, y;

	if (top.is.ie4up)
	{
		anchorX = elem.offsetLeft;
		anchorY = elem.offsetTop;
		var par = elem.offsetParent
		while (par != null)
		{
			anchorX += par.offsetLeft;
			anchorY += par.offsetTop;
			par = par.offsetParent;
		}

		x = anchorX + (elem.offsetWidth / 2);
		y = anchorY + elem.offsetHeight;

		var overSize = elem.offsetWidth + elem.offsetLeft - elem.offsetParent.offsetWidth;

		if (overSize > 0) //if anchor wraps
		{
//	alert(elem.offsetWidth + ", " + elem.offsetLeft);

			var lines = 2;
			var tempOS = overSize;
			while (tempOS > elem.offsetParent.offsetWidth)
			{
				lines++;
				tempOS -= elem.offsetParent.offsetWidth;
			}

			var lineHeight = 0;
			if (elem.offsetHeight % lines == 0 && elem.offsetHeight / lines > 11)
				lineHeight = elem.offsetHeight / lines;
			else if (elem.offsetHeight % (lines + 1) == 0 && elem.offsetHeight / (lines+1) > 11)
				lineHeight = elem.offsetHeight / (lines + 1);
			else
			{
				while (elem.offsetHeight % lines != 0  || elem.offsetHeight / lines <= 11)
				{
					lines--;
				}

				lineHeight = elem.offsetHeight / lines;
			}
//			alert(elem.offsetHeight);

			var rowArray = new Array;
			rowArray[0] = new rect;
			rowArray[0].left = anchorX;
			rowArray[0].top  = anchorY;
			rowArray[0].right = anchorX + elem.offsetWidth - overSize;
			rowArray[0].bottom  = anchorY + lineHeight;

			var row=1;

			while (overSize > 0)
			{
				rowArray[row] = new rect;
				rowArray[row].left = anchorX - elem.offsetLeft;
				rowArray[row].top = rowArray[row-1].top + lineHeight;
				var tempRight = rowArray[row].left;

//alert(overSize + ", " + elem.offsetParent.offsetWidth);

				if (overSize > elem.offsetParent.offsetWidth)
					tempRight += elem.offsetParent.offsetWidth;
				else
					tempRight += overSize;
				rowArray[row].right = tempRight;
				rowArray[row].bottom = rowArray[row].top + lineHeight;

				overSize -= elem.offsetParent.offsetWidth;
				row++;
			}
//		alert(rowArray + " - " + window.event.clientX + ", " + window.event.clientY);
			for (var i = 0;i < rowArray.length;i++)
			{
				if (window.event.clientY >= rowArray[i].top
				  && window.event.clientY < rowArray[i].bottom)
				{
					x = (rowArray[i].left + rowArray[i].right) /2;
					y = rowArray[i].bottom;
//					alert("row " + i);
					break;
				}
			}

		}

		if (x + layer.offsetWidth > document.body.clientWidth + document.body.scrollLeft)
		{
			x = document.body.clientWidth + document.body.scrollLeft - layer.offsetWidth -5;
		}

		if (y + layer.offsetHeight > document.body.clientHeight + document.body.scrollTop)
		{
			var tempY = anchorY - layer.offsetHeight;

			if (tempY >= 0)
			{
				y = tempY;
			}
		}

		layer.style.pixelLeft = x;// + document.body.scrollLeft;
		layer.style.pixelTop =y;// + document.body.scrollTop;
		 layer.style.visibility = "visible";
	}
	else
	{
		x = elem.x + 20;
		y = elem.y + 15;

		if (x + layer.document.width > window.innerWidth + window.pageXOffset)
		{
			x = (window.innerWidth + window.pageXOffset) - layer.document.width - 5;
		}

		if (y + layer.document.height > window.innerHeight + window.pageYOffset)
		{
			tempY = elem.y - layer.document.height;
			if (tempY > window.pageYOffset)
			{
				y = tempY;
			}
		}

		layer.left = x;
		layer.top = y;
		layer.visibility = "show";
	}
}

function setHideTimer(evt)
{
	if (timer != -1)
		cancelHideTimer();
	
	timer = setTimeout("hideGlossary()", 150);
}

function cancelHideTimer(evt)
{
	if (timer != -1)
	{
		clearTimeout(timer);
		timer = -1;
	}
}

function hideGlossary()
{
	mouseIsOver = null;    //This is a hack to solve a problem with NS where the MouseOver event is triggered
					 // before the MouseOut event when moving from the layer to a link.

	var obj = MM_findObj("Glossary");

	if (top.is.nav4up)
	{
		obj.visibility = "hide";
	}
	else
	{
		obj.style.visibility = "hidden";
	}
}





