var spaces=[];
var airports=[];
var runways=[];
var waypoints=[];
var navaids=[];
var route_polygon;

var region = "ne";

function redraw_waypoints() {
	var ptlist=[];

	if (route_polygon) {
		top.map.removeOverlay(route_polygon);
	}
	var lst = top.documentc.getElementById('route');

	var str = "<table>";
	str += "<tr><td>Num</td>"+
				"<td>Name</td>"+
				"<td>Long</td>"+
				"<td>Lat</td>"+
				"<td>Dist (NM)</td>"+
				"<td>Total Dist</td>"+
				"<td>Bearing</td>"+
				"</tr>";
	var lastlon = -1;
	var lastlat = -1;
	var totaldist = 0;
	for (var i in waypoints) {
		var distangle=null;
		str += "<tr>";
		str += "<td>"+i+"</td>";
		str += "<td>"+waypoints[i].name+"</td>";
		str += "<td>"+waypoints[i].lon+"</td>";
		str += "<td>"+waypoints[i].lat+"</td>";
		str += "<td>";
		
		if (lastlon != -1) {
			distangle = XMaps.model.getDistanceAndAngle(
					new top.windowa.GPoint(lastlon,lastlat),
					new top.windowa.GPoint(waypoints[i].lon,waypoints[i].lat));
			var dst = distangle.distance.toNauticalMiles();
			if (dst < 1) {
				var feet = distangle.distance.toMeters();
				feet *= 3;
				str += feet.toFixed(0);
				str += " Feet";
			} else {
				str += dst.toFixed(2);
			}
			totaldist += dst;
		}

		str += "</td>";
		str += "<td>";

		if (totaldist)
			str+= totaldist.toFixed(2);

		
		str += "</td>";
		str += "<td>";

		if (distangle)  {
			var ang = parseInt(distangle.angle.toDegrees());
				
			if (waypoints[i].variation) {
				var tmp = (ang-waypoints[i].variation);
				str += tmp;
				str +="  ";
			}
			str += "(";
			str += ang;
			str += "T)";
		}


		str += "</td>";
		ptlist.push(new top.windowa.GPoint(waypoints[i].lon,waypoints[i].lat));
		lastlon = waypoints[i].lon;
		lastlat = waypoints[i].lat;
		str += "<td><a href='javascript:top.delete_waypoint("+i+");'>Delete</a></td>";
		str += "</tr>";
	}
	str += "</table>";

	lst.innerHTML = str;

	if (waypoints.length >= 2) {
		route_polygon = new top.windowa.GPolyline(ptlist,"#ff0000",6);
		top.map.addOverlay(route_polygon);
	}
}

function delete_waypoint(num) {
	if (waypoints[num].obj) {
		top.map.removeOverlay(waypoints[num].obj);
	}
	delete waypoints[num];
	redraw_waypoints();
}

function add_waypoint_ctr() {
	var tmp=[];
	var center = top.map.getCenterLatLng();
	tmp.lon = center.x;
	tmp.lat = center.y;
	tmp.obj = new top.windowa.GMarker(new top.windowa.GPoint(tmp.lon,tmp.lat));
	top.map.addOverlay(tmp.obj);
	waypoints.push(tmp);
	redraw_waypoints();
}

function add_waypoint(name,lon,lat,variation) {
	var tmp=[];
	tmp.name = name;
	tmp.lon = lon;
	tmp.lat = lat;
	tmp.variation = variation;
	waypoints.push(tmp);
	redraw_waypoints();
}

function entwaypt(e) {
	var keynum;
	if(window.event) // IE
	{
		keynum = e.keyCode
	}
	else if(e.which) // Netscape/Firefox/Opera
	{
		keynum = e.which
	}
	if (keynum == 13)
		top.add_waypoint(top.documentc.getElementById('waypt_text').value);
	else
		return true;
	}
function removeicao(icao) {

	if	(airports[icao]) {
		if (airports[icao].hidden == 0) {
			top.map.removeOverlay(airports[icao].obj);
		}
		delete airports[icao];
	}

	if (runways[icao]) {
		for (var rwy in runways[icao]) {
			if (runways[icao][rwy].hidden == 0) {
				top.map.removeOverlay(runways[icao][rwy].obj);
			}
		}
		delete runways[icao];
	}

	if (spaces[icao]) {
		for  (var a in spaces[icao]) {
			for  (var b in spaces[icao][a]) {
				if (spaces[icao][a][b].hidden==0) 
					top.map.removeOverlay(spaces[icao][a][b].obj);
			}
			delete spaces[icao][a];
		}
		delete spaces[icao];
	}
}

function debug(str) {
	var tmp=top.documentc.getElementById('debug');

	tmp.innerHTML += str+"<br>";
}
function findvis() {
	var bnds = top.map.getBoundsLatLng();
	var request;
	request = top.windowa.GXmlHttp.create();
	request.open('GET', '/airnav-cgi/boundsapt?region='+region+'&region='+region+'&lat1='+bnds.minY+
				'&lon1='+bnds.minX+
				'&lat2='+bnds.maxY+
				'&lon2='+bnds.maxX
				, true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
		var xmlDoc = request.responseXML;
		var area = xmlDoc.documentElement.getElementsByTagName("apt");
		for (var i = 0; i < area.length; i++) {
				var code = area[i].getAttribute("icao");
				if (airports[code])
					show_apt(code);
				else 
					top.Airnav(code,1);
			}
		}
	}
	request.send(null);

	var request2;
	request2= top.windowa.GXmlHttp.create();
	request2.open('GET', '/airnav-cgi/navaid?region='+region+'&lat1='+bnds.minY+
				'&lon1='+bnds.minX+
				'&lat2='+bnds.maxY+
				'&lon2='+bnds.maxX
				, true);
	request2.onreadystatechange = function() {
		if (request2.readyState == 4) {
		var xmlDoc = request2.responseXML;
		var area = xmlDoc.documentElement.getElementsByTagName("navaid");
		for (var i = 0; i < area.length; i++) {
				var lon = area[i].getAttribute("lng");
				var lat = area[i].getAttribute("lat");
				var id = area[i].getAttribute("id");
				var icon = area[i].getAttribute("icon");
				var freq = area[i].getAttribute("freq");
				var locid = area[i].getAttribute("locid");
				var type = area[i].getAttribute("type");
				var name = area[i].getAttribute("name");
				var variation = area[i].getAttribute("var");
				var text = locid+"<br />"+
							name+"<br />"+
							type+"<br />"+
							freq+"<br />"+
							"<a href='javascript:top.add_waypoint(\""+
								name+"\", "+
								lon+", "+
								lat+", "+
								variation+
							");'>Add Waypoint</a>";
				if (navaids[id])
					show_navaid(id);
				else 
					top.add_navaid(id,icon,lon,lat,text,1);
			}
		}
	}
	request2.send(null);
}
function query_db(qry) {
	if (qry == "") return;
	var request;
	request = top.windowa.GXmlHttp.create();
	request.open('GET', '/airnav-cgi/findairport?region='+region+'&query='+qry, true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
		var xmlDoc = request.responseXML;
		var area = xmlDoc.documentElement.getElementsByTagName("apt");
		var desc = top.documentb.getElementById("aslist");
		var str= "<table border=1>";
		for (var i = 0; i < area.length; i++) {
				var name = area[i].getAttribute("name");
				var icao = area[i].getAttribute("icao");
				var city = area[i].getAttribute("city");
				var st = area[i].getAttribute("st");
				var variation = parseInt(area[i].getAttribute("var"));
				str += "<tr>\n";
				str += "<td><a href='javascript:top.Airnav(\""+icao+"\");'>Add</td><td>"+icao+"</td><td>"+name+"</td><td>"+city+"</td><td>"+st+"</td>\n";
				str += "</tr>\n";
			}
			str+= "</table>";
			desc.innerHTML = str;
			if (area.length == 1) {
				top.Airnav(area[0].getAttribute("icao"),1);
			}
		}
	}
		var desc = top.documentb.getElementById("aslist");
request.send(null);
		desc.innerHTML="<h3>Loading...</h3>";
}

function updateLocation() {
	alert(getCenterLatLng());
}

function addMarker(lng,lat,text,icon) {
	var mkr = new top.windowa.GMarker(new top.windowa.GPoint(lng,lat),icon);
		mkr.mytitle = text;
		top.windowa.GEvent.addListener(mkr, 'click', function() {
		this.openInfoWindowHtml(this.mytitle);
		});

	top.map.addOverlay(mkr);
	return mkr;
}

function show_navaid(id) {
}

function add_navaid(id,filename,lng,lat,text,showme) {
		if (navaids[id])
			show_navaid(id);
		else {
				var icon = new top.windowa.GIcon();
				var filename;
				filename  = "img/"+filename;
				icon.image = filename;
				icon.iconSize = new top.windowa.GSize(24, 24);
				icon.iconAnchor = new top.windowa.GPoint(12, 12);
				icon.infoWindowAnchor = new top.windowa.GPoint(12, 12);
			navaids[id] = addMarker(lng,lat,text,icon);
		}
}


function show_apt(a) {
		if (airports[a].hidden == 1) {
			top.map.addOverlay(airports[a].obj);
		}
		airports[a].hidden =0;
		var it = top.documentc.getElementById("cb_apt_"+a);
		a.checked = 1;
}
function hide_apt(a) {
		if (airports[a].hidden == 0) {
			top.map.removeOverlay(airports[a].obj);
		}
		airports[a].hidden =1;
		var it = top.documentc.getElementById("cb_apt_"+a);
		it.checked = 0;
}

function show_rwy(a) {
		for (var r in runways[a]) {
			if (runways[a][r].hidden == 1) {
				top.map.addOverlay(runways[a][r].obj);
			}
			runways[a][r].hidden =0;
			var it = top.documentc.getElementById("cb_rwy_"+a);
			it.checked = 1;
		}
}
function hide_rwy(a) {
		for (var r in runways[a]) {
			if (runways[a][r].hidden == 0) {
				top.map.removeOverlay(runways[a][r].obj);
			}
			runways[a][r].hidden =1;
			var it = top.documentc.getElementById("cb_rwy_"+a);
			it.checked = 0;
		}
}

function cb_apt(a) {
	var it = top.documentc.getElementById("cb_apt_"+a);
	if  (it.checked) {
			show_apt(a);
	} else {
			hide_apt(a);
	}
}

function cb_rwy(a) {
	var it = top.documentc.getElementById("cb_rwy_"+a);
	if  (it.checked) {
			show_rwy(a);
	} else {
			hide_rwy(a);
	}
}
function cb_name(a) {
	var it = top.documentc.getElementById("nm_"+a);
}

function cb_nmcl(a,b) {
	var it = top.documentc.getElementById("nmcl_"+a+"_"+b);
	var dowhat = it.checked;
	for (var c in spaces[a][b]) {
		if (dowhat) {
			show(a,b,c);
		}	 else {
			remove(a,b,c);
		}
	}
}

function cb_as(a,b,c) {
	var it = top.documentc.getElementById("as_"+a+"_"+b+"_"+c);
	if  (it.checked) {
			show(a,b,c);
	} else {
			remove(a,b,c);
	}
}

function toggle(a,b,c) {
		if (spaces[a][b][c].hidden) {
			show(a,b,c);
		} else {
			remove(a,b,c);
		}
}

function show(a,b,c) {

		if (!spaces[a][b][c].hidden)
				return;

		spaces[a][b][c].hidden = 0;
		var it = top.documentc.getElementById("as_"+a+"_"+b+"_"+c);
		it.checked = 1;

		if (spaces[a][b][c].obj) {
			top.map.addOverlay(spaces[a][b][c].obj);
			return;
		}



		top.Airnav(a,1,b);

		// Need to load! 


		
}
function remove(a,b,c) {
		if (spaces[a][b][c].hidden == 0) {
			top.map.removeOverlay(spaces[a][b][c].obj);
		}
		spaces[a][b][c].hidden = 1;
		var it = top.documentc.getElementById("as_"+a+"_"+b+"_"+c);
		it.checked = 0;
}
function expclps_code(code) {
	var img = top.documentc.getElementById("desc_img_"+code);
	var make;
	var imgto;
	var showto;
	if (img.showme) {
		imgto = "img/plus.gif";
		showto = 0;
		make = "none";
	} else {
		imgto = "img/minus.gif";
		make = "";
		showto = 1;
	}
	img.src = imgto;
	img.showme = showto;

	var d = top.documentc.getElementById("desc_apt_"+code);
			d.style.display=make;
	for (var b in spaces[code]) {

		var img = top.documentc.getElementById("desc_img_"+code+"_"+b);
		img.src = "img/plus.gif";
		img.showme = 0;
		if (!showto) {
			for (var c in spaces[code][b]) {
				var d = top.documentc.getElementById("desc_spc_"+code+"_"+b+"_"+c);
				d.style.display=make;
			}
		}
			var d = top.documentc.getElementById("desc_spc_"+code+"_"+b);
			d.style.display=make;
	}
}

function expclps_class(code,clss) {
	var img = top.documentc.getElementById("desc_img_"+code+"_"+clss);
	var make;
	if (img.showme) {
		img.src = "img/plus.gif";
		img.showme = 0;
		make = "none";
	} else {
		img.src = "img/minus.gif";
		img.showme = 1;
		make = "";
	}
	for (var c in spaces[code][clss]) {
			var d = top.documentc.getElementById("desc_spc_"+code+"_"+clss+"_"+c);
			d.style.display=make;
	}

}

function fixdesc() {
	var desc = top.documentc.getElementById("modme");
	var str = "";

	str += "<table>\n";
	for (var spc in airports) {
		str += "<tr><td>\n";
		str += spc;
		str += " <a href='javascript:top.map.centerAtLatLng(new top.top.windowa.GPoint("+airports[spc].lon+","+airports[spc].lat+"));'>";
		str += "<img border=0 src=\"img/gotoicon.png\"/>";
		str += "</a> ";

		str += " <a href='javascript:top.add_waypoint(\""+spc+"\""+
					","+airports[spc].lon+","+airports[spc].lat+","+airports[spc].variation+");'><img border=0 src=\"img/addwpticon.png\"/></a>";

		str += "\n";
		str += "</td></tr>\n";

			str += "<tr style=\"display:none\" id=desc_apt_"+spc+"><td style=\"padding-left: 10px\">\n";
			str += "Airport ";
					str += "<input type=\"checkbox\" id=\"cb_apt_"+
								spc+"\"";
					if (airports[spc].hidden == 0)
						str += " checked=1";
								str += " onclick='javascript:top.cb_apt(\""+
								spc+"\");' "+
								">";
			if (runways[spc]) {
				str += "<br>";
				str += "Runways ";
						str += "<input type=\"checkbox\" id=\"cb_rwy_"+
									spc+"\" " +
									"onclick='javascript:top.cb_rwy(\""+
									spc+"\");' "+
									">";
			}
			str += "</td></tr>\n";
		for (var clss in spaces[spc]) {
			var hdn = spaces[spc][clss] && spaces[spc][clss].hidden;
			str += "<tr style=\"display:";
			if (1) {
				str += "none";
			}
			str += "\" id=desc_spc_"+spc+"_"+clss+"><td style=\"padding-left: 10px\">\n";
			str += "<img id=desc_img_"+spc+"_"+clss+" src=img/plus.gif onclick='javascript:top.expclps_class(\"";
			str += spc+"\",\""+clss;
			str += "\");'>";
			str += " Class "+clss+"\n";
					str += "<input type=\"checkbox\" id=\"nmcl_"+
								spc+"_"+clss+"\" " +
								"onclick='javascript:top.cb_nmcl(\""+
								spc+"\",\""+clss+"\");' "+
								">";
			str += "</td></tr>\n";
			for (var nam in spaces[spc][clss]) {
				var hdn = spaces[spc][clss][nam].hidden ;
				str += "<tr style=\"display:";
				if (1) {
					str += "none";
				}
				str += "\" id=desc_spc_"+spc+"_"+clss+"_"+nam+"><td style=\"padding-left: 20px\">\n";
					str += spaces[spc][clss][nam].lower+" to "+
					spaces[spc][clss][nam].upper;
					str += "<input type=\"checkbox\" id=\"as_"
								+spc+"_"+clss+"_"+nam+"\"" ;
					if (hdn)
						str += "";
					else 
						str += "checked=1";
					str += "\" "+
								"onclick='javascript:top.cb_as(\""
								+spc+"\",\""+clss+"\",\""+nam+"\");' "+
								">";
							
					str += "</td></tr>\n";
			}
		}
	}
	str += "</table>\n";
		desc.innerHTML=str;
}

Airnav = function (icao,showit) {
var request;
request = top.windowa.GXmlHttp.create();
var reqstr = "preload/"+icao+".xml";
request.open('GET', reqstr, true);

request.onreadystatechange = function() {
  if (request.readyState == 4) {
	var xmlDoc = request.responseXML;
	if (!xmlDoc) {
		return 0;
	}
	if (!xmlDoc.documentElement) {
		return 0;
	}
	var area = xmlDoc.documentElement.getElementsByTagName("area");
	if (area)
	for (var i = 0; i < area.length; i++) {
			var name = area[i].getAttribute("name");
			var code = area[i].getAttribute("icao");
			var clss = area[i].getAttribute("class");
			var upper = area[i].getAttribute("uppper");
			var lower = area[i].getAttribute("lower");

			var pointlist = [];
			var rpt = area[i].childNodes.length;
			for (var x = 0; x < rpt; x++) {
				var segid = area[i].childNodes[x];
				if (segid.nodeType == 1) {
					var lon = parseFloat(area[i].childNodes[x].getAttribute("long"));
					var lat = parseFloat(area[i].childNodes[x].getAttribute("lat"));
					pointlist.push(new top.windowa.GPoint(lon,lat));
				}
			}
			var clr;

			if (clss == "B") clr = "#ff0000";
			else if (clss == "C") clr = "#00ff00";
			else if (clss == "D") clr = "#0000ff";
			else clr = "#00ffff";
		
			var polyline = new top.windowa.GPolyline(pointlist,clr,3);
			if (! spaces[code]) {
				spaces[code] = [];
			}
			if (! spaces[code][clss] ) {
				spaces[code][clss] = [];
			}
			if (! spaces[code][clss][name] ) {
				spaces[code][clss][name] = [];
				spaces[code][clss][name].upper = upper;
				spaces[code][clss][name].lower = lower;
				spaces[code][clss][name].hidden = 1;
			}
			if (!spaces[code][clss][name].obj) {
				spaces[code][clss][name].obj = polyline;
//				if (!spaces[code][clss][name].hidden)
					top.windowa.map.addOverlay(polyline);
			}

			
			
		}

	var area = xmlDoc.documentElement.getElementsByTagName("airport");
	if (area)
	for (var i = 0; i < area.length; i++) {
			var name = area[i].getAttribute("name");
			var code = area[i].getAttribute("code");
			var loc = area[i].getAttribute("loc");
			var lat = parseFloat(area[i].getAttribute("lat"));
			var lng = parseFloat(area[i].getAttribute("lng"));
			var variation = parseFloat(area[i].getAttribute("var"));
			if (! airports[code]) {
				airports[code] = [];
			}
			if (! airports[code].obj) {
				var icon = new top.windowa.GIcon();
				icon.image = "img/iconcache/"+code+".png";
				icon.iconSize = new top.windowa.GSize(48, 48);
				icon.iconAnchor = new top.windowa.GPoint(24, 24);
				icon.infoWindowAnchor = new top.windowa.GPoint(24, 24);
		
				var marker = new top.windowa.GMarker(new top.windowa.GPoint(lng,lat),icon);
				airports[code].obj = marker;
				airports[code].hidden = 0;
				airports[code].lat = lat;
				airports[code].lon = lng;
				airports[code].variation = variation;
				marker.mytext = code+"<br>"+name+"<br>"+loc+"<br>";
				marker.mytext += "<a href='javascript:top.add_waypoint(\""+code+"\""+
						","+lng+","+lat+","+variation+");'>Waypoint</a>";
				top.windowa.GEvent.addListener(marker,'click', function() 
						 { this.openInfoWindowHtml(this.mytext); }
				);
				top.windowa.map.addOverlay(marker);
			}
	}


	var area = xmlDoc.documentElement.getElementsByTagName("classexists");
	if (area)
	for (var i = 0; i < area.length; i++) {
			var code = area[i].parentNode.getAttribute("code");
			var clss = area[i].getAttribute("class");
			var nam = area[i].getAttribute("name");
			var upper = area[i].getAttribute("upper");
			var lower = area[i].getAttribute("lower");
			if (! spaces[code]) {
				spaces[code] = [];
			}
			if (! spaces[code][clss] ) {
				spaces[code][clss] = [];
			}
			if (! spaces[code][clss][nam]) {
				spaces[code][clss][nam] = [];
				spaces[code][clss][nam].upper = upper;
				spaces[code][clss][nam].lower = lower;
				spaces[code][clss][nam].hidden = 1;
			}
			
			
	}

	var area = xmlDoc.documentElement.getElementsByTagName("runway");
	for (var i = 0; i < area.length; i++) {
			var lat1 = parseFloat(area[i].getAttribute("lat1"));
			var lon1 = parseFloat(area[i].getAttribute("lon1"));
			var lat2 = parseFloat(area[i].getAttribute("lat2"));
			var lon2 = parseFloat(area[i].getAttribute("lon2"));
			var code = area[i].parentNode.getAttribute("code");
			var name = area[i].getAttribute("name");

			if ((lat1) && (lon1) && (lat2) && (lon2)) {
				if (!runways[code]) {
					runways[code] = [];
				}

				if (!runways[code][name]) {
					runways[code][name] = [];
					var runway = new top.windowa.GPolyline([new top.windowa.GPoint(lon1,lat1),new top.windowa.GPoint(lon2,lat2)],"#ff8888",4);
					runways[code][name].obj = runway;
					runways[code][name].hidden = 0;
				}
			}
			
	}

			fixdesc();
  }
}
request.send(null);
}


/*
   Add Route 
*/

ShowRoute = function (filename) {
var request;
request = top.windowa.GXmlHttp.create();
request.open('GET', filename ,true);

request.onreadystatechange = function() {
  if (request.readyState == 4) {
	var xmlDoc = request.responseXML;
	var pointlist = [];
	var area = xmlDoc.documentElement.getElementsByTagName("point");
	for (var i = 0; i < area.length; i++) {
			var lat = area[i].getAttribute("lat");
			var lon = area[i].getAttribute("lon");
			var marker = area[i].getAttribute("marker");

			if ((marker) || (i==0) || (i==(area.length-1)))  {
				
				var angle = area[i].getAttribute("angle");
				angle = Math.round(angle/10);
				angle = Math.round(angle*10);

				var icon = new top.windowa.GIcon();
				var filename;
				if (i==0)
					filename  = "img/start.png";
				else if (i==(area.length -1))
					filename  = "img/stop.png";
				else
					filename  = "img/arrow-"+angle+".png";
				icon.image = filename;
				icon.iconSize = new top.windowa.GSize(13, 13);
				icon.iconAnchor = new top.windowa.GPoint(7, 7);
				icon.infoWindowAnchor = new top.windowa.GPoint(7, 7);
				
				addMarker(lon,lat,marker,icon);
			}

			pointlist.push(new top.windowa.GPoint(lon,lat));
			}
	top.windowa.map.addOverlay(new top.windowa.GPolyline(pointlist),'#FFFF00',3);
	var flight = xmlDoc.documentElement.getElementsByTagName("vars");
		for (var i = 0; i < flight.length; i++) {
			var centerlat = flight[i].getAttribute("centerlat");
			var centerlon = flight[i].getAttribute("centerlon");
			var zoomlevel  = flight[i].getAttribute("zoomlevel");
			if (centerlat) {
				top.map.centerAtLatLng(new top.windowa.GPoint(centerlon,centerlat));
			}
			if (zoomlevel) {
				top.windowa.map.zoomTo(zoomlevel);
			}
		}
	var apt = xmlDoc.documentElement.getElementsByTagName("apt");
		for (var i = 0; i < apt.length; i++) {
			var icao = apt[i].getAttribute("icao");
			if (icao) {
				top.Airnav(icao,1);
			}
		}
  var apt = xmlDoc.documentElement.getElementsByTagName("icon");
    for (var i = 0; i < apt.length; i++) {
      var lat = apt[i].getAttribute("lat");
      var lon = apt[i].getAttribute("lon");
      var text = apt[i].getAttribute("text");
      addMarker(lon,lat,text);
    }

		}
	}
request.send(null);
}

