var lists 		= new Array();
lists.sublists 	= new Array();

var xml;
var opera 	= (navigator.userAgent.toLowerCase().indexOf('opera') != -1);
var ie 		= (document.all && typeof(ActiveXObject) != "undefined" && !opera);
//var firefox = (navigator.userAgent.indexOf("Firefox") != -1);
//var mozilla = (document.implementation && document.implementation.createDocument);

function getSubList(elt)
{
	var code 	= elt.options[elt.selectedIndex].value;
	var text 	= elt.options[elt.selectedIndex].text;
	var subList	= lists.sublists[elt.name];
	
	// null out options in reverse order (bug work-around)
	for (var i = subList.options.length - 1; i >= 0; i--) subList.options[i] = null;

	if (code != "-1")
	{
	  	var xslQuery;
	  	var NodeList;
		var i=0;

		if (ie)
		{
			xslQuery = '//*[@value="' + code + '" and @desc="' + text + '"]';
			NodeList = xml.selectNodes(xslQuery);
		}
		else
		{
			NodeList = xml.getElementsByTagName(elt.id);

			while (  i < NodeList.length
				  && NodeList[i]  .getAttribute("value") != code
				  && NodeList[i].getAttribute("desc")  != text ) {i++}
		}
		fillList(subList, NodeList.item(i).childNodes);
	}

	//null out all sublists options
	subList = lists.sublists[subList.name];
	while ( typeof(subList) != "undefined" )
	{
		for (var i = subList.options.length - 1; i >= 0; i--) subList.options[i] = null;

		subList = lists.sublists[subList.name];
	}
}

function initLists()
{
	// Load XML
	if (ie)
	{
	  xml = new ActiveXObject("Microsoft.XMLDOM");
	  xml.async = false;
	  xml.loadXML(xmlString);
	}
	else
	{
		if (typeof(DOMParser) != "undefined")
		{
	  		xml = (new DOMParser()).parseFromString(xmlString, "text/xml");
	  	}
	  	else
	  	{
	  		if (opera)
	  			alert("Please upgrade to Opera 7.6.");
	  		else
	  			alert("Your browser does not implement the DOMParser Object.");

	  		return;
	  	}
	}

	var objIndexes 	= new function() { this.formIndex = 0; this.eltIndex = 0; };
	var list		= getNextList(objIndexes);

	while (list)
	{
		lists.push(list);

		if (lists.length > 1)
		{
			lists.sublists[lists[lists.length - 2].name] = list;
		}

		if ( (list = getNextList(objIndexes)) )
		{	
			//attach the event handler to the element
			lists[lists.length - 1].onchange = function() { getSubList(this); };
		}
	}

	//first time loading.  The sublists have not been populated yet.
	if (lists[1].options.length == 0) resetLists();
}

function getNextList( objIndexes )
{
	do
	{
		with(document.forms[objIndexes.formIndex])
		{
			while (objIndexes.eltIndex < length)
			{
				if (elements[objIndexes.eltIndex++].className == "saveHistory")
					return elements[objIndexes.eltIndex - 1 ];
			}
		}
	} while (++objIndexes.formIndex < document.forms.length);

	//no more lists
	return;
}

function resetLists()
{	
	if (lists.length == 0) return;

	var selIndex=0;
	
	if ( typeof(lists[0].form.defaultIndex) != "undefined" )
	{
		var di = parseInt(lists[0].form.defaultIndex.value);

	  	if (!isNaN(di) && di >= 0 && di < lists[0].options.length) selIndex = di;
	}

	lists[0].selectedIndex = selIndex;

	if(lists[0].fireEvent)
	{
		lists[0].fireEvent("onchange");
	}
	else if(lists[0].onchange)
	{
		lists[0].onchange();
	}
}

function fillList( listBox, NodeList )
{   
	listBox.options[0] = new Option("", "-1");

	for (var i = 0; i < NodeList.length; i++)
	{
		text = NodeList.item(i).getAttribute("desc");

		if (text == null || text.length == 0)
			text = NodeList.item(i).childNodes.item(0).nodeValue;

		listBox.options[listBox.options.length] = new Option(text, NodeList.item(i).getAttribute("value"));
	}
}