/******************************************************************************************************************************
*******************************************************************************************************************************
Author: Trevor Hanna
Inputs: Word and definition
Outputs: Glossary table with formating and definition.

Change Log:

12/04/2007 - DS - hard-coded iwidth
*******************************************************************************************************************************
*******************************************************************************************************************************/
var pmStart = 10000;
var pmUpper = 10001;
var olLoaded = 0;  var pmCount = pmStart+1; var pmt=''; var pms = new Array();
var FREPLACE = 0; var FBEFORE = 1; var FAFTER = 2; var FALTERNATE = 3; var FCHAIN=4;
var olHideForm=0;
var olHautoFlag = 0;
var olVautoFlag = 0;
var hookPts = new Array(), postParse = new Array(), cmdLine = new Array(), runTime = new Array();

registerCommands('left,right,center,offsetx,offsety,cellpad,snapx,snapy,fixx,fixy,relx,rely,padx,pady,fullhtml,above,below,capicon,textfont,captionfont,closefont,textsize,captionsize,closesize,timeout,function,hauto,vauto,closeclick,wrap,cssoff,compatmode,cssclass,textfontclass,captionfontclass,closefontclass');


var Vo_text="";
var Vo_close=" ";
var Vo_hpos=RIGHT;
var Vo_offsetx=2;
var Vo_offsety=2;
var Vo_textcolor="";
var Vo_cellpad=2;
var Vo_status="";
var Vo_autostatus=0;
var Vo_snapx=0;
var Vo_snapy=0;
var Vo_fixx=-1;
var Vo_fixy=-1;
var Vo_relx=null;
var Vo_rely=null;
var Vo_fgbackground="";
var Vo_bgbackground="";
var Vo_fullhtml=0;
var Vo_vpos=BELOW;
var Vo_aboveheight=0;
var Vo_capicon="";
var Vo_textfont="Verdana,Arial,Helvetica";
var Vo_captionfont="Verdana,Arial,Helvetica";
var Vo_closefont="Verdana,Arial,Helvetica";
var Vo_textsize="1";
var Vo_captionsize="1";
var Vo_closesize="1";
var Vo_frame=self;
var Vo_function=null;
var Vo_delay=0;
var Vo_delayid=0;
var Vo_hauto=0;
var Vo_vauto=0;


// Display state variables
var Vo_x = 0;
var Vo_y = 0;
var Vo_showingsticky = 0;
var Vo_removecounter = 0;

// Our layer
var over = null;
var fnRef, hoveringSwitch = false;
//var olHideDelay;

// Decide browser version
var isMac = (navigator.userAgent.indexOf("Mac") != -1);
var olOp = (navigator.userAgent.toLowerCase().indexOf('opera') > -1 && document.createTextNode);  // Opera 7
var olNs4 = (navigator.appName=='Netscape' && parseInt(navigator.appVersion) == 4);
var olNs6 = (document.getElementById) ? true : false;
var olKq = (olNs6 && /konqueror/i.test(navigator.userAgent));
var olIe4 = (document.all) ? true : false;
var olIe5 = false;
var olIe55 = false; // Added additional variable to identify IE5.5+
var docRoot = 'document.body';

// Resize fix for NS4.x to keep track of layer
if (olNs4) {
	var oW = window.innerWidth;
	var oH = window.innerHeight;
	window.onresize = function() { if (oW != window.innerWidth || oH != window.innerHeight) location.reload(); }
}



// Check for compatability mode.
if (document.compatMode && document.compatMode == 'CSS1Compat') {
	docRoot= ((olIe4 && !olOp) ? 'document.documentElement' : docRoot);
}

// Add window onload handlers to indicate when all modules have been loaded
// For Netscape 6+ and Mozilla, uses addEventListener method on the window object
// For IE it uses the attachEvent method of the window object and for Netscape 4.x
// it sets the window.onload handler to the OLonload_handler function for Bubbling
if(window.addEventListener) window.addEventListener("load",OLonLoad_handler,false);
else if (window.attachEvent) window.attachEvent("onload",OLonLoad_handler);

var capExtent;

////////
// PUBLIC FUNCTIONS
////////

// MouseOver(arg0,...,argN)
// Loads parameters into global runtime variables.
function MouseOver() {

	Vo_sticky=1;
	Vo_fgcolor="#FFFFFF"
	Vo_capcolor="#FFFFFF";
	Vo_closecolor="#FFFFFF";
	Vo_width="300";
	Vo_border="2";
	Vo_cellpad="2";
	Vo_height="-1";
	Vo_snapx="5";
	Vo_snapy="5";
	Vo_fixx="-1";
	Vo_fixy="-1";
	Vo_relx=null;
	Vo_rely=null;
	Vo_padxl=1;
	Vo_padxr=1;
	Vo_padyt=1;
	Vo_padyb=1;
	Vo_fullhtml=0;
	Vo_vpos=BELOW;
	Vo_aboveheight=0;
	Vo_capicon="";
	Vo_textfont="Verdana,Arial,Helvetica";
	Vo_captionfont="Franklin Gothic Demi Cond";
	Vo_closefont=="Verdana,Arial,Helvetica";


	Vo_hauto=0;
	Vo_vauto=0;
	Vo_closeclick=1;
	Vo_wrap=0;

	Vo_mouseoff=0;
	Vo_closetitle='Close Glossary';
	Vo_css=CSSOFF;
	Vo_compatmode=0;
	Vo_fgclass="";
	Vo_bgclass="";
	Vo_textfontclass="";
	Vo_captionfontclass="";
	Vo_closefontclass="";

	//setRunTimeVariables();

	fnRef = '';

	// Special for frame support, over must be reset...
	Vo_frame = self;

	if(!(over=createDivContainer())) return false;

	parseTokens('Vo_', MouseOver.arguments);


	if (Vo_delay == 0) {
		return runHook("olMain", FREPLACE);
 	} else {
		Vo_delayid = setTimeout("runHook('olMain', FREPLACE)", Vo_delay);
		return false;
	}
}


// The Close onMouseOver function
function cClick() {
	if (olLoaded) {
		runHook("hideObject", FREPLACE, over);
		Vo_showingsticky = 0;
	}
	return false;
}



/***********************************
// MAIN FUNCTION
/***********************************/


function olMain() {
	var layerhtml, styleType;
 	runHook("olMain", FBEFORE);

	layerhtml = runHook('ol_content_caption', FALTERNATE, Vo_css, Vo_text, 'Glossary', Vo_close);
	if (!runHook("createPopup", FREPLACE, layerhtml)) return false;

	// Prepare status bar
	if (Vo_autostatus > 0) {
		Vo_status = Vo_text;
		if (Vo_autostatus > 1) Vo_status = 'Glosssary';
	}
	Vo_allowmove = 0;
	runHook("disp", FREPLACE, Vo_status);
	runHook("olMain", FAFTER);
	return (olOp && event && event.type == 'mouseover' && !Vo_status) ? '' : (Vo_status != '');
}


function ol_content_caption(text,title,close) {
	var nameId, txt, cpIsMultiple = /,/.test(Vo_cellpad);
	var closing, closeevent;
	var textlength = 1;
	if (Vo_closeclick == 1) closeevent = (Vo_closetitle ? "title='" + Vo_closetitle +"'" : "") + " onclick";
		//display three widths of glossary depending on the length of the text
		if(text!=null) textlength=text.length;
		var tablewidth="200";
		if(textlength>=501&&textlength<=1000){
			tablewidth="350";
		} else if (textlength>=1001){
			tablewidth="450";
		}
		closing = '<td '+(!Vo_compatmode && Vo_closefontclass ? 'class="'+Vo_closefontclass : 'align="RIGHT')+'"><a href="javascript:return '+fnRef+'cClick();"'+((Vo_compatmode && Vo_closefontclass) ? ' class="' + Vo_closefontclass + '" ' : ' ')+closeevent+'="return '+fnRef+'cClick();">'+(Vo_closefontclass ? '' : wrapStr(0,Vo_closesize,'close'))+close+(Vo_closefontclass ? '' : wrapStr(1,Vo_closesize,'close'))+'<img src="/_images/aw/close.gif" border="0"></a></td>';
		txt = '<table width="'+tablewidth+'" border="2" cellpadding="2" cellspacing="0" bgcolor="#a5aeb7" height="20"><tr><td><table width="100%" border="0" cellpadding="2" cellspacing="0"><tr><td style="color=white; font=\'Franklin Gothic Demi Cond\'";><b>Glossary</b></td>'+closing+'</tr></table><table width="100%" border="0" cellpadding="7" cellspacing="0" bgcolor="#ffffff"><tr><td valign="TOP"'+(Vo_textfontclass ? ' class="'+Vo_textfontclass+'">' :((!olNs4&&cpIsMultiple) ? ' style="'+setCellPadStr(Vo_cellpad)+'">' : '>'))+(Vo_textfontclass ? '' : wrapStr(0,Vo_textsize,'text'))+text+(Vo_textfontclass ? '' : wrapStr(1,Vo_textsize)) + '</td></tr></table></td></tr></table>';
	return txt;
}

var olShowId=-1;

// Displays the popup
function disp(statustext) {

	runHook("disp", FBEFORE);
	runHook("placeLayer", FREPLACE);
	(olNs6&&olShowId<0) ? olShowId=setTimeout("runHook('showObject', FREPLACE, over)", 1) : runHook("showObject", FREPLACE, over);
	Vo_allowmove = (Vo_sticky || Vo_followmouse==0) ? 0 : 1;
	runHook("disp", FAFTER);
}

// Creates the actual popup structure
function createPopup(lyrContent){
	runHook("createPopup", FBEFORE);

	if (Vo_wrap) {
		var wd,ww,theObj = (olNs4 ? over : over.style);
		theObj.top = theObj.left = ((olIe4&&!olOp) ? 0 : -10000) + (!olNs4 ? 'px' : 0);
		layerWrite(lyrContent);
		wd = (olNs4 ? over.clip.width : over.offsetWidth);
		if (wd > (ww=windowWidth())) {
			lyrContent=lyrContent.replace(/\&nbsp;/g, ' ');
			Vo_width=ww;
			Vo_wrap=0;
		}
	}

	layerWrite(lyrContent);

	// Have to set Vo_width for placeLayer() routine if Vo_wrap is turned on
	if (Vo_wrap) Vo_width=(olNs4 ? over.clip.width : over.offsetWidth);

	runHook("createPopup", FAFTER, lyrContent);

	return true;
}

// Positions Glossary Popup
function placeLayer() {
	var placeX, placeY, widthFix = 0;

	if (Vo_frame.innerWidth) widthFix=18;
	//iwidth = windowWidth();
  // changed to hard-code so the popup doesn't go over the side of the page causing scrolling
  iwidth = 600;
  

	// Horizontal scroll offset
	winoffset=(olIe4) ? eval('Vo_frame.'+docRoot+'.scrollLeft') : Vo_frame.pageXOffset;

	placeX = runHook('horizontalPlacement',FCHAIN,iwidth,winoffset,widthFix);

	if (Vo_frame.innerHeight) {
		iheight=Vo_frame.innerHeight;
	} else if (eval('Vo_frame.'+docRoot)&&eval("typeof Vo_frame."+docRoot+".clientHeight=='number'")&&eval('Vo_frame.'+docRoot+'.clientHeight')) {
		iheight=eval('Vo_frame.'+docRoot+'.clientHeight');
	}

	// Vertical scroll offset
	scrolloffset=(olIe4) ? eval('Vo_frame.'+docRoot+'.scrollTop') : Vo_frame.pageYOffset;
	placeY = runHook('verticalPlacement',FCHAIN,iheight,scrolloffset);

	// Actually move the object.
	PosLayer(over, placeX, placeY);
}

// Moves the layer
function olMouseMove(e) {
	var e = (e) ? e : event;

	if (e.pageX) {
		Vo_x = e.pageX;
		Vo_y = e.pageY;
	} else if (e.clientX) {
		Vo_x = eval('e.clientX+Vo_frame.'+docRoot+'.scrollLeft');
		Vo_y = eval('e.clientY+Vo_frame.'+docRoot+'.scrollTop');
	}
}

// Fake function for 3.0 users.
function no_MouseOver() { return ver3fix; }

// Capture the mouse and chain other scripts.
function olMouseCapture() {
	capExtent = document;
	var fN, str = '', l, k, f, wMv, sS, mseHandler = olMouseMove;
	var re = /function[ ]*(\w*)\(/;

	wMv = (!olIe4 && window.onmousemove);
	if (document.onmousemove || wMv) {
		if (wMv) capExtent = window;
		f = capExtent.onmousemove.toString();
		fN = f.match(re);
		if (fN == null) {
			str = f+'(e); ';
		} else if (fN[1] == 'anonymous' || fN[1] == 'olMouseMove' || (wMv && fN[1] == 'onmousemove')) {
			if (!olOp && wMv) {
				l = f.indexOf('{')+1;
				k = f.lastIndexOf('}');
				sS = f.substring(l,k);
				if ((l = sS.indexOf('(')) != -1) {
					sS = sS.substring(0,l).replace(/^\s+/,'').replace(/\s+$/,'');
					if (eval("typeof " + sS + " == 'undefined'")) window.onmousemove = null;
					else str = sS + '(e);';
				}
			}
			if (!str) {
				olCheckMouseCapture = false;
				return;
			}
		} else {
			if (fN[1]) str = fN[1]+'(e); ';
			else {
				l = f.indexOf('{')+1;
				k = f.lastIndexOf('}');
				str = f.substring(l,k) + '\n';
			}
		}
		str += 'olMouseMove(e); ';
		mseHandler = new Function('e', str);
	}

	capExtent.onmousemove = mseHandler;
	if (olNs4) capExtent.captureEvents(Event.MOUSEMOVE);
}

////////
// PARSING FUNCTIONS
////////

// Does the actual command parsing.
function parseTokens(pf, ar) {
	// What the next argument is expected to be.
	var v, i, mode=-1, par = (pf != 'ol_');
	var fnMark = (par && !ar.length ? 1 : 0);

	for (i = 0; i < ar.length; i++) {
		if (mode < 0) {
			// Arg is maintext,unless its a number between pmStart and pmUpper
			// then its a command.
			if (typeof ar[i] == 'number' && ar[i] > pmStart && ar[i] < pmUpper) {
				fnMark = (par ? 1 : 0);
				i--;   // backup one so that the next block can parse it
			} else {
				switch(pf) {
					case 'ol_':
						//ol_text = ar[i].toString();
						break;
					default:
						Vo_text=ar[i].toString();
				}
			}

		}
	}


}


////////
// LAYER FUNCTIONS
////////

// Writes to a layer
function layerWrite(txt) {
	txt += "\n";
	if (olNs4) {
		var lyr = Vo_frame.document.layers['overDiv'].document
		lyr.write(txt)
		lyr.close()
	} else if (typeof over.innerHTML != 'undefined') {
		if (olIe5 && isMac) over.innerHTML = '';
		over.innerHTML = txt;
	} else {
		range = Vo_frame.document.createRange();
		range.setStartAfter(over);
		domfrag = range.createContextualFragment(txt);

		while (over.hasChildNodes()) {
			over.removeChild(over.lastChild);
		}

		over.appendChild(domfrag);
	}
}

// Make an object visible
function showObject(obj) {
	runHook("showObject", FBEFORE);

	var theObj=(olNs4 ? obj : obj.style);
	theObj.visibility = 'visible';

	runHook("showObject", FAFTER);
}

// Hides an object
function hideObject(obj) {
	runHook("hideObject", FBEFORE);

	var theObj=(olNs4 ? obj : obj.style);
	if (olNs6 && olShowId>0) { clearTimeout(olShowId); olShowId=0; }
	theObj.visibility = 'hidden';
	theObj.top = theObj.left = ((olIe4&&!olOp) ? 0 : -10000) + (!olNs4 ? 'px' : 0);
	self.status = "";

	if (obj.onmouseout||obj.onmouseover) {
		if (olNs4) obj.releaseEvents(Event.MOUSEOUT || Event.MOUSEOVER);
		obj.onmouseout = obj.onmouseover = null;
	}

	runHook("hideObject", FAFTER);
}

// Move a layer
function PosLayer(obj, xL, yL) {
	var theObj=(olNs4 ? obj : obj.style);
	theObj.left = xL + (!olNs4 ? 'px' : 0);
	theObj.top = yL + (!olNs4 ? 'px' : 0);
}


// Onload handler for window onload event
function OLonLoad_handler(e) {
	var re = /\w+\(.*\)[;\s]+/g, olre = /MouseOver\(|nd\(|cClick\(/, fn, l, i;

	if(!olLoaded) olLoaded=1;

  // Remove it for Gecko based browsers
	if(window.removeEventListener && e.eventPhase == 3) window.removeEventListener("load",OLonLoad_handler,false);
	else if(window.detachEvent) { // and for IE and Opera 4.x but execute calls to MouseOver, nd, or cClick()
		window.detachEvent("onload",OLonLoad_handler);
		var fN = document.body.getAttribute('onload');
		if (fN) {
			fN=fN.toString().match(re);
			if (fN && fN.length) {
				for (i=0; i<fN.length; i++) {
					if (/anonymous/.test(fN[i])) continue;
					while((l=fN[i].search(/\)[;\s]+/)) != -1) {
						fn=fN[i].substring(0,l+1);
						fN[i] = fN[i].substring(l+2);
						if (olre.test(fn)) eval(fn);
					}
				}
			}
		}
	}
}

// Wraps strings in Layer Generation Functions with the correct tags
//    endWrap true(if end tag) or false if start tag
//    fontSizeStr - font size string such as '1' or '10px'
//    whichString is being wrapped -- 'text', 'caption', or 'close'
function wrapStr(endWrap,fontSizeStr,whichString) {
	var fontStr, fontColor, isClose=((whichString=='close') ? 1 : 0), hasDims=/[%\-a-z]+$/.test(fontSizeStr);
	fontSizeStr = (olNs4) ? (!hasDims ? fontSizeStr : '1') : fontSizeStr;
	if (endWrap) return (hasDims&&!olNs4) ? (isClose ? '</span>' : '</div>') : '</font>';
	else {
		fontStr='Vo_'+whichString+'font';
		fontColor='Vo_'+((whichString=='caption')? 'cap' : whichString)+'color';
		return (hasDims&&!olNs4) ? (isClose ? '<span style="font-family: '+quoteMultiNameFonts(eval(fontStr))+'; color: '+eval(fontColor)+'; font-size: '+fontSizeStr+';">' : '<div style="font-family: '+quoteMultiNameFonts(eval(fontStr))+'; color: '+eval(fontColor)+'; font-size: '+fontSizeStr+';">') : '<font face="'+eval(fontStr)+'" color="'+eval(fontColor)+'" size="'+(parseInt(fontSizeStr)>7 ? '7' : fontSizeStr)+'">';
	}
}

// Quotes Multi word font names; needed for CSS Standards adherence in font-family
function quoteMultiNameFonts(theFont) {
	var v, pM=theFont.split(',');
	for (var i=0; i<pM.length; i++) {
		v=pM[i];
		v=v.replace(/^\s+/,'').replace(/\s+$/,'');
		if(/\s/.test(v) && !/['"]/.test(v)){
			v="\'"+v+"\'";
			pM[i]=v;
		}
	}
	return pM.join();
}

// Sets cellpadding style string value
function setCellPadStr(parameter) {
	var Str='', j=0, ary = new Array(), top, bottom, left, right;

	Str+='padding: ';
	ary=parameter.replace(/\s+/g,'').split(',');

	switch(ary.length) {
		case 2:
			top=bottom=ary[j];
			left=right=ary[++j];
			break;
		case 3:
			top=ary[j];
			left=right=ary[++j];
			bottom=ary[++j];
			break;
		case 4:
			top=ary[j];
			right=ary[++j];
			bottom=ary[++j];
			left=ary[++j];
			break;
	}

	Str+= ((ary.length==1) ? ary[0] + 'px;' : top + 'px ' + right + 'px ' + bottom + 'px ' + left + 'px;');

	return Str;
}



function horizontalPlacement(browserWidth, horizontalScrollAmount, widthFix) {
	var placeX, iwidth=browserWidth, winoffset=horizontalScrollAmount;
	var parsedWidth = parseInt(Vo_width);

	if (Vo_fixx > -1 || Vo_relx != null) {
		// Fixed position
		placeX=(Vo_relx != null ? ( Vo_relx < 0 ? winoffset +Vo_relx+ iwidth - parsedWidth - widthFix : winoffset+Vo_relx) : Vo_fixx);
	} else {
		// If HAUTO, decide what to use.
		if (Vo_hauto == 1) {
			if ((Vo_x - winoffset) > (iwidth / 2)) {
				Vo_hpos = LEFT;
			} else {
				Vo_hpos = RIGHT;
			}
		}

		// From mouse
		if (Vo_hpos == CENTER) { // Center
			placeX = Vo_x+Vo_offsetx-(parsedWidth/2);

			if (placeX < winoffset) placeX = winoffset;
		}

		if (Vo_hpos == RIGHT) { // Right
			placeX = Vo_x+Vo_offsetx;

			if ((placeX+parsedWidth) > (winoffset+iwidth - widthFix)) {
				placeX = iwidth+winoffset - parsedWidth - widthFix;
				if (placeX < 0) placeX = 0;
			}
		}
		if (Vo_hpos == LEFT) { // Left
			placeX = Vo_x-Vo_offsetx-parsedWidth;
			if (placeX < winoffset) placeX = winoffset;
		}

		// Snapping!
		if (Vo_snapx > 1) {
			var snapping = placeX % Vo_snapx;

			if (Vo_hpos == LEFT) {
				placeX = placeX - (Vo_snapx+snapping);
			} else {
				// CENTER and RIGHT
				placeX = placeX+(Vo_snapx - snapping);
			}

			if (placeX < winoffset) placeX = winoffset;
		}
	}

	return placeX;
}

// was originally in the placeLayer() routine; separated out for future ease
function verticalPlacement(browserHeight,verticalScrollAmount) {
	var placeY, iheight=browserHeight, scrolloffset=verticalScrollAmount;
	var parsedHeight=(Vo_aboveheight ? parseInt(Vo_aboveheight) : (olNs4 ? over.clip.height : over.offsetHeight));

	if (Vo_fixy > -1 || Vo_rely != null) {
		// Fixed position
		placeY=(Vo_rely != null ? (Vo_rely < 0 ? scrolloffset+Vo_rely+iheight - parsedHeight : scrolloffset+Vo_rely) : Vo_fixy);
	} else {
		// If VAUTO, decide what to use.
		if (Vo_vauto == 1) {
			if ((Vo_y - scrolloffset) > (iheight / 2) && Vo_vpos == BELOW && (Vo_y + parsedHeight + Vo_offsety - (scrolloffset + iheight) > 0)) {
				Vo_vpos = ABOVE;
			} else if (Vo_vpos == ABOVE && (Vo_y - (parsedHeight + Vo_offsety) - scrolloffset < 0)) {
				Vo_vpos = BELOW;
			}
		}

		// From mouse
		if (Vo_vpos == ABOVE) {
			if (Vo_aboveheight == 0) Vo_aboveheight = parsedHeight;

			placeY = Vo_y - (Vo_aboveheight+Vo_offsety);
			if (placeY < scrolloffset) placeY = scrolloffset;
		} else {
			// BELOW
			placeY = Vo_y+Vo_offsety;
		}

		// Snapping!
		if (Vo_snapy > 1) {
			var snapping = placeY % Vo_snapy;

			if (Vo_aboveheight > 0 && Vo_vpos == ABOVE) {
				placeY = placeY - (Vo_snapy+snapping);
			} else {
				placeY = placeY+(Vo_snapy - snapping);
			}

			if (placeY < scrolloffset) placeY = scrolloffset;
		}
	}

	return placeY;
}

// checks positioning flags
function checkPositionFlags() {
	if (olHautoFlag) olHautoFlag = Vo_hauto=0;
	if (olVautoFlag) olVautoFlag = Vo_vauto=0;
	return true;
}

// get Browser window width
function windowWidth() {
	var w;
	if (Vo_frame.innerWidth) w=Vo_frame.innerWidth;
	else if (eval('Vo_frame.'+docRoot)&&eval("typeof Vo_frame."+docRoot+".clientWidth=='number'")&&eval('Vo_frame.'+docRoot+'.clientWidth'))
		w=eval('Vo_frame.'+docRoot+'.clientWidth');
	return w;
}

// create the div container for popup content if it doesn't exist
function createDivContainer(id,frm,zValue) {
	id = (id || 'overDiv'), frm = (frm || Vo_frame), zValue = (zValue || 1000);
	var objRef, divContainer = layerReference(id);

	if (divContainer == null) {
		if (olNs4) {
			divContainer = frm.document.layers[id] = new Layer(window.innerWidth, frm);
			objRef = divContainer;
		} else {
			var body = (olIe4 ? frm.document.all.tags('BODY')[0] : frm.document.getElementsByTagName("BODY")[0]);
			if (olIe4&&!document.getElementById) {
				body.insertAdjacentHTML("beforeEnd",'<div id="'+id+'"></div>');
				divContainer=layerReference(id);
			} else {
				divContainer = frm.document.createElement("DIV");
				divContainer.id = id;
				body.appendChild(divContainer);
			}
			objRef = divContainer.style;
		}

		objRef.position = 'absolute';
		objRef.visibility = 'hidden';
		objRef.zIndex = zValue;
		if (olIe4&&!olOp) objRef.left = objRef.top = '0px';
		else objRef.left = objRef.top =  -10000 + (!olNs4 ? 'px' : 0);
	}

	return divContainer;
}

// get reference to a layer with ID=id
function layerReference(id) {
	return (olNs4 ? Vo_frame.document.layers[id] : (document.all ? Vo_frame.document.all[id] : Vo_frame.document.getElementById(id)));
}

// Converts an array into an argument string for use in eval.
function argToString(array, strtInd, argName) {
	var jS = strtInd, aS = '', ar = array;
	argName=(argName ? argName : 'ar');

	if (ar.length > jS) {
		for (var k = jS; k < ar.length; k++) aS += argName+'['+k+'], ';
		aS = aS.substring(0, aS.length-2);
	}

	return aS;
}

// Places a hook in the correct position in a hook point.
function reOrder(hookPt, fnRef, order) {
	var newPt = new Array(), match, i, j;

	if (!order || typeof order == 'undefined' || typeof order == 'number') return hookPt;

	if (typeof order=='function') {
		if (typeof fnRef=='object') {
			newPt = newPt.concat(fnRef);
		} else {
			newPt[newPt.length++]=fnRef;
		}

		for (i = 0; i < hookPt.length; i++) {
			match = false;
			if (typeof fnRef == 'function' && hookPt[i] == fnRef) {
				continue;
			} else {
				for(j = 0; j < fnRef.length; j++) if (hookPt[i] == fnRef[j]) {
					match = true;
					break;
				}
			}
			if (!match) newPt[newPt.length++] = hookPt[i];
		}

		newPt[newPt.length++] = order;

	} else if (typeof order == 'object') {
		if (typeof fnRef == 'object') {
			newPt = newPt.concat(fnRef);
		} else {
			newPt[newPt.length++] = fnRef;
		}

		for (j = 0; j < hookPt.length; j++) {
			match = false;
			if (typeof fnRef == 'function' && hookPt[j] == fnRef) {
				continue;
			} else {
				for (i = 0; i < fnRef.length; i++) if (hookPt[j] == fnRef[i]) {
					match = true;
					break;
				}
			}
			if (!match) newPt[newPt.length++]=hookPt[j];
		}

		for (i = 0; i < newPt.length; i++) hookPt[i] = newPt[i];
		newPt.length = 0;

		for (j = 0; j < hookPt.length; j++) {
			match = false;
			for (i = 0; i < order.length; i++) {
				if (hookPt[j] == order[i]) {
					match = true;
					break;
				}
			}
			if (!match) newPt[newPt.length++] = hookPt[j];
		}
		newPt = newPt.concat(order);
	}

	hookPt = newPt;

	return hookPt;
}






////////
//  PLUGIN REGISTRATION FUNCTIONS
////////

// Registers commands and creates constants.
function registerCommands(cmdStr) {
	if (typeof cmdStr!='string') return;

	var pM = cmdStr.split(',');
	pms = pms.concat(pM);

	for (var i = 0; i< pM.length; i++) {
		eval(pM[i].toUpperCase()+'='+pmCount++);
	}
}

// Registers no-parameter commands
function registerNoParameterCommands(cmdStr) {
	if (!cmdStr && typeof cmdStr != 'string') return;
	pmt=(!pmt) ? cmdStr : pmt + ',' + cmdStr;
}

// Register a function to hook at a certain point.
function registerHook(fnHookTo, fnRef, hookType, optPm) {
	var hookPt, last = typeof optPm;

	if (fnHookTo == 'plgIn'||fnHookTo == 'postParse') return;
	if (typeof hookPts[fnHookTo] == 'undefined') hookPts[fnHookTo] = new FunctionReference();

	hookPt = hookPts[fnHookTo];

	if (hookType != null) {
		if (hookType == FREPLACE) {
			hookPt.ovload = fnRef;  // replace normal MouseOver routine
			if (fnHookTo.indexOf('ol_content_') > -1) hookPt.alt[pms[CSSOFF-1-pmStart]]=fnRef;

		} else if (hookType == FBEFORE || hookType == FAFTER) {
			var hookPt=(hookType == 1 ? hookPt.before : hookPt.after);

			if (typeof fnRef == 'object') {
				hookPt = hookPt.concat(fnRef);
			} else {
				hookPt[hookPt.length++] = fnRef;
			}

			if (optPm) hookPt = reOrder(hookPt, fnRef, optPm);

		} else if (hookType == FALTERNATE) {
			if (last=='number') hookPt.alt[pms[optPm-1-pmStart]] = fnRef;
		} else if (hookType == FCHAIN) {
			hookPt = hookPt.chain;
			if (typeof fnRef=='object') hookPt=hookPt.concat(fnRef); // add other functions
			else hookPt[hookPt.length++]=fnRef;
		}

		return;
	}
}



// Runs any hooks registered.
function runHook(fnHookTo, hookType) {
	var l = hookPts[fnHookTo], k, rtnVal = null, optPm, arS, ar = runHook.arguments;

	if (hookType == FREPLACE) {
		arS = argToString(ar, 2);

		if (typeof l == 'undefined' || !(l = l.ovload)) rtnVal = eval(fnHookTo+'('+arS+')');
		else rtnVal = eval('l('+arS+')');

	} else if (hookType == FBEFORE || hookType == FAFTER) {
		if (typeof l != 'undefined') {
			l=(hookType == 1 ? l.before : l.after);

			if (l.length) {
				arS = argToString(ar, 2);
				for (var k = 0; k < l.length; k++) eval('l[k]('+arS+')');
			}
		}
	} else if (hookType == FALTERNATE) {
		optPm = ar[2];
		arS = argToString(ar, 3);

		if (typeof l == 'undefined' || (l = l.alt[pms[optPm-1-pmStart]]) == 'undefined') {
			rtnVal = eval(fnHookTo+'('+arS+')');
		} else {
			rtnVal = eval('l('+arS+')');
		}
	} else if (hookType == FCHAIN) {
		arS=argToString(ar,2);
		l=l.chain;

		for (k=l.length; k > 0; k--) if((rtnVal=eval('l[k-1]('+arS+')'))!=void(0)) break;
	}

	return rtnVal;
}

////////
// OBJECT CONSTRUCTORS
////////

// Object for handling hooks.
function FunctionReference() {
	this.ovload = null;
	this.before = new Array();
	this.after = new Array();
	this.alt = new Array();
	this.chain = new Array();
}





////////
// STANDARD REGISTRATIONS
////////

registerHook("ol_content_caption", ol_content_caption, FALTERNATE, CSSOFF);
registerHook("ol_content_caption", ol_content_caption, FALTERNATE, CSSCLASS);
registerHook("horizontalPlacement", horizontalPlacement, FCHAIN);
registerHook("verticalPlacement", verticalPlacement, FCHAIN);
if (olNs4||(olIe5&&isMac)||olKq) olLoaded=1;
registerNoParameterCommands('sticky,autostatus,autostatuscap,fullhtml,hauto,vauto,closeclick,wrap,followmouse,mouseoff,compatmode');
///////
// ESTABLISH MOUSECAPTURING
///////

// Capture events, alt. diffuses the MouseOver function.
var olCheckMouseCapture=true;
if ((olNs4 || olNs6 || olIe4)) {
	olMouseCapture();
} else {
	MouseOver = no_MouseOver;
	nd = no_MouseOver;
	ver3fix = true;
}
