var Chart =
{
	attributes: [],
	initial: true,
	charted: false,
	Elements: {},
	sources: {},
	init: function()
	{
		Chart.currentChart = Util.getElementsByClass("selected")[0];
		Chart.Elements.areas = document.getElementById("area_menu").getElementsByTagName("input");
		Chart.setChart();
		Chart.setAreas();
		Chart.setFrequency();
		Chart.areaAJAX();
		Chart.sourceAJAX();
		
		var images = document.getElementsByTagName("img");
		for(var i = 0; i < images.length; i++) {
			Util.addEventListener("click", Chart.treeHandler, false, images[i]);
		}
		
		var nodes = Util.getElementsByClass("selection");
		for(var i = 0; i < nodes.length; i++) {
			Util.addEventListener("click", Chart.selectionHandler, false, nodes[i]);
		}
		
		for(var i=0; i<Chart.Elements.areas.length; i++) {
			Util.addEventListener("click", Chart.areaHandler, false, Chart.Elements.areas[i].parentNode);
		}
		
		var buttons = Util.getElementsByClass("button");
		for(var i = 0; i<buttons.length; i++) {
			Util.addEventListener("click", Chart.controlsClickHandler, false, buttons[i]);
			buttons[i]._menu = Util.getNextSibling(buttons[i]);
			buttons[i]._control = buttons[i].parentNode;
		}
		
		Util.addEventListener("click", Chart.exportData, false, document.getElementById("export"));
	},
	
	setChart: function()
	{
		Chart.attributes['chart'] = Chart.currentChart.id;
	},
	
	setFrequency: function()
	{
		Chart.attributes['freq'] = document.getElementById("frequency").value;
	},
	
	setAreas: function()
	{
		Chart.attributes['area'] = "";
		for(var i=0; i<Chart.Elements.areas.length; i++) {
			if(Chart.Elements.areas[i].checked && !Chart.Elements.areas[i].disabled)
				Chart.attributes['area'] += (Chart.attributes['area'] ? "," : "") + Chart.Elements.areas[i].value;
		}
	},
	
	setYears: function()
	{
		var selects = Util.getElementsByClass("sel_year");
		for(var i = 0; i < selects.length; i++)
			Chart.attributes[selects[i].name] = selects[i].value;
	},
	
	setWidth: function()
	{
		try{
			var menuWidth = document.getElementById("sidebar").offsetWidth;
			Chart.width = document.getElementById("wrapper").offsetWidth - menuWidth - 16;
		} catch(error) {
			Chart.width = "748";
		}
	},
	
	setURL: function(type)
	{
		var url = "";
		for(var key in Chart.attributes)
			url += key + "=" + Chart.attributes[key] + "&";
		if(type) {
			return url.substring(0,url.length-1) + "&type=" + type;
		} else {
			return escape(url.substring(0,url.length-1));
		}
	},
	
	renderChart: function()
	{
		if(!Chart.attributes['area']) {
			alert("Please choose at least one region using the button below.");
			Chart.charted = false;
			return;
		}
		document.getElementById("chart_menu").className = "invisible";
		document.getElementById("area_menu").className = "invisible";
		document.getElementById("chart_control").style.borderStyle = "outset";
		document.getElementById("area_control").style.borderStyle = "outset";
		Chart.setYears();
		Chart.setFrequency();
		Chart.setWidth();
		var url = "data.php?" + Chart.setURL() + "&type='chart'";
		
		var myChart = new FusionCharts("../fusioncharts/FCF_MSLine.swf", "myChartId", Chart.width, "500", "0", "1");
		myChart.setDataURL(url);
		myChart.render("chartdiv");
		Chart.charted = true;
		Chart.updateSource();
	},
	
	updateSource: function() {  
		if(!Chart.sources.source){
			setTimeout(Chart.updateSource, 500);
		} else {
			document.getElementById("source").innerHTML = "Data: " + Chart.sources.source[Chart.attributes['chart']];
			document.getElementById("info").innerHTML = Chart.sources.info[Chart.attributes['chart']];

		}
	},
		
	exportData: function(event){
		Chart.renderChart();
		if(Chart.charted) {
			var url = "data.php?" + Chart.setURL("data");
			window.open(url,'Download');
		}
//		Util.stopPropagation(event);
//		Util.preventDefault(event);
	},
	
	moreInfo: function(){
		alert(Chart.sources.info[Chart.attributes['chart']]);
	},
	
	selectionHandler: function(event)
	{
		Chart.currentChart.className = "selection";
		Chart.currentChart = this;
		Chart.currentChart.className = "selection selected";
		Chart.setChart();		//could really do away with this function call if not used elsewhere
		Chart.areaAJAX();
		document.getElementById("chart_menu").className = "invisible";
		document.getElementById("chart_control").style.borderStyle = "outset";
	},
	
	areaAJAX: function(){
		var XMLRequest = Util.newAJAX();
		var url = "criteria.php?" + Chart.setURL("area");
		XMLRequest.open("GET", url, true);
		XMLRequest.onreadystatechange = function() {
			if(XMLRequest.readyState == 4) {
				if(XMLRequest.status == 200 || XMLRequest.status == 304) {
					Chart.areaUpdate(XMLRequest.responseText);
				} else {
					alert("The server was unable to be contacted");
				}
			}
		};
		XMLRequest.send(null);
	},
	
	areaUpdate: function(json)
	{
		var availableAreaCount = 0;
		var areaStatus = eval('(' + json + ')');
		for(var i in areaStatus) {
			if(areaStatus[i])
				availableAreaCount++;
		}
/*can't use a for-in loop because IE chooses weird index names that don't work */  
		for(var i = 0; i < Chart.Elements.areas.length; i++) {
			if(areaStatus[Chart.Elements.areas[i].value]) {
				Chart.Elements.areas[i].removeAttribute("disabled");
				if(availableAreaCount == 1) {
					Chart.Elements.areas[i].checked = true;
				}
			} else {
				Chart.Elements.areas[i].disabled="disabled";
				Chart.Elements.areas[i].checked= false;
			}
		}
		Chart.setAreas();
		Chart.yearAJAX();
	},
/* still sends two of these when you click on a label*/	
	areaHandler: function(event){
		Chart.setAreas();
		Chart.yearAJAX();
		Util.stopPropagation(event);
	},
	
	yearAJAX: function(){
		var XMLRequest = Util.newAJAX();
		var URL = "criteria.php?" + Chart.setURL("year");
		XMLRequest.open("GET", URL, true);
		XMLRequest.onreadystatechange = function() {
			if(XMLRequest.readyState == 4) {
				if(XMLRequest.status == 200 || XMLRequest.status == 304) {
					Chart.yearUpdate(XMLRequest.responseText);
				} else {
					alert("The server was unable to be contacted");
				}
			}
		};
		XMLRequest.send(null);
	},
	
	yearUpdate: function(xml)
	{
		if(xml == "null") return;
		var criteria = document.getElementById("criteria");
		criteria.innerHTML = xml;
		if(Chart.initial) {
			Chart.renderChart();
			Chart.initial = false;
		}
/*
** 		var fields = criteria.getElementsByTagName("fieldset");
**		criteria.removeChild(fields[0]);
**		criteria.appendChild(xml.getElementsByTagName("fieldset")[0]);
**		criteria.replaceChild(xml.getElementsByTagName("fieldset")[0],fields[0]);
*/
	},
	
	controlsClickHandler: function(event) {
		if(this._menu.className == "") {
			this._menu.className = "invisible";
			this._control.style.borderStyle = "outset";
		} else {
			this._menu.className = "";
			this._control.style.borderStyle = "inset";
		}
		
		Util.stopPropagation(event);
	},
	
	sourceAJAX: function(){
		var XMLRequest = Util.newAJAX();
		var URL = "criteria.php?" + Chart.setURL("source");
		XMLRequest.open("GET", URL, true);
		XMLRequest.onreadystatechange = function() {
			if(XMLRequest.readyState == 4) {
				if(XMLRequest.status == 200 || XMLRequest.status == 304) {
					Chart.sources = eval('(' + XMLRequest.responseText + ')');
				} else {
					alert("The server was unable to be contacted");
				}
			}
		};
		XMLRequest.send(null);
	},
	
	treeHandler: function(event){
		var list = Util.getNextSibling(this);
		if(!list) {
			Util.stopPropagation(event);
			return;
		} else if(list.className == "invisible") {
			this.src = "../styles/minus.gif";
			this.alt = "collapse";
			list.className = "";
		} else {
			this.src = "../styles/plus.gif";
			this.alt = "expand";
			list.className = "invisible";
		}
		Util.stopPropagation(event);
	}
};







function test() {
	alert(Chart.sources[1]);
}

function testListener(){
	var str = "";
	for (var test in Chart.sources)
		str += test + ": " + Chart.sources[test] + "\n";
	alert(str);
}