var win, countries, headers, data, table, arr, map, sources;

var ENDL = '\n';
function retrieveXMLDocument(url){
	var parser, xmldoc;
	if(window.ActiveXObject)
	{
		xmldoc = new ActiveXObject("Microsoft.XMLDOM");
		xmldoc.async="false";
		xmldoc.load(url);
		parser = new XMLParser();
		parser.parse(xmldoc.xml);
	}
	else
	{
		xmldoc = new XMLHttpRequest();
		xmldoc.open('GET', url, false);
		xmldoc.send(null);
		parser = new XMLParser();
		parser.parse(xmldoc.responseText)
	}
	return parser.doc;
}

function preload_sources(path){
	sources = {};
	var doc = retrieveXMLDocument(path);
	var ss = doc.getElementsByTagName('source');
	for(var i = 0; i < ss.length; i++){
		var s = ss.item(i);
		var id = s.getAttribute('id');
		var href = s.getAttribute('href');
		
		var txt = s.getFirstChild().getData();
		
		if(href){
			txt = '<a href="' + href + '" target="_blank">' + txt + '</a>';
		}
		sources[id] = txt;
	}
}

function addCountry(gac, name)
{
	var obj = new Object();
	obj.gac = gac;
	obj.name = name;
	countries[countries.length] = obj;
}

function removeCountry(gac)
{
	var arr = new Array();
	for(var i = 0; i < countries.length; i++)
	{
		var obj = countries[i];
		if(obj.gac != gac)
		{
			arr[arr.length] = obj;
		}
	}
	countries = arr;
}

function getCountryData(url)
{
	var doc = retrieveXMLDocument(url);
	var divs = doc.getElementsByTagName('div');
	var tbl = {};
	for(i = 0; i < divs.length; i++)
	{
		var div = divs.item(i);
		var id = div.getAttribute('id');
		var source = div.getAttribute('source');
		var val = div.getFirstChild().getData();
		tbl[id] = new Object();
		tbl[id].val = val;
		tbl[id].source = source;
	}
	return tbl;
}

function getCountryNames(url){
	countries = new Array();
	var doc = retrieveXMLDocument(url);
	var divs = doc.getElementsByTagName('div');
	for(i = 0; i < divs.length; i++)
	{
		var div = divs.item(i);
		var obj = new Object();
		obj.gac = div.getAttribute('id');
		obj.name = div.getFirstChild().getData();
		countries.push(obj);
	}
	countries.sort(sortByCountryName);
}

function sortByCountryName(a, b)
{
	var x = a.name.toLowerCase();
	var y = b.name.toLowerCase();
	return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

function addHeader(data_id, data_name){
	headers[data_id] = data_name;
}

function removeHeader(data_id){
	delete headers[data_id];
}

function restoreMap(){
	var hook = document.getElementById('hook');
	hook.removeChild(document.getElementById('linkhook'));
	hook.removeChild(document.getElementById('datatbl'));	
	
	var map = document.getElementById('worldmap');
	map.style.visibility = 'visible';
}

function appendError(str){
	var hook = document.getElementById('hook');
	var map = document.getElementById('worldmap');
	map.style.visibility = 'hidden';
	
	var msg = document.createElement('div');
	msg.id = 'datatbl';
	msg.style.color = 'red';
	msg.style.fontWeight = 'bold';
	msg.appendChild(document.createTextNode(str));
	
	hook.insertBefore(msg, map);
	
	var div = document.createElement('div');
	div.align = 'right';
	div.id = 'linkhook';
	
	var a = document.createElement('a');
	a.appendChild(document.createTextNode('Return to Previous Screen'));
	a.href = 'javascript:restoreMap()';
	
	div.appendChild(a);
	
	hook.insertBefore(div, msg);
}

function displayTable()
{
	var err = '';
	var len = 0;
	for(key in headers){ len++; }
	if(len == 0){
		err += 'No datasets have been selected for display. ';
	}
	
	if(countries.length == 0){
		err += 'No countries have been selected for display. ';
	}
	
	if(err){
		err += 'Please return to the map and complete your selections. ';
		appendError(err);
		return;
	}
	
	
	var hook = document.getElementById('hook');
	var map = document.getElementById('worldmap');
	map.style.visibility = 'hidden';

	var tbody = document.createElement('tbody');
	
	var tr = document.createElement('tr');
	var th = document.createElement('th');
	th.appendChild(document.createTextNode('Country'));
	tr.appendChild(th);
	
	var country_data = new Array();
	for(h in headers)
	{
		th = document.createElement('th');
		th.appendChild(document.createTextNode(headers[h]));
		tr.appendChild(th);
		country_data[country_data.length] = getCountryData(h);
	}

	tbody.appendChild(tr);
	
	var count = 0;
	
	// populate the table with data
	for(var c = 0; c < countries.length; c++)
	{
		var gac = countries[c].gac;
		
		// begin a new row
		tr = document.createElement('tr');
		if((count++ % 2) == 0) tr.className = 'gbg';
		
		th = document.createElement('th');
		th.innerHTML = countries[c].name;
		
		tr.appendChild(th);
		for(var i = 0; i < country_data.length; i++)
		{
			var td = document.createElement('td');
			var data = (!country_data[i][gac] || parseInt(country_data[i][gac].val) == 0) ? 'N/A' : commas(country_data[i][gac].val);
			var source = (!country_data[i][gac] || !country_data[i][gac].source ? 0 : country_data[i][gac].source); 
			
			var txt = document.createTextNode(data + ' ');
			
			var lnk = null;
			if(source)
			{
				lnk = document.createElement('a');
				lnk.href = '#';
				lnk.source = source;
				lnk.onclick = popup_source;
				lnk.appendChild(document.createTextNode('[source]'));
			} else {
				lnk = document.createTextNode(' ');
			}
			
			td.appendChild(txt);
			td.appendChild(lnk);
			tr.appendChild(td);
		}
		
		tbody.appendChild(tr);
	}
	
	var table = document.createElement('table');
	table.id = 'datatbl';
	table.border = '1';
	
	table.appendChild(tbody);
	
	hook.insertBefore(table, map);
	
	var div = document.createElement('div');
	div.align = 'right';
	div.id = 'linkhook';
	
	var a = document.createElement('a');
	a.appendChild(document.createTextNode('Return to Previous Screen'));
	a.href = 'javascript:restoreMap()';
	
	div.appendChild(a);
	
	hook.insertBefore(div, table);
}

function popup_source(){
	var txt = sources['source' + this.source];
	var win = window.open('','_blank','height=200px;width=80px;scrollbars=no;menubar=no;location=no;toolbar=no;titlebar=no');
	var doc = win.document;
	
	doc.write(txt);
	win.onblur = win.close;
	doc.close();
}

function commas(num){
	var str = "" + num;
	if(str.length < 4)
		return str;
	return commas(str.substring(0, str.length - 3)) + ',' + str.substring(str.length - 3);
}

function init(){
	headers = {};
	data = {};
	countries = new Array();
	// getCountryNames('data/countries.xml');
}

init();
