var map;
var isloaded=0;
var blip=[];
var icon;
var points=[];
var wptbg=[];
var xmlDoc;
var ismultitrack=false;
var isplaying=false;
var framenumber=0;
var polylinecount=0;
var replayspeed=100;
var zoomlatpadding=0.001;
var zoomlngpadding=0.001;
var lastxmlurl;
var sectors=["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"];
var unitsspd=0,unitsdst=0,unitsalt=0,unitsvsi=0,unitsdeg=0,unitsarea=0;
function setUnits(_1,_2,_3,_4,_5,_6){
unitsspd=_1;
unitsdst=_2;
unitsvsi=_4;
unitsalt=_3;
unitsdeg=_5;
unitsarea=_6;
}
function formatSpeed(_7){
if(unitsspd==1){
return "<b>"+(_7*3.6/1.609344).toFixed(1)+"</b> mph";
}else{
if(unitsspd==2){
return "<b>"+(_7*3.6/1.852).toFixed(1)+"</b> kts";
}else{
if(unitsspd==3&&_7<0.01){
return "-";
}else{
if(unitsspd==3){
return "<b>"+formatDurationPlain(1000000/_7)+"</b>/km";
}else{
if(unitsspd==4){
return "<b>"+(_7).toFixed(1)+"</b> m/s";
}else{
return "<b>"+(_7*3.6).toFixed(1)+"</b> km/h";
}
}
}
}
}
}
function formatDistance(_8){
if(unitsdst==1){
return "<b>"+(_8/1609.344).toFixed(1)+"</b> M";
}else{
if(unitsdst==2){
return "<b>"+(_8/1852).toFixed(1)+"</b> NM";
}else{
if(unitsdst==3&&_8>1500){
return "<b>"+(_8/1609.344).toFixed(1)+"</b> M";
}else{
if(unitsdst==3){
return "<b>"+(_8).toFixed(0)+"</b> m";
}else{
return "<b>"+(_8/1000).toFixed(1)+"</b> km";
}
}
}
}
}
function formatDuration(_9){
var _a=Math.floor(_9/3600000);
var _b=Math.floor(_9/60000)%60;
var _c=Math.floor(_9/1000)%60;
var _d=_9%1000;
var _e=_b+":"+_c;
if(_d>0){
_e+="."+_d.toFixed(0);
}
if(_a>0){
_e=_a+"h:"+_e;
}
return _e;
}
function formatDurationPlain(_f){
var _10=Math.floor(_f/3600000);
var _11=Math.floor(_f/60000)%60;
var _12=Math.floor(_f/1000)%60;
var _13=_f%1000;
var _14=_11+":"+_12;
return _14;
}
function formatAltitude(_15){
if(unitsalt==1){
return "<b>"+(_15/0.3048).toFixed(0)+"</b> ft";
}else{
return "<b>"+(_15).toFixed(1)+"</b> m";
}
}
function formatDegrees(_16,_17,_18){
var _19;
var bs="<b>",be="</b>",dg="&deg;",mn="&#39;",sc="&#34;";
if(_18==null){
_18=false;
}
if(_18){
bs="";
be="";
dg=" ";
mn=" ";
sc="";
}
if(unitsdeg==3||(unitsdeg==0&&_18)){
var _1f=Math.floor(Math.abs(_16)*3600000+0.5);
var _20=Math.floor(_1f/3600000);
var _21=Math.floor(_1f/60000)%60;
var _22=(_1f%60000)/1000;
_19=bs+_20+be+dg;
if(_21>0||_22>0){
_19+=bs+padLeft(_21,"0",2)+be+mn;
}
if(_22>0){
_19+=bs+_22.toFixed(3)+be+sc;
}
}else{
if(unitsdeg==1){
var _20=Math.floor(Math.abs(_16));
var _23=60*(Math.abs(_16)-Math.floor(Math.abs(_16)));
_19=bs+_20+be+dg;
if(_23>0){
_19+=bs+_23.toFixed(_18?6:3)+be+mn;
}
}else{
if(unitsdeg==0){
var _1f=Math.floor(Math.abs(_16)*3600+0.5);
var _20=Math.floor(_1f/3600);
var _21=Math.floor(_1f/60)%60;
var _24=_1f%60;
_19=bs+_20+be+dg;
if(_21>0||_24>0){
_19+=bs+padLeft(_21,"0",2)+be+mn;
}
if(_24>0){
_19+=bs+padLeft(_24,"0",2)+be+sc;
}
}else{
_19=bs+Math.abs(_16).toFixed(_18?7:6)+be+dg;
}
}
}
if(_17==null||_18){
return (_16>0?"":"-")+_19;
}else{
return _19+_17.charAt(_16>0?0:1);
}
}
function formatBearing(_25){
while(_25<0){
_25+=360;
}
while(_25>360){
_25-=360;
}
return "<b>"+_25.toFixed(0)+"\xb0</b> <i>"+formatBearingName(_25)+"</i>";
}
function formatBearingName(_26){
while(_26<0){
_26+=360;
}
var _27=Math.floor(((_26%360)+11.25)/22.5)%16;
return sectors[_27];
}
function padLeft(str,_29,_2a){
while(str.length<_2a){
str=_29+str;
}
return str;
}
function loadXMLLive(_2b){
if(window.XMLHttpRequest){
var _2c=new XMLHttpRequest();
_2c.onreadystatechange=function(){
if(_2c.readyState==4){
xmlDoc=_2c.responseXML;
parseXMLLive();
}
};
_2c.open("GET",_2b,true);
_2c.send("");
}else{
if(document.implementation&&document.implementation.createDocument){
xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.onload=parseXMLLive;
xmlDoc.load(_2b);
}else{
if(window.ActiveXObject){
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=true;
xmlDoc.onreadystatechange=function(){
if(xmlDoc.readyState==4){
parseXMLLive();
}
};
xmlDoc.load(_2b);
}else{
alert("Your browser cannot handle this script");
}
}
}
lastxmlurl=_2b;
}
function parseXMLLive(){
var _2d=xmlDoc.documentElement.getElementsByTagName("marker");
if(isloaded==0){
for(var i=0;i<_2d.length;i++){
var _2f=new Object();
_2f.name=_2d[i].getAttribute("name");
_2f.user=_2d[i].getAttribute("username");
_2f.title=_2f.user;
_2f.lat=parseFloat(_2d[i].getAttribute("lat"));
_2f.lng=parseFloat(_2d[i].getAttribute("lng"));
_2f.alt=parseFloat(_2d[i].getAttribute("alt"));
_2f.speed=parseFloat(_2d[i].getElementsByTagName("speed")[0].firstChild.nodeValue);
_2f.bearing=parseFloat(_2d[i].getElementsByTagName("bearing")[0].firstChild.nodeValue);
_2f.nearto=_2d[i].getElementsByTagName("nearto")[0].firstChild.nodeValue;
_2f.lastupdate=_2d[i].getElementsByTagName("lastupdate")[0].firstChild.nodeValue;
if(_2d[i].getElementsByTagName("visible")[0].firstChild.nodeValue=="1"){
_2f.visible=true;
}else{
_2f.visible=false;
}
blip.push(_2f);
createinfotext(blip.length-1);
_2f.marker=newMarker(blip.length-1,_2f,icon);
if(_2f.visible==true){
addMarker(_2f);
}
}
isloaded=1;
}else{
for(var i=0;i<_2d.length;i++){
blip[i].lat=parseFloat(_2d[i].getAttribute("lat"));
blip[i].lng=parseFloat(_2d[i].getAttribute("lng"));
blip[i].alt=parseFloat(_2d[i].getAttribute("alt"));
blip[i].lastupdate=_2d[i].getElementsByTagName("lastupdate")[0].firstChild.nodeValue;
blip[i].speed=parseFloat(_2d[i].getElementsByTagName("speed")[0].firstChild.nodeValue);
blip[i].bearing=parseFloat(_2d[i].getElementsByTagName("bearing")[0].firstChild.nodeValue);
blip[i].nearto=_2d[i].getElementsByTagName("nearto")[0].firstChild.nodeValue;
createinfotext(i);
if(blip[i].visible){
setMarkerLoc(blip[i]);
}
}
}
if(document.options.autozoom.checked&&document.options.autopan.checked){
zoomtoall(1,1);
}else{
if(document.options.autopan.checked){
zoomtoall(0,1);
}
}
updatedatatable();
d=new Date();
document.getElementById("lastupdate").innerHTML="Last update: "+d.toTimeString();
}
function updatepoints(){
loadXMLLive(lastxmlurl);
return false;
}
function createinfotext(i){
blip[i].info="Device: <b>"+blip[i].name+"</b><br/>";
if(!isNaN(blip[i].speed)){
blip[i].info+="Speed: "+formatSpeed(blip[i].speed)+"<br/>";
blip[i].info+="Direction: "+formatBearing(blip[i].bearing)+"<br/>";
}
if(blip[i].nearto!="null"){
blip[i].info+="Near to: <b>"+blip[i].nearto+"</b><br/>";
}
blip[i].info+="Latitude: "+formatDegrees(blip[i].lat,"NS")+"<br/>";
blip[i].info+="Longitude: "+formatDegrees(blip[i].lng,"EW")+"<br/>";
blip[i].info+="Altitude: "+formatAltitude(blip[i].lng)+"<br/>";
blip[i].info+="Last update: <b>"+blip[i].lastupdate+"</b>";
}
function updatedatatable(){
if(isloaded==1){
var _31="<table cellpadding=\"0\" cellspacing=\"0\" style=\"width: 95%;\">";
_31+="<tr><td class=\"theadl\" style=\"text-align: left;\">&nbsp;</td>";
_31+="<td class=\"thead\" style=\"text-align: left;\">User/Device</td>";
_31+="<td class=\"thead\" style=\"text-align: left;\">Location</td>";
_31+="<td class=\"thead\" style=\"text-align: left;\">Altitude/Speed</td>";
_31+="<td class=\"theadr\" style=\"text-align: left;\">Last Update</td></tr>";
var _32;
for(var i=0;i<blip.length;i++){
if(((new Date()).getTime()-Date.parse(blip[i].lastupdate)-300000)<3600000){
_32="bs2c";
}else{
if((i%2)==0){
_32="bs2a";
}else{
_32="bs2b";
}
}
_31+="<tr><td class=\""+_32+"l\"><input onclick=\"showhide("+i+")\" type=\"checkbox\" ";
if(blip[i].visible){
_31+="checked ";
}
_31+="name=\"marker"+i+"\">";
_31+="<td class=\""+_32+"\" style=\"padding:3px;\"><b>"+blip[i].user+"</b>&nbsp;<br/>"+blip[i].name+"&nbsp;</td>";
_31+="<td class=\""+_32+"\">Lat: "+formatDegrees(blip[i].lat,"NS")+"&nbsp;<br/>Long: "+formatDegrees(blip[i].lng,"EW")+"</td>";
_31+="<td class=\""+_32+"\">Altitude: "+formatAltitude(blip[i].alt)+"<br/>Speed: ";
if(blip[i].speed==0){
_31+="-";
}else{
_31+=formatSpeed(blip[i].speed)+" "+formatBearing(blip[i].bearing);
}
_31+="</td>";
_31+="<td class=\""+_32+"r\">&nbsp;"+blip[i].lastupdate+"</td></tr>";
}
_31+="<tr><td class=\"tfootl\">&nbsp;</td><td class=\"tfoot\" colspan=\"3\">&nbsp;</td><td class=\"tfootr\">&nbsp;</td></tr>";
_31+="</table>";
if(blip.length==0){
_31+="<p>No live data available!</p>";
}
document.getElementById("datatable").innerHTML=_31;
}
}
function showhide(i){
if(isloaded==1){
blip[i].visible=!blip[i].visible;
if(blip[i].visible){
blip[i].marker=newMarker(i,blip[i],icon);
addMarker(blip[i]);
}else{
removeMarker(blip[i]);
}
zoomtoall(0,0,1);
}
return false;
}
function zoomtoall(_35,_36,_37){
if(isloaded==1){
var _38=90,_39=180,_3a=-90,_3b=-180,_3c=true;
for(var i=0;i<blip.length;i++){
if(blip[i].visible){
_3c=false;
if(blip[i].lat<_38){
_38=blip[i].lat;
}
if(blip[i].lng<_39){
_39=blip[i].lng;
}
if(blip[i].lat>_3a){
_3a=blip[i].lat;
}
if(blip[i].lng>_3b){
_3b=blip[i].lng;
}
}
}
if(!_3c){
if(_35==1||(_37==1&&document.options.autozoom.checked&&document.options.autopan.checked)){
mapZoomAndPan(_38,_39,_3a,_3b);
}else{
if(_36==1||(_37==1&&document.options.autopan.checked)){
mapPanTo((_38+_3a)/2,(_39+_3b)/2);
}
}
}
}
return false;
}
function loadClickLocation(_3e,_3f){
var _40=new Object();
_40.name="Home Location";
_40.title="";
_40.user="";
_40.lat=_3e;
_40.lng=_3f;
_40.lastupdate="";
_40.visible=true;
blip.push(_40);
createinfotext(0);
_40.marker=newMarker(0,_40,icon);
addMarker(_40);
setOnClickGeneral();
isloaded=1;
}
function loadWaypointsBackground(){
var _41=getMapCorners();
minlat=1.5*_41.minlat-_41.maxlat/2;
maxlat=1.5*_41.maxlat-_41.minlat/2;
minlng=1.5*_41.minlng-_41.maxlng/2;
maxlng=1.5*_41.maxlng-_41.minlng/2;
if(window.XMLHttpRequest){
var _42=new XMLHttpRequest();
_42.onreadystatechange=function(){
if(_42.readyState==4){
xmlBGDoc=_42.responseXML;
parseXMLWaypointsBG();
}
};
_42.open("GET","./xmlwaypoints.php?limitgroup=100&minlat="+minlat+"&maxlat="+maxlat+"&minlng="+minlng+"&maxlng="+maxlng,true);
_42.send("");
}else{
if(document.implementation&&document.implementation.createDocument){
xmlBGDoc=document.implementation.createDocument("","",null);
xmlBGDoc.onload=parseXMLWaypointsBG;
xmlBGDoc.load("./xmlwaypoints.php?limitgroup=100&minlat="+minlat+"&maxlat="+maxlat+"&minlng="+minlng+"&maxlng="+maxlng);
}else{
if(window.ActiveXObject){
xmlBGDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlBGDoc.async=true;
xmlBGDoc.onreadystatechange=function(){
if(xmlBGDoc.readyState==4){
parseXMLWaypointsBG();
}
};
xmlBGDoc.load("./xmlwaypoints.php?limitgroup=100&minlat="+minlat+"&maxlat="+maxlat+"&minlng="+minlng+"&maxlng="+maxlng);
}else{
alert("Your browser cannot handle this script");
}
}
}
var btn=document.getElementById("btnwptbg");
btn.disabled=true;
btn.value="Loading Waypoints...";
}
function parseXMLWaypointsBG(){
while(wptbg.length>0){
var wpt=wptbg.pop();
removeBasicMarker(wpt.mrkr);
}
var _45=xmlBGDoc.documentElement.getElementsByTagName("wpt");
for(var i=0;i<_45.length;i++){
var wpt=new Object();
wpt.lat=new Number(_45[i].getAttribute("lat"));
wpt.lng=new Number(_45[i].getAttribute("lon"));
wpt.name=_45[i].getElementsByTagName("name")[0].firstChild.nodeValue;
wpt.type=_45[i].getElementsByTagName("type")[0].firstChild.nodeValue;
var _47=addBasicMarker(wpt.name,wpt.lat,wpt.lng,"./images/waypoints/wpt"+wpt.type+".png",16);
wpt.mrkr=_47;
wptbg.push(wpt);
}
var btn=document.getElementById("btnwptbg");
btn.disabled=false;
btn.value="Reload Waypoints";
}
function loadWaypoint(_49,_4a){
var _4b=new Object();
_4b.name="Home Location";
_4b.title="";
_4b.user="";
_4b.lat=_49;
_4b.lng=_4a;
_4b.lastupdate="";
_4b.visible=true;
blip.push(_4b);
createinfotext(0);
_4b.marker=newMarker(0,_4b,icon);
addMarker(_4b);
setOnClickForWaypoints();
isloaded=1;
}
function getWayPoint(){
return (getMarkerLoc(blip[0]));
}
function selectWaypoint(_4c,_4d){
blip[0].lat=_4c;
blip[0].lng=_4d;
setMarkerLoc(blip[0]);
setMapCenter(_4c,_4d);
return false;
}
function loadXMLTrack(_4e){
if(window.XMLHttpRequest){
var _4f=new XMLHttpRequest();
_4f.onreadystatechange=function(){
if(_4f.readyState==4){
xmlDoc=_4f.responseXML;
parseXMLTrack();
}
};
_4f.open("GET",_4e,true);
_4f.send("");
}else{
if(document.implementation&&document.implementation.createDocument){
xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.onload=parseXMLTrack;
xmlDoc.load(_4e);
}else{
if(window.ActiveXObject){
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=true;
xmlDoc.onreadystatechange=function(){
if(xmlDoc.readyState==4){
parseXMLTrack();
}
};
xmlDoc.load(_4e);
}else{
alert("Your browser cannot handle this script");
}
}
}
}
function parseXMLTrack(){
var _50=xmlDoc.documentElement.getElementsByTagName("trk");
for(var t=0;t<_50.length;t++){
var _52=[];
var _53=_50[t].getElementsByTagName("extensions");
var _54=_53[0].getElementsByTagName("color")[0].firstChild.nodeValue;
var _55=_53[0].getElementsByTagName("linewidth")[0].firstChild.nodeValue;
var _56=_50[t].getElementsByTagName("trkseg");
var _57=_56[0].getElementsByTagName("trkpt");
for(var i=0;i<_57.length;i++){
var loc=new Object();
loc.id=parseFloat(_57[i].getAttribute("id"));
loc.lat=parseFloat(_57[i].getAttribute("lat"));
loc.lng=parseFloat(_57[i].getAttribute("lng"));
loc.speed=parseFloat(getSubNode(_57[i],"speed"));
loc.bearing=parseFloat(getSubNode(_57[i],"bearing"));
loc.alt=parseFloat(getSubNode(_57[i],"ele"));
loc.time=getSubNode(_57[i],"time");
loc.timeoffset=parseFloat(getSubNode(_57[i],"timeoffset"));
loc.distance=parseFloat(getSubNode(_57[i],"distance"));
if(loc.time.length>18){
loc.timestamp=Date.UTC(loc.time.substr(0,4),loc.time.substr(5,2)-1,loc.time.substr(8,2),loc.time.substr(11,2),loc.time.substr(14,2),loc.time.substr(17,2));
loc.date=new Date();
loc.date.setTime(loc.timestamp);
}
if(t==0){
points.push(loc);
}
_52.push(makePoint(loc.lat,loc.lng));
}
addMapPolyLine(_52,_55,_54);
}
if(_50.length==1){
var _5a=new Object();
_5a.name="";
_5a.title="";
_5a.user="";
_5a.lat=points[0].lat;
_5a.lng=points[0].lng;
_5a.lastupdate="";
_5a.visible=true;
blip.push(_5a);
_5a.marker=newMarker(0,_5a,icon);
addMarker(_5a);
}else{
ismultitrack=true;
}
isloaded=1;
}
function getSubNode(_5b,_5c){
var _5d=_5b.getElementsByTagName(_5c);
if(_5d.length>0){
return _5d[0].firstChild.nodeValue;
}
return "";
}
function nextFrame(){
if(isplaying){
framenumber=(framenumber+1)%points.length;
setTrackMarker(framenumber,1,1);
var _5e=20;
if(framenumber==(points.length-1)){
_5e=3000;
}else{
var _5f=points[framenumber];
var _60=points[framenumber+1];
_5e=Math.round((_60.timeoffset-_5f.timeoffset)*1000/replayspeed);
if(_5e>3000){
_5e=2000;
}
}
var t=setTimeout("nextFrame();",_5e);
}
}
function startstop(btn){
if(isplaying){
isplaying=false;
btn.value=" Play > ";
}else{
isplaying=true;
btn.value=" Pause ";
nextFrame();
}
}
function setspeed(btn){
if(replayspeed==5){
replayspeed=10;
}else{
if(replayspeed==10){
replayspeed=20;
}else{
if(replayspeed==20){
replayspeed=50;
}else{
if(replayspeed==50){
replayspeed=100;
}else{
if(replayspeed==100){
replayspeed=500;
}else{
replayspeed=5;
}
}
}
}
}
btn.value=" "+replayspeed+"x ";
}
function setTrackMarker(num,_65,_66){
var _67=Math.max(0,Math.min(parseInt(num)-1,points.length-1));
if(!ismultitrack&&blip[0]){
var _68=points[Math.floor(num)];
blip[0].lat=_68.lat;
blip[0].lng=_68.lng;
setMarkerLoc(blip[0]);
if(_65==1){
setMapCenter(_68.lat,_68.lng);
}
if(_66==1){
updateTable(Math.floor(num));
}
}
return false;
}
function setTrackMarkerFraction(num,_6a,_6b,_6c){
if(isplaying){
return false;
}
var _6d=points[points.length-1].id;
var _6e=Math.max(0,Math.min(parseInt(num*_6d/_6a),_6d-1));
if(!ismultitrack&&blip[0]){
var idx=Math.max(0,Math.min(points.length-1,parseInt(_6e*points.length/_6d)));
if(points[idx].id>_6e){
while(idx>0&&points[idx].id>_6e){
idx--;
}
}else{
if(points[idx].id<_6e){
while(idx<(points.length-1)&&points[idx].id<_6e){
idx++;
}
}
}
var _70=points[idx];
blip[0].lat=_70.lat;
blip[0].lng=_70.lng;
setMarkerLoc(blip[0]);
if(_6b==1){
mapPanTo(_70.lat,_70.lng);
framenumber=idx;
}
if(_6c==1){
updateTable(idx);
}
}
return false;
}
function setTrackMarkerTimeOffset(_71){
var idx=0;
while(idx<(points.length-2)&&points[idx].timeoffset<_71){
idx++;
}
var _73=points[idx];
blip[0].lat=_73.lat;
blip[0].lng=_73.lng;
setMarkerLoc(blip[0]);
mapPanTo(_73.lat,_73.lng);
updateTable(idx);
return false;
}
function getMouseEventPosition(e){
var _75=0;
var _76=0;
if(!e){
var e=window.event;
}
if(e.pageX||e.pageY){
_75=e.pageX;
_76=e.pageY;
}else{
if(e.clientX||e.clientY){
_75=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
_76=e.clientY+document.body.scrollTop+document.documentElement.scrollTop;
}
}
return [_75,_76];
}
function getObjectPosition(obj){
var _78=curtop=0;
if(obj.offsetParent){
_78=obj.offsetLeft;
curtop=obj.offsetTop;
while(obj=obj.offsetParent){
_78+=obj.offsetLeft;
curtop+=obj.offsetTop;
}
}
return [_78,curtop];
}
function getOffsetX(e,t){
var _7b=getMouseEventPosition(e);
var _7c=getObjectPosition(t);
return (_7b[0]-_7c[0]);
}

