/* ____ _____ _ _ _ _ _ _ _ / __ \ / ____| (_) | | | \ | | | | | | | | | |_ __ ___ _ __ | | __| |_ __| | ___ _ __ | \| | ___| |___ _____ _ __| | __ | | | | '_ \ / _ \ '_ \ | | |_ | | |/ _` |/ _ \ '__| | . ` |/ _ \ __\ \ /\ / / _ \| '__| |/ / | |__| | |_) | __/ | | | | |__| | | | (_| | __/ | | |\ | __/ |_ \ V V / (_) | | | < \____/| .__/ \___|_| |_| \_____|_|_|\__,_|\___|_| |_| \_|\___|\__| \_/\_/ \___/|_| |_|\_\ | | |_| */ var map; var autoc = ""; var acaff = ""; var cton = false; var tcolor = ["000000", "FF0000", "00FF00", "0000FF", "FFFF00", "00FFFF", "FF00FF", "C0C0C0", "FFFFFF"]; var ccolor = 0; var aflist = true; var vallpolon = true; var vallpoloff = true; var vallmaron = true; var vallmaroff = true; var lside = 0; // 0=right 1=left var infowindow = new google.maps.InfoWindow(); var online = []; // ([cn,alt*1,cn+"_"+ps,colcn,afdif]); var offline = []; // ([cn,alt*1,cn+"_"+ps,colcn,afdif]); var receivers = []; var all = 0; var pathl = 30; // path length 5' (30points) var unit = "m"; // metric units var onoff = 1; // 1: online, 2: offline, 3: Menu var onoffaff = "OnLine"; var triasc = 1; // 1: asc 2: desc var tricol = 0; // 0:tri sur cn 1: tri sur alti var ett1 = "
      
"; var w = 0; // watchdog variable var tmgm, tmwd; var nbreq = 0; // nb request launch var wlt = 0; // tasks white list var wlist = []; var vasp = false; var vrec = false; var vrecl = false; var vstm = false; var vapt = false; var vwin = false; var vpre = false; var hnew = false; selrec = ""; var ftype = ["unknown", "Glider/MotorGlider", "Tow Plane", "Helicopter", "Parachute", "Drop Plane", "Hangglider", "Paraglider", "Plane", "Jet", "UFO", "Balloon", "Airship", "Drone", "unknown", "Static Object"]; var ftypec = ["_b", "", "_g", "_r", "_b", "_b", "_p", "_p", "_b", "_b", "_b", "_b", "_b", "_b", "_b", "_b"]; var taskFeatures = []; var initialResolution = 2 * Math.PI * 6378137 / 256; // == 156543.0339 var originShift = 2 * Math.PI * 6378137 / 2.0; // == 20037508.34 var m2ft={"m":1, "i":3.2808}; var am2ft={"m":"m", "i":"ft"}; var kh2kt={"m":1, "i":0.53996}; var akh2kt={"m":"km/h", "i":"kt"}; var m2kt={"m":1, "i":1.94384}; var am2kt={"m":"m/s", "i":"kt"}; var hashc="",hashz="",hashm="",hasho="",hashb="",hashs="",hashl="",hasht="",hl=" ",hashw="",hashu="",hashp="",hashn="",hashy=""; // center zoom maptype offline bound autoset2ma layers tasks warning units pathlength nolist devtype // close popup function cp() { clearTimeout(tmop); var d = document.getElementById('popup'); d.style.display = 'none'; } // open popup function op(maxw) { var d = document.getElementById('popup'); d.style.display = 'block'; d.style.width = maxw + 'px'; d.style.height = maxw + 'px'; tmop = setTimeout(cp, 15000); } function chunit() { // change units if (document.getElementById('uni').checked === true) { // units imperial unit = 'i'; hashu = "&u=i"; } else { // units metric unit = 'm'; hashu = ""; } rehash(); } function chpl() { // change path length if (document.getElementById('rp1').checked === true) { // 5 minutes pathl = 30; hashp = ""; } else if (document.getElementById('rp2').checked === true) { // 10 minutes pathl = 60; hashp = "&p=2"; } else { // all points pathl = 99999; hashp = "&p=3"; } delpon(); delpoff(); rehash(); } function devtype() { // devices types selected var dt = 0; if (document.getElementById('ICAObox').checked) { dt += 1; } if (document.getElementById('Flarmbox').checked) { dt += 2; } if (document.getElementById('OGNbox').checked) { dt += 4; } if (dt == 7) hashy = ""; // all devices else hashy = "&y=" + dt; reseton(); resetoff(); rehash(); } function onofff() { switch (onoff) { case 1: if (all == 1) { onoffaff = "OffLine"; onoff = 2; } else { onoffaff = "Menu"; onoff = 3; document.getElementById("ett2").style.display = "none"; document.getElementById("dtlist").style.display = "none"; document.getElementById("menu").style.display = "block"; } break; case 2: onoffaff = "Menu"; onoff = 3; document.getElementById("ett2").style.display = "none"; document.getElementById("dtlist").style.display = "none"; document.getElementById("menu").style.display = "block"; break; case 3: onoffaff = "OnLine"; onoff = 1; document.getElementById("ett2").style.display = "block"; document.getElementById("dtlist").style.display = "block"; document.getElementById("menu").style.display = "none"; break; } afftab(); } function delpon() { // delete all online path var j = -1; while (online[++j]) { window["P_" + online[j][2]].getPath().clear(); window["M_" + online[j][2]].set('tra', 0); } } function delpoff() { // delete all offline path var j = -1; while (offline[++j]) { window["P_" + offline[j][2]].getPath().clear(); window["M_" + offline[j][2]].set('tra', 0); } } function deletepath(pol) { window[pol].getPath().clear(); window["M_" + pol.substring(2)].set('tra', 0); } function deleteallpath() { if (onoff == 1) { delpon(); } else { delpoff(); } } function allpath() { var j = -1; if (onoff == 1) { if (vallpolon === true) vallpolon = false; else vallpolon = true; while (online[++j]) { window["P_" + online[j][2]].setOptions({ visible: vallpolon }); } } else { if (vallpoloff === true) vallpoloff = false; else vallpoloff = true; while (offline[++j]) { window["P_" + offline[j][2]].setOptions({ visible: vallpoloff }); } } afftab(); } function allmarker() { var j = -1; if (onoff == 1) { if (vallmaron === true) vallmaron = false; else vallmaron = true; while (online[++j]) { window["M_" + online[j][2]].setOptions({ visible: vallmaron }); } } else { if (vallmaroff === true) vallmaroff = false; else vallmaroff = true; while (offline[++j]) { window["M_" + offline[j][2]].setOptions({ visible: vallmaroff }); } } afftab(); } function tricn() { if (tricol == 1) triasc = 1; else if (triasc == 1) triasc = 2; else triasc = 1; tricol = 0; afftab(); } function trialti() { if (tricol === 0) triasc = 1; else if (triasc == 1) triasc = 2; else triasc = 1; tricol = 1; afftab(); } function focuson(poly) { if (document.getElementById(poly) !== null) document.getElementById(poly).className = 'yel'; window[poly].setOptions({ strokeWeight: 4, strokeOpacity: 1 }); } function focusoff(poly) { if (document.getElementById(poly) !== null) document.getElementById(poly).className = 'whi'; window[poly].setOptions({ strokeWeight: 2, strokeOpacity: 0.75 }); } function asp() { if (document.getElementById('aspbox').checked) { vasp = true; airspaceoverlay.setOpacity(1); map.overlayMapTypes.setAt(1, airspaceoverlay); rempl(4, "z"); } else { vasp = false; airspaceoverlay.setOpacity(0); map.overlayMapTypes.removeAt(1); rempl(4, " "); } rehash(); } function apt() { if (document.getElementById('aptbox').checked) { vapt = true; airportoverlay.setOpacity(1); map.overlayMapTypes.setAt(2, airportoverlay); rempl(5, "a"); } else { vapt = false; airportoverlay.setOpacity(0); map.overlayMapTypes.removeAt(2); rempl(5, " "); } rehash(); } function wind() { if (document.getElementById('winbox').checked) { vwin = true; windoverlay.setOpacity(1); map.overlayMapTypes.setAt(3, windoverlay); if (map.getZoom() > 7) map.setZoom(7); rempl(2, "v"); } else { vwin = false; windoverlay.setOpacity(0); map.overlayMapTypes.removeAt(3); rempl(2, " "); } rehash(); } function pres() { if (document.getElementById('prebox').checked) { vpre = true; presoverlay.setOpacity(1); map.overlayMapTypes.setAt(4, presoverlay); if (map.getZoom() > 7) map.setZoom(7); rempl(3, "p"); } else { vpre = false; presoverlay.setOpacity(0); map.overlayMapTypes.removeAt(4); rempl(3, " "); } rehash(); } function hidenew() { if (document.getElementById('hnewbox').checked) hnew = true; else hnew = false; } function reseton() { // delete all online markers and their path var j = -1; while (online[++j]) { window["M_" + online[j][2]].setMap(null); delete window["M_" + online[j][2]]; window["P_" + online[j][2]].setMap(null); delete window["P_" + online[j][2]]; } } function resetoff() { // delete all offline markers and their path var j = -1; while (offline[++j]) { window["M_" + offline[j][2]].setMap(null); delete window["M_" + offline[j][2]]; window["P_" + offline[j][2]].setMap(null); delete window["P_" + offline[j][2]]; } } function lineoff() { if (document.getElementById('offl').checked) { all = 0; resetoff(); hasho = ""; } else { all = 1; hasho = "&o=1"; } rehash(); } function bounds() { if (document.getElementById('boundsbox').checked) { bound = true; if (document.getElementById('astmbox').checked) { vstm = false; hashs = ""; document.getElementById('astmbox').checked = false; } amax = parseFloat(document.getElementById('latmax').value); amin = parseFloat(document.getElementById('latmin').value); if (amin > amax) { var tmp = amax; amax = amin; amin = tmp; } omax = parseFloat(document.getElementById('lonmax').value); omin = parseFloat(document.getElementById('lonmin').value); if (omin > omax) { var tmp = omax; omax = omin; omin = tmp; } if (amax > 85) amax = 85; if (amin < -85) amin = -85; if (omax > 180) omax = 180; if (omin < -180) omin = -180; boundc = "&b=" + amax + "&c=" + amin + "&d=" + omax + "&e=" + omin; document.getElementById('latmax').value = amax; document.getElementById('latmin').value = amin; document.getElementById('lonmax').value = omax; document.getElementById('lonmin').value = omin; reseton(); resetoff(); hashb = "&b=" + amax.toFixed(4) + "," + amin.toFixed(4) + "," + omax.toFixed(4) + "," + omin.toFixed(4); } else { bound = false; if (vstm === false) boundc = ""; hashb = ""; } rehash(); } function afftab() { var j = -1; var dlistd = ""; var mar = ""; var pol = ""; var affcpt = ""; switch (onoff) { case 1: online.sort(ASC); if (triasc == 2) online.reverse(); while (online[++j]) { mar = "M_" + online[j][2]; pol = "P_" + online[j][2]; dlistd += ""; } affcpt = " (" + online.length + ")"; break; case 2: offline.sort(ASC); if (triasc == 2) offline.reverse(); while (offline[++j]) { mar = "M_" + offline[j][2]; pol = "P_" + offline[j][2]; dlistd += ""; } affcpt = " (" + offline.length + ")"; break; case 3: affcpt = "         "; break; } dlistd += "
" + online[j][0] + "  "; if (unit == "i") { dlistd += (online[j][1] * m2ft[unit]).toFixed(); } // { var tv=online[j][1]*m2ft[unit]; dlistd+= tv.toFixed(); } else dlistd += online[j][1] + "m"; dlistd += "
" + offline[j][0] + "  "; if (unit == "i") { dlistd += (offline[j][1] * m2ft[unit]).toFixed(); } else dlistd += offline[j][1] + "m"; dlistd += "
"; document.getElementById("dtlist").innerHTML = dlistd; if (aflist === true) document.getElementById("onoff").innerHTML = "" + onoffaff + "" + affcpt; } function ASC(a, b) { a = a[tricol]; b = b[tricol]; if (a > b) return 1; if (a < b) return -1; return 0; } function alist() { if (aflist === true) { document.getElementById("ett1").innerHTML = "
"; document.getElementById('dlist').style.width = "20px"; document.getElementById('dlist').style.height = "20px"; if (lside == 1) document.getElementById('ac').style.left = "0px"; else document.getElementById('ac').style.right = "0px"; centeroff(); aflist = false; hashn = "&n=0"; } else { document.getElementById("ett1").innerHTML = ett1; document.getElementById('dlist').style.width = "180px"; document.getElementById('dlist').style.height = "90%"; if (lside == 1) document.getElementById('ac').style.left = "180px"; else document.getElementById('ac').style.right = "180px"; aflist = true; afftab(); hashn = ""; } rehash(); } function sideclick() { // change list position (left<->right) if (lside === 0) { document.getElementById('dlist').className = "lleft"; document.getElementById('ac').className = "acleft"; document.getElementById('ac').style.right = ""; lside = 1; map.setOptions({ mapTypeControlOptions: { position: google.maps.ControlPosition.TOP_RIGHT }, streetViewControlOptions: { position: google.maps.ControlPosition.RIGHT_TOP }, zoomControlOptions: { position: google.maps.ControlPosition.RIGHT_TOP } }); } else { document.getElementById('dlist').className = "lright"; document.getElementById('ac').className = "acright"; document.getElementById('ac').style.left = ""; lside = 0; map.setOptions({ mapTypeControlOptions: { position: google.maps.ControlPosition.TOP_LEFT }, streetViewControlOptions: { position: google.maps.ControlPosition.LEFT_TOP }, zoomControlOptions: { position: google.maps.ControlPosition.LEFT_TOP } }); } } function autocenter(mark) { document.getElementById("divInfoac").innerHTML = "AC: " + window[mark].get('title'); autoc = mark; document.getElementById("divInfoac").style.display = "block"; map.setCenter(window[mark].getPosition()); } function centeron(mark) { cton = true; map.setCenter(window[mark].getPosition()); } function centeroff() { if (autoc !== "") { map.setCenter(window[autoc].getPosition()); } cton = false; } function vpolmar(chk, polmar) { window[polmar].setOptions({ visible: chk }); } function isvisib(pol) { if (window[pol].getVisible() === true) return "checked"; else return ""; } function dec2dms(dec) { dec = Math.abs(dec); var decd = Math.floor(dec); var decm = Math.floor((dec - decd) * 60); var decs = Math.floor((dec - decd - (decm / 60)) * 3600); return "" + decd + "° " + decm + "' " + decs + "\""; } function changecolor(mark) { var colactive = window[mark].get('icol'); if (++colactive == 9) colactive = 0; var ncol = tcolor[colactive]; window[window[mark].get('poly')].setOptions({ strokeColor: '#' + ncol }); window[mark].set('icol', "" + colactive); return "#" + ncol; } function redraw(pol) { var p = pol.substring(2); var mrk = window["M_" + p]; var fi = mrk.get('fid'); var lo = mrk.getPosition().lng().toFixed(); mrk.set('tra', 1); downloadUrl(tld + '/' + cxml1 + '?id=' + p + "&l=" + lo, function(data) { var vtrace = data.documentElement.getElementsByTagName("m"); var err = parseFloat(vtrace[0].getAttribute("e")); var idd = vtrace[0].getAttribute("i"); var encodedt = vtrace[0].getAttribute("r"); if (err === 0 && encodedt.length > 2) { window['P_' + idd].getPath().clear(); var ftrace = google.maps.geometry.encoding.decodePath(encodedt); window['P_' + idd].setPath(ftrace); } }); } function taskbox() { var vtas = false; if (document.getElementById('taskbox').checked) { vtas = true; if (wlt == 2) { --wlt; reseton(); resetoff(); } } else { if (wlt == 1) { ++wlt; reseton(); resetoff(); } } var j = -1; while (taskFeatures[++j]) { taskFeatures[j].setOptions({ visible: vtas }); } } function reclbox() { if (document.getElementById('reclbox').checked) { vrecl = true; rempl(6, "r"); } else { vrecl = false; rempl(6, " "); } var j = -1; while (receivers[++j]) { window["R_" + receivers[j][0]].setOptions({ visible: vrecl }); } rehash(); } function checkrec() { downloadUrl(tld + '/' + rxml, function(data) { var vlrec = data.documentElement.getElementsByTagName("m"); var err = parseFloat(vlrec[0].getAttribute("e")); if (err === 0 && vlrec.length > 1) { selrec = ""; // effacer markers var j = -1; while (receivers[++j]) { window["R_" + receivers[j][0]].setMap(null); delete window["R_" + receivers[j][0]]; } receivers.length = 0; for (var i = 1; i < vlrec.length; i++) { var re = vlrec[i].getAttribute("a"); var rlat = parseFloat(vlrec[i].getAttribute("b")); var rlon = parseFloat(vlrec[i].getAttribute("c")); var ract = parseInt(vlrec[i].getAttribute("d")); var rind = 2000 * ract; selrec += ""; receivers.push([re, rlat, rlon]); // lat et lon stockées mais jamais utilisées ? window["R_" + re] = new google.maps.Marker({ position: new google.maps.LatLng(rlat, rlon), title: "Receiver: " + re, map: map, icon: "" + tld + "/pict/rec" + ract + ".png", zIndex: rind, visible: vrecl }); } setTimeout(checkrec, 120000); } else { selrec = ""; setTimeout(checkrec, 20000); } reclbox(); }); } function receiv() { if (document.getElementById('recbox').checked) { vrec = true; } else { vrec = false; } } function affinfodata(mark) { var mrk = window[mark]; var vz = mrk.get('vz') * m2kt[unit]; var vx = mrk.get('speed') * kh2kt[unit]; var al = mrk.get('alt') * m2ft[unit]; document.getElementById("aclt").innerHTML = mrk.get('tim'); document.getElementById("acla").innerHTML = mrk.getPosition().lat().toFixed(6); document.getElementById("aclo").innerHTML = mrk.getPosition().lng().toFixed(6); document.getElementById("acal").innerHTML = al.toFixed() + " " + am2ft[unit]; document.getElementById("acsp").innerHTML = vx.toFixed() + " " + akh2kt[unit]; document.getElementById("actr").innerHTML = mrk.get('track'); document.getElementById("acvz").innerHTML = ((vz >= 0) ? "+" : "–") + Math.abs(vz).toFixed(1) + " " + am2kt[unit]; var re = mrk.get('rec'); if (typeof(window["R_" + re]) != 'undefined') { var mre = window["R_" + re]; var di = dist(mrk.getPosition().lat(), mrk.getPosition().lng(), mre.getPosition().lat(), mre.getPosition().lng()); re += " (" + di.toFixed() + " Km)"; } else { re += " (?)"; } document.getElementById("acrx").innerHTML = re; } function affinfodata2(mark) { var mrk = window[mark]; document.getElementById("acmo").innerHTML = mrk.get('model'); } function affinfo(mark) { affinfodata(mark); var mrk = window[mark]; var rg = mrk.get('reg'); var fi = mrk.get('fid'); var vd = "block"; if (fi == rg) vd = "none"; document.getElementById("ac1").style.display = vd; document.getElementById("accn").innerHTML = mrk.get('cn'); document.getElementById("acfi").innerHTML = fi; document.getElementById("acre").innerHTML = rg; document.getElementById("acty").innerHTML = ftype[mrk.get('type') * 1]; document.getElementById("acmo").innerHTML = ""; if (fi != "hidden") { document.getElementById("acif").innerHTML = "Infos    Pictures"; if (mrk.get('dinfo') === "") { downloadUrl(tld + '/' + dxml + '?i=' + mark + '&f=' + fi, function(data) { var dat = data.documentElement.getElementsByTagName("m"); var err = parseFloat(dat[0].getAttribute("g")); var mrk = dat[0].getAttribute("i"); if (err === 0) { window[mrk].set('model', "" + dat[0].getAttribute("c")); affinfodata2(mrk); document.getElementById("ac2").style.display = "block"; window[mrk].set('dinfo', "ok"); } else { window[mrk].set('dinfo', "_"); document.getElementById("ac2").style.display = "none"; } }); } else { if (mrk.get('dinfo') != "_") { affinfodata2(mark); document.getElementById("ac2").style.display = "block"; } else { document.getElementById("ac2").style.display = "none"; } } } else { document.getElementById("ac2").style.display = "none"; document.getElementById("acif").innerHTML = ""; document.getElementById("acmo").innerHTML = ""; } acaff = mark; document.getElementById("ac").style.display = "block"; } function settomap() { var b = map.getBounds(); amax = b.getNorthEast().lat(); amin = b.getSouthWest().lat(); omax = b.getNorthEast().lng(); omin = b.getSouthWest().lng(); if (amax > 85) amax = 85; if (amin < -85) amin = -85; if (omax > 180) omax = 180; if (omin < -180) omin = -180; document.getElementById('latmax').value = amax; document.getElementById('latmin').value = amin; document.getElementById('lonmax').value = omax; document.getElementById('lonmin').value = omin; if (bound === true) bounds(); if (vstm === true) { boundc = "&b=" + amax + "&c=" + amin + "&d=" + omax + "&e=" + omin; hashs = "&s=1"; rehash(); } } function astm() { if (document.getElementById('astmbox').checked) { vstm = true; if (document.getElementById('boundsbox').checked) { bound = false; document.getElementById('boundsbox').checked = false; hashb = ""; } settomap(); } else { vstm = false; if (bound === false) boundc = ""; hashs = ""; rehash(); } } function dist(lat1, lon1, lat2, lon2) { var torad = Math.PI / 180; lat1 *= torad; lon1 *= torad; lat2 *= torad; lon2 *= torad; var dt = Math.acos((Math.sin(lat1) * Math.sin(lat2)) + (Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2))); dt *= 6366; return dt; } function gesmark() { if (nbreq > 0) { --nbreq; return; } ++nbreq; downloadUrl(tld + '/' + cxml + "?a=" + all + boundc + recc + parc + tz + hashy, function(data) { ++w; var planeurs = data.documentElement.getElementsByTagName("m"); online.length = 0; offline.length = 0; var colcn; var del = "N"; for (var i = 0; i < planeurs.length; i++) { // récupération des données transmises pour ce planeur var tab = planeurs[i].getAttribute("a").split(","); var fid = tab[12]; if (wlt == 1) { if (wlist.indexOf(fid) == -1) continue; } var ps = tab[3]; var lat = parseFloat(tab[0]); var lon = parseFloat(tab[1]); var cn = tab[2]; if (cn == "") cn = "_"; var alt = tab[4]; var tim = tab[5]; var ddf = tab[6]; var track = tab[7]; var speed = tab[8]; var vz = tab[9]; var typ = tab[10]; var rec = tab[11]; var crc = tab[13]; var posi = new google.maps.LatLng(lat, lon); var polyvar = "P_" + crc; var markvar = "M_" + crc; var visib = true; if (typeof(window[polyvar]) == 'undefined') // If aircraft not already created { // create path color for array hcol = tcolor[ccolor]; if (hnew === true) visib = false; // create Marker var polyOptions = { strokeColor: '#' + hcol, strokeOpacity: 0.75, strokeWeight: 2, visible: visib }; window[polyvar] = new google.maps.Polyline(polyOptions); window[polyvar].setMap(map); window[polyvar].set('nom', "" + cn + " - " + ps); window[polyvar].set('poly', "" + polyvar); window[polyvar].getPath().push(posi); // ajout d'une position sur le tracé google.maps.event.addListener(window[polyvar], "mouseover", function() { focuson(this.get('poly')); var bcol = this.strokeColor; document.getElementById("divInfo").innerHTML = "    " + this.get('nom'); }); google.maps.event.addListener(window[polyvar], "mouseout", function() { focusoff(this.get('poly')); document.getElementById("divInfo").innerHTML = " "; }); // création du Marker window[markvar] = new google.maps.Marker({ position: posi, title: cn + " - " + ps + " @ " + alt + "m", map: map, icon: "" + tld + "/markers/" + cn + ftypec[typ * 1] + ".png", visible: visib }); window[markvar].set('poly', "" + polyvar); window[markvar].set('mark', "" + markvar); window[markvar].set('nom', "" + cn + " - " + ps); window[markvar].set('cn', "" + cn); window[markvar].set('reg', "" + ps); if (fid == "0") fid = "hidden"; window[markvar].set('fid', "" + fid); window[markvar].set('type', "" + typ); window[markvar].set('icol', "" + ccolor); window[markvar].set('off', 0); window[markvar].set('dinfo', ""); window[markvar].setTitle("" + cn + " - " + ps + " @ " + (alt * m2ft[unit]).toFixed() + am2ft[unit] + " @ " + tim); window[markvar].set('speed', "" + speed); window[markvar].set('track', "" + track); window[markvar].set('vz', "" + vz); window[markvar].set('tim', "" + tim); window[markvar].set('rec', "" + rec); window[markvar].set('alt', "" + alt); window[markvar].set('tra', 0); google.maps.event.addListener(window[markvar], "mouseover", function() { var bcol = window[this.get('poly')].strokeColor; document.getElementById("divInfo").innerHTML = "    " + this.get('nom'); focuson(this.get('poly')); }); google.maps.event.addListener(window[markvar], "mouseout", function() { document.getElementById("divInfo").innerHTML = " "; focusoff(this.get('poly')); }); google.maps.event.addListener(window[markvar], "click", function() { affinfo(this.get('mark')); }); google.maps.event.addListener(window[markvar], "dblclick", function() { document.getElementById("divInfoac").innerHTML = "AC: " + this.get('title'); autoc = this.get('mark'); document.getElementById("divInfoac").style.display = "block"; map.setCenter(this.position); }); google.maps.event.addListener(window[markvar], "rightclick", function() { var pol = this.get('poly'); redraw(pol); }); if (++ccolor == 9) ccolor = 0; } // fin du if typeof... var difalt = vz * 1; colcn = window[polyvar].strokeColor; if (ddf < 600) { // if online (active during 10 last minutes) if (ddf > 120) afdif = "n"; else if (difalt === 0) afdif = "z"; else if (difalt < -4) afdif = "mmm"; else if (difalt < -1) afdif = "mm"; else if (difalt < 0) afdif = "m"; else if (difalt > 4) afdif = "ppp"; else if (difalt > 1) afdif = "pp"; else afdif = "p"; online.push([cn, alt * 1, crc, colcn, afdif]); if (window[markvar].get('off') == 1) { window[markvar].setOptions({ zIndex: 50 }); window[markvar].setIcon("" + tld + "/markers/" + cn + ftypec[typ * 1] + ".png"); window[markvar].set('off', 0); } if (window[markvar].get('tra') === 0) { if (window[polyvar].getPath().getLength() >= pathl) window[polyvar].getPath().removeAt(0); // remove first point of the trace } window[polyvar].getPath().push(posi); // ajout d'une position sur le tracé window[markvar].setPosition(posi); // déplace le marker // change l'altitude affichée window[markvar].setTitle("" + cn + " - " + ps + " @ " + (alt * m2ft[unit]).toFixed() + am2ft[unit] + " @ " + tim); window[markvar].set('speed', "" + speed); window[markvar].set('track', "" + track); window[markvar].set('vz', "" + vz); window[markvar].set('tim', "" + tim); window[markvar].set('rec', "" + rec); window[markvar].set('alt', "" + alt); } else { if (all === 0) { if (typeof(window[polyvar]) != 'undefined') { // si pas déjà effacé // efface et détruit le PolyLine et le Marker window[polyvar].setMap(null); delete window[polyvar]; window[markvar].setMap(null); delete window[markvar]; if (autoc == markvar) { autoc = ""; document.getElementById("divInfoac").innerHTML = " "; document.getElementById("divInfoac").style.display = "none"; } if (acaff == markvar) acaff = ""; } } else { offline.push([cn, alt * 1, crc, colcn, "n"]); if (window[markvar].get('off') === 0) { window[markvar].setOptions({ zIndex: 10 }); window[markvar].setIcon("" + tld + "/markers/" + cn + "_o.png"); window[markvar].set('off', 1); } } } if (autoc == markvar) { document.getElementById("divInfoac").innerHTML = "AC: " + cn + " - " + ps + " @ " + (alt * m2ft[unit]).toFixed() + am2ft[unit]; if (cton === false) map.setCenter(new google.maps.LatLng(lat, lon)); } if (acaff == markvar) affinfodata(markvar); } // fin du for (var i = 0; i < planeurs.length; i++) // tri et affichage du tableau afftab(); if (--nbreq < 0) { nbreq = 0; } else { tmgm = setTimeout(gesmark, 10000); } }); } function wd() { if (w === 0) { clearTimeout(tmgm); gesmark(); } w = 0; tmwd = setTimeout(wd, 30000); } function rehash() { window.location.replace("#" + hashc + hashz + hashm + hasho + hashb + hashs + hashl + hashw + hashp + hashu + hashn + hashy); } function rempl(po, c) { var thl = hl; hl = thl.substring(0, po) + c + thl.substring(po + 1); thl = hl.replace(/ /g, ''); if (thl === '') hashl = ''; else hashl = "&l=" + thl; } function taskclic() { document.getElementById("chfile").click(); } function loadtask(cont) { var tasks = []; try { tasks = tasks.concat(parseJSONTasks(cont)); } catch (err) { tasks.push(parseXCSoarTask(cont)); } for (var i = 0; i < tasks.length; i++) { showTask(tasks[i]); filterDevices(tasks[i].wlist); } } function parseJSONTasks(cont) { var res = JSON.parse(cont); var tasks = []; for (var i = 0; i < res.tasks.length; i++) { var task = {}; task.name = res.tasks[i].name; task.color = res.tasks[i].color; var tp = []; if (typeof res.tasks[i].legs != 'undefined') { for (var ii = 0; ii < res.tasks[i].legs.length; ii++) { if (typeof res.tasks[i].legs[ii][1] == 'undefined') { // circle tp[tp.length - 1].type = "circle"; tp[tp.length - 1].radius = res.tasks[i].legs[ii][0]; } else { tp.push({ lat: res.tasks[i].legs[ii][0], lon: res.tasks[i].legs[ii][1] }); } } } task.turnpoints = tp; if (typeof res.tasks[i].wlist != 'undefined') { task.wlist = []; for (var ii = 0; ii < res.tasks[i].wlist.length; ii++) { task.wlist.push(res.tasks[i].wlist[ii]); } } tasks.push(task); } return tasks; } function parseXCSoarTask(cont) { var ltp; var tp = []; var wl = []; tp.length = 0; var oParser = new DOMParser(); var oDOM = oParser.parseFromString(cont, "text/xml"); var points = oDOM.getElementsByTagName("Point"); for (var i = 0; i < points.length; i++) { var loc = points[i].getElementsByTagName("Waypoint")[0].getElementsByTagName("Location")[0]; var ltp = { lat: loc.getAttribute("latitude"), lon: loc.getAttribute("longitude") }; if (points[i].getElementsByTagName("ObservationZone")[0].getAttribute("type") == "Cylinder") { ltp.type = "circle"; ltp.radius = parseFloat(points[i].getElementsByTagName("ObservationZone")[0].getAttribute("radius")); } tp.push(ltp); } var task = { turnpoints: tp }; return task; } function showTask(task) { var tc, tn, ltp; var tp = []; tn = task.name || 'task ' + taskFeatures.length; tc = task.color || 'FF0000'; for (var ii = 0; ii < task.turnpoints.length; ii++) { if ((task.turnpoints[ii].type == 'circle')) { point = new google.maps.LatLng(task.turnpoints[ii].lat, task.turnpoints[ii].lon); tp.push(point); aatCircle = new google.maps.Circle({ strokeColor: '#' + tc, strokeOpacity: 0.5, strokeWeight: 2, fillColor: '#' + tc, fillOpacity: 0.1, map: map, center: point, radius: task.turnpoints[ii].radius }); taskFeatures.push(aatCircle); } else { // Point point = new google.maps.LatLng(task.turnpoints[ii].lat, task.turnpoints[ii].lon); tp.push(point); } } var flightPath = new google.maps.Polyline({ path: tp, strokeColor: '#' + tc, strokeOpacity: 1, strokeWeight: 2, map: map }); flightPath.set('nom', '' + tn); taskFeatures.push(flightPath); google.maps.event.addListener(flightPath, 'mouseover', function() { var bcol = this.strokeColor; document.getElementById('divInfo').innerHTML = '    task: ' + this.get('nom'); }); google.maps.event.addListener(flightPath, 'mouseout', function() { document.getElementById('divInfo').innerHTML = ' '; }); document.getElementById('dtaskbox').innerHTML = ''; } function filterDevices(wl) { if (typeof wl != 'undefined') { for (var i = 0; i < wl.length; i++) { wlist.push(wl[i]); } } if (wlist.length > 0) { wlt = 1; reseton(); resetoff(); } } function rtask() { // select a task file var files = document.getElementById('chfile').files; if (!files.length) { alert('Please select a file!'); return; } var file = files[0]; var reader = new FileReader(); reader.onloadend = function(evt) { if (evt.target.readyState == FileReader.DONE) { var cont = evt.target.result; cont = cont.trim(); loadtask(cont); } }; reader.readAsText(file); } function initialize() { var has = window.location.hash.substring(1).split('&'); // parse the parameters var parh = []; var cent = []; var gmdelay = 0; // to delay first call to gesmark if task file required for (var i = 0; i < has.length; i++) { var x = has[i].split('='); parh[x[0]] = x[1]; } // parameter c=lat,lon (center of the map) if (typeof(parh.c) != 'undefined') { cent = parh.c.split(','); vlat = parseFloat(cent[0]); vlon = parseFloat(cent[1]); hashc = "c=" + vlat.toFixed(5) + "," + vlon.toFixed(5); } // parameter o=1 (display offline) if (typeof(parh.o) != 'undefined') { if (parh.o == "1") { all = 1; hasho = "&o=1"; } } airspaceoverlay = new google.maps.ImageMapType({ getTileUrl: function(tile, zoom) { var tx = tile.x; var ty = tile.y; var res = initialResolution / Math.pow(2, zoom); ty = ((1 << zoom) - ty - 1); // TMS var swlon = tx * 256 * res - originShift; var swlat = ty * 256 * res - originShift; var nelon = (tx + 1) * 256 * res - originShift; var nelat = (ty + 1) * 256 * res - originShift; var baseURL = "http://maps.openaip.net/geowebcache/service/wms?service=WMS&request=GetMap&version=1.1.1&layers=openaip_approved_airspaces_geometries&styles=&format=image/png&transparent=true&height=256&width=256&srs=EPSG:900913&bbox="; var url = baseURL + swlon + "," + swlat + "," + nelon + "," + nelat; return url; }, maxZoom: 17, minZoom: 4, opacity: 0, tileSize: new google.maps.Size(256, 256) }); airportoverlay = new google.maps.ImageMapType({ getTileUrl: function(tile, zoom) { var tx = tile.x; var ty = tile.y; var res = initialResolution / Math.pow(2, zoom); ty = ((1 << zoom) - ty - 1); // TMS var swlon = tx * 256 * res - originShift; var swlat = ty * 256 * res - originShift; var nelon = (tx + 1) * 256 * res - originShift; var nelat = (ty + 1) * 256 * res - originShift; var baseURL = "http://maps.openaip.net/geowebcache/service/wms?service=WMS&request=GetMap&version=1.1.1&layers=openaip_approved_airports&styles=&format=image/png&transparent=true&height=256&width=256&srs=EPSG:900913&bbox="; var url = baseURL + swlon + "," + swlat + "," + nelon + "," + nelat; return url; }, maxZoom: 17, minZoom: 6, opacity: 0, tileSize: new google.maps.Size(256, 256) }); windoverlay = new google.maps.ImageMapType({ getTileUrl: function(tile, zoom) { if (zoom > 7) return; return "http://www.openportguide.org/tiles/actual/wind_vector/5/" + zoom + "/" + tile.x + "/" + tile.y + ".png"; }, maxZoom: 7, opacity: 0, tileSize: new google.maps.Size(256, 256) }); presoverlay = new google.maps.ImageMapType({ getTileUrl: function(tile, zoom) { if (zoom > 7) return; return "http://www.openportguide.org/tiles/actual/surface_pressure/5/" + zoom + "/" + tile.x + "/" + tile.y + ".png"; }, maxZoom: 7, opacity: 0, tileSize: new google.maps.Size(256, 256) }); var myOptions = { mapTypeControlOptions: { mapTypeIds: [google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.TERRAIN, google.maps.MapTypeId.SATELLITE, google.maps.MapTypeId.HYBRID] }, center: new google.maps.LatLng(vlat, vlon), draggableCursor: 'default', draggingCursor: 'default', mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.TOP_LEFT }, scaleControl: true, streetViewControl: true, streetViewControlOptions: { position: google.maps.ControlPosition.LEFT_TOP }, zoom: 13, zoomControl: true, zoomControlOptions: { position: google.maps.ControlPosition.LEFT_TOP } }; map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); var mid = 'TERRAIN'; var tmid = { "r": "ROADMAP", "t": "TERRAIN", "s": "SATELLITE", "h": "HYBRID" }; // parameter m= map type if (typeof(parh.m) != 'undefined') { mid = tmid[parh.m]; hashm = "&m=" + parh.m; } map.setMapTypeId(google.maps.MapTypeId[mid]); google.maps.event.addListener(map, 'maptypeid_changed', function() { hashm = "&m=" + map.getMapTypeId().substr(0, 1); rehash(); }); google.maps.event.addListener(map, 'click', function() { infowindow.close(); }); google.maps.event.addListener(map, 'bounds_changed', function() { if (vstm === true) settomap(); }); google.maps.event.addListener(map, 'zoom_changed', function() { hashz = "&z=" + map.getZoom(); rehash(); }); google.maps.event.addListener(map, 'center_changed', function() { var nc = map.getCenter(); hashc = "c=" + nc.lat().toFixed(5) + "," + nc.lng().toFixed(5); rehash(); }); // parameter z= zoom level if (typeof(parh.z) != 'undefined') map.setZoom(parseInt(parh.z)); else { var southWest = new google.maps.LatLng(vlatmin, vlonmin); var northEast = new google.maps.LatLng(vlatmax, vlonmax); var bounds = new google.maps.LatLngBounds(southWest, northEast); map.fitBounds(bounds); } var divinfoCont = document.createElement('DIV'); // contener glider info when overmouse divinfoCont.style.paddingTop = "7px"; divinfoCont.style.paddingRight = "3px"; var divinfoContac = document.createElement('DIV'); // contener autocenter divinfoContac.style.paddingTop = "7px"; divinfoContac.style.paddingRight = "3px"; var divinfoContpb = document.createElement('DIV'); // contener poweredby divinfoContpb.style.paddingTop = "7px"; divinfoContpb.style.paddingRight = "3px"; var divInfo = document.createElement("div"); divInfo.id = "divInfo"; divInfo.className = "divInfoclass"; divInfo.style.width = "170px"; divInfo.style.float = "left"; divInfo.style.display = "block"; divInfo.appendChild(document.createTextNode("...")); var divInfoac = document.createElement("div"); divInfoac.id = "divInfoac"; divInfoac.className = "divInfoclass"; divInfoac.style.width = "170px"; divInfoac.style.cursor = 'pointer'; divInfoac.style.float = "left"; divInfoac.style.display = "none"; divInfoac.appendChild(document.createTextNode("...")); var divInfopb = document.createElement("div"); divInfopb.id = "divInfopb"; //divInfopb.className = "divInfoclass"; //divInfopb.style.width = "170px"; divInfopb.style.backgroundColor = '#F5F5F5'; divInfopb.style.opacity = 0.7; divInfopb.style.cursor = 'pointer'; divInfopb.style.float = "left"; divInfopb.style.display = "block"; divInfopb.innerHTML = "  Powered By GliderNet.Org  "; // divInfopb.appendChild ( document.createTextNode("Powered By GliderNet.Org")); divinfoCont.appendChild(divInfo); divinfoContac.appendChild(divInfoac); divinfoContpb.appendChild(divInfopb); divinfoCont.index = 1; map.controls[google.maps.ControlPosition.TOP_CENTER].push(divinfoCont); map.controls[google.maps.ControlPosition.TOP_LEFT].push(divinfoContac); map.controls[google.maps.ControlPosition.TOP_RIGHT].push(divinfoContpb); google.maps.event.addDomListener(divInfoac, 'click', function() { document.getElementById("divInfoac").innerHTML = " "; autoc = ""; document.getElementById("divInfoac").style.display = "none"; }); // affiche l'altitude du terrain quand clic-droit elevator = new google.maps.ElevationService(); google.maps.event.addListener(map, 'rightclick', function(event) { var locations = []; var clickedLocation = event.latLng; locations.push(clickedLocation); var latc = clickedLocation.lat(); var alat = (latc >= 0 ? "N" : "S") + " " + dec2dms(latc); var lonc = clickedLocation.lng(); var alon = (lonc >= 0 ? "E" : "W") + " " + dec2dms(lonc); var positionalRequest = { 'locations': locations }; elevator.getElevationForLocations(positionalRequest, function(results, status) { if (status == google.maps.ElevationStatus.OK) { if (results[0]) { var te = Math.round(results[0].elevation); infowindow.setContent('Elevation:' + (te * m2ft[unit]).toFixed() + am2ft[unit] + '
Lat: ' + alat + '
Lon: ' + alon); infowindow.setPosition(clickedLocation); infowindow.open(map); } else { alert('No results found'); } } else { alert('Elevation service failed due to: ' + status); } }); }); document.getElementById("ett1").innerHTML = ett1; document.getElementById("ett2").innerHTML = "
CNAlti.Vz
"; document.getElementById("ac").innerHTML = "   ..::Aircraft::..
CN:
Regist.:
Device Id:
Type:
Model:
Last time:
Latitude:
Longitude:
Altitude:
G.Speed:
Track:  °
Vz:
Receiver:
"; document.getElementById("dtable").innerHTML = "
"; document.getElementById("menu").innerHTML = "
Hide new gliders
Ignore Offline
Bounds

       
Auto Set to map
..:: Devices ::..
ICAO
Flarm
OGN Trackers
..:: Layers ::..
Wind
Pressure
AirSpaces ( openaip.net )
Airports ( openaip.net )
Receivers
Tasks

..::Units::..
Met. Imp.
..::Path length::..
5' 10' All
Join the
OGN DataBase

Sources
"; // parameter b=lat1,lon1,lat2,lon2 bounds if (typeof(parh.b) != 'undefined') { cent = parh.b.split(','); document.getElementById('latmax').value = parseFloat(cent[0]); document.getElementById('latmin').value = parseFloat(cent[1]); document.getElementById('lonmax').value = parseFloat(cent[2]); document.getElementById('lonmin').value = parseFloat(cent[3]); boundc = "&b=" + cent[0] + "&c=" + cent[1] + "&d=" + cent[2] + "&e=" + cent[3]; document.getElementById('boundsbox').checked = true; bound = true; hashb = "&b=" + cent[0] + "," + cent[1] + "," + cent[2] + "," + cent[3]; } // parameter l= active layers if (typeof(parh.l) != 'undefined') { for (var i = 0; i < parh.l.length; i++) { switch (parh.l[i]) { case 'v': // wind document.getElementById('winbox').checked = true; wind(); break; case 'p': // pressure document.getElementById('prebox').checked = true; pres(); break; case 'z': // airspace document.getElementById('aspbox').checked = true; asp(); break; case 'a': // airport document.getElementById('aptbox').checked = true; apt(); break; case 'r': // receivers document.getElementById('reclbox').checked = true; break; } } } if (typeof(parh.t) != 'undefined') { gmdelay = 1; var xhr = new XMLHttpRequest(); xhr.open("GET", parh.t, true); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { var status = xhr.status; if ((status >= 200 && status < 300) || status === 304) { loadtask(xhr.responseText); } else { alert("Task Request unsuccessful" + status); } } gesmark(); }; xhr.send(null); } // parameter w=0 (Don't display the warning) var warn = 1; if (typeof(parh.w) != 'undefined') { if (parh.w == "0") { warn = 0; hashw = "&w=0"; } } // parameter n=0 (Hide the panel) if (typeof(parh.n) != 'undefined') { if (parh.n == "0") { alist(); } } if (warn == 1) { document.getElementById("popup").innerHTML = "\"close\"

Warning!


The data on this site can be ambiguous in certain situations and the displayed position of an aircraft or glider can be displaced relative to the actual position.
Before raising an alert please contact us so we can interpret the data correctly.


If you want your devices to be identified, join the OGN DataBase.

"; op(300); } // parameter s=1 auto set bounds to the map if (typeof(parh.s) != 'undefined') { if (parh.s == "1") { document.getElementById('astmbox').checked = true; vstm = true; hashs = "&s=1"; } } // parameter u=i units imperial ou metric (default)) if (typeof(parh.u) != 'undefined') { if (parh.u == "i") { document.getElementById('uni').checked = true; unit = "i"; hashu = "&u=i"; } } // parameter p=1,2 or 3 path length 5", 10" or all points if (typeof(parh.p) != 'undefined') { if (parh.p == "2") { // 10 minutes pathl = 60; document.getElementById('rp2').checked = true; hashp = "&p=2"; } else if (parh.p == "3") { // all points pathl = 99999; document.getElementById('rp3').checked = true; hashp = "&p=3"; } } // parameter device type d=1 ICAO ,2 Flarm or 3 OGN tracker if (typeof(parh.y) != 'undefined') { if ((parh.y & 1) == 1) { document.getElementById('ICAObox').checked = true; } if ((parh.y & 2) == 2) { document.getElementById('Flarmbox').checked = true; } if ((parh.y & 4) == 4) { document.getElementById('OGNbox').checked = true; } devtype(); } else { document.getElementById('ICAObox').checked = true; document.getElementById('Flarmbox').checked = true; document.getElementById('OGNbox').checked = true; } tz = "&z=" + (tz / -60); // the javascript gettimezone function return negative value in minutes then /-60 to have correct hours rehash(); checkrec(); tmwd = setTimeout(wd, 30000); if (gmdelay == 0) gesmark(); }