// ========================================  INIT VARIABLES ========================================
	google.load("maps", "2");
	google.load("earth", "1");
	
	window.onload = init;
	window.onresize = resizeLayout;

	var kmlDB, kmlType, kmlTable, kmlCol;	// currently selected Database, Type(table category), Table, Column
	var kmlFile;	// KML file URL for currently selected table/settings
	var kmlFile_nw;	// ..same but added flag to return network link
	var kmlStyle = '3D'; // settings tab selected - type of KML to make
	var currentKml, currentKml3D, currentKmlUrl;	// currently loaded KML in preview maps (first 2 are Maps objects, currentKmlUrl is URL)
	var map;
	var geoXml;
	var ge;
	var previewdiv, previewdiv2;
	var table_list;
	var msgdiv, oldcol;
	var CIAlist, WRIlist, UNlist;	// cache of table lists
	var mapType; // 2D or 3D

// ========================================  LOAD FUNCTIONS ========================================
	function init() {
		if (location.hash) {	// load settings from hash URL
			kmlDB = (location.hash.match(/&db=(\w*)&/i)) ? location.hash.match(/&db=(\w*)&/i)[1] : 'ciafb';
			kmlTable = (location.hash.match(/&table=(.\w*)&/i)) ? location.hash.match(/&table=(.\w*)&/i)[1] : '';
			kmlCol = (location.hash.match(/&col=(.\w*)&/i)) ? location.hash.match(/&col=(.\w*)&/i)[1] : '';
			//alert(kmlDB+' '+kmlTable+' '+kmlCol);
			pickDB(kmlDB,'find',kmlTable,kmlCol);
			//alert(kmlDB+' '+kmlTable+' '+kmlCol);
		} else {
			pickDB('ciafb');	// no hash url - load default settings
		}
		initialize_map();
		resizeLayout();
		switchTab(2,'3D');
		setupColors();
		pickColset(document.getElementById('colpickframe3D'),1);
		pickColset(document.getElementById('colpickframe2D'),1);
		pickColset(document.getElementById('colpickframe3Dneg'),1);
		pickColset(document.getElementById('colpickframe2Dneg'),1);
		validateLoginCookie('switchToMyData');
		document.getElementById('file_upload_form').onsubmit=uploadDo;
		document.getElementById("upload_target").onload = uploadDone;
		if (navigator.appName == "Microsoft Internet Explorer") {
			document.getElementById("message").innerHTML = "<a class='grey right' href='javascript:hidemessage()'>X</a> You appear to be using Internet Explorer. This application works best in modern web browsers like <a target='_blank' href='http://www.mozilla.com/en-US/firefox/'>Firefox</a> or <a target='_blank' href='http://www.google.com/chrome'>Google Chrome</a>.";
			document.getElementById("message").style.display = "block";
		}
		window.onunload = GUnload;
	}
	
	function resizeLayout() {
		var winheight = (document.all) ? document.body.offsetHeight : window.innerHeight;
		var winwidth = (document.all) ? document.body.offsetWidth : window.innerWidth;
		var mainheight = winheight - document.getElementById("header").offsetHeight - document.getElementById("footer").offsetHeight - 0;
		if (navigator.appName == "Microsoft Internet Explorer") {
			var mapheight = mainheight - document.getElementById("about_data_outer").offsetHeight - 80;
		} else {
			var mapheight = mainheight - document.getElementById("about_data_outer").offsetHeight - 50;
		}
		document.getElementById("main").style.height = mainheight + "px";
		document.getElementById("table_list").style.height = mainheight - document.getElementById("db").offsetHeight - document.getElementById("table_types").offsetHeight - document.getElementById("col_list").offsetHeight - 12 + "px";
		document.getElementById("map_canvas_outer").style.height = mapheight + "px";
		document.getElementById("map_canvas_outer").style.width = winwidth - document.getElementById("table_list").offsetWidth - document.getElementById("settings").offsetWidth - 28 + "px";
		if (navigator.appName == "Microsoft Internet Explorer") {
			document.getElementById("about_data_outer").style.width = winwidth - document.getElementById("table_list").offsetWidth - 4 + "px";
			document.getElementById("settings").style.height = mainheight - document.getElementById("about_data_outer").offsetHeight + "px";
			document.getElementById("tabledescr").style.width = document.getElementById("about_data_outer").offsetWidth - 446 + "px";
		} else {
			document.getElementById("settings").style.height = mainheight - document.getElementById("about_data_outer").offsetHeight - 2 + "px";
			document.getElementById("tabledescr").style.width = document.getElementById("about_data_outer").offsetWidth - 426 + "px";
		}
		if (mapType == '2D') {
			if (mapheight > 280) {
				map.removeControl(smallzoomcontrol);
				map.addControl(bigzoomcontrol);
			} else {
				map.addControl(smallzoomcontrol);
				map.removeControl(bigzoomcontrol);
			}
		} else {
			map.getEarthInstance(function (ge) {
				if (mapheight > 280) {
					ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);
				} else {
					ge.getNavigationControl().setVisibility(ge.VISIBILITY_HIDE);
				}
			});
		}
		map.checkResize();
	}

	function fullScreen(off) {
		if (off) {
			document.getElementById("selector").style.display = "block";
			document.getElementById("settings").style.display = "block";
			document.getElementById("about_data_outer").style.display = "block";
			document.getElementById("footer").style.display = "block";
			document.getElementById("mappr_top").style.display = "block";
			document.getElementById("main_right").style.left = "300px";
			document.getElementById("map_preview").style.left = "202px";
			document.getElementById("map_preview").style.bottom = "118px";
			document.getElementById("closeFullScreenBtn").style.display = "none";
		} else {
			document.getElementById("selector").style.display = "none";
			document.getElementById("settings").style.display = "none";
			document.getElementById("about_data_outer").style.display = "none";
			document.getElementById("footer").style.display = "none";
			document.getElementById("mappr_top").style.display = "none";
			document.getElementById("main_right").style.left = 0;
			document.getElementById("map_preview").style.left = 0;
			document.getElementById("map_preview").style.bottom = 0;
			document.getElementById("closeFullScreenBtn").style.display = "block";
			hidemessage();
		}
		window.setTimeout(resizeLayout,50);
	}
	
	function hidemessage() {document.getElementById("message").style.display = "none";}

// ========================================  SITE FUNCTIONS ========================================
	function setDB(db,type,table,col,updateAbout) {
		kmlDB = db;
		editTable('hide');
		document.getElementById('table_types').innerHTML = "<div class=\"tablelist bold\">Loading...</div>";
		document.getElementById('table_list').innerHTML = "<div class=\"tablelist bold\">Loading...</div>";
		document.getElementById('col_list').innerHTML = "<div class=\"tablelist bold\">Loading...</div>";
		if (kmlDB == 'my_data' && !loggedIn) {
			document.getElementById('table_types').innerHTML = "<div class=\"tablelist warn bold\">Please <a href='#' onclick='showLogin()'>sign in</a> or create an account using the link above to upload your own custom data-sets</div>";
			document.getElementById('table_list').innerHTML = "<div class=\"tablelist bold\"></div>";
			document.getElementById('col_list').innerHTML = "<div class=\"tablelist bold\"></div>";
			updateAboutData();
			return;
		}
		if (db == 'ciafb' && CIAlist) {
			setDBmakelist(CIAlist);
		} else if (db == 'wri' && WRIlist) {
			setDBmakelist(WRIlist);
		} else if (db == 'un' && UNlist) {
			setDBmakelist(UNlist);
		} else {
			var http = newHTTP();
			if (kmlDB == 'my_data') {
				var username = readCookie('username');
				http.open("GET", "./tablelist.php?db=user&user="+username);
			} else {
				http.open("GET", "./tablelist.php?db="+kmlDB);
			}
			http.onreadystatechange=function() {
				if (http.readyState == 4) {
					var data = JSONparse(http.responseText);
					setDBmakelist(data);
					if (db == 'ciafb') { CIAlist = data; }
					if (db == 'wri') { WRIlist = data; }
					if (db == 'un') { UNlist = data; }
				}
			}
			http.send(null);
		}
		function setDBmakelist(data) {
			if (data[0] == "") { //list is empty
				if (kmlDB == 'my_data') {
					document.getElementById('table_types').innerHTML = "<div class=\"tablelist bold\">No data uploaded yet. Please use the <a href='#' onclick='showUpload()'>Upload Data</a> link above to upload a CSV format file (comma separated file). For more help on uploading data please see the <a target='_blank' href='./about/'>Help &amp; About</a> pages.</div>";
				} else {
					document.getElementById('table_types').innerHTML = "<div class=\"tablelist warn bold\">No data found in this database.</div>";
				}
				document.getElementById('table_list').innerHTML = "";
				document.getElementById('col_list').innerHTML = "";
				updateAboutData();
			} else { // list is not empty
				table_list = data[1];
				var table_types = data[0];
				var table_typesHtml = '';
				for (var i = 0, ln = table_types.length; i<ln; i++) {
				   var item = table_types[i];
				   table_typesHtml = table_typesHtml + "<div class=\"tablelist bold\" onmousedown=\"setType(\'"+item+"\')\">"+item+"</div>";
				}
				document.getElementById('table_types').innerHTML = table_typesHtml;
				if (type == 'find') {
					for (var i = 0, j = 0, ln = table_list.length; i<ln; i++) {
						var item = table_list[i];
						if (item.tableid == table) {
							type = item.type;
						}
					}
				}
				if (type) {
					setType(type,table,col,updateAbout);
				} else {
					setType(table_types[0],table,col,updateAbout);
				}
			}
		}
	}

	function setType(type,table,col,updateAbout) {
		showDBlist('hide');
		kmlType = type;
		editTable('hide');
		var table_listHtml = '';
		var nodelist = document.getElementById('table_types').childNodes;
		for (var i = 0, ln = nodelist.length; i<ln; i++) {
			var item = nodelist[i];
			if (item.nodeName == 'DIV') {
				if (innerText(item) != kmlType) {
					item.style.backgroundColor = '';
				} else {
					item.style.backgroundColor = '#AACCFF';
				}
			}
		}
		for (var i = 0, j = 0, ln = table_list.length; i<ln; i++) {
			var item = table_list[i];
			if (item.type == kmlType) {
				var tablename = item.name.replace(/(.+?)(\(|:|( - ))(.*)/g, "<b>$1</b> $2$4");	// bold table name before "(" or ":" or " - "
				if (tablename.substr(0,3) != "<b>") { tablename = "<b>"+tablename+"</b>" }
				table_listHtml = table_listHtml + "<div id=\"table_"+item.tableid+"\" class=\"tablelist\" onmousedown=\"setTable(\'"+item.tableid+"\')\">"+tablename+"</div>";
				if (j == 0) {
					var firsttable = item.tableid;
				}
				j++;
			}
		}
		document.getElementById('table_list').innerHTML = table_listHtml;
		if (table != 'no') {
			if (table) {
				setTable(table,col,updateAbout);
			} else {
				setTable(firsttable,col,updateAbout);
			}
		} else {
			document.getElementById('col_list').innerHTML = "<div class=\"tablelist bold\"></div>";
		}
	}
	
	function setTable(table,col,updateAbout) {
		editTable('hide');
		showDBlist('hide');
		if (document.getElementById('table_'+kmlTable)) {
			document.getElementById('table_'+kmlTable).style.backgroundColor = ''; // remove style from currently selected
		}
		kmlTable = table;
		if (document.getElementById('table_'+kmlTable)) {
			document.getElementById('table_'+kmlTable).style.backgroundColor = '#AACCFF'; // set style on newly selected
		}
		getKmlUrl();
		updateCollist(kmlDB,kmlTable,col);
		if (updateAbout != 'no') {
			updateAboutData(kmlDB,kmlTable);
		}
		document.getElementById('PreviewData').style.fontWeight = 'bold';
	}
	
	function setCol(column) {
		showDBlist('hide');
		if (document.getElementById('col_'+oldcol)) {
			document.getElementById('col_'+oldcol).style.backgroundColor = '';
		}
		if (document.getElementById('col_'+column)) {
			document.getElementById('col_'+column).style.backgroundColor = '#AACCFF';
			kmlCol = innerText(document.getElementById('col_'+column));
		}
		oldcol = column;
		getKmlUrl();
	}
	
	function updateCollist(db,table,col) {
		document.getElementById('col_list').innerHTML = "<div class=\"tablelist bold\">Loading...</div>";	//xxxxxxxxxxxxxxxxx
		if (!table) { table = kmlTable; }
		var http = newHTTP();
		if (db == 'my_data' && loggedIn) {
			var username = readCookie('username');
			http.open("GET", "./collist.php?db=user&table="+table+"&user="+username);
		} else {
			http.open("GET", "./collist.php?db="+db+"&table="+table);
		}
		http.onreadystatechange=function() {
			if (http.readyState == 4) {
				var collist = JSONparse(http.responseText);
				var collistHtml = '';
				for (var i = 0, ln = collist.length; i<ln; i++) {
					collistHtml += "<div id=\"col_"+i+"\" class=\"tablelist\" onmousedown=\"setCol(\'"+i+"\')\">"+collist[i]+"</div>";
				}
				document.getElementById('col_list').innerHTML = collistHtml;
				if (col) {
					var nodelist = document.getElementById('col_list').childNodes;
					for (var i = 0, ln = nodelist.length; i<ln; i++) {
						var item = nodelist[i];
						if (item.nodeName == 'DIV') {
							if (innerText(item) == col) {
								setCol(i);
							}
						}
					}
				} else {
					setCol(0);
				}
			}
		}
		http.send(null);
	}

	function updateAboutData(db,table) {
		if (!db) {	// call with no param to blank
			document.getElementById('about_data').innerHTML = '';
			return;
		}
		document.getElementById('about_data').innerHTML = "<b>Loading...</b>";	//xxxxxxxxxxxxxxxxx
		if (!table) { table = kmlTable; }
		var http = newHTTP();
		if (db == 'my_data' && loggedIn) {
			var username = readCookie('username');
			http.open("GET", "./aboutdata.php?db=user&table="+table+"&user="+username);
		} else {
			http.open("GET", "./aboutdata.php?db="+db+"&table="+table);
		}
		http.onreadystatechange=function() {
			if (http.readyState == 4) {
				document.getElementById('about_data').innerHTML = '';
				if (http.responseText) {
					var tabledata = JSONparse(http.responseText);
					var aboutHtml = '';
					if (db == 'my_data') {
						aboutHtml += '<input class="button" type="button" value="Edit Details" onClick="editTable()"/>';
						if (kmlType != 'Trash') {
							aboutHtml += '<input class="button" type="button" value="Delete table" onClick="deleteTable(\''+db+'\',\''+table+'\')"/>';
						}
						aboutHtml += '<br/>';
						document.tabledata_form.tabletype.value = 'Other'; // update hidden table-details edit dialog
						document.tabledata_form.tabletype.value = kmlType; // update hidden table-details edit dialog
						document.tabledata_form.tablename.value = tabledata.name;
						document.tabledata_form.tabledescr.value = tabledata.description;
						document.tabledata_form.tablelink.value = tabledata.link;
						document.tabledata_form.tablelinkname.value = tabledata.linkname;
						document.tabledata_form.tablepublic.checked = (tabledata.public == '1') ? true : false;
					}
					aboutHtml += '<b>'+tabledata.name+'</b> '+tabledata.description.replace('\n','<br/>')+'<div class="small"><br/>';
					if (tabledata.link != "") {
						if (tabledata.link.indexOf('://') == -1 ) {
							tabledata.link = 'http://' + tabledata.link;
						}
						if (tabledata.linkname == '') {
							tabledata.linkname = tabledata.link;
						}
						aboutHtml += '<b>Download this dataset</b>: <a target="_blank" href="'+ tabledata.link +'">'+ tabledata.linkname +'</a>';
					}
					if (tabledata.license) {
						aboutHtml += ' &nbsp;  &nbsp; <span class="license">(data license: <a target="_blank" href="'+ tabledata.licenselink +'">'+ tabledata.license +'</a>)</span>';
					}
					if (tabledata.upload_time && (db == 'my_data' || db == 'user')) {
						aboutHtml += '<br/><br/><b>Uploaded:</b> '+tabledata.upload_time;
						if (tabledata.owner && db == 'user') {
							aboutHtml += ' <i>(by  <b>'+tabledata.owner+'</b>)</i>';
						}
					}
					aboutHtml += '</div>';
					document.getElementById('about_data').innerHTML = aboutHtml;
				}
			}
		}
		http.send(null);
	}

	function switchTab(tab,type) {
		showDBlist('hide');
		for (var n=1; n <= 3; n++) {
			if (n == tab) {
				document.getElementById('settings_tab'+n).style.display = 'block';
				document.getElementById('tab'+n).style.backgroundColor = '#6168AD';
				document.getElementById('tab'+n).style.backgroundPosition = '0 26px';
				//document.getElementById('tab'+n).style.fontWeight = 'bold';
			} else {
				document.getElementById('settings_tab'+n).style.display = 'none';
				document.getElementById('tab'+n).style.backgroundColor = '#3A3F6C';
				document.getElementById('tab'+n).style.backgroundPosition = '0 0';
				//document.getElementById('tab'+n).style.fontWeight = 'normal';
			}
		}
		kmlStyle = type;
		getKmlUrl();
	}
	
	function togglecheck(checkboxelem,idOn,idOff) {
		if (typeof(checkboxelem) == "string") {
			var checkboxelem = document.getElementById(checkboxelem);
			if (checkboxelem.checked) {
				checkboxelem.checked = false;
			} else {
				checkboxelem.checked = true;
			}
		}
		if (idOn) {
			if (checkboxelem.checked) {
				for (var i=0, ln=idOn.split(" ").length; i<ln; i++) {
					document.getElementById(idOn.split(" ")[i]).style.display = 'inline';
				}
				if (idOff) { document.getElementById(idOff).style.display = 'none'; }
			} else {
				for (var i=0, ln=idOn.split(" ").length; i<ln; i++) {
					document.getElementById(idOn.split(" ")[i]).style.display = 'none';
				}
				if (idOff) { document.getElementById(idOff).style.display = 'inline'; }
			}
		}
		getKmlUrl();
	}
	
	function pickDB(db,type,table,col) {
		if (!document.getElementById("db_"+db)) {
			db = 'ciafb';
		}
		document.getElementById("db").innerHTML = document.getElementById("db_"+db).innerHTML;
		showDBlist('hide');
		setDB(db,type,table,col)
	}
	
	function showDBlist(showhide) {
		if (showhide == 'hide' || (showhide != 'show' && document.getElementById('db_list').style.display == 'block')) {
			document.getElementById("db_list").style.display = 'none';
			document.getElementById("dbdropdown").style.backgroundPosition = '0 0';
		} else {
			document.getElementById("db_list").style.display = 'block';
			document.getElementById("dbdropdown").style.backgroundPosition = '0 40px';
		}
	}

// ========================================  EDIT TABLE ========================================
	function deleteTable(db,table) {
		if (table && db == 'my_data' && loggedIn) {
			var answer = confirm("Delete this table?");
			if (answer) {
				closepreview();
				var http = newHTTP();
				var username = readCookie('username');
				http.open("GET", "./tableupdate.php?db=user&table="+table+"&user="+username+"&public=0&type=Trash");
				http.onreadystatechange=function() {
					if (http.readyState == 4) {
						results = http.responseText.split('|');
						if (results[0] == 'true') {
							//setDB('my_data','Trash',table,'no'); // selects just deletde table in Trash
							setDB('my_data',kmlType,'no','no','no'); // refresh current view
							document.getElementById('about_data').innerHTML = '<b>The table has been deleted</b><br/>You can still find it in the Trash category under My Data to the left<br/>';
						} else {
							document.getElementById('about_data').innerHTML = '<b>Deleting table failed:</b><br/><span class="warning">'+results[1]+'</span>';
						}
					}
				}
				http.send(null);
			}
		}
	}

	function editTable(hide) {
		if (hide || kmlDB != 'my_data') {
			document.getElementById('about_data').style.display = 'block';
			document.getElementById('edit_tabledata').style.display = 'none';
		} else {
			document.getElementById('about_data').style.display = 'none';
			document.getElementById('edit_tabledata').style.display = 'block';
		}
	}
	
	function editTableSubmit(db,table) {
		if (table && db == 'my_data' && loggedIn) {
			var http = newHTTP();
			var username = readCookie('username');
			var newtype = escape(document.tabledata_form.tabletype.value);
			var newname = escape(document.tabledata_form.tablename.value);
			var newdescription = escape(document.tabledata_form.tabledescr.value);
			var newlink = escape(document.tabledata_form.tablelink.value);
			var newlinkname = escape(document.tabledata_form.tablelinkname.value);
			var newpublic = (document.tabledata_form.tablepublic.checked) ? '1' : '0';
			//alert("db=user&table="+table+"&user="+username+"&public="+newpublic+"&type="+newtype+"&name="+newname+"&link="+newlink+"&linkname="+newlinkname+"&description="+newdescription);
			http.open("GET", "./tableupdate.php?db=user&table="+table+"&user="+username+"&public="+newpublic+"&type="+newtype+"&name="+newname+"&link="+newlink+"&linkname="+newlinkname+"&description="+newdescription);
			http.onreadystatechange=function() {
				if (http.readyState == 4) {
					results = http.responseText.split('|');
					if (results[0] == 'true') { // success
						editTable('hide');
						setDB('my_data',newtype,kmlTable); // refresh current view
					} else { // failed
						document.getElementById('about_data').innerHTML = '<b>Submitting changes failed:</b><br/><span class="warning">'+results[1]+'</span>';
						editTable('hide');
					}
				}
			}
			http.send(null);
		}
	}

// ========================================  COLORS ========================================

	function setupColors(colpicker,destid) {
		var colsets = [];
		if (destid) {
			document.getElementById(destid).style.backgroundColor = "#"+colpicker.color;
			colsets[0] = colpicker.parentNode;
		} else {
			var colpickframelist = ['colpickframe2D', 'colpickframe2Dneg', 'colpickframe3D', 'colpickframe3Dneg'];
			for (var i=0, ln=colpickframelist.length; i<ln; i++) {
				elem = document.getElementById(colpickframelist[i]);
				if (elem) {
					colsets = colsets.concat(nodelist2array(elem.childNodes));
				}
			}
		}
		for (var i = 0, ln = colsets.length ; i < ln ; i++ ) {
			if (colsets[i].tagName == "DIV") {
				var colsetlist = colsets[i].getElementsByTagName("div");
				var l = colsetlist.length - 1;
				var endColor = getElemBgcolor(colsetlist[0]);
				var startColor = getElemBgcolor(colsetlist[l]);
				for ( var k = 0; k < l ; k++ ) {
					var red = Math.floor(endColor[0] * ((l - k) / l) + startColor[0] * (k / l));
					var green = Math.floor(endColor[1] * ((l - k) / l) + startColor[1] * (k / l));
					var blue = Math.floor(endColor[2] * ((l - k) / l) + startColor[2] * (k / l));
					colsetlist[k].style.backgroundColor = "rgb("+red+","+green+","+blue+")";
				}
			}
		}
	}

	function getElemBgcolor(elem) {	// returns array: [red, green, blue] in decimal 0-255
		var bgcolor = elem.style.backgroundColor; // can be either in format "#FF0000" (Opera) or "rgb(255, 0, 0)"  (Firefox/Chrome/IE)
		if (bgcolor.substr(0,4) == 'rgb(') {
			return bgcolor.replace(/rgb\(|\)/g, "").split(",");
		} else {
			return [h2d(bgcolor.substr(1,2)), h2d(bgcolor.substr(3,2)), h2d(bgcolor.substr(5,2))];
		}
	}
	
	function getColors(id) {	// returns array [startcolor, endcolor] in hex 
		var colsets = document.getElementById(id).childNodes;
		for (var i = 0, ln = colsets.length ; i<ln ; i++) {
			if (colsets[i].tagName == "DIV") {
				if (colsets[i].getElementsByTagName("input")[0].checked) {
					var colsetlist = colsets[i].getElementsByTagName("div");
					var l = colsetlist.length - 1;
					var endColor = getElemBgcolor(colsetlist[0]);
					var startColor = getElemBgcolor(colsetlist[l]);
					return [d2h(startColor[0])+d2h(startColor[1])+d2h(startColor[2]), d2h(endColor[0])+d2h(endColor[1])+d2h(endColor[2])];
				}
			}
		}
	}

	function pickColset(elem,colsetnr) {		// selects a color set - first param is DIV containing the list of DIV's that make up the colset list
		var colsets = elem.childNodes;
		for (var i = 0, j = 0, ln = colsets.length ; i<ln; i++) {
			if (colsets[i].tagName == "DIV") {
				j++;
				if (colsetnr != j) {
					colsets[i].style.backgroundColor = '#FFFFFF';
					colsets[i].style.borderColor = '#FFFFFF';
				} else {
					colsets[i].style.backgroundColor = '#EEEEEE';
					colsets[i].style.borderColor = '#B0B0B0';
					var subelem = colsets[i].childNodes;
					for ( var k = 0, ll = subelem.length ; k < ll; k++ ) {
						if (subelem[k].tagName == "INPUT") {
							subelem[k].checked = true;
						}
					}
				}
			}
		}
		getKmlUrl();
	}
	
	function hideColPicker() {
		if (jscolor.picker.owner) {
			jscolor.picker.owner.hidePicker();
		}
	}
	
// ========================================  GENERIC FUNCTIONS ========================================
	function d2h(d) {return String("0" + parseInt(d).toString(16)).slice(-2).toUpperCase();}
	function h2d(h) {return parseInt(h,16);}
	function nodelist2array(nodelist) {var ar = []; for (var i=0, ln = nodelist.length; i < ln; i++) {ar.push(nodelist[i]);} return ar;}
	function innerText(node) {if (navigator.appName == "Microsoft Internet Explorer") { return node.innerText; } else { return node.textContent;}}
	function newHTTP() {if (navigator.appName == "Microsoft Internet Explorer") { return new ActiveXObject("Microsoft.XMLHTTP"); } else { return new XMLHttpRequest();}}
	//function enterSubmit(src,e) {var key; if (window.event) key = window.event.key; else if (e) key = e.which; else return true; if (key == 13) { src.form.submit(); return false; } else return true;} // onKeyPress="return enterSubmit(this,event)
	function enterSubmit(src,e) {var key; if (window.event) key = window.event.keyCode; else if (e) key = e.which; else return true; if (key == 13) { validateLogin(); return false; } else return true;} // onKeyPress="enterSubmit(this,event)
	function deleteCookie(name) {var d = new Date(); document.cookie = name + "=''; expires=" + d.toGMTString() + "; path=/"}
	function setCookie(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}
	function readCookie(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	}
	function JSONparse(jsonstr) {if (typeof JSON != 'undefined') {return JSON.parse(jsonstr)}else{return jsonParse(jsonstr)}} // use native JSON for firefox 3.1+, otherwise json_sans_eval.js

	// json_sans_eval_min.js
	var jsonParse=(function(){var number='(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)';var oneChar='(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]'+'|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';var string='(?:\"'+oneChar+'*\")';var jsonToken=new RegExp('(?:false|true|null|[\\{\\}\\[\\]]'+'|'+number+'|'+string+')','g');var escapeSequence=new RegExp('\\\\(?:([^u])|u(.{4}))','g');var escapes={'"':'"','/':'/','\\':'\\','b':'\b','f':'\f','n':'\n','r':'\r','t':'\t'};function unescapeOne(_,ch,hex){return ch?escapes[ch]:String.fromCharCode(parseInt(hex,16));};var EMPTY_STRING=new String('');var SLASH='\\';var firstTokenCtors={'{':Object,'[':Array};return function(json){var toks=json.match(jsonToken);var result;var tok=toks[0];if('{'===tok){result={};}else if('['===tok){result=[];}else{throw new Error(tok);};var key;var stack=[result];for(var i=1,n=toks.length;i<n;++i){tok=toks[i];var cont;switch(tok.charCodeAt(0)){default:cont=stack[0];cont[key||cont.length]=+(tok);key=void 0;break;case 0x22:tok=tok.substring(1,tok.length-1);if(tok.indexOf(SLASH)!==-1){tok=tok.replace(escapeSequence,unescapeOne);};cont=stack[0];if(!key){if(cont instanceof Array){key=cont.length;}else{key=tok||EMPTY_STRING;break;}};cont[key]=tok;key=void 0;break;case 0x5b:cont=stack[0];stack.unshift(cont[key||cont.length]=[]);key=void 0;break;case 0x5d:stack.shift();break;case 0x66:cont=stack[0];cont[key||cont.length]=false;key=void 0;break;case 0x6e:cont=stack[0];cont[key||cont.length]=null;key=void 0;break;case 0x74:cont=stack[0];cont[key||cont.length]=true;key=void 0;break;case 0x7b:cont=stack[0];stack.unshift(cont[key||cont.length]={});key=void 0;break;case 0x7d:stack.shift();break;}};if(stack.length){throw new Error();};return result;};})();
	
// ========================================  KML functions ========================================
	function getKmlUrl() {
		kmlFile = './buildkml.php?';
		if (kmlStyle == "2D" || kmlStyle == "3D") {
			if (kmlStyle == "2D") { var srcform=document.tab2Dform; }
			if (kmlStyle == "3D") { var srcform=document.tab3Dform; }
			if (!srcform) {var srcform=document.tab3Dform;}
			var kmlMaxheigth = srcform.maxheight.value;
			var kmlOpacity = d2h(Math.round(srcform.opacity.value*2.55));
			var kmlLineopacity = d2h(Math.round(srcform.lineopacity.value*2.55));
			var kmlLinecolor = srcform.linecolor.value;
			var kmlLinehicolor = srcform.linehicolor.value;
			var kmlNegcutoff = (srcform.usecutoff.checked) ? srcform.negcutoff.value : "no";
			var kmlMakeplmark = (srcform.useplmark.checked) ? "1" : "0";
			var kmlPlmarkicon = srcform.plmark_icon.value;
			var kmlLabelsize = srcform.label_size.value;
			var kmlColor0 = srcform.zerocolor.value;
			var kmlColors = getColors('colpickframe'+kmlStyle);
			var kmlColors2 = getColors('colpickframe'+kmlStyle+'neg');
			kmlFile +=
				'&db='+kmlDB+
				'&table='+kmlTable+
				'&col='+kmlCol+
				'&type='+kmlStyle+
				'&maxh='+kmlMaxheigth+
				'&plmark='+kmlMakeplmark+
				'&labl='+kmlLabelsize+
				'&clsta='+kmlColors[0]+
				'&clend='+kmlColors[1]+
				'&clopa='+kmlOpacity+
				'&clln='+kmlLinecolor+
				'&cllnhi='+kmlLinehicolor+
				'&cllnopa='+kmlLineopacity+
				'&negcut='+kmlNegcutoff+
				'&cl0='+kmlColor0+
				'&cl2sta='+kmlColors2[1]+
				'&cl2end='+kmlColors2[0]+
				'&plico='+kmlPlmarkicon;
			if (srcform.advchkbox.checked) {
				if (kmlStyle == "3D") {
					var kmlFltLev = srcform.fltlev.value;
					kmlFile += '&fltlev='+kmlFltLev;
				}
				var kmlMapsComp = (srcform.mapscompat.checked) ? "1" : "0";
				var kmlImgBundl = (srcform.bundleimg.checked) ? "1" : "0";
				var kmlTimetag = (srcform.timetag.checked) ? "1" : "0";
				kmlFile += '&gmaps='+kmlMapsComp+'&imgkmz='+kmlImgBundl+'&timetag='+kmlTimetag;
			}
		}
		if (kmlStyle == "Chart" || kmlPlmarkicon == "chart") {
			srcform = document.tabChartform;
			var kmlChartSizeMin = srcform.chartSizeMin.value;
			var kmlChartSizeMax = (srcform.varchartsize.checked) ? srcform.chartSizeMax.value : "no";
			var kmlChart360 = srcform.chart360.value;
			var kmlChartcol0 = srcform.chartcol0.value;
			var kmlChartcol1 = srcform.chartcol1.value;
			var kmlDB3 		= srcform.chartSizeSrc.value.split('|')[0];
			var kmlTable3	= srcform.chartSizeSrc.value.split('|')[1];
			var kmlCol3		= srcform.chartSizeSrc.value.split('|')[2];
			if (kmlStyle == "Chart") { kmlFile += '&type=Chart'+'&plico=chart'+'&plmark=1'; } // '&db='+kmlDB+'&table='+kmlTable+'&col='+kmlCol+
			kmlFile +=
				'&db4='+kmlDB+
				'&table4='+kmlTable+
				'&col4='+kmlCol+
				'&chismax='+kmlChartSizeMax+
				'&chismin='+kmlChartSizeMin+
				'&chmax='+kmlChart360+
				'&clch0='+kmlChartcol0+
				'&clch1='+kmlChartcol1+
				'&db3='+kmlDB3+
				'&table3='+kmlTable3+
				'&col3='+kmlCol3;
			if (srcform.advchkbox.checked) {
				var kmlMapsComp = (srcform.mapscompat.checked) ? "1" : "0";
				var kmlTimetag = (srcform.timetag.checked) ? "1" : "0";
				var kmlLabelsize = srcform.label_size.value;
				kmlFile += '&gmaps='+kmlMapsComp+'&imgkmz='+kmlImgBundl+'&labl='+kmlLabelsize+'&timetag='+kmlTimetag;
			}
		}
		location.hash = '&db='+kmlDB+'&table='+kmlTable+'&col='+kmlCol+'&';
		kmlFile_nw = kmlFile + '&nwlink=1';
		if (currentKmlUrl == kmlFile_nw) {
			document.getElementById('PreviewKml').style.fontWeight = 'normal';
		} else {
			document.getElementById('PreviewKml').style.fontWeight = 'bold';	// indicate update available
		}
	}

// ========================================  MAP FUNCTIONS ========================================	
	function initialize_map() {
		if (GBrowserIsCompatible()) {
			map = new google.maps.Map2(document.getElementById("map_canvas"), {backgroundColor:"#FFFFFF"}); // #99B3CC is water color  #F7FAFF is kmlfb bg
			map.enableContinuousZoom();
			map.enableScrollWheelZoom();
			bigzoomcontrol = new GLargeMapControl();
			smallzoomcontrol = new GSmallZoomControl();
			map.addControl(bigzoomcontrol);
			map.addMapType(G_SATELLITE_3D_MAP); //  G_NORMAL_MAP   G_SATELLITE_MAP   G_HYBRID_MAP   G_PHYSICAL_MAP   G_SATELLITE_3D_MAP
			map.addMapType(G_PHYSICAL_MAP);
			map.removeMapType(G_NORMAL_MAP);
			map.removeMapType(G_SATELLITE_MAP);
			map.removeMapType(G_HYBRID_MAP);
			map.addControl(new GMapTypeControl()); // GHierarchicalMapTypeControl, GMapTypeControl, GMenuMapTypeControl
			GEvent.addListener(map, "maptypechanged", mapTypeChange);
			if (google.earth.isInstalled() && google.earth.isSupported()) {
				map.setMapType(G_SATELLITE_3D_MAP);
			} else {
				map.setMapType(G_PHYSICAL_MAP);
				document.getElementById("message").innerHTML = "<a class='grey right' href='javascript:hidemessage()'>X</a> The <a href='javascript:map.setMapType(G_SATELLITE_3D_MAP)'>Google Earth Plugin</a> does not appear to be installed. To enable all functionality of this site please <a target='_blank' href='http://earth.google.com/plugin/'>download it from Google</a>.";
				document.getElementById("message").style.display = "block";
			}
			map.setCenter(new GLatLng(30, -10), 2);
		}
	} 
	
	function mapTypeChange() {
		closepreview();
		//alert(map.getCurrentMapType().getName()); //Earth //Terrain
		//alert(map.getCurrentMapType().getUrlArg()); //e //p
		document.getElementById('PreviewKml').style.fontWeight = 'bold';
		if (map.getCurrentMapType().getUrlArg() == 'e') {	// in 3D mode
			map.removeControl(bigzoomcontrol);
			map.removeControl(smallzoomcontrol);
			map.getEarthInstance(function (ge) {
				if (document.getElementById("map_canvas_outer").style.height > '280px') {
					ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);
				} else {
					ge.getNavigationControl().setVisibility(ge.VISIBILITY_HIDE);
				}
			});
			mapType = '3D';
		} else {	// in 2D mode
			if (document.getElementById("map_canvas_outer").style.height > '280px') {
				map.removeControl(smallzoomcontrol);
				map.addControl(bigzoomcontrol);
			} else {
				map.addControl(smallzoomcontrol);
				map.removeControl(bigzoomcontrol);
			}
			mapType = '2D';
		}
	}
	
	function showKml() {
		statusMsg();
		getKmlUrl();
		if (mapType == '2D') {
			oldKml = currentKml;
			currentKml = new GGeoXml('http://www.kmlfactbook.org/devx/'+kmlFile_nw);      // use domain prefix,..gemaps need access..can't test on localhost
			//map.clearOverlays();	// remove KML added in 2D Maps mode
			if (oldKml) {
				map.removeOverlay(oldKml);
			}
			map.addOverlay(currentKml);
			GEvent.addListener(currentKml, "load", statusMsgClose);
		} else {
			oldKml3D = currentKml3D;
			map.getEarthInstance(function (ge) {
				var http = newHTTP();
				http.open("GET", kmlFile_nw);	// don't use domain prefix..XmlHttp won't do
				http.onreadystatechange=function() {
					if (http.readyState == 4) {
						try {
							var kmlData = ge.parseKml(http.responseText);
							if (oldKml3D) {
								ge.getFeatures().removeChild(oldKml3D);		// remove KML added in 3D Earth mode
							}
							map.clearOverlays();	// remove KML added in 2D Maps mode
							currentKml3D = ge.getFeatures().appendChild(kmlData);
						} catch (ex) {
							alert('Error parsing KML!');
						}
						window.setTimeout(statusMsgClose,2000);		// kml is downloaded - give 2 seconds for  plugin to display before removing message..
					}
				}
				http.send(null);
			});
			/* map.getEarthInstance(function (ge) {		// NWLINK
				var link = ge.createLink('');
				link.setHref('http://www.tryse.net/kmlfactbook/'+kmlFile_nw);
				var networkLink = ge.createNetworkLink('');
				networkLink.setLink(link);
				map.clearOverlays(); // xxxxxxxxxxxxxx does not work on GE added item
				ge.getFeatures().appendChild(networkLink);
				statusMsgClose();
			}); */
			/* map.getEarthInstance(function (ge) {		// FETCH
				google.earth.fetchKml(ge, 'http://www.tryse.net/kmlfactbook/'+kmlFile_nw, kmlFetchDone);
				alert('http://www.tryse.net/kmlfactbook/'+kmlFile_nw);
			}); */
			/* var http = newHTTP();					// AJAX
			http.open("GET", 'http://www.tryse.net/kmlfactbook/'+kmlFile_nw);
			http.onreadystatechange=function() {
				if (http.readyState == 4) {
					map.clearOverlays();
					//try {
						alert(http.responseText);
						var kmlData = ge.parseKml(http.responseText);
						alert(kmlData);
						currentKml = ge.getFeatures().appendChild(kmlData);
					//} catch (ex) {
					//	alert('Error parsing KML!');
					//}
					window.setTimeout(statusMsgClose,2000);		// kml is downloaded - give 2 seconds for  plugin to display before removing message..
				}
			}
			http.send(null); */
		}
		currentKmlUrl = kmlFile_nw;
	}
	
	/*function kmlFetchDone(kmlObject) {	// fetch
		map.clearOverlays();
		if (kmlObject) {
			ge.getFeatures().appendChild(kmlObject);
		} else {
			alert('Error parsing KML!');
		}
		statusMsgClose();
	}*/

// ========================================  PREVIEW  ========================================

	function preview(notoggle) {
		if (previewdiv && !notoggle) {
			closepreview();
		} else {
			//if (map.getCurrentMapType().getName() == 'Earth' && (navigator.userAgent.split('/')[0] != 'Mozilla' || navigator.userAgent.indexOf('Chrome') != -1)) {
			if (mapType == '3D' && (navigator.userAgent.split('/')[0] != 'Mozilla' || navigator.userAgent.indexOf('Chrome') != -1)) {
				map.setMapType(G_PHYSICAL_MAP); 	// cannot display preview DIV on top of Earth plugin except in Firefox
			}
			document.getElementById('DataButton').style.fontWeight = 'bold';
			document.getElementById('DataButton').value = 'View Map';
			document.getElementById('PreviewKml').style.display = 'none';
			document.getElementById('PreviewData').style.display = 'inline';
			if (!previewdiv) {
				previewdiv = document.createElement('div');
				previewdiv.setAttribute('id','data_preview');
				previewdiv2 = document.createElement('div');
				previewdiv2.setAttribute('id','preview_inner');
				document.getElementById('map_canvas_outer').appendChild(previewdiv);
				previewdiv.appendChild(previewdiv2);
			}
			previewdiv2.innerHTML = 'Loading...';
			var http = newHTTP();
			if (kmlDB == 'my_data' && loggedIn) {
				var username = readCookie('username');
				http.open("GET", "./preview.php?db=user&table="+kmlTable+"&col="+kmlCol+"&user="+username);
			} else {
				http.open("GET", "./preview.php?&db="+kmlDB+"&table="+kmlTable+"&col="+kmlCol);
			}
			http.onreadystatechange=function() {
				if (http.readyState == 4) {
					var data = JSONparse(http.responseText);
					var newtable = '<table class="preview"><thead class="nosel"><tr><th>Rank</th><th onclick="sortTable(\'previewTableBody\', 1, true);">Region</th>';
					var colNum = 2;
					for (var col in data[0]) {	// get column headers
						if (col != 'cc' && col != 'country') {
							newtable += '<th onclick="sortTable(\'previewTableBody\', '+colNum+', true);">'+col+'</th>';
							colNum++;
						}
					}
					newtable += '</tr></thead><tbody id="previewTableBody">';
					var altrow;
					for (var row in data) {
						newtable = newtable+'<tr class="'+altrow+'"><td class="num">'+(parseFloat(row)+1)+'</td>';
						if ((data[row].cc == '' || data[row].cc == '-' || !data[row].cc) && kmlDB == 'my_data') {
							newtable = newtable+'<td class="warn">'+data[row].country+'</td>';
						} else {
							newtable = newtable+'<td>'+data[row].country+'</td>';
						}
						for (var col in data[row]) {
							if (col != 'cc' && col != 'country') {
								newtable = newtable+'<td class="num">'+data[row][col]+'</td>';
							}
						}
						newtable = newtable+'</tr>';
						altrow = (altrow) ? '' : 'alternateRow';
					}
					newtable += '</tbody></table>';
					previewdiv2.innerHTML = newtable;
				}
			}
			http.send(null);
			document.getElementById('PreviewData').style.fontWeight = 'normal';
		}
	}
	
	function closepreview() {
		document.getElementById('DataButton').value = 'View Data';
		if (previewdiv) {
			document.getElementById('PreviewKml').style.display = 'inline';
			document.getElementById('PreviewData').style.display = 'none';
			document.getElementById('map_canvas_outer').removeChild(previewdiv);
			document.getElementById('DataButton').style.fontWeight = 'normal';
			previewdiv = '';
		}
	}

// ========================================  STATUS MESSAGE ========================================

	function statusMsg(message) {
		if (!message) { message = 'Loading...'; }
		if (!msgdiv) {
			msgdiv = document.createElement('div');
			msgdiv.setAttribute('id','status_message');
			document.getElementById('map_canvas_outer').appendChild(msgdiv);
		}
		//msgdiv2 = document.createElement('div');
		//msgdiv2.setAttribute('id','status_message_inner');
		//msgdiv.appendChild(msgdiv2);
		msgdiv.innerHTML = message;
	}

	function statusMsgClose() {
		if (msgdiv) {
			document.getElementById('map_canvas_outer').removeChild(msgdiv);
			msgdiv = '';
		}
		document.getElementById('PreviewKml').style.fontWeight = 'normal';
	}

// ========================================  LOGIN ========================================

var loggedIn = false;
var seed = 0;
loginShown = false;

	function showLogin() {
		hideUpload();
		toggleLoginSignup('hide');
		if (loginShown) {
			hideLogin();
		} else {
			document.getElementById('login_window').style.display = 'block';
			getSeed();
			document.getElementById('login_message').innerHTML = 'Enter your username and password to log in.';
			loginShown = true;
			document.getElementById('username').focus();
		}
	}

	function hideLogin() {
		document.getElementById('login_window').style.display = 'none';
		loginShown = false;
	}

	function toggleLoginSignup(hide) {
		if (hide) {
			document.login_form.newuser.checked = false;
		}
		if (document.login_form.newuser.checked) {
			document.getElementById("login_window").style.height = '300px';
			document.getElementById("login_button").style.display = 'none';
			document.getElementById("signup_button").style.display = 'inline';
		} else {
			document.getElementById("login_window").style.height = '130px';
			document.getElementById("login_button").style.display = 'inline';
			document.getElementById("signup_button").style.display = 'none';
		}
	}
	
	function getSeed()  {	// getSeed method:  gets a seed from the server for this transaction
		if (!loggedIn && !seed) {		// only get a seed if we're not logged in and we don't already have one
			var http = newHTTP();
			http.open('GET', './login.php?task=getseed', true);
			http.onreadystatechange = function () {
				if (http.readyState == 4) {
					seed = http.responseText;
				}
			}
			http.send(null);
		}
	}

	function validateLogin() {	// validateLogin method: validates a login request
		document.getElementById('login_message').innerHTML = '&nbsp;';
		if (loggedIn) { return; }	// ignore request if we are already logged in
		var username = document.getElementById('username').value;		// get form elements 'username' and 'password'
		var password = document.getElementById('password').value;
		if (username != '' && password  != '') {		// ignore if either is empty
			var hash = hex_md5(hex_md5(password).toLowerCase() + seed);		// compute the hash of the hash of the password and the seed
			var http = newHTTP();
			http.open('GET', './login.php?task=checklogin&username='+username+'&hash='+hash, true);
			hash = '';
			http.onreadystatechange = function () {
				if (http.readyState == 4) {
					results = http.responseText.split('|');
					if (results[0] == 'true') {
						setCookie('username',username);
						loggedIn = true;
						hidemessage();
						document.getElementById('login_message').innerHTML = '&nbsp;';
						document.getElementById('logon_name').innerHTML = ': ' + username;
						username = document.getElementById('username').value = '';
						password = document.getElementById('password').value = '';
						document.getElementById('login_link').style.display = 'none';
						document.getElementById('logout_link').style.display = 'inline';
						document.getElementById('upload_link').style.display = 'inline';
						hideLogin();
						pickDB('my_data');
					} else {
						document.getElementById('login_message').innerHTML = '<span id="login_warning">'+results[1]+'</span>';
					}
				}
			}
			http.send(null);
		}
	}

	function validateLoginCookie(switchToMyData) {
		var session = readCookie('PHPSESSID');
		var username = readCookie('username');
		if (username && session) {		// ignore if either is empty
			var http = newHTTP();
			http.open('GET', './login.php?task=checklogin&username='+username+'&hash=r', true);
			http.onreadystatechange = function () {
				if (http.readyState == 4) {
					results = http.responseText.split('|');
					if (results[0] == 'true') {
						setCookie('username',username);
						loggedIn = true;
						hidemessage();
						document.getElementById('login_message').innerHTML = '&nbsp;';
						document.getElementById('logon_name').innerHTML = ': ' + username;
						username = document.getElementById('username').value = '';
						password = document.getElementById('password').value = '';
						document.getElementById('login_link').style.display = 'none';
						document.getElementById('logout_link').style.display = 'inline';
						document.getElementById('upload_link').style.display = 'inline';
						if (switchToMyData) {
							pickDB('my_data');
						}
					} else {
						logOut();
					}
				}
			}
			http.send(null);
		}
	}

	function logOut() {
		hideUpload();
		loggedIn = false;
		var username = readCookie('username');
		var http = newHTTP();
		http.open('GET', './login.php?task=logout&username='+username, true);
		http.onreadystatechange = function () { return 0; }
		http.send(null);
		seed = 0;
		username = document.getElementById('username').value = '';
		password = document.getElementById('password').value = '';
		document.getElementById('password2').value = '';
		document.getElementById('fullname').value = '';
		document.getElementById('emailaddr').value = '';
		deleteCookie('username');
		deleteCookie('PHPSESSID');
		document.getElementById('logon_name').innerHTML = '';
		document.getElementById('login_link').style.display = 'inline';
		document.getElementById('logout_link').style.display = 'none';
		document.getElementById('upload_link').style.display = 'none';
		if (kmlDB == 'my_data') {
			pickDB('ciafb');
		}
	}
	
	function validateSignup() {
		document.getElementById('login_message').innerHTML = '&nbsp;';
		if (loggedIn) { return; }	// ignore request if we are already logged in
		var username = document.getElementById('username').value;		// get form elements 'username' and 'password'
		var password = document.getElementById('password').value;
		var password2 = document.getElementById('password2').value;
		var emailaddr = document.getElementById('emailaddr').value;
		var fullname = document.getElementById('fullname').value;
		if (password != password2) {
			//document.getElementById('password2').value = '';
			document.getElementById('login_message').innerHTML = '<span id="login_warning">Passwords do not match</span>';
			return;
		}
		if (username != '' && password  != '') {		// ignore if either is empty
			var pwhash = hex_md5(password);		// compute the hash of the hash of the password and the seed
			var http = newHTTP();
			http.open('GET', './login.php?task=signup&username='+username+'&hash='+pwhash+'&email='+emailaddr+'&fullname='+fullname, true);
			pwhash = '';
			http.onreadystatechange = function () {
				if (http.readyState == 4) {
					results = http.responseText.split('|');
					if (results[0] == 'true') {
						setCookie('username',username);
						loggedIn = true;
						hidemessage();
						document.getElementById('login_message').innerHTML = 'New user account created successfully';
						document.getElementById('logon_name').innerHTML = ': ' + username;
						username = document.getElementById('username').value = '';
						password = document.getElementById('password').value = '';
						document.getElementById('login_link').style.display = 'none';
						document.getElementById('logout_link').style.display = 'inline';
						document.getElementById('upload_link').style.display = 'inline';
						toggleLoginSignup();
						hideLogin();
						pickDB('my_data');
						document.getElementById('login_message').innerHTML = '&nbsp;';
					} else {
						document.getElementById('login_message').innerHTML = '<span id="login_warning">'+results[1]+'</span>';
					}
				}
			}
			http.send(null);
		}
	}

// ========================================  UPLOAD ========================================

uploadShown = false;

	function showUpload() {
		hideLogin();
		if (uploadShown) {
			hideUpload();
		} else {
			document.getElementById('upload_window').style.display = 'block';
			document.getElementById('upload_error').style.display = 'none';
			uploadShown = true;
		}
	}
	
	function hideUpload() {
		document.getElementById('upload_window').style.display = 'none';
		document.getElementById('upload_error').style.display = 'none';
		uploadShown = false;
	}
	
	function uploadDo() {
		document.getElementById('file_upload_form').target = 'upload_target'; //'upload_target' is the name of the iframe
		document.getElementById('pre_upload').style.display = 'none';
		document.getElementById('uploading').style.display = 'block';
		document.getElementById('upload_error').style.display = 'none';
	}
	
	function uploadDone() {
		var ret = frames['upload_target'].document.getElementsByTagName("body")[0].innerHTML;
		if (ret.split("|")[0] != 'true') {	// no error
			hideUpload();
			document.getElementById('pre_upload').style.display = 'block';
			document.getElementById('uploading').style.display = 'none';
			setDB('my_data','newly_submitted');
			window.setTimeout(function () {editTable();preview('notoggle')},500);		// wait 0.5 sec to allow table list to update before showing preview and editing table
		} else {	// error
			document.getElementById('pre_upload').style.display = 'block';
			document.getElementById('uploading').style.display = 'none';
			document.getElementById('upload_error').innerHTML = ret.split("|")[1];
			document.getElementById('upload_error').style.display = 'block';
		}
	}
