metars = new Array();
function getUpdate() {
	var xmlhttp;
	if (window.XMLHttpRequest) {
 		xmlhttp=new XMLHttpRequest();
	} else {
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	xmlhttp.onreadystatechange=function()
	{
		if(xmlhttp.readyState==4 && xmlhttp.status==200)
		{
			xmlobj= xmlHelper(xmlhttp.responseXML);
			dateObj = new Date();
		//	date = (((((((((dateObj.getUTCFullYear() * 100) + dateObj.getUTCMonth() + 1) * 100) + dateObj.getUTCDate()) * 100) + dateObj.getUTCHours()) * 100) + dateObj.getUTCMinutes()) * 100) + dateObj.getUTCSeconds() +90;
		date = (((((((((dateObj.getFullYear() * 100) + dateObj.getMonth() + 1) * 100) + dateObj.getDate()) * 100) + dateObj.getHours()) * 100) + dateObj.getMinutes()) * 100) + dateObj.getSeconds() +90;
			if(xmlobj.tid.replace(" ",'') < date - 90) {
				document.getElementById("status").innerHTML = "<span class=\"paused\"><span class=\"bold\">( OFFLINE )</span> Exporter Not Responding - Data Rev." + xmlobj.tid.replace(" ",'') + "  Date=" + date + "</span>"  ;
			} else {
				if (xmlobj.lobby > 3)
				{
				document.getElementById("status").innerHTML = "<span class=\"green\"><span class=\"bold\">( ONLINE ) - Gamespy: CONNECTED (" + xmlobj.lobby + ")</span></span>";
				}else{
				document.getElementById("status").innerHTML = "<span class=\"green\"><span class=\"bold\">( ONLINE ) </span></span><span class=\"red\"><span class=\"bold\">- Gamespy: DISCONNECTED</span></span>";
				}
			}
			//update Tables
			updateTop(xmlobj);
			updateUserTables(xmlobj);
			updateChat(xmlhttp.responseXML);
		} else if(RegExp(/40[0-9]/).test(xmlhttp.status)) {
			document.getElementById("status").innerHTML = "<span class=\"paused\"><span class=\"bold\">( OFFLINE )</span> Unable to fetch update</span>";
		}
	}
	dateObj = new Date();
	date = (((((((((dateObj.getFullYear() * 100) + dateObj.getMonth() + 1) * 100) + dateObj.getDate()) * 100) + dateObj.getHours()) * 100) + dateObj.getMinutes()) * 100) + dateObj.getSeconds();
	xmlhttp.open("GET","./data.php?" + date,true);
	xmlhttp.send();
	gettotals(document.getElementById("fp"));
	gettotals(document.getElementById("controllers"));
	gettotals(document.getElementById("observers"));
	gettotals(document.getElementById("lobby"));
	gettotals(document.getElementById("copilot"));
	gettotals(document.getElementById("recent"));
}
//XML Handler
function xmlHelper(xml) {
	markers=xml.getElementsByTagName("markers")[0].getElementsByTagName("marker");
	xmlobj = new Object();
	for(i=0;i<markers.length;i++) {
		objobj = new Object();
		for(n=0;n<markers[i].attributes.length;n++) {
			objobj[markers[i].attributes[n].name] = markers[i].attributes[n].value;
		}
		objobj.length = n + 1;
		
		xmlUserDetail(objobj);
		xmlReasonForLeaving(objobj);
		atcPosition(objobj);
		xmlFlightPlanCleanup(objobj, markers);
		if(objobj.pau == 1)	{ objobj.idg = "<span class=\"paused\">(P)</span>   " + objobj.idg;}
		if(objobj.pot == 1) { objobj.tpt = "[" + objobj.amk + "]   " + objobj.typ + "   (" + objobj.tit + ")   " + objobj.act; }
		if(objobj.sta == "") { objobj.sta = "UN REG"; }
		
		objobj.epm = objobj.ker;
		objobj.lit = objobj.lit.match(/ [0-9]{2}:[0-9]{2}/);
		if(objobj.nlo < 6 ) { objobj.nlo = objobj.nlo + " NEW";}
//		objobj.idn = objobj.idn.replace( "( ? )","( CO-PILOT )");
		if(RegExp(/ft/i).test(objobj.alt)) { objobj.alt = Math.round((objobj.alt.replace("ft", '')/100)); objobj.alt = (objobj.alt * 100) + " ft" }
		objobj.alt = objobj.alt.replace( "FL", "FL ");
		objobj.ifr = objobj.ifr.replace( "---.--", "");
		objobj.tad = objobj.tad.replace( "deg to", "&deg; >> ");
		tadicao = objobj.tad.substr(objobj.tad.length -4, 4);
		objobj.tad = objobj.tad.substr(0, objobj.tad.length - 4);
		objobj.tad = objobj.tad + "<a href=\"http://www.aviationweather.gov/adds/metars/?station_ids=" + tadicao + "&std_trans=translated&chk_metars=on&hoursStr=most+recent+only&submitmet=Submit\">" + tadicao + "</a>";
		if(objobj.cm1 == "") { objobj.cm1 =  " (OFF) ";}
		
		xmlobj[i] = objobj;
	}
	xmlobj.started = xml.getElementsByTagName("markers")[0].getAttribute("sod");
	xmlobj.tid = xml.getElementsByTagName("markers")[0].getAttribute("tid");
	xmlobj.lobby = xml.getElementsByTagName("markers")[0].getAttribute("lobby");
	xmlobj.version = xml.getElementsByTagName("markers")[0].getAttribute("version");
	xmlobj.icao = xml.getElementsByTagName("markers")[0].getAttribute("mica");
	xmlobj.airport = xml.getElementsByTagName("markers")[0].getAttribute("mapt");
	xmlobj.alat = xml.getElementsByTagName("markers")[0].getAttribute("alat");
	xmlobj.alng = xml.getElementsByTagName("markers")[0].getAttribute("alng");
	xmlobj.length = i;
	return xmlobj;
}
function xmlReasonForLeaving(obj) {
	if(RegExp(/communications timeout/).test(obj.per)) {
		obj.per = obj.per.replace(/communications timeout/,"<span class=\"bold\">TIMEOUT:</span> (Your PC or Internet crashed or hung)");
	} else if(RegExp(/banned/).test(obj.per)) {
		obj.per = obj.per.replace(/banned/, "<span class=\"bold\">BANNED:</span>");
	}else if(RegExp(/ejected/).test(obj.per)) {
		obj.per = obj.per.replace(/ejected/, "<span class=\"bold\">EJECTED:</span>");
	}else if(RegExp(/Takeoff without Flightplan/).test(obj.per)) {
		obj.per = "<span class=\"bold\">Takeoff WITHOUT Flightplan</span>";
	} else {
		if(RegExp(/True/i).test(obj.per)) {
			obj.per = "<span class=\"bold\">	PLAYER ERROR: </span>" + obj.per;
		} else if(RegExp(/False/i).test(obj.per)) {
			obj.per = "<span class=\"bold\">	Player QUIT Session Normally: </span>" + obj.per;
		}
	}
	obj.per = obj.per.replace(/[a-z]{4,5},/i, "");
}
function atcPosition(obj) {
	if(obj.pot == 0 && obj.sog == 0) {
		obj.position = "UN-REG";
	} 
	obj.act = obj.act.replace("CD","....CD");
	obj.act = obj.act.replace("Gnd","...Gnd");
	obj.act = obj.act.replace("Twr","..Twr");
	obj.act = obj.act.replace("Apt",".Apt");
	obj.act = obj.act.replace("Dept",".Dept");
	obj.act = obj.act.replace("Obs","OBSERVER");
}
function xmlUserDetail(obj) {
	if(obj.lvl == "C") {
		var userdetail = obj.idg + "    Controller Admin ";//  -   Logged on for " + obj.lot;
	} else if(obj.lvl == "A") {
		var userdetail = obj.idg + "    Session Admin  ";// -   Logged on for " + obj.lot;
	} else if(obj.lvl == "G") {
		var userdetail = obj.idg + "    Host Admin  ";// -   Logged on for " + obj.lot;
	}else {
		userdetail = obj.idg + "    Player   ";//-   Logged on for " + obj.lot;
	}
	obj.userdet = userdetail;
	if(obj.sms > 0 && obj.sco == 1 ) {
		obj.idg = obj.idg + " <span class=\"blue bold\"> (F)</span>";
	}
	if(obj.sms > 0 && obj.sco == 0 ) {
		obj.idg = obj.idg + " <span class=\"blue bold\"> (_)</span>";
	}
	obj.idg = " " + obj.idg;
}
function xmlFlightPlanCleanup(obj, xml) {
	if(obj.sms == 2) {
		for(t=0;t<xml.length;t++) {
			if(obj.sna == xml[t].getAttribute("idg").replace("*", '')) {
					nofilter = true;
					obj.ffp = "Co-Pilot with: <span class=\"bold\">" + xml[t].getAttribute("idg") + "</span>  - Pilot must file flightplan.";
			}
		}
	}
	if(obj.sms == 1 || obj.sms == 0 ) {
		nofilter = false;
	}
	if(nofilter) {
	} else {
		obj.ffp = obj.ffp.replace(/\+[fp].((?![a-z|A-Z|0-9][|]).)/gi, '');
		
		obj.ffp = " " + obj.ffp;
		obj.ffp = obj.ffp.replace(/\|/g," | ");
		obj.ffp = obj.ffp.replace(/\//g, " | ");
		obj.ffp = obj.ffp.replace(/ /g, " ");
		obj.ffp = obj.ffp.replace(/\./g, " . ");
		obj.ffp = obj.ffp.replace(/,/g, " , ");
		obj.ffp = obj.ffp.replace(/-/g, " - ");
		obj.ffp = obj.ffp.replace(/_/g, " _ ");
		obj.ffp = obj.ffp.replace(/ /g, "  ");
		obj.ffp = obj.ffp.replace(/\>/g, "  ");
		obj.ffp = obj.ffp.replace(/&lt;/g, "  &lt;  ");
		obj.ffp = obj.ffp.replace(/&gt;/g, "  &gt;  ");
		obj.ffp = obj.ffp.replace(/&amp;/g, "  &amp;  ");
		
		obj.ffp = styleColorICAO(obj.ffp);
		
		obj.ffp = obj.ffp.replace(/\|/g, "<span class=\"fpdeeppink\" > | </span>");
		
		obj.ffp = obj.ffp.replace(/  /g, " ");
		obj.ffp = obj.ffp.replace(/  /g, " ");
		
		obj.ffp = obj.ffp.replace(/\. /g, ".");
		obj.ffp = obj.ffp.replace(/ \./g, ".");
		
		obj.ffp = obj.ffp.replace(/^\s+|\s+$/,"");
			
		if(RegExp(/VFR/).test(obj.ffp)) {
			spSQWK(obj);
			if((obj.tco < 1199 || obj.tco > 1300) && !RegExp(/0000|4000|4600|70004|7500|7600|7700|7777/).test(obj.tco)) { obj.tco = obj.tco + "&nbsp;<span class=\"paused\">(?)</span>"}
		} else if(RegExp(/IFR/).test(obj.ffp)) {
			spSQWK(obj);
			if((obj.tco > 1199 && obj.tco < 1299) && !RegExp(/0000|4000|4600|70004|7500|7600|7700|7777/).test(obj.tco) ) { obj.tco = obj.tco + "&nbsp;<span class=\"paused\">(?)</span>";}
		} else {
			if(obj.ffp == "") {
				if(obj.spd > 10) {	obj.ffp = "<span class=\"nofptaxi\">Taxi WITHOUT flightplan?</span>"	}
				if(obj.spd > 40) {	obj.ffp = "<span class=\"nofptakeoff\">Takeoff WITHOUT flightplan?</span>"	}
				spSQWK(obj);
			} else {
				obj.ffp = obj.ffp + "<span class=\"paused\">(DEFAULT TO VFR)</span>";
				spSQWK(obj);
			}
		}
		obj.ffp = obj.ffp.replace("VFR","<span class=\"fpvfrtext\">VFR</span>");
		obj.ffp = obj.ffp.replace("IFR","<span class=\"fpifrtext\">IFR</span>");
	}
}
function spSQWK(obj) {
		if(obj.tco == 0000) { obj.tco = obj.tco + "<br /> IDENT";}
		if(obj.tco == 4000) { obj.tco = obj.tco + "<br />MILITARY";}
		if(obj.tco == 4600) { obj.tco = obj.tco + "<br />AEROBAT";}
		if(obj.tco == 7004) { obj.tco = obj.tco + "<br />AEROBAT";}
		if(obj.tco == 7500) { obj.tco = obj.tco + "<br />HIJ";}
		if(obj.tco == 7600) { obj.tco = obj.tco + "<br />NO COM"; }
		if(obj.tco == 7700) { obj.tco = obj.tco + "<br />EMG"; }
		if(obj.tco == 7777) { obj.tco = obj.tco + "<br />MIL INT";}	
}
//INIT TABLES
function updateTop(xml) {
	date = new Date();
	document.getElementById("introl").innerHTML = "Welcome to the <a href=\"http://www.fs-mp.com/\">FS-MP FSX server</a> @ <span id=\"airport\">" + xml.icao + " (" + xml.airport + ")</span>" ;
	document.getElementById("ainfo").innerHTML = "<a href=\"http://www.runwayfinder.com/?loc=" + xml.icao + "\">VFR</a> - " +
												 "<a href=\"http://www.runwayfinder.com/?x=" + xml.alng + "&y=" + xml.alat + "&z=9&view=ifr\">IFR</a> - " +
												 "<a href=\"http://www.airnav.com/airport/" + xml.icao + "\">AIRPORT</a> - " +
												 "<span id=\"metarwrap\"><a href=\"http://www.aviationweather.gov/adds/metars/?station_ids=" + xml.icao + "&std_trans=translated&chk_metars=on&hoursStr=most+recent+only&submitmet=Submit\" title=\"" + metarRequest(xml.icao) + "\" >METAR</a></span>- " +
												 "<a href=\"http://flightaware.com/resources/airport/" + xml.icao + "/procedures\">PLATES</a>  " ;
	document.getElementById("lastupdate").innerHTML = "Last Update @ " + date;
	if (window.XMLHttpRequest) {
 		xmlhttp=new XMLHttpRequest();
	} else {
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	xmlhttp.onreadystatechange=function()
	{
		if(xmlhttp.readyState==4 && xmlhttp.status==200)
		{
			towrite = document.getElementById("watching")
			users = xmlhttp.responseXML.getElementsByTagName('users')[0].getElementsByTagName('user');
			output = " Watching including:</span> "
			punc = "";
			for(i=0;i<users.length;i++) {
				ip = users[i].getAttribute("ip");
				matched = 0;
				for(n=0;n<xml.length;n++)
				{
				if(xml[n].sta != "QUIT") {
					ip2 = xml[n].ipa;
					// Correct CDUMBER's xml IP for Local IPs 
					if(RegExp(/192.168.1./).test(ip2)){
						ip2 = "68.49.210.150";	
					}
					if(ip2 == ip) {
						matched++;
							output = output + punc + xml[n].idg;
							punc = ", ";
					}
				}
				}
				if(matched > 1) {
					watched = users.length + (matched - 1);
				} else {
					watched = users.length;
				}
			}
			output = "<span class=bold>" + watched + output;
			towrite.innerHTML = output;
		}
	}
	dateObj = new Date();
	date = (((((((((dateObj.getFullYear() * 100) + dateObj.getMonth() + 1) * 100) + dateObj.getDate()) * 100) + dateObj.getHours()) * 100) + dateObj.getMinutes()) * 100) + dateObj.getSeconds();
	xmlhttp.open("GET","./users.php?" + date,true);
	xmlhttp.send();
}
function updateUserTables(xml) {
	//import tables
	fptable = document.getElementById("fp");
	cttable = document.getElementById("controllers");
	obtable = document.getElementById("observers");
	lotable = document.getElementById("lobby");
	cotable = document.getElementById("copilot");
	retable = document.getElementById("recent");
	
	plength = 0;
	
	for(i=0;i<xml.length;i++) {
		if(xml[i].sta == "QUIT") {
			refreshRE(xml[i],retable);
		} else if(xml[i].sta == "IN_SESSION" && xml[i].pot == 1 && (xml[i].sms == 0 || xml[i].sms == 1)) {
			refreshFP(xml[i],fptable);
			plength = plength + 1;
		} else if(xml[i].sta == "IN_SESSION" && xml[i].pot == 1 && xml[i].sms == 2) {
			refreshCO(xml[i],cotable);
			plength = plength + 1;
		} else if((xml[i].sta == "IN_SESSION" && xml[i].pot == 0 && xml[i].sog == 0) ||(xml[i].sta == "IN_SESSION" && xml[i].pot == 0 && xml[i].sog == 1)) {
			refreshSP(xml[i], obtable);
			plength = plength + 1;
		} else if( xml[i].sta == "IN_SESSION" && xml[i].pot == 0 && xml[i].sog == 2) {
			refreshSP(xml[i], cttable);
			plength = plength + 1;
		} else if(xml[i].sta == "ENTERING" || xml[i].sta == "CHANGING" || xml[i].sta == "BRIEFING" || xml[i].sta == "LOGON") {
			xml[i].act = xml[i].sta;
			refreshSP(xml[i], lotable);
			plength = plength + 1;
		} else {
		}
	}
	document.getElementById("players").innerHTML = "Players: " + plength
	deleteFP(xml,fptable);
	deleteSP(xml,cttable);
	deleteSP(xml,obtable);
	deleteSP(xml,lotable);
	deleteCO(xml,cotable);
	deleteRE(xml,retable);
}
//refresh tables
function refreshFP(obj, fptable) {
	if(fptable.rows.length < 2) {
		addFP(obj,fptable);
	} else {
		isnew = true;
		for(t=0;t<fptable.rows.length;t++) {
			if(fptable.rows[t].cells[0].innerHTML == obj.idg) {
				isnew = false;
			}
		}
		if(isnew) {
			 addFP(obj,fptable); 
		} else {
			updateFP(obj,fptable);
		}
	}
}
function refreshSP(obj, tableObj) {
	if(tableObj.rows.length < 2) {
		addSP(obj, tableObj);
	} else {
		isnew = true;
		for(n=0;n<tableObj.rows.length;n++) {
			if(tableObj.rows[n].cells[0].innerHTML == obj.idg) {
				isnew= false;
			}
		}
		if(isnew) {
			addSP(obj, tableObj);
		} else {
			updateSP(obj, tableObj);
		}
	}
}
function refreshCO(obj, tableObj) {
	if(tableObj.rows.length < 2) {
		addCO(obj, tableObj);
	} else {
		isnew = true;
		for(n=0;n<tableObj.rows.length;n++) {
			if(tableObj.rows[n].cells[0].innerHTML == obj.idg) {
				isnew= false;
			}
		}
		if(isnew) {
			addCO(obj, tableObj);
		} else {
			updateCO(obj, tableObj);
		}
	}
}
function updateChat(xml) {
	chatXML = xml.getElementsByTagName("markers")[0].getElementsByTagName("chatbox")[0].getElementsByTagName("chat");
	chats = new Array();
	for(i=0;i<chatXML.length;i++) {
		chatTime = chatXML[i].getAttribute("time");
		chatTimeNice = chatTime.substr(0,5);
		chatTime = chatTime.replace(/[:|\.]/ig, '');
		user = chatXML[i].getAttribute("user");
		message = '';
		for(t=0;t<chatXML[i].getElementsByTagName('line').length;t++)  {
			message = message + chatXML[i].getElementsByTagName('line')[t].getAttribute("text") + "<br />";
			message = chatFilters(message);
		}

						
		message = message.replace(/-- \[CENSORED \!\!\] -- /ig, "<span class=\"paused\"> CENSORED !!</span");
		message = message.replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,"<a href='$1' target=\"_blank\">" + '$1' + "</a>");
		
		message = wbr1(message,20);  // a-z
		message = wbr2(message,20);  // other
			
		chats[i] = new Array();
		chats[i]['code'] = chatTime;
		chats[i]['time'] = chatTimeNice;
		chats[i]['user'] = user;
		chats[i]['message'] = message;
	}
	chats.chatsize = i;
	chats=chats.sort().reverse();
/*	chats = chats.sort(chats = chats.sort(function(a, b) {
		 var valueA, valueB;
		 
		 valueA = a['code'];
		 valueB = b['code'];
		 if (valueA < valueB) {
			 return -1;
			 } else if (valueA > valueB) {
				 return 1;
			}
			return 0;
		}
	)).reverse();*/
	table = document.getElementById("chat");
	for(i=0;i<chats.length;i++) {
		if(table.rows.length < 2) {
			addChat(table, chats[i]);
		} else {
			isnew = true;
			for(n=0;n<table.rows.length;n++) {
				if(table.rows[n].cells[0].innerHTML == chats[i]['code']) {
					isnew = false;
				}
			}
			if(isnew) { addChat(table,chats[i]); }
		}
	}
	for(i=0;i<table.rows.length;i++) {
		var del = true;
		for(n=0;n<chats.length;n++) {
			if(table.rows[i].cells[0].innerHTML == chats[n]['code']) {
				del = false;
			} else {
			}
		}
		if(del) {table.deleteRow(i);}
	}
}
function refreshRE(obj,REtable) {
	if(REtable.rows.length < 2) {
		addRE(obj,REtable);
	} else {
		isnew = true;
		for(t=0;t<REtable.rows.length;t++) {
			if(REtable.rows[t].cells[0].innerHTML == obj.idg && REtable.rows[t].cells[9].innerHTML == obj.nlo) {
				isnew = false;
			}
		}
		if(isnew) {
			 addRE(obj,REtable); 
		} else {
			updateRE(obj,REtable);
		}
	}
}
//UPDATE TABLES
function updateFP(obj, table) {
	for(g=0;g<table.rows.length;g++) {
		currow = table.rows[g];
		if(currow.cells[0].innerHTML == obj.idg) {
			currow.cells[0].innerHTML = obj.idg;
			currow.cells[1].innerHTML = obj.png;
			currow.cells[2].innerHTML = obj.cm1;
			currow.cells[3].innerHTML = obj.cm2;
			currow.cells[4].innerHTML = obj.idn;
			currow.cells[5].innerHTML = obj.typ;
				currow.cells[5].attributes.title = obj.tpt;
				if(obj.fil == 0) {
					currow.cells[5].setAttribute("class", "aircraftFloodZero");
				} else if(obj.fil == 1) {
					currow.cells[5].setAttribute("class", "aircraftFloodOne");
				} else {
					currow.cells[5].setAttribute("class", "aircraftFloodTwo");
				}
			currow.cells[6].innerHTML = obj.alt;
			currow.cells[7].innerHTML = obj.spd;
			currow.cells[8].innerHTML = obj.ffp;
			currow.cells[9].innerHTML = obj.tco;
			currow.cells[10].innerHTML = obj.tfp;
			currow.cells[11].innerHTML = obj.lot;
			currow.cells[12].innerHTML = obj.nlo;
			currow.cells[13].innerHTML = obj.kec;
				if(obj.fil == 0) {
					currow.cells[13].setAttribute("class", "aircraftFloodZero");
				} else if(obj.fil == 1) {
					currow.cells[13].setAttribute("class", "aircraftFloodOne");
				} else {
					currow.cells[13].setAttribute("class", "aircraftFloodTwo");
				}

			currow.cells[14].innerHTML = obj.epm;
			currow.cells[15].innerHTML = obj.tad.replace(/<a/, "<a title=\"" + metarRequest(currow.cells[15].innerHTML.match(/[A-Z]{4}/)) + "\"");
		}
	}
}
function updateSP(obj, table) {
	for(g=0;g<table.rows.length;g++) {
		currow=table.rows[g];
		if(currow.cells[0].innerHTML == obj.idg) {
			currow.cells[0].innerHTML = obj.idg;
			currow.cells[1].innerHTML = obj.png;
			currow.cells[2].innerHTML = obj.cm1;
			currow.cells[3].innerHTML = obj.cm2;
			currow.cells[4].innerHTML = obj.nad;
			currow.cells[5].innerHTML = obj.act;
			currow.cells[6].innerHTML = obj.ifr;
			currow.cells[7].innerHTML = obj.nan;
			currow.cells[8].innerHTML = obj.lit;
			currow.cells[9].innerHTML = obj.lot;
			currow.cells[10].innerHTML = obj.nlo;
		}
	}
}
function updateCO(obj, table) {
	for(g=0;g<table.rows.length;g++) {
		currow=table.rows[g];
		if(currow.cells[0].innerHTML == obj.idg) {
			currow.cells[0].innerHTML = obj.idg;
			currow.cells[1].innerHTML = obj.png;
			currow.cells[2].innerHTML = obj.cm1;
			currow.cells[3].innerHTML = obj.cm2;
			currow.cells[4].innerHTML = obj.idn;
			currow.cells[5].innerHTML = obj.typ;
				currow.cells[5].attributes.title = obj.tpt;
			currow.cells[6].innerHTML = obj.alt;
			currow.cells[7].innerHTML = obj.spd;
			currow.cells[8].innerHTML = obj.ffp;
			currow.cells[9].innerHTML = obj.tco;
			currow.cells[10].innerHTML = obj.lot;
			currow.cells[11].innerHTML = obj.nlo;
			currow.cells[12].innerHTML = obj.kec;
			currow.cells[13].innerHTML = obj.epm;
		}
	}
}
function updateRE(obj, table) {
	for(g=1;g<table.rows.length;g++) {
		currow=table.rows[g];
			if(currow.cells[0].innerHTML == obj.idg && currow.cells[9].innerHTML == obj.nlo ) {
			currow.cells[0].innerHTML = obj.idg;
			currow.cells[1].innerHTML = obj.cm1;
			currow.cells[2].innerHTML = obj.cm2;
			currow.cells[3].innerHTML = obj.idn;
			aircraft = currow.cells[4];
			aircraft.innerHTML = obj.typ;
			aircraft.attributes.title = obj.tpt;
			fps = currow.cells[5];
			if(obj.ffp != "") {
				fps.innerHTML = "OPEN";
				fps.setAttribute("class", "openfp");
			}
			currow.cells[6];innerHTML = obj.per;
			currow.cells[7].innerHTML = obj.pep;
			currow.cells[8].innerHTML = obj.lot;
			currow.cells[9].innerHTML = obj.nlo;
			currow.cells[10].innerHTML = obj.kec;
			currow.cells[11].innerHTML = obj.epm;
		}
	}
}
//DELETE FROM TABLES
function deleteFP(xml, fptable) {
	todel = new Array();
	for(i=1;i<fptable.rows.length;i++) {
		del=true;
		for(n=0;n<xml.length;n++) {
			if(fptable.rows[i].cells[0].innerHTML == xml[n].idg && xml[n].sta == "IN_SESSION" && xml[n].pot == 1) {
				if(xml[n].sms == 0 || xml[n].sms == 1) {
					del = false;
				}
			}
		}
		if(del) {
			todel.push(i);
		} else {
		}
	}
	for(i=0;i<todel.length;i++) {
		fptable.deleteRow(todel[todel.length-1-i]);
	}
}
function deleteSP(xml,sptable) {
	todel = new Array();
	for(i=1;i<sptable.rows.length;i++) {
		del=true;
		for(n=0;n<xml.length;n++) {
			if(sptable.rows[i].cells[0].innerHTML == xml[n].idg) {
				if(sptable.id == "controllers" && xml[n].sta == "IN_SESSION" && xml[n].pot == 0) {
					if(xml[n].sog == 2) {
						del = false;
					}
				}
				if(sptable.id == "observers" && xml[n].sta == "IN_SESSION" && xml[n].pot == 0 ) {
					if(xml[n].sog == 1 || xml[n].sog == 0) {
						del = false;
					}
				}
				if(sptable.id == "lobby" && RegExp(/ENTERING|CHANGING|BRIEFING|LOGON/).test(xml[n].sta)) {
						del = false;
				}
			}
		}
		if(del) {
			todel.push(i);
		} else {
		}
	}
	for(i=0;i<todel.length;i++) {
		sptable.deleteRow(todel[todel.length-1-i]);
	}
}
function deleteCO(xml,cotable) {
	todel = new Array();
	for(i=1;i<cotable.rows.length;i++) {
		del=true;
		for(n=0;n<xml.length;n++) {
			if(cotable.rows[i].cells[0].innerHTML == xml[n].idg && xml[n].sta == "IN_SESSION" && xml[n].pot == 1 && xml[n].sms == 2 ) {
				del = false;
			}
		}
		if(del) {
			todel.push(i);
		} else {
		}
	}
	for(i=0;i<todel.length;i++) {
		cotable.deleteRow(todel[todel.length-1-i]);
	}
}
function deleteRE(xml, retable) {
	todel = new Array();
	for(i=1;i<retable.rows.length;i++) {
		del=true;
		for(n=0;n<xml.length;n++) {
			if(retable.rows[i].cells[0].innerHTML == xml[n].idg && retable.rows[i].cells[9].innerHTML == xml[n].nlo ) {
				del = false;
			}
		}
		if(del) {
			todel.push(i);
		} else {
		}
	}
	for(i=0;i<todel.length;i++) {
		retable.deleteRow(todel[todel.length-1-i]);
	}
}
//ADD TO TABLES
function addFP(obj, table) {
	var newrow = table.insertRow(-1) ;
	user = newrow.insertCell(0);
		user.innerHTML = obj.idg;
		user.setAttribute("title", obj.userdet);
	newrow.insertCell(1).innerHTML = obj.png;
	newrow.insertCell(2).innerHTML = obj.cm1;
	newrow.insertCell(3).innerHTML = obj.cm2;
	newrow.insertCell(4).innerHTML = obj.idn;
	aircraft = newrow.insertCell(5);
		aircraft.innerHTML = obj.typ;
		aircraft.setAttribute("title", obj.tpt);
		if(obj.fil == 0) {
			aircraft.setAttribute("class", "aircraftFloodZero");
		} else if(obj.fil == 1) {
			aircraft.setAttribute("class", "aircraftFloodOne");
		} else {
			aircraft.setAttribute("class", "aircraftFloodTwo");
		}
	newrow.insertCell(6).innerHTML = obj.alt;
	newrow.insertCell(7).innerHTML = obj.spd;
	newrow.insertCell(8).innerHTML = obj.ffp;
	newrow.insertCell(9).innerHTML = obj.tco;
	newrow.insertCell(10).innerHTML = obj.tfp;
	newrow.insertCell(11).innerHTML = obj.lot;
	newrow.insertCell(12).innerHTML = obj.nlo;
	kec = newrow.insertCell(13);
		kec.innerHTML = obj.kec;
		if(obj.fil == 0) {
			kec.setAttribute("class", "aircraftFloodZero");
		} else if(obj.fil == 1) {
			kec.setAttribute("class", "aircraftFloodOne");
		} else {
			kec.setAttribute("class", "aircraftFloodTwo");
		}
	newrow.insertCell(14).innerHTML = obj.epm;
	nrst = newrow.insertCell(15);
		nrst.innerHTML = obj.tad;
		nrst.setAttribute("Class", "nearestright");
}
function addSP(obj, table) {
	var newrow = table.insertRow(-1);
	user = newrow.insertCell(0);
		user.innerHTML = obj.idg;
		user.setAttribute("title", obj.userdet);
	newrow.insertCell(1).innerHTML = obj.png;
	newrow.insertCell(2).innerHTML = obj.cm1;
	newrow.insertCell(3).innerHTML = obj.cm2;
	newrow.insertCell(4).innerHTML = obj.nad;
	pos = newrow.insertCell(5);
		pos.innerHTML = obj.act;
		pos.setAttribute("Class", "smallFont");
	newrow.insertCell(6).innerHTML = obj.ifr;
	newrow.insertCell(7).innerHTML = obj.nan;
	newrow.insertCell(8).innerHTML = obj.lit;
	newrow.insertCell(9).innerHTML = obj.lot;
	newrow.insertCell(10).innerHTML = obj.nlo;
}
function addCO(obj,table) {
	var newrow = table.insertRow(-1) ;
	user = newrow.insertCell(0);
		user.innerHTML = obj.idg;
		user.setAttribute("title", obj.userdet);
	newrow.insertCell(1).innerHTML = obj.png;
	newrow.insertCell(2).innerHTML = obj.cm1;
	newrow.insertCell(3).innerHTML = obj.cm2;
	newrow.insertCell(4).innerHTML = obj.idn;
	aircraft = newrow.insertCell(5);
		aircraft.innerHTML = obj.typ;
		aircraft.setAttribute("title", obj.tpt);
	newrow.insertCell(6).innerHTML = obj.alt;
	newrow.insertCell(7).innerHTML = obj.spd;
	ffp = newrow.insertCell(8);
		ffp.innerHTML = obj.ffp;
		ffp.setAttribute("Class", "goodCallSign");
	newrow.insertCell(9).innerHTML = obj.tfp;
	newrow.insertCell(10).innerHTML = obj.lot;
	newrow.insertCell(11).innerHTML = obj.nlo;
	newrow.insertCell(12).innerHTML = obj.kec;
	newrow.insertCell(13).innerHTML = obj.epm;
	
}
function addRE(obj,table) {
	var newrow = table.insertRow(1) ;
	user = newrow.insertCell(0);
		user.innerHTML = obj.idg;
		user.setAttribute("title", obj.userdet);
	newrow.insertCell(1).innerHTML = obj.cm1;
	newrow.insertCell(2).innerHTML = obj.cm2;
	newrow.insertCell(3).innerHTML = obj.idn;
	aircraft = newrow.insertCell(4);
	aircraft.innerHTML = obj.typ;
	aircraft.setAttribute("title", obj.tpt);
	fps = newrow.insertCell(5);
	if(obj.ffp != "") {
		fps.innerHTML = "OPEN";
		fps.setAttribute("class", "openfp");
	}
	reason = newrow.insertCell(6);
	if(obj.per == 'communications timeout') {
		reason.innerHTML = "<span class=\"bold\">TIMEOUT:</span> (Your PC or Internet crashed or hung)";
	} else {
		reason.innerHTML = obj.per;
	}
	newrow.insertCell(7).innerHTML = obj.pep;
	newrow.insertCell(8).innerHTML = obj.lot;
	newrow.insertCell(9).innerHTML = obj.nlo;
	newrow.insertCell(10).innerHTML = obj.kec;
	newrow.insertCell(11).innerHTML = obj.epm;
}
function addChat(table, message) {
	var newrow = table.insertRow(0);
	var code = newrow.insertCell(0);
	var time = newrow.insertCell(1);
	var user = newrow.insertCell(2);
	var text = newrow.insertCell(3);
	code.innerHTML = message['code'];
	code.className = code.className + " code";
	time.innerHTML = message['time'];
	time.className = time.className + " time";
	user.innerHTML = message['user'];
	user.className = user.className + " user";
	text.innerHTML = message['message'];
	text.className = text.className + " message";
	if(RegExp(/^[\+|\-|\%|\?]FP/i).test(text.innerHTML)) { text.className = text.className + " flightplan"; }
}
//Chat Filters 
function chatFilters(message) {
	//bad ppl filter
	message = message.replace(" -- [CENSORED !!] -- ", "<span class=\"censored\">[CENSORED]</span>");
	//smiley filter
	
	
	message = message.replace(/:\)/g, "<img src=images/smile.gif />");              // :)
	message = message.replace(/:D/ig, "<img src=images/open_mouth_smile.gif />");
	message = message.replace(/;\)/g, "<img src=images/winking_smile.gif />");
	message = message.replace(/:\-0/g, "<img src=images/surprised_smile.gif  />");
	message = message.replace(/:P/ig, "<img src=images/smile_with_tongue_out.gif />");
	message = message.replace(/:\@/g, "<img src=images/angry_smile.gif />");
	message = message.replace(/:S/ig, "<img src=images/confused_smile.gif />");
	message = message.replace(/:\$/g, "<img src=images/embarrassed_smile.gif />");
	message = message.replace(/:\(/g, "<img src=images/sad_smile.gif />");
	message = message.replace(/:\|/g, "<img src=images/disappointed_smile.gif />");
	message = message.replace(/8o\|/g, "<img src=images/baring_teeth_smile.gif />");
	message = message.replace(/8\-\|/g, "<img src=images/nerd_smile.gif />");
	message = message.replace(/\+o\|/g, "<img src=images/sick_smile.gif />");
	message = message.replace(/:\-\#/g, "<img src=images/dont_tell_smile.gif />");
	message = message.replace(/\!C/ig, "<img src=images/atc.gif />");
	message = message.replace(/\!P/ig, "<img src=images/pilot.gif />");
	return message;
}
//clock
function clock() {
	var runTime = new Date();
	var hours = runTime.getHours();
	var minutes = runTime.getMinutes();
	var seconds = runTime.getSeconds();
	var dn = "Local";
	if (minutes <= 9) {
		minutes = "0" + minutes;
	}
	if (seconds <= 9) {
		seconds = "0" + seconds;
	}
	movingtime = "<span id=\"time\">"+ hours + ":" + minutes + ":" + seconds + "" + "</span> " + dn ;
	document.getElementById('clock').innerHTML = "Currently it's: " + movingtime;
}
function gettotals(table) {
	length = table.rows.length;
	length = length - 1;
	table.rows[0].cells[0].innerHTML = table.rows[0].cells[0].innerHTML.replace(/[0-9]{1,}/, length );
}
// INSERT breaks into long words in Chat
function wbr1(str, num) {  
  return str.replace(RegExp("(\\w{" + num + "})(\\w)", "g"), function(all,text,char){ 
  //  return text + "<wbr>" + char;
  return text + "&shy;" + char;
  }); 
}

function wbr2(str, num) {  
  return str.replace(RegExp("(\\W{" + num + "})(\\W)", "g"), function(all,text,char){ 
  //  return text + "<wbr>" + char;
  return text + "&shy;" + char;
  }); 
}
function styleColorICAO(flightplan)
{
	function addcolor(match)
	{
		return "<span class=\"fpICAO\" >" + match + "</span>"; 
	}
	return flightplan.replace(/ K[A-Z][A-Z][A-Z] /g, addcolor);
}
function metarRequest(airport) {
	if(airport in metars) {
		metarDate = ((dateObj.getUTCDay() * 100) + dateObj.getUTCHours() * 100) + dateObj.getUTCMinutes();
		if(metarDate > (metars[airport].match(/[0-9]{6}z/) + 100)) {
			return metars[airport];
		}
	}
	
	xmlht=new XMLHttpRequest();
	xmlht.onreadystatechange=function()
	{
		if(xmlht.readyState==4 && xmlht.status==200)
		{
			metars[airport] = xmlht.responseText;
			return xmlht.responseText;
		}
	}	
	date = (((((((((dateObj.getFullYear() * 100) + dateObj.getMonth() + 1) * 100) + dateObj.getDate()) * 100) + dateObj.getHours()) * 100) + dateObj.getMinutes()) * 100) + dateObj.getSeconds();
	xmlht.open("GET","./metar.php?station_ids=" + airport + "&random=" + date,true);
	xmlht.send();
}
//ONLOAD FUNCTION
function load() {
	getUpdate();
	clock();
	colorize();
	//sortinit(); -- disabled untill finished
	window.setInterval(clock, 1000);
	window.setInterval(getUpdate, 5000);
	window.setInterval(colorize, 1000);
}

