// ######### custom glossary code #########

// glossary global variables
glossary_buffer = new Array();											// keywords
glossary_defbuffer = new Array();											// definitions
glossary_buffer[0] = '';
glossary_defbuffer[0] = '';
var glossary_triggerposx = -1;
var glossary_triggerposy = -1;
var glossary_inprocess = false;											// true if fade-in is in process or if glossary is shown
var glossary_currentquery = '';
var glossary_lastquery = '';
var glossary_below = true;
var glossary_opacity = 0;													// start out fully transparent
glossary_exclusion_list = new Array();


function glossary_mouseover() {											// called from glossary mouse over
	glossary_triggerposx = mouse_x;
	glossary_triggerposy = mouse_y;
	if (glossary_buffer_pos(this.innerHTML) == -1) {
		glossary_buffer[glossary_buffer.length] = this.innerHTML;
		glossary_currentquery = this.innerHTML;
		loadXMLDoc('/globals/xml/glossary.jsp?keyword=' + escape(this.innerHTML.toLowerCase()));
	} else {
		glossary_show(this.innerHTML,glossary_defbuffer[glossary_buffer_pos(this.innerHTML)],true);
	}
}


function glossary_mouseout() {											// called from glossary mouse out
	glossary_hide();
}


function glossary_buffer_pos(glossquery) {									// find buffered query or return -1
	result = -1;
	for (a=0;a<glossary_buffer.length;a++) {
		if (glossquery == glossary_buffer[a]) {
			result = a;
		}
	}
	return result;
}


// once we have the data, set up glossary layer
function glossary_show(glossquery,glossdef,glossbuffered) {
	if (glossbuffered != true) {											// the query was not buffered and the result has to be saved
		glossary_defbuffer[glossary_defbuffer.length] = glossdef;
	}
	if (glossdef.length > 10) {											// keep glossary from appearing if definition is less than 10 characters
		if (glossary_lastquery != glossquery  && glossary_inprocess) {		// glossary is still active, but this is a new query, hide the old definition
			glossary_hide();
		}
		glossary_lastquery = glossquery;
		
		capsquery = '';													// create first-letter-caps version of query for display
		for (a=0;a<glossquery.length;a++) {
			if (a == 0) {
				capsquery = capsquery + glossquery.charAt(a).toUpperCase();
			} else {
				if (glossquery.charAt(a-1) == ' ') {
					capsquery = capsquery + glossquery.charAt(a).toUpperCase();
				} else {
					capsquery = capsquery + glossquery.charAt(a);
				}
			}
		}
		
		if (!glossary_inprocess) {
			glosstop = '<table border="0" cellpadding="0" cellspacing="0"><tr><td colspan="5"><img src="\/media\/images\/glossary_top.gif" width="195" height="9" border="0" alt=""><\/td><\/tr>';
			glosstop = glosstop + '<tr><td width="1" bgcolor="#6c9f9f"><img src="\/media\/images\/spacer.gif" width="1" height="1" border="0" alt=""><\/td><td width="5" bgcolor="#f6f0dc"><img src="\/media\/images\/spacer.gif" width="5" height="1" border="0" alt=""><\/td><td width="181" bgcolor="#f6f0dc"><span class="glossaryHeader">'+capsquery+'<\/span><br><img src="\/media\/images\/glossary_separator.gif" width="181" height="7" border="0" alt=""><\/td><td width="7" bgcolor="#f6f0dc"><img src="\/media\/images\/spacer.gif" width="7" height="1" border="0" alt=""><\/td><td width="1" bgcolor="#6c9f9f"><img src="\/media\/images\/spacer.gif" width="1" height="1" border="0" alt=""><\/td><\/tr>';
			glosstop = glosstop + '<tr><td bgcolor="#6c9f9f"><img src="\/media\/images\/spacer.gif" width="1" height="1" border="0" alt=""><\/td><td bgcolor="#f6f0dc"><img src="\/media\/images\/spacer.gif" width="5" height="1" border="0" alt=""><\/td><td bgcolor="#f6f0dc"><span class="glossaryText">';
			glossbot = '<\/span><\/td><td bgcolor="#f6f0dc"><img src="\/media\/images\/spacer.gif" width="7" height="1" border="0" alt=""><\/td><td bgcolor="#6c9f9f"><img src="\/media\/images\/spacer.gif" width="1" height="1" border="0" alt=""><\/td><\/tr><tr><td colspan="5"><img src="\/media\/images\/glossary_bottom.gif" width="195" height="8" border="0" alt=""><\/td><\/tr><\/table>';
			d_write_layer('glossarylayer',glosstop + glossdef + glossbot);
			ax = glossary_triggerposx;
			ay = glossary_triggerposy;
			
			win_width = get_winwidth();
			
			if (win_width > 750) {
				arx = ax - (win_width-750)/2;
			} else {
				arx = ax;
			}
	
			glossary_below = true;
	
			arrowx = ax - 6;													// setup default glossary coords
			arrowy = ay + 12;
			glossx = arrowx - 55;
			glossy = arrowy + 9;
	
			if (arx < 70) {													// if glossary is too far to the left, adjust to align with left content border
				glossx = glossx + (70 - arx);
			}
	
			win_height = get_winheight();
			gloss_height = d_layer_height('glossarylayer');					// check window size and scroll status
			scroll_y = get_scroll_y();

			flash_below = false;
			flash_above = false;
			for (a=0;a<glossary_exclusion_list.length;a++) {
				// check if Flash is in the way for glossary to stay below
				if (glossy < glossary_exclusion_list[a]['objtop']  &&  (Math.floor(glossy)+Math.floor(gloss_height)) > glossary_exclusion_list[a]['objtop'])  {
					flash_below = true;
				}
				// check if Flash is in the way for glossary to move up
				flash_bottomedge = Math.floor(glossary_exclusion_list[a]['objtop'])+Math.floor(glossary_exclusion_list[a]['objheight']);
				if (glossy > flash_bottomedge  &&  (ay-25-gloss_height) < flash_bottomedge)  {
					flash_above = true;
				}
			}

			if (((glossy-scroll_y) + gloss_height + 10 > win_height  ||  flash_below)  &&  !flash_above) {	// if there's not enough space below or if Flash is in the way, flip glossary to the top
				glossary_below = false;
				arrowy = ay - 25;
				glossy = arrowy - gloss_height + 1;
			}

			d_move_object(glossarylayerobject,glossx,glossy);
			d_move_object(glossaryarrowupobject,arrowx,arrowy);
			d_move_object(glossaryarrowdownobject,arrowx,arrowy);
	
			d_show_object(glossarylayerobject);
			if (glossary_below) {
				d_show_object(glossaryarrowupobject);
			} else {
				d_show_object(glossaryarrowdownobject);
			}
	
			glossary_inprocess = true;										// now set up the fader engine
			glossary_fadeengine();
		}
	}
}


// fades glossary layers in via timer for as long as glossary_inprocess is true
function glossary_fadeengine() {
	if (glossary_inprocess  &&  glossary_opacity < 100) {
		glossary_opacity = glossary_opacity + 10;
		if (glossary_opacity > 100) {
			glossary_opacity = 100;
		}
		d_change_opac(glossary_opacity, 'glossarylayer');
		if (glossary_below) {
			d_change_opac(glossary_opacity, 'glossaryarrowup');
		} else {
			d_change_opac(glossary_opacity, 'glossaryarrowdown');		
		}
		if (glossary_opacity < 100) {
			setTimeout("glossary_fadeengine()",20);
		}
	}
}


// hides the glossary layers
function glossary_hide() {
	d_hide_object(glossarylayerobject);
	d_change_opac(0, 'glossarylayer');
	d_hide_object(glossaryarrowupobject);
	d_change_opac(0, 'glossaryarrowup');
	d_hide_object(glossaryarrowdownobject);
	d_change_opac(0, 'glossaryarrowdown');

	glossary_opacity = 0;
	glossary_inprocess = false;
}


// pull the x & y-position of Flash objects
function find_object_position(obj) {
	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];
}


//called with a 0.5-sec delay after onload event: find all flash objects in the page and add to exclusion list
function find_flash_objects() {
	if (ns6 && !safari) {
		plugin_offset = -56;	// Firefox offset for Flash y coordinate
	} else {
		plugin_offset = 0;
	}
	var emblist = document.getElementsByTagName("object");
	for (a=0;a<emblist.length;a++) {
		objxy = find_object_position(emblist[a]);
		glossary_exclusion_list[a] = new Array();
		glossary_exclusion_list[a]['objtop'] = objxy[1] + plugin_offset;
		glossary_exclusion_list[a]['objheight'] = emblist[a].height;
	}
}


// initialize glossary layers and catch mouse events
window.onload = function() {
	d_make_layer('glossarylayer','',-200,-200,195,null,null,false,9998);
	glossarylayerobject = d_init_layer('glossarylayer');
	d_make_layer('glossaryarrowup','',-200,-200,195,null,null,false,9999);
	d_write_layer('glossaryarrowup','<img src="\/media\/images\/glossary_arrow_up.gif" width="13" height="10" border="0" alt="">');
	glossaryarrowupobject = d_init_layer('glossaryarrowup');
	d_make_layer('glossaryarrowdown','',-200,-200,195,null,null,false,9999);
	d_write_layer('glossaryarrowdown','<img src="\/media\/images\/glossary_arrow_down.gif" width="13" height="10" border="0" alt="">');
	glossaryarrowdownobject = d_init_layer('glossaryarrowdown');

	// capture mouse movements to be aware of mouse coords
	document.onmousemove = save_mouse_coords;
	if (ns6) {
		document.captureEvents(Event.MOUSEMOVE);
	}
	
	// attach mouseover events to all glossary links
	var currentrollover = document.getElementsByName('glossaryrollover');
	for (a=0;a<currentrollover.length;a++) {
		currentrollover[a].onmouseover = glossary_mouseover;
		currentrollover[a].onmouseout = glossary_mouseout;
	}
	
	setTimeout("find_flash_objects()",500);
}

// ######### custom AJAX library #########

var xml_req_obj;

// XMLHttpRequest handler
function loadXMLDoc(url) {
	xml_req_obj = false;
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest && !(window.ActiveXObject)) {
    	try {
			xml_req_obj = new XMLHttpRequest();
        } catch(e) {
			xml_req_obj = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
       	try {
        	xml_req_obj = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		xml_req_obj = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		xml_req_obj = false;
        	}
		}
    }
	if(xml_req_obj) {
		xml_req_obj.onreadystatechange = processReqChange;
		xml_req_obj.open("GET", url, true);
		xml_req_obj.send("");
	}
}

// request response handler
function processReqChange() {
    // only if xml_req_obj shows "loaded"
    if (xml_req_obj.readyState == 4) {
        // only if "OK"
        if (xml_req_obj.status == 200) {
			glossary_show(glossary_currentquery,xml_req_obj.responseText,false);
        } else {
			// if the request fails, we don't show the glossary
        }
    }
}