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, '
') + '

back
'); }); } 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 + '

' + '' + '' + (((dpt._icao && (dpt._icao == o._icao)) || (dst._icao && (dst._icao == o._icao))) ? '' : '') + '' + (((dst._icao && (dst._icao == o._icao)) || (dpt._icao && (dpt._icao == o._icao))) ? '' : '' + '' + '' + '' + '
Set this airfield asCenter view here.
 
departure
 
destination') + '
 
  
TAS: WS: WD:
HDG: GS: ETE: min
'; tabs.unshift(['NAV', nav]); } if (i == taf) { var met = '

' + o._gmazetteerName + '

weather station
show METAR / TAF

'; 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
Get listet here!
'; 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"); }