// Stores all the data the user has searched for during this visit, to save
// on server load.  c_data[district][grade][subject] = "a b c d e"
var c_data = new Array();
var c_district;
var c_grade;
var c_subject;
// c_chart[0] = average
// c_chart[1,2,3,4,5] = 0-100 with decimal, or x for null
var c_chart;

function initialize() {
	changeData();
}

function changeData() {
	
	updateLogic();
	
	//// See if the client already has the data ////
	if (clientAlreadyHasData()) {
		displayData();
	} else {
		getDataFromServer();
	}
	
}

function whenRequestReceived(req) {
	
	var data = readData(req.responseText);
	
	if (errorsInData(data)) {
		alert("error");
	} else {
		// No errors in data
		saveClientData(data);
		if (stillFocused(data)) {
			displayData();
		}
	}
	
}

function updateLogic() {
	c_district = document.getElementById("district").value;
	c_grade    = document.getElementById("grade").value;
	c_subject  = document.getElementById("subject").value;
}

function clientAlreadyHasData() {
	if (c_data == null) { return false; }
	if (c_data[c_district] == null) { return false; }
	if (c_data[c_district][c_grade] == null) { return false; }
	if (c_data[c_district][c_grade][c_subject] == null) { return false; }
	return true;
}


function getDataFromServer() {
	var url = "data.php"
	
	var query = new Array(); // An array of $_GET variables
	query.push("district="+c_district);
	query.push("grade="   +c_grade);
	query.push("subject=" +c_subject);
	if (query) { url += "?"+query.join("&"); }
	
	// Send request to server
	loadXMLDoc(url)
}

function readData(text) {
	var result = new Array();
	if (m = /d=(\d{1,3})/.exec(text)) { result['d'] = m[1]; }
	if (m = /g=(\d{1,2})/.exec(text)) { result['g'] = m[1]; }
	if (m = /s=(\d)/.exec(text)) { result['s'] = m[1]; }
	if (m = /1=(\d{1,3}(\.\d)?)/.exec(text)) { result['1'] = m[1]; }
	if (m = /4=(\d{1,3}(\.\d)?)/.exec(text)) { result['4'] = m[1]; }
	if (m = /5=(\d{1,3}(\.\d)?)/.exec(text)) { result['5'] = m[1]; }
	if (m = /6=(\d{1,3}(\.\d)?)/.exec(text)) { result['6'] = m[1]; }
	if (m = /7=(\d{1,3}(\.\d)?)/.exec(text)) { result['7'] = m[1]; }
	if (m = /9=(\d{1,3}(\.\d)?)/.exec(text)) { result['9'] = m[1]; }
	return result;
}

function errorsInData(data) {
	return (data["d"] == null || data["g"] == null || data["s"] == null);
}

function saveClientData(data) {
	if (c_data[data['d']] == null) { c_data[data['d']] = new Array(); }
	if (c_data[data['d']][data['g']] == null) { c_data[data['d']][data['g']] = new Array(); }
	if (c_data[data['d']][data['g']][data['s']] == null) { c_data[data['d']][data['g']][data['s']] = new Array(); }
	
	c_data[data["d"]][data["g"]][data["s"]][1] = data[1];
	c_data[data["d"]][data["g"]][data["s"]][4] = data[4];
	c_data[data["d"]][data["g"]][data["s"]][5] = data[5];
	c_data[data["d"]][data["g"]][data["s"]][6] = data[6];
	c_data[data["d"]][data["g"]][data["s"]][7] = data[7];
	c_data[data["d"]][data["g"]][data["s"]][9] = data[9];
}

function stillFocused(data) {
	return (data['d'] == c_district) && (data['g'] == c_grade) && (data['s'] == c_subject);
}

function displayData() {
	var result = '<!-- This table is generated with JavaScript -->'+"\n";
    if (c_data[c_district][c_grade][c_subject][1]) {
		result += '<table class="vt_data">'+"\n";
		result += '  <tr><td width="30"><div style="background-color: #CCFFFF;">&nbsp;</div></td><td>'+c_data[c_district][c_grade][c_subject][1]+'</td><td>School Average</td></tr>'+"\n";
		if (c_data[c_district][c_grade][c_subject][4]) { result += '  <tr><td><div style="background-color: #0000FF;">&nbsp;</div></td><td>'+c_data[c_district][c_grade][c_subject][4]+'</td><td>American Indian</td></tr>'+"\n"; }
		if (c_data[c_district][c_grade][c_subject][5]) { result += '  <tr><td><div style="background-color: #00FF00;">&nbsp;</div></td><td>'+c_data[c_district][c_grade][c_subject][5]+'</td><td>Asian</td></tr>'+"\n"; }
		if (c_data[c_district][c_grade][c_subject][6]) { result += '  <tr><td><div style="background-color: #CCCC00;">&nbsp;</div></td><td>'+c_data[c_district][c_grade][c_subject][6]+'</td><td>Black</td></tr>'+"\n"; }
		if (c_data[c_district][c_grade][c_subject][7]) { result += '  <tr><td><div style="background-color: #FF0000;">&nbsp;</div></td><td>'+c_data[c_district][c_grade][c_subject][7]+'</td><td>Hispanic</td></tr>'+"\n"; }
		if (c_data[c_district][c_grade][c_subject][9]) { result += '  <tr><td><div style="background-color: #CC00CC;">&nbsp;</div></td><td>'+c_data[c_district][c_grade][c_subject][9]+'</td><td>White</td></tr>'+"\n"; }
	
		result += '</table>'+"\n";
	} else {
		result += "No data for this category.";
	}
	document.getElementById("ajax_table").innerHTML = result;
	
	myDrawFunction()
}

/////////////////////////////// Graphics ///////////////////////////////

			var jg;
			var chart_offset_w;
			var chart_offset_h;
			var chart_height;
			var chart_width;
			
			var chart_s;
			var chart_w;
			var chart_n;
			var chart_e;
			
			var bar_width;
			
			function myDrawFunction() {
			  chart_offset_w = 0;
			  chart_offset_h = 0;
			  chart_height = parseInt(document.getElementById('barchart').style.height);
			  chart_width = parseInt(document.getElementById('barchart').style.width);
			  chart_s = chart_offset_h+chart_height;
			  chart_w = chart_offset_w;
			  chart_n = chart_offset_h;
			  chart_e = chart_offset_w+chart_width;
			  bar_width = chart_width/7;
			  
			  jg.clear();
			  if (c_data[c_district][c_grade][c_subject][1]) {
				  drawAverage(c_data[c_district][c_grade][c_subject][1]);
				  drawChart();
				  if (c_data[c_district][c_grade][c_subject][4]) {
					  drawBar(1, c_data[c_district][c_grade][c_subject][4]);
				  }
				  if (c_data[c_district][c_grade][c_subject][5]) {
					  drawBar(2, c_data[c_district][c_grade][c_subject][5]);
				  }
				  if (c_data[c_district][c_grade][c_subject][6]) {
					  drawBar(3, c_data[c_district][c_grade][c_subject][6]);
				  }
				  if (c_data[c_district][c_grade][c_subject][7]) {
					  drawBar(4, c_data[c_district][c_grade][c_subject][7]);
				  }
				  if (c_data[c_district][c_grade][c_subject][9]) {
					  drawBar(5, c_data[c_district][c_grade][c_subject][9]);
				  }
			  }
			  
			  jg.paint();
			  return;
			}
			function drawChart() {
			  for (var i=1; i<=10; i++) {
			    jg.setColor("#cccccc");
			    jg.drawLine(chart_w, chart_s-(i*chart_height/10), chart_e, chart_s-(i*chart_height/10));
			  }
			  jg.setColor("#000000"); // black
			  jg.drawLine(chart_w, chart_s, chart_e, chart_s);
			  jg.drawLine(chart_w, chart_s, chart_w, chart_n);
			  for (var i=1; i<=10; i++) {
			    jg.drawLine(chart_w, chart_s-(i*chart_height/10), chart_w+(0.25*bar_width), chart_s-(i*chart_height/10));
			  }
			  for (var i=1; i<=2; i++) {
			    jg.drawLine(chart_w, chart_s-(i*chart_height/2), chart_w+(0.5*bar_width), chart_s-(i*chart_height/2));
			  }
			}
			function drawAverage(height) {
			  var color = "#CCFFFF";
			  var my_height = chart_height * height / 100;
			  jg.setColor(color);
			  jg.fillRect(chart_w, chart_s-my_height, chart_width, my_height);
			}
			function drawBar(n, height) {
			  var color = "#CCCCCC";
			  var my_height = chart_height * height / 100;
			  switch(n) {
			    case 1:
			      color = "#0000FF";
			      break;
			    case 2:
			      color = "#00FF00";
			      break;
			    case 3:
			      color = "#CCCC00";
			      break;
			    case 4:
			      color = "#FF0000";
			      break;
			    case 5:
			      color = "#CC00CC";
			      break;
			  }
			  jg.setColor(color);
			  jg.fillRect(chart_w+(bar_width*n), chart_s-my_height, bar_width, my_height);
			}