// JavaScript Document
<!--
	var isIE = false;
	var destField;
	// global request and XML document objects
	var req;
	
	// retrieve XML document (reusable generic function);
	// parameter is URL string (relative or complete) to
	// an .xml file whose Content-Type is a valid XML
	// type, such as text/xml; XML source must be from
	// same domain as HTML file
	
	function loadXMLDoc(url) {
		req = false;
		 // branch for native XMLHttpRequest object
		 if(window.XMLHttpRequest && !(window.ActiveXObject)) {
			try {
				req = new XMLHttpRequest();
				req.overrideMimeType('text/xml');			
			  } catch(e) {
				req = false;
			  }
		 // branch for IE/Windows ActiveX version
		 } else if(window.ActiveXObject) {
				try {
				req = new ActiveXObject("Msxml2.XMLHTTP");
				} catch(e) {
				try {
						req = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {
						req = false;
				}
			}
		 }
		if(req) {
			req.onreadystatechange = processReqChange;
			req.open("GET", url, true);	
			req.send("");
		}
	}	
	
	// handle onreadystatechange event of req object
	function processReqChange() {
		 // only if req shows "loaded"
		if (req.readyState == 4) {
			  // only if "OK"
			  if (req.status == 200) {
					buildTopicList();
				} else {
					alert("There was a problem retrieving the XML data:\n" +
						 req.statusText);
				}
		 }
	}
	
	// invoked by "Category" select element change;
	// loads chosen XML document, clears Topics select
	// element, loads new items into Topics select element
	function loadDoc(evt,field) {
		 // equalize W3C/IE event models to get event object
		destField = field
		clearTopicList();	
		 evt = (evt) ? evt : ((window.event) ? window.event : null);
		 if (evt) {
			  // equalize W3C/IE models to get event target reference
			  var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			  if (elem) {
					try {

						 if (elem.options[elem.selectedIndex].value > 0) {
							 loadXMLDoc("/models-"+elem.options[elem.selectedIndex].value+".xml");	
						 }	
					}
					catch(e) {
						 var msg = (typeof e == "string") ? e : ((e.message) ? e.message : "Unknown Error");
						 alert("Unable to get XML data:\n" + msg);
						 return;
					}
			  }
		 }
	}
	
	// retrieve text of an XML document element, including
	// elements using namespaces
	function getElementTextNS(prefix, local, parentElem, index) {
		 var result = "";
		 if (prefix && isIE) {
			  // IE/Windows way of handling namespaces
			  result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
		 } else {
			  // the namespace versions of this method 
			  // (getElementsByTagNameNS()) operate
			  // differently in Safari and Mozilla, but both
			  // return value with just local name, provided 
			  // there aren't conflicts with non-namespace element
			  // names
			  result = parentElem.getElementsByTagName(local)[index];
		 }
		 if (result) {
			  // get text, accounting for possible
			  // whitespace (carriage return) text nodes 
			  if (result.childNodes.length > 1) {
					return result.childNodes[1].nodeValue;
			  } else {
					return result.firstChild.nodeValue;    		
			  }
		 } else {
			  return "n/a";
		 }
	}
	
	// empty Topics select list content
	function clearTopicList() {
		 var selectbox = document.getElementById(destField);
		 while (selectbox.length > 0) {
			  selectbox.remove(0);
		 }
		 opt = document.createElement("option");
		 opt.value = 0;
		 opt.appendChild(document.createTextNode("Loading..."));
		 selectbox.appendChild(opt);
	}
	
	// add item to select element the less
	// elegant, but compatible way.
	function appendToSelect(select, value, content) {
		 var opt;
		 opt = document.createElement("option");
		 opt.value = value;
		 opt.appendChild(content);
		 select.appendChild(opt);
	}
	
	// fill Topics select list with items from
	// the current XML document
	function buildTopicList() {
		 var select = document.getElementById(destField);
		 try{
		 while (select.length > 0) {
			  select.remove(0);
		 }		
		 }
		 catch(err){}
	 
		 var items = req.responseXML.getElementsByTagName("model");
		 // loop through <item> elements, and add each nested
		 // <title> element to Topics select element
		 for (var i = 0; i < items.length; i++) {
			  appendToSelect(select,getElementTextNS("", "id", items[i], 0),document.createTextNode(getElementTextNS("", "name", items[i], 0)));
		 }
	}	
// -->