/****************************************************
 * Pop-up detail list
 * Sunil Karve 07/06/2007
 *
 * Use W3C DOM methods to generate an index menu,
 * and selectively make an entry visible to the user
 ****************************************************/

// Define global variables
var dlContainer;
var terms;
var definitions;
var termsArray = new Array();
 
window.onload = function() {
 
	if(!document.getElementById("popUpDetailList")) { return; }

// Set references to key elements
	dlContainer = document.getElementById("popUpDetailList");
    terms = dlContainer.getElementsByTagName("dt");
    definitions = dlContainer.getElementsByTagName("dd");

// Set DL list container width (only used when script is running)
    var dlElement = dlContainer.getElementsByTagName("dl")[0];
    dlElement.style.width="275px";
	dlElement.style.display = "block";

// Hide all terms and definitions on the page
    hideElement(terms);
    hideElement(definitions);

// Create array of all term names in the definition list
    for (var j=0; j < terms.length; j++ ) {
	    termsArray[j] = terms[j].firstChild.nodeValue;
    }
  
// Create unordered list for index menu, and directions copy
    var indexMenu = document.createElement("ul");
    var indexMenuDirections = document.createElement("p");
  
// Populate index menu with definition terms and set event handlers for each
    for (var k=0; k < termsArray.length; k++ ) {  
        var listItem = indexMenu.appendChild(document.createElement("li"));
        var listAnchor = listItem.appendChild(document.createElement("a"));
        addEvent(listAnchor, "click", showPopUp);  
        listAnchor.appendChild(document.createTextNode(termsArray[k]));
    }
  
    var directionsCopy = "Choose an item from the menu for more information.";
    indexMenuDirections.appendChild(document.createTextNode(directionsCopy));
  
// Write index menu to document
    document.getElementById("indexMenu").appendChild(indexMenuDirections);
    document.getElementById("indexMenu").appendChild(indexMenu);
}


function showPopUp(e) {
// Get event target node (caller)
    var targ;
	if (!e) { var e = window.event };
	if (e.target) { targ = e.target }
	else if (e.srcElement) { targ = e.srcElement };
	if (targ.nodeType == 3) // Defeat Safari bug
		targ = targ.parentNode;
		
    clearIndexMenu(); // Reset index menu to no bold text

    targ.style.fontWeight = "bold"; // Highlight the selected menu item

// Read text node value
    var findText = targ.firstChild.nodeValue;
	
// Hide all terms and definitions
	hideElement(terms);
	hideElement(definitions);
	
//	Display only the selected term and definition
	for (var m=0; m < termsArray.length; m++ ) {		
		if (termsArray[m] == findText) {
			terms[m].style.display = "block";
			definitions[m].style.display = "block";
			break;		
		}
	}
}

// ***************** Utility functions ***********************

function hideElement(node) {
// Hide all elements in the passed-in node	 
    for (var i=0; i < node.length; i++) {
        node[i].style.display = "none";	
    } 
}
 
function clearIndexMenu() {
// Set all links in index menu to normal weight (reset)
    var listItems = document.getElementById("indexMenu").getElementsByTagName("li");
    for (var n=0; n < listItems.length; n++ ) {
        listItems[n].firstChild.style.fontWeight = "normal";		
    }
}
 
function addEvent(obj, evType, fn) { 
// Add event handler to element (cross-browser compliant)
    if (obj.addEventListener){ 
        obj.addEventListener(evType, fn, false); 
        return true; 
    } else if (obj.attachEvent){ 
        var r = obj.attachEvent("on" + evType, fn); 
        return r; 
    } else { 
        return false; 
    } 
}
