var hta;
var hti;
var txt;
var geoc;
var map;
var gm;
var first = true;
var aicon=new GIcon();
aicon.image="/img/i.png";
aicon.shadow="";
aicon.iconSize=new GSize(15, 13);
aicon.shadowSize=new GSize(15, 13);
aicon.iconAnchor=new GPoint(6, 6);
aicon.infoWindowAnchor=new GPoint(7, 6);
var dptIcon = new GIcon();
aicon.image="/img/i.png";
dptIcon.shadow="";
dptIcon.iconSize=new GSize(23, 23);
dptIcon.shadowSize=new GSize(23, 23);
dptIcon.iconAnchor=new GPoint(12, 12);
dptIcon.infoWindowAnchor=new GPoint(12, 12);
dptIcon.image = '/img/dpt.png';
var dstIcon = new GIcon(dptIcon);
dstIcon.image = '/img/dst.png';
var taf = new GIcon();
taf.image = "http://www.airspace-v.com/img/taf.png";
taf.iconSize = new GSize(9, 17);
taf.iconAnchor = new GPoint(4, 12);
taf.infoWindowAnchor = new GPoint(4, 12);
var mApts = [];
var mMets = [];
var dpt = false;
var dst = false;
var gcl = false;
var dst2 = false;
var dpt2 = false;
function ce(t){return document.createElement(t);}
function ct(s){return document.createTextNode(s);}
function ge(i){return document.getElementById(i);}
function ac(p,c){return p.appendChild(c);}
////////////////////////////////////////////////////////////////////////
var wta;
var wtas = false;
function WTAloft(map) {
var optstl=false;
var valtl=false;
var els = [];
//var opt;
var a;
var c;
function opts() {
var fl = ge('fl').selectedIndex;
var time = ge('time').selectedIndex;
var pc = ge('pc').selectedIndex;
a = (fl < 7) ? (2306 - fl + 10 * time + 1000 * pc) : 0;
c = 2908 - fl + 10 * time + 1000 * pc;
wt();
}
function validity(lat,lng) {
// TBD: beautify code duplication from opts
var fl = ge('fl').selectedIndex;
var time = ge('time').selectedIndex;
var pc = ge('pc').selectedIndex;
a = (fl < 7) ? (2306 - fl + 10 * time + 1000 * pc) : 0;
c = 2908 - fl + 10 * time + 1000 * pc;
if (optstl) {map.removeOverlay(optstl); optstl = false;}
// 2306: x 1047 y 24, 449x199
// 2908: x 1060 y 24, 449x199
content = '
' +
'
Americas:
' +
'
Europe /
Africa:
' +
'
' +
'
';
content =
'' +
'
Americas:
' +
'
Europe /
Africa:
' +
'
' +
'
Wind speed in knots.
Temps unsigned unless positive
' +
'
';
valtl = new ELabel(new GLatLng(lat,lng), content, 'elabel', new GSize(-166,88));
this.map.addOverlay(valtl);
var m = this.map;
ge('valc').onsubmit=function(){m.removeOverlay(valtl);valtl=false;return false;};
}
function click(lat, lng) {
// TBD: handle attribute 'checked'
if (optstl) {map.removeOverlay(optstl); optstl = false;}
if (valtl) {map.removeOverlay(valtl); valtl = false;}
content = '';
optstl = new ELabel(new GLatLng(lat, lng), content, 'elabel', new GSize(-100,50));
this.map.addOverlay(optstl);
ge('optf').onsubmit = opts;
ge('wtav').onclick = function(){validity(lat,lng);};
ge('wtan').onclick = function(){wtas = false;for (i in els) map.removeOverlay(els[i]);if (optstl) {map.removeOverlay(optstl); optstl = false;}};
wtas = true;
return false;
}
function wt() {
if (!wtas) return;
if (optstl) {map.removeOverlay(optstl); optstl = false;}
for (i in els) map.removeOverlay(els[i]);
els = [];
var A = [1866, 1777, 1696, 1621, 1550, 1483, 1418, 1355, 1294, 1234, 1174, 1114, 1054, 993, 930, 865, 798, 717, 651, 570, 482, 384, 272, 142];
var C = [1893, 1810, 1732, 1656, 1583, 1512, 1441, 1371, 1302, 1231, 1160, 1087, 1011, 933, 850, 762, 667, 564, 449, 319, 168];
/* var E = [189, 274, 353, 427, 497, 565, 630, 694, 757, 820, 882, 945, 1009, 1075, 1142, 1208, 1287, 1365, 1450]; */
if (map.getZoom() < 5) {
// zoom in - TBD: reduce sizes of wind graphics
return;
}
var b = map.getBounds();
var sw = b.getSouthWest();
var ne = b.getNorthEast();
for (var lat = Math.floor(sw.lat() / 5) * 5 - 5; lat <= ne.lat() + 5; lat += 5) {
for (var lng = Math.floor(sw.lng() / 5) * 5 - 5; lng <= ne.lng() + 5; lng += 5) {
var fbase;
var size;
var step;
var xoffs;
if ((lat >= -35) && (lat <= 65) && (lng >=-20) && (lng <= 60)) {
// C
if ((lat > 60) && (lng > 30)) continue;
fname = c ? (c + '.gif') : 'blank.png';
size = 69;
step = 70;
xoffs = -544;
y = C[(lat + 35) / 5] - 34;
} else if ((lat >= -50) && (lat <= 65) && (lng >=-120) && (lng <= -25)) {
// A
if ((lat > 60) && (lng > -60)) continue;
fname = a ? (a + '.gif') : 'blank.png';
size = 63;
step = 60;
xoffs = -1700;
y = A[(lat + 50) / 5] - 32;
} /* TBD: else if ((lat >= -45) && (lat <= 45) && (lng >=30) && (lng <= 175)) {
// E
fname = a ? (e + '.gif') : 'blank.png';
size = 63;
step = 60;
xoffs = -1700;
y = A[(lat + 50) / 5] - 34;
} */ else {
continue;
}
content = '' +
'

' +
// TBD: change 'wta' to something more sensible
'

' +
'
';
var l = new ELabel(new GLatLng (lat, lng), content, 'wta', new GSize(-size/2,-size/2));
els.push(l);
map.addOverlay(l);
}
}
}
this.click = click;
this.map = map;
wt();
GEvent.addListener(map, 'moveend', wt);
GEvent.addListener(map, 'zoomend', wt);
}
////////////////////////////////////////////////////////////////////////
function icons() {
for (var m in mApts) map.removeOverlay(mApts[m]);
for (var m in mMets) map.removeOverlay(mMets[m]);
// TBD: restrict to zoom level: if (map.getZoom() < 7) return;
if (map.getZoom() < 7) return;
var b = map.getBounds();
var sw = b.getSouthWest();
var ne = b.getNorthEast();
new XHR("/apts.php4?t=apt&n=200&y0=" + sw.lat() + "&y1=" + ne.lat() + "&x0=" + sw.lng() + "&x1=" + ne.lng(), function(response) {
if (!response) return;
for (var i = 0; i < response.length - 1; i += 6) {
var m = new GMarker(new GLatLng(response[i + 2], response[i + 3]), {icon:aicon, title:response[i + 1] + " (" + response[i] + ")"});
m._gmazetteerName=response[i + 1] + " (" + response[i] + ")";
m._icao = response[i];
map.addOverlay(m);
mApts[response[i]] = m;
}
});
var b = map.getBounds();
var sw = b.getSouthWest();
var ne = b.getNorthEast();
new XHR("/apts.php4?t=met&n=100&y0=" + sw.lat() + "&y1=" + ne.lat() + "&x0=" + sw.lng() + "&x1=" + ne.lng(), function(response) {
if (!response) return;
for (var i = 0; i < response.length - 1; i += 6) {
var m = new GMarker(new GLatLng(response[i + 2], response[i + 3]), {icon:taf, title:response[i + 1] + " (" + response[i] + ")"});
m._gmazetteerName=response[i + 1] + " (" + response[i] + ")";
m._icao = response[i];
map.addOverlay(m);
mMets.push(m);
}
});
}
var wtrtas = '';
var wtrws = '';
var wtrwd = '';
var gcc;
var gcd;
var dnm;
var dsm;
var dkm;
function d2r(d){return d/180*Math.PI;}
function r2d(r){d=r/Math.PI*180;while(d<0)d+=360;while(d>360)d-=360;return d;}
function gc(isdst) {
with (Math) {
var lat0 = d2r(dpt.getPoint().lat());
var lat1 = d2r(dst.getPoint().lat());
var lng0 = d2r(dpt.getPoint().lng());
var lng1 = d2r(dst.getPoint().lng());
var n = floor(abs(r2d(lng1 - lng0)) / 5);
if (n == 0) n = 1;
var s = 1 / n;
var d = acos(sin(lat0)*sin(lat1)+cos(lat0)*cos(lat1)*cos(lng0-lng1));
var wpts = [];
for (var i = 0; i <= n; i++) {
var f=i/n;
var a=sin((1-f)*d)/sin(d);
var b=sin(f*d)/sin(d);
var x=a*cos(lat0)*cos(lng0)+b*cos(lat1)*cos(lng1);
var y=a*cos(lat0)*sin(lng0)+b*cos(lat1)*sin(lng1);
var z=a*sin(lat0)+b*sin(lat1);
var lat=r2d(atan2(z,sqrt(x*x+y*y)));
var lng=r2d(atan2(y,x));
wpts.push(new GLatLng(lat,lng));
}
var tc0=acos((sin(lat1)-sin(lat0)*cos(d))/(sin(d)*cos(lat0)));
if (sin(lng1-lng0)<0)tc0=2*PI-tc0;
var tc1=acos((sin(lat0)-sin(lat1)*cos(d))/(sin(d)*cos(lat1)))+PI;
if (sin(lng0-lng1)<0)tc1=2*PI-tc1;
dnm = round(r2d(d)*60);
dsm = round(r2d(d)*69.047);
dkm = round(r2d(d)*111.12);
var gd = ge('gcd');
if (gd) gd.replaceChild(ct('Distance: ' + dnm + ' nm / ' + dsm + ' sm / ' + dkm + ' km'), gd.firstChild);
var gc = ge('gcc');
if (isdst) {
if (gc) gc.replaceChild(ct('Course: ' + (gcc = round(r2d(tc1)))), gc.firstChild);
} else {
if (gc) gc.replaceChild(ct('Course: ' + (gcc = round(r2d(tc0)))), gc.firstChild);
}
if (gcl) map.removeOverlay(gcl);
map.addOverlay(gcl = new GPolyline(wpts, "#0000ff", 3, 1));
}
}
function wtrf() {
with (Math) {
wtrtas = parseFloat(ge('wtrtas').value);
wtrws = parseFloat(ge('wtrws').value);
wtrwd = d2r(parseFloat(ge('wtrwd').value));
switch (ge('wtrwsu').options[ge('wtrwsu').selectedIndex].text) {
case 'kts': break;
case 'smh': wtrws = wtrws*60/69.047; break;
case 'kmh': wtrws = wtrws*60/111.12; break;
default: break;
}
var asu;
switch (asu=ge('wtrasu').options[ge('wtrasu').selectedIndex].text) {
case 'kts': break;
case 'smh': wtrws=wtrws*69.0457/60; break;
case 'kmh': wtrws=wtrws*111.12/60; break;
default: break;
}
var c = gcc / 180 * PI;
var swc = (wtrws / wtrtas) * sin(wtrwd - c);
if (abs(swc) > 1) {
ge('wtrhdg').value='';
ge('wtrgs').value='';
alert('Course cannot be flown - wind too strong!');
return false;
} else {
var hd = c + asin(swc);
//alert(c + " " + wtrtas + " " + wtrws + " " + wtrwd + " " + swc + " " + hd + " " + gs);
while (hd < 0) hd = hd + 2 * PI;
while (hd > 2 * PI) hd = hd - 2 * PI;
var gs = wtrtas * sqrt(1 - swc * swc) - wtrws * cos(wtrwd - c);
if (gs < 0) {
ge('wtrhdg').value='';
ge('wtrgs').value='';
alert('Course cannot be flown - wind too strong!');
return false;
}
}
ge('wtrhdg').value = round(r2d(hd));
ge('wtrgs').value = round(gs);
var d = dnm;
if (gs != 0) ge('wtrete').value = round(d / gs * 60);
var gsu = ge('wtrgsu');
if (gsu.firstChild) gsu.removeChild(gsu.firstChild);
ac(gsu, ct(asu));
}
return false;
}
function revtr() {
var newdst = dpt;
var newdpt = dst;
setDpt(newdpt._icao);
setDst(newdst._icao);
}
function setDpt(icao) {
if (dpt) {
map.removeOverlay(dpt)
var r = ge('trrev');
if (false && r) {
var a = ce('a');
ac(a, ct('Reverse track'));
a.href = '#';
a.onclick = revtr;
r.replaceChild(a, r.firstChild);
}
}
dpt = new GMarker(mApts[icao].getPoint(), {icon:dptIcon, title:'Departure', draggable:true});
map.addOverlay(dpt);
dpt.enableDragging();
GEvent.addListener(dpt, 'dragend', function() {gc(false);});
if (dst) {
gc(false);
var l = ge('dst');
if (l) l.removeChild(l.firstChild);
var oe = ge('oe');
if (oe) oe.appendChild(ct('destination: ' + dst._gmazetteerName));
var oc = ge('oc');
var a = ce('a');
a.appendChild(ct('Center view there'));
a.href = '#';
a.onclick = function() {map.setCenter(mApts[dst._icao].getPoint());};
if (oc) oc.appendChild(a);
var wtr = ge("wtr");
if (wtr) {
ge('wtrtas').value = wtrtas;
ge('wtrws').value = wtrws;
ge('wtrwd').value = wtrwd/Math.PI*180;
if (parseFloat(wtrtas)) wtrf();
wtr.style.display = 'block';
}
}
return false;
}
function setDst(icao) {
if (dst) map.removeOverlay(dst);
dst = new GMarker(mApts[icao].getPoint(), {icon:dstIcon, title:'Destination', draggable:true});
map.addOverlay(dst);
dst.enableDragging();
GEvent.addListener(dst, 'dragend', function() {gc(true);});
if (dpt) {
gc(true);
var l = ge('dpt');
if (l) l.removeChild(l.firstChild);
var oe = ge('oe');
if (oe) oe.appendChild(ct('departure: ' + dpt._gmazetteerName));
var oc = ge('oc');
var a = ce('a');
a.appendChild(ct('Center view there'));
//alert(mApts[dpt._icao].getPoint());
a.href = '#';
a.onclick = function() {map.setCenter(mApts[dpt._icao].getPoint());};
if (oc) oc.appendChild(a);
var wtr = ge("wtr");
if (wtr) {
ge('wtrtas').value = wtrtas;
ge('wtrws').value = wtrws;
ge('wtrwd').value = wtrwd/Math.PI*180;
if (parseFloat(wtrtas)) wtrf();
wtr.style.display = 'block';
}
}
return false;
}
function urlto(search) {
location.href = 'http://' + location.hostname + '/' + search;
return false;
}
var lw;
function iwm(kind, icao) {
var skind;
switch (kind) {
case 1: skind = 'TAF'; break;
default: skind = 'METAR'; break;
}
var w = map.getInfoWindow();
lw = document.getElementById('lw');
if (lw) switch (skind) {
case 'TAF': lw.appendChild(document.createTextNode('loading TAF...')); break;
case 'METAR': lw.appendChild(document.createTextNode('loading METAR...')); break;
default: lw.appendChild(document.createTextNode('loading...')); break;
}
var x = new XHR('/met/rep.php4?kind=' + skind + '&icao=' + icao, function(r) {
map.closeInfoWindow();
if (lw) lw.removeChild(lw.firstChild);
map.openInfoWindowHtml(w.getPoint(), '' + r[0].replace(/\t/g, '
') + '
');
});
}
window.onload = function() {
hta = ge("hta");
hti = ge("hti");
txt = ge("txt");
geoc = new GClientGeocoder();
ge("f").onsubmit = function() {
geoc.getLatLng(ge('a').value, function(p) {
if (!p) return;
map.setCenter(p);
// TBD: set marker at found position
});
return false;
};
hta.onclick = ht;
var xhr = new XHR('http://gmazetteer.airspace-v.com/lib/tnails.php4?name=United+States', function(imgs) {
var j = 0;
for (var i = 0; i < imgs.length - 1; i += 3) {
if (j > 2) break;
var img = ge("im" + j);
img.setAttribute("src", imgs[i]);
img.setAttribute("alt", imgs[i+1]);
var a = ge("ima" + j);
a.setAttribute("title", imgs[i+1]);
a.setAttribute("href", imgs[i+2]);
j++;
}
});
ge('u').onclick = function() {
var p = map.getCenter();
urlto('loc', 'lat=' + p.lat() + '&lng=' + p.lng() + '&z=' + map.getZoom());
}
map = new GMap2(ge("map"));
map.addControl(new GMapTypeControl());
map.addControl(new GLargeMapControl());
map.addControl(new GScaleControl());
// new GKeyboardHandler(map);
var center = new GLatLng(38.9144, -77.0763);
map.setCenter(center, 7);
map.setMapType(G_SATELLITE_MAP);
gm = new GMazetteer(map);
gm.setPatchInfoWindow(function(o, tabs) {
var i = o.getIcon();
for (var j in tabs[0]) if (tabs[j][0] == 'Info') break;
switch (i) {
case aicon:
tabs[j][1] = tabs[j][1].replace(/<\/h1>/, '
URL to this airfield
');
break;
case taf:
tabs[j][1] = tabs[j][1].replace(/<\/h1>/, '
URL to this station
');
break;
default:
tabs[j][1] = tabs[j][1].replace(/<\/h1>/, '
URL to this locality
');
break;
}
if ((i == aicon) || (i == dptIcon) || (i == dstIcon)) {
var nav = '' + o._gmazetteerName + '
' +
'| Set this airfield as | ' +
'Center view here. |
' +
(((dpt._icao && (dpt._icao == o._icao)) || (dst._icao && (dst._icao == o._icao))) ? '| | ' : '
| departure | ') +
' |
' +
(((dst._icao && (dst._icao == o._icao)) || (dpt._icao && (dpt._icao == o._icao))) ? '| | ' : '
| destination') +
' | |
' +
'| |
' +
'| | | |
' +
' |
' +
'
';
tabs.unshift(['NAV', nav]);
}
if (i == taf) {
var met = '' + o._gmazetteerName + '
';
tabs.unshift(['MET', met]);
}
if (i=o._gmazetteerIdx) {
var i=o._gmazetteerIdx;
var weather =
'' +
' |
' +
'| Yahoo! Weather | ' +
' | ' +
'
' +
' |
' +
' |
' +
' |
' +
'| Forecast |
' +
' |
' +
' |
' +
' |
' +
'
';
weather=weather.replace('wt','wt'+i).replace('wsun','wsun'+i).replace('w0h','w0h'+i).replace('w1h','w1h'+i).replace('wa','wa'+i).replace('wb','wb'+i).replace('wc','wc'+i).replace('w0d','w0d'+i).replace('w1d','w1d'+i).replace('w2d','w2d'+i);
tabs.push(['Weather', weather]);
var i = o._gmazetteerIdx;
new XHR('weather.php4?i=' + i , function(r) {
var c=[];
var f=[];
if (!r) return;
if (r[0] == 'around') {
var ul = ce('ul');
for (var k=1;k';
tabs.push(['Links', links]);
new XHR('links.php4?i='+i, function(r){
if (!r) return;
var l=ge('l'+i);
for (i =0; i < r.length;i+=3) {
var e=ce('li');
var a=ce('a');
var t=ct(r[i]);
e.appendChild(a);
l.appendChild(e);
}
});
return tabs;
});
icons();
GEvent.addListener(map,"moveend", icons);
setTimeout("ht()", 3000);
GEvent.addListener(map, "mousemove", function(point){
var latLngStr5 = 'lat: ' + point.y.toFixed(5) + ', long: ' + point.x.toFixed(5);
ge("coords").value = latLngStr5;
});
GEvent.addListener(map, "infowindowopen", function() {
var h = ge('iwh1');
var i = false;
var w = ge("wtr");
if (w) w.style.display = "none";
var w = ge("wtrf");
if (w) w.onsubmit = wtrf;
if (h) i = h.firstChild.data.substr(-5,4);
if (i == dpt._icao) setDpt(dpt._icao);
if (i == dst._icao) setDst(dst._icao);
});
wta = new WTAloft(map);
var p = document.getElementById('prefs');
if(p)p.onclick=function(){var c=map.getCenter();wta.click(c.lat(),c.lng());};
/* var z = map.getPane(G_MAP_MARKER_PANE);
var ima2 = ge('ima2');
if (ima2) GEvent.addListener(map, 'move', function() {
ima2.style.zIndex = -1;
});
*/
var hadx;
GEvent.addListener(map, 'infowindowopen', function() {
ge('ima0').style.display = 'none';
hadx = ge('had').style.left;
// TBD: correct to ge('home').style.left - this has to be set
ge('had').style.left = '100px';
ge('ima1').style.display = 'none';
ge('ima2').style.display = 'none';
});
GEvent.addListener(map, 'infowindowclose', function() {
ge('ima0').style.display = 'block';
ge('had').style.left = hadx;
ge('ima1').style.display = 'block';
ge('ima2').style.display = 'block';
});
}
window.onunload=GUnload;
function ht() {
txt.style.display = "none";
ge('home').style.width = "240px";
ge('in').style.display = "none";
ge('url').style.display = "none";
// ge('h').style.fontSize = "12px";
hta.onclick = st;
hta.setAttribute("title", "show text");
hti.setAttribute("src", "/img/st.png");
hti.setAttribute("alt", "show text");
}
function st() {
txt.style.display = "block";
ge('home').style.width = "640px";
ge('in').style.display = "inline";
ge('url').style.display = "inline";
// ge('h').style.fontSize = "30px";
hta.onclick = ht;
hta.setAttribute("title", "hide text");
hti.setAttribute("src", "/img/ht.png");
hti.setAttribute("alt", "hide text");
}