var numSeries = 2;
var seriesInChart = Array(0,0);
var timeSeries = new Array(2);
timeSeries[0] = new Array("outlays",11,"Total federal outlays",0,'',0,'',0,'',0,'');
timeSeries[1] = new Array("receipts",31,"Total federal receipts",0,'',0,'',0,'',0,'');

//copyXMLToDOM takes an XML object and recursively copies all child nodes (and associated attributes) to a
//given DOM object. It does not copy the root level node or any associated attributes to the DOM object -- if necessary,
//that will need to be done by the calling function.
function copyXMLToDOM (XMLObject,DOMObject) {
	var i;
	var j;
	var notWhitespace = /\S/;
	
	for (i=0;i<XMLObject.childNodes.length;i++) {
		var sourceNode = XMLObject.childNodes[i];
		if (sourceNode.nodeType != 3) {
			var destinationNode = document.createElement(sourceNode.nodeName);
			for (j=0;j<sourceNode.attributes.length;j++) {
				destinationNode.setAttribute(sourceNode.attributes[j].nodeName,sourceNode.attributes[j].value);
			}
			if(sourceNode.childNodes.length > 0) {
				copyXMLToDOM (sourceNode,destinationNode);
			}
			DOMObject.appendChild(destinationNode);
		} else if (notWhitespace.test(sourceNode.nodeValue)) {
			var newTextNode = document.createTextNode(sourceNode.nodeValue);
			DOMObject.appendChild(newTextNode);
		}
	}
}

function convertStringToXMLDOMObject (string) {
	if (window.DOMParser) {
		parser=new DOMParser();
		xmlDoc=parser.parseFromString(string,"text/xml");
	}
	else // Internet Explorer
	{
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.loadXML(string); 
	}
	
	return xmlDoc;
}

function convertXMLObjectToChartString (myData) {
	//	var string = (new XMLSerializer()).serializeToString(myData);
	
	var i;
	var string = "<" + myData.nodeName;
	
	for (i=0;i<myData.attributes.length;i++) {
		if (myData.attributes[i].nodeName != 'id' && myData.attributes[i].nodeName != 'showInChart' && myData.attributes[i].nodeName != 'seriesMax' && myData.attributes[i].nodeName != 'seriesMin') {
			string += " " + myData.attributes[i].nodeName + "='" + myData.attributes[i].value.replace(/'/g, "&apos;") + "'";
		}
	}
	
	if (myData.childNodes.length > 0) {
		string += ">";
		for (i=0;i<myData.childNodes.length;i++) {
			if (myData.childNodes[i].getAttribute('showInChart') != '0') {
				string += convertXMLObjectToChartString(myData.childNodes[i]);
			}
		}
		string += "</" + myData.nodeName + ">";
	} else {
		string += "/>";
	}
	
	return string;
}

function convertXMLDOMObjectToString (myData) {
	//	var string = (new XMLSerializer()).serializeToString(myData);
	
	var i;
	var string = "<" + myData.nodeName;
	
	for (i=0;i<myData.attributes.length;i++) {
		string += " " + myData.attributes[i].nodeName + "='" + myData.attributes[i].value + "'";
	}
	
	if (myData.childNodes.length > 0) {
		string += ">";
		for (i=0;i<myData.childNodes.length;i++) {
			string += convertXMLDOMObjectToString(myData.childNodes[i]);
		}
		string += "</" + myData.nodeName + ">";
	} else {
		string += "/>";
	}
	
	return string;
}

function removeAllChildren(XMLObject) {
	while (XMLObject.childNodes.length > 0) {
		XMLObject.removeChild(XMLObject.firstChild);
	}
}

function changeMenuSelection(myMenu,newValue) {
	var i;
	
	for (i=0;i<myMenu.options.length;i++) {
		if(myMenu.options[i].value == newValue) {
			myMenu.options[i].selected=true;
		} else {
			myMenu.options[i].selected=false;
		}
	}
}

function getSeriesLabel (itemNum) {
	var i;
	var label;
	
	switch (timeSeries[itemNum-1][0]) {
		case "outlays":
			label = "Outlays: ";
			break;
		case "budauth":
			label = "Budget authority: ";
			break;
		case "receipts":
			label = "Receipts: ";
			break;
	}
	i = timeSeries[itemNum-1].length-1;
	while (timeSeries[itemNum-1][i] == '') {
		i -= 2;
	}
	
	label += timeSeries[itemNum-1][i];
	
	return label;
}

function getSeriesLevel (itemNum) {
	var i = timeSeries[itemNum-1].length-1;

	while (timeSeries[itemNum-1][i] == '') {
		i -= 2;
	}
	
	return (i/2-1);
}

function getSeriesValue (itemNum, level, requestType) {
	switch (requestType) {
		case "value":
			return timeSeries[itemNum-1][1+2*level];
			break;
		case "label":
			return timeSeries[itemNum-1][2+2*level];
			break;
	}
}

function getTimeSeriesDbase (itemNum) {
	return timeSeries[itemNum-1][0];
}

function updateTimeSeriesDbase (itemNum,dbase) {
	timeSeries[itemNum-1][0] = dbase;
}

function updateTimeSeries (itemNum,level,value,label) {
	var i;
	
	timeSeries[itemNum-1][2*level+1] = value;
	timeSeries[itemNum-1][2*level+2] = label;
}

//clearItemSeriesData clears the timeSeries array for all values ofter the type indicated bye requestType.
function clearTimeSeriesData (itemNum, level) {
	var i;
	
	for (i=3+2*level;i<timeSeries[itemNum-1].length-1;i+=2) {
		timeSeries[itemNum-1][i] = 0;
		timeSeries[itemNum-1][i+1] = '';
	}
}

function deleteSubMenus (menuAreas, menuLevel) {
	var i;
	
	for (i=menuLevel+1;i<5;i++) {
		if (menuAreas[i].childNodes.length != 0) {
			while (menuAreas[i].childNodes[0]) {
				menuAreas[i].removeChild(menuAreas[i].childNodes[0]);
			}
		}
	}
}
	
function trimExtraNodes(myMenuTree) {
	var i;
	
	if (myMenuTree.childNodes.length == 1) {
		if (myMenuTree.firstChild.childNodes.length == 0) {
			myMenuTree.removeChild(myMenuTree.firstChild);
		}
	} else if (myMenuTree.childNodes.length == 2) {
		if (myMenuTree.firstChild.getAttribute('value') == 'all') {
			if (myMenuTree.childNodes[1].childNodes.length == 0) {
				myMenuTree.removeChild(myMenuTree.childNodes[1]);
			}
			myMenuTree.removeChild(myMenuTree.firstChild);
		}
	}
	
	var menuChildren = myMenuTree.childNodes;
	
	if (menuChildren.length > 0) {
		for (i=0; i<menuChildren.length; i++) {
			trimExtraNodes(menuChildren[i]);
		}
	}
}

function getMenuData (itemNum, level) {
	var i;
	
	var level1Menus = menuTree.firstChild.childNodes;
	
	switch (1.0*timeSeries[itemNum-1][1]) {
		case 12:
		case 22:
		case 33:
			var level1Menu = level1Menus[0];
			break;
		case 13:
		case 23:
			var level1Menu = level1Menus[1];
			break;
		case 32:
			var level1Menu = level1Menus[2];
			break;
	}
	if (level == 0) {
		return level1Menu;
	} else {
		for (i=0;i<level1Menu.childNodes.length;i++) {
			if (level1Menu.childNodes[i].getAttribute('value') == timeSeries[itemNum-1][3]) {
				var level2Menu = level1Menu.childNodes[i];
			}
		}
		if (level == 1) {
			return level2Menu;
		} else {
			for (i=0;i<level2Menu.childNodes.length;i++) {
				if (level2Menu.childNodes[i].getAttribute('value') == timeSeries[itemNum-1][5]) {
					var level3Menu = level2Menu.childNodes[i];
				}
			}
			if (level == 2) {
				return level3Menu;
			} else {
				for (i=0;i<level3Menu.childNodes.length;i++) {
					if (level3Menu.childNodes[i].getAttribute('value') == timeSeries[itemNum-1][7]) {
						var level4Menu = level3Menu.childNodes[i];
					}
				}
				if (level == 3) {
					return level4Menu;
				} else {
					return ("Error: too many levels");
				}
			}
		}
	}
}
