function glossarypops(root) {
	// recursively locate all elements with TEXTx IDs, scan element HTML for glossary references and edit in link/popup
	if (root.id && root.id.substring(0,4) == 'TEXT') {
		var txt = root.innerHTML;
		var i1 = txt.indexOf('<!--Text-->');
		var i2 = txt.indexOf('<!--/Text-->');
		if(i1 > 0 && i2 > 0) {
			var edit = txt.substring(i1+11, i2);
			var acro;
			for (acro in glossarydata) {
				var tit = glossarydata[acro];
				var mrk = '<!--Pop-->';
				var pop = '<span style="color: magenta; cursor: default" title="' + tit + '">' + mrk + acro + '</span>';
				var i3 = -pop.length;
				var i4 = 0;
				while((i3 = edit.indexOf(acro, i3+pop.length)) >= 0) {
					// don't highlight if preceeded by [A-Z]
					if(i3 > 0 && edit.charAt(i3-1) >= 'A' && edit.charAt(i3-1) <= 'Z')
						i3 += acro.length - pop.length
					// or part of another acronym..
					else if(i3 >= mrk.length && edit.substring(i3-mrk.length, i3) == mrk)
						i3 += acro.length - pop.length
					// or preceeding search space contains an open anchor but no close..
					else if(edit.substring(i4, i3).indexOf('<a') != -1 && edit.substring(i4, i3).indexOf('</a') == -1)
						i3 += acro.length - pop.length
					// or preceeding search space contains an open image but no close..
					else if(edit.substring(i4, i3).indexOf('<img') != -1 && edit.substring(i4, i3).indexOf('0>') == -1)
						i3 += acro.length - pop.length
					else {
						edit = edit.substring(0, i3) + pop + edit.substring(i3 + acro.length);
						i4 = i3+pop.length;
					}
				}
			}
			root.innerHTML = txt.substring(0, i1+11) + edit + txt.substring(i2);
		}
	} else {
		var i;
		for(i=0; i<root.childNodes.length; i++) {
			glossarypops(root.childNodes.item(i));
		}
	}
}
