JAVASCRIPT 63
DrawRoute-moz.js Guest on 10th June 2020 02:28:08 AM
  1.  
  2. replaces=[
  3.                 {from:'this.createImageSegments',to:'this.createSVGVectorSegments'},
  4.      {from:'I.prototype.createVectorSegments',to:'I.prototype.createSVGVectorSegments=function(a,b,c){  var d=this.getVectors(a,b);\n   var e=new Array();\n    var f=new E();\n        this.getBitmapVectors(d,e,f);\n if(!c){  c=new E();\n } var g=E.intersection(c,f);\n var h;\n if(e.length>0){  var i=this.map.centerBitmap;\n  h=document.createElementNS("http://www.w3.org/2000/svg","svg");\n  var path=document.createElementNS("http://www.w3.org/2000/svg","path");\n  h.appendChild(path);\n  var n=1;\n  var v=1;\n  h.style.position="absolute";\n  h.style.width="100px";\n  h.style.height="100px";\n   var vpath=this.getVectorPath(e).toUpperCase().replace("E","");\n;arr=vpath.split(/[ML,\\s]+/gim);arr=arr.splice(1,arr.length-2);\nvar aminX=arr[0];var aminY=arr[1];for (var zzz=2;zzz<arr.length;zzz+=2) {if (arr[zzz]<aminX) aminX=arr[zzz];if (arr[zzz+1]<aminY) aminY=arr[zzz+1];} outstr="M"+(Number(arr[0])-aminX)+","+(Number(arr[1])-aminY)+"L";\nfor (var zzz=2;zzz<arr.length;zzz+=2) {\n outstr+=(Number(arr[zzz])-aminX)+","+(Number(arr[zzz+1])-aminY)+" ";\n}; var k=this.map.getDivCoordinate(aminX,aminY,sb);\n h.style.left=m(k.x);\n  h.style.top=m(k.y);\n; \n  path.setAttributeNS(null,"d",outstr);  path.setAttributeNS(null,"opacity",this.opacity);\n  path.setAttributeNS(null,"stroke",this.color);\n  path.setAttributeNS(null,"fill","none");\n  path.setAttributeNS(null,"stroke-weight",m(this.weight));\n;\n }else { h=document.createElement("div");\n } return h;\n};\nI.prototype.createVectorSegments'}
  5.  
  6.                 ];
  7. if (window.SVGElement) {
  8.         var funcstr=rewrite(GMapsNamespace,replaces);
  9.         eval(funcstr);
  10.         GMapsNamespace();
  11. }
  12.  
  13. function rewrite(func,replaces) {
  14.  var str=func+'';
  15.  for (i=0;i<replaces.length;i++) {
  16.   var rep=replaces[i];
  17.   str=str.replace(rep.from,rep.to);
  18.  }
  19.  return str;
  20. }
  21.  
  22. var svgNS="http://www.w3.org/2000/svg";
  23.  
  24. // this is a bad way...
  25. var vml=window.external ? true : false;
  26. var startTime=new Date();
  27. var graphPoints=[];
  28. var startEle=0;
  29. var timeOffset=0;
  30. var previousEndTime=0;
  31. var totalDistance=0;
  32. var previousPoint;
  33. var SPEED=1000;
  34. var minEle=10000;
  35. var maxEle=0;
  36. var polylines=[];
  37. var trackXMLdocs={files:[],processed:[]};
  38. function getDragParent(el) {
  39.         var oldEl=el;
  40.         while (el) {
  41.                 el=el.parentNode;
  42.                 if (el.id=="maptable" || el.nodeName.toUpperCase()=='BODY') {
  43.                         return oldEl;
  44.                 }
  45.                 oldEl=el;
  46.         }
  47. }
  48. draggingThing=null;
  49. function startDrag(e) {
  50.         draggingThing=getDragParent(e.srcElement || e.target);
  51.         offsetX=e.clientX-draggingThing.offsetLeft;
  52.         offsetY=e.clientY-draggingThing.offsetTop;
  53.         document.body.onmousemove=moveDrag;
  54.         document.body.onmouseup=endDrag;
  55.         document.onselectstart=nullFunc;
  56. }
  57.  
  58. function nullFunc(e) {
  59.         return false;
  60. }
  61. function moveDrag(e) {
  62.         e=e || event;
  63.         if (draggingThing) {
  64.                 draggingThing.style.top=(e.clientY-offsetY)+'px';
  65.                 draggingThing.style.left=(e.clientX-offsetX)+'px';
  66.                 return true;
  67.         }
  68. }
  69. function endDrag(e) {
  70.         draggingThing=null;
  71.         document.body.onmousemove=null;
  72.         document.body.onmouseend=null;
  73.         document.onselectstart=null;
  74. }
  75.  
  76. function getHeightWidth() {
  77.         var winWidth=800;
  78.         var winHeight=600;
  79.         var     d=document;
  80.         if (typeof window.innerWidth!='undefined') {
  81.                 var winWidth = window.innerWidth;
  82.                 var winHeight = window.innerHeight;
  83.         } else {
  84.                 if (d.documentElement &&
  85.                                 typeof d.documentElement.clientWidth!='undefined' &&
  86.                                 d.documentElement.clientWidth!=0) {
  87.                         var winWidth = d.documentElement.clientWidth;
  88.                         var winHeight = d.documentElement.clientHeight;
  89.                 } else {
  90.                         if (d.body &&
  91.                                         typeof d.body.clientWidth!='undefined') {
  92.                                 var winHeight = d.body.clientHeight;
  93.                                 var winWidth = d.body.clientWidth;
  94.                         }
  95.                 }
  96.         }
  97.         return {width:winWidth,height:winHeight};
  98. }
  99. function sizer() {
  100.         var size=getHeightWidth();
  101.                         mapWidth=size.width-25;
  102.                         mapHeight=size.height-25;
  103.                         var mt=document.getElementById('map').style;
  104.                         mt.height=mapHeight+"px";
  105.                         mt.width=mapWidth+"px";
  106. }
  107. window.onresize=sizer;
  108. sizer();
  109. getGPX("gpx/"+gpxFile);
  110.  
  111.  
  112. function HTTP() {
  113.  var xmlhttp
  114.    try {
  115.    xmlhttp=new ActiveXObject("Msxml2.XMLHTTP")
  116.   } catch (e) {
  117.    try {
  118.      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
  119.    } catch (E) {
  120.     xmlhttp=false
  121.    }
  122.   }
  123.  if (!xmlhttp) {
  124.   try {
  125.    xmlhttp = new XMLHttpRequest();
  126.   } catch (e) {
  127.                 xmlhttp=false;
  128.   }
  129.  }
  130.  return xmlhttp;
  131. }
  132. function getGPX(file) {
  133.         var xmlhttp=HTTP();
  134.         xmlhttp.open("GET",file,true);
  135.         xmlhttp.onreadystatechange=function() {
  136.                 if (xmlhttp.readyState==4) {
  137.                         var doc=xmlhttp.responseXML;
  138.                         if (doc.documentElement) {
  139.                                 var trks=doc.getElementsByTagName('trk');
  140.                                 if (trks.length>0) {
  141.                                         trackXMLdocs.files.push(doc);
  142.                                         var trkRef=trackXMLdocs.files.length-1;
  143.                                         var     output=[];
  144.                                         for (var i=0;i<trks.length;i++) {
  145.                                                 setTimeout(new Function("trackProcess("+trkRef+","+i+")"),10);
  146.                                                 var trk=trks[i];
  147.                                                 var name=trk.getElementsByTagName('name');
  148.                                                 if (name[0]) {
  149.                                                         name=name[0].firstChild.nodeValue;
  150.                                                 } else {
  151.                                                         name="unnammed";
  152.                                                 }
  153.                                                 var trkpt=trk.getElementsByTagName('trkpt');
  154.                                                 var tracklength=trkpt.length;
  155.                                                 if (!previousPoint) {
  156.                                                         try {
  157.                                                                 pt=trkpt.item(0);
  158.                                                                 previousPoint=new GPoint(pt.getAttribute('lon'),pt.getAttribute('lat'));
  159.                                                                 try {
  160.                                                                         startTime=new Date(parseDate(pt.getElementsByTagName('time')[0].firstChild.nodeValue));
  161.                                                                 } catch (e) {}
  162.                                                                 try {
  163.                                                                         startEle=Number(pt.getElementsByTagName('ele')[0].firstChild.nodeValue);
  164.                                                                 } catch (e) {}
  165.                                                         }catch (e) {}
  166.                                                 }
  167.                                                 output.push('<span onclick="showTrack('+trkRef+','+i+')">'+name+'('+tracklength+' points)</span><br>');
  168.                                         }
  169.                                         document.getElementById('info').innerHTML='<center><span onclick="PlayAll()" style="font-weight:bold">'+goMessage+'</span>';
  170.                                 } else {
  171. alert(doc.xml)
  172.                                         document.getElementById('info').innerHTML="No track logs found";
  173.                                 }
  174.                         } else {
  175.                                 document.getElementById('info').innerHTML="No track logs found";
  176.                         }
  177.                 }
  178.         }
  179.         xmlhttp.send(null)
  180. }
  181. function trackProcess(file,trackID) {
  182.         if (!trackXMLdocs.processed[file]) {
  183.                 trackXMLdocs.processed[file]=[];
  184.         }
  185.         var trk=[];
  186.         try {
  187.         var     track=trackXMLdocs.files[file].getElementsByTagName('trk').item(trackID);
  188.         var trackPts=track.getElementsByTagName('trkpt');
  189.         if (trackPts.length>0) {
  190.                 if (previousEndTime!=0) {
  191.                         try {
  192.                                 var pt=trackPts.item(i);
  193.                                 var time=new Date(parseDate(pt.getElementsByTagName('time')[0].firstChild.nodeValue));
  194.                                 timeOffset+=time.valueOf()-previousEndTime;
  195.                         } catch (e) {}
  196.                 }
  197.                 for (var i=0;i<trackPts.length;i++) {
  198.                         var pt=trackPts.item(i);
  199.                         try {
  200.                                 var ele=Number(pt.getElementsByTagName('ele')[0].firstChild.nodeValue);
  201.                         } catch (e) {
  202.                                 var ele=0;
  203.                         }
  204.                         try {
  205.                                 var time=new Date(parseDate(pt.getElementsByTagName('time')[0].firstChild.nodeValue));
  206.                         } catch (e) {
  207.                                 var time=new Date();
  208.                         }
  209.                        
  210.                         var pt=new GPoint(pt.getAttribute('lon'),pt.getAttribute('lat'));
  211.                         var distance=GCdistanceBetween(pt,previousPoint);
  212.                         totalDistance+=distance;
  213.                         previousPoint=pt;
  214.                         pt.ele=ele;
  215.                         if (ele>maxEle) maxEle=ele;
  216.                         if (ele<minEle) minEle=ele;
  217.                         pt.time=time;
  218.                         pt.elapsedTime=new Date(time.valueOf()-timeOffset);
  219.                         pt.distance=totalDistance;
  220.                         trk.push(pt);
  221.                 }
  222.                 trackXMLdocs.processed[file][trackID]=trk;
  223.                 previousEndTime=pt.time.valueOf();
  224.         }
  225.         } catch (e) {
  226.                 trackXMLdocs.processed[file][trackID]=false;
  227.         }
  228. }
  229. function showTrack(file,track) {
  230.         if (!trackXMLdocs.processed[file] || !trackXMLdocs.processed[file][track]) {
  231.                 trackProcess(file,track);
  232.         }
  233.         if (document.getElementById('timeSequence').checked) {
  234.                 setTimeout(function() {drawTrackSeqUpd(file,track,1,10) },SPEED)
  235.         } else {
  236.                 drawTrackSeq(file,track,1,trackXMLdocs.processed[file][track].length-1);
  237.         }
  238. }
  239. function drawTrackSeqUpd(file,track,start,end,callbackEnd) {
  240.         var tl=trackXMLdocs.processed[file][track].length;
  241.         if (start<tl) {
  242.                 drawTrackSeq(file,track,start,(end>=tl ? tl-1 : end));
  243.                 setTimeout(function() {drawTrackSeqUpd(file,track,end,end+10,callbackEnd) },SPEED);
  244.         } else {
  245.                 if (callbackEnd) {
  246.                         callbackEnd();
  247.                 }
  248.         }
  249. }
  250. function PlayAll() {
  251.         map.clearOverlays();
  252.         graphPoints=[];
  253.         drawTracks(0,0);
  254. }
  255. function drawTracks(file,track) {
  256.         if (!trackXMLdocs.processed[file] || !trackXMLdocs.processed[file][track]) {
  257.                 trackProcess(file,track);
  258.         }
  259.         if (trackXMLdocs.processed[file][track]!=false) {
  260.                 setTimeout(function() {drawTrackSeqUpd(file,track,1,10,function() {                     betweenTrackLines(file,track+1);drawTracks(file,track+1)})},100);
  261.         } else {
  262.                 document.getElementById('info').innerHTML=      document.getElementById('info').innerHTML+'<br><center><span onclick="PlayAll()" style="font-weight:bold">View Cycle Ride</span></center>';
  263.         }
  264. }
  265. // 0 -> maxElevation-
  266. function addToGraph(ele) {
  267.         var graph=document.getElementById('graph');
  268.         graphPoints.push(graphPoints.length*2);
  269.         var graphC=document.getElementById('graphControls');
  270.         graphC.style.height="120px";
  271.         var y=Math.floor((maxEle-ele)/(maxEle-minEle)*100);
  272.         graphPoints.push(Math.floor(y));
  273.         var se=Math.floor((maxEle-startEle)/(maxEle-minEle)*100);
  274.         if (vml) {
  275.                 try {           graph.removeChild(graph.firstChild); } catch (e) {}
  276.                 if (graphPoints.length>50) {
  277.                         graphC.style.width=(2*graphPoints.length)+"px";
  278.                 }
  279.                 var shp=document.createElement('v:shape');
  280.                 shp.style.position="absolute";
  281.                 shp.style.height="100px";
  282.                 shp.style.width="300px";
  283.                 shp.strokecolor="#ff0000";
  284.                 shp.opacity=1;
  285.                 shp.coordsize="300 120";
  286.                 shp.coordorigin="0 0";
  287.                 shp.strokeweight="1px";
  288.                 shp.path="m0,"+se+"l"+graphPoints.join(',');
  289.                 graph.appendChild(shp);
  290.         } else {
  291.                 if (!graph.firstChild) {
  292.                         var svg=document.createElementNS(svgNS,"svg");
  293.                         var path=document.createElementNS(svgNS,"path");
  294.                         svg.appendChild(path);
  295.                         path.setAttributeNS(null,"stroke","red");
  296.                         path.setAttributeNS(null,"fill","none");
  297.                         graph.appendChild(svg);
  298.                 }
  299.                 if (graphPoints.length>50) {
  300.                         graphC.style.width=(graphPoints.length+15)+"px";
  301.                 }
  302.                 path=graph.firstChild.firstChild;
  303.                 path.setAttributeNS(null,"d","M0,"+se+"L"+graphPoints.join(','));
  304.         }
  305. }
  306.  
  307. function drawTrackSeq(file,track,start,end) {
  308.         var     track=trackXMLdocs.processed[file][track];
  309.         var colour=getColour(track[end].ele);
  310.         addToGraph(track[end].ele);
  311.         var arr=track.slice(start-1,end);
  312.         var pt=drawPolyline(new GPolyline(arr,colour,4,0.5),arr[arr.length-1]);
  313.         document.getElementById('info').innerHTML="<center>"+(pt.distance.toFixed(2))+"miles &nbsp;"+FmtTime(pt.time.valueOf()-startTime.valueOf())+"</center>"+"<center>"+(pt.distance.toFixed(2))+"miles &nbsp;"+FmtTime(pt.elapsedTime.valueOf()-startTime.valueOf())+"</center>";
  314. }
  315. function betweenTrackLines(file,track) {
  316.         try {
  317.                 var previous=trackXMLdocs.processed[file][track-1];
  318.                 var next=trackXMLdocs.processed[file][track];
  319.                 var arr=[previous[previous.length-1],next[0]];
  320.                 drawPolyline(new GPolyline(arr,"#00ff00",4,0.5),next[0]);
  321.         } catch (e) {}
  322. }
  323. function drawPolyline(poly,pt) {
  324.         polylines.push(poly);
  325.         if (polylines.length>5) {
  326.                 map.removeOverlay(polylines[0]);
  327.                 polylines.splice(0,1);
  328.         }
  329.         map.addOverlay(polylines[polylines.length-1]);
  330.         map.recenterOrPanToLatLng(pt);
  331.         return pt;
  332. }
  333.  
  334. function FmtTime(n) {
  335.         seconds=n/1000;
  336.         minutes=seconds/60;
  337.         hours=minutes/60;
  338.         return Math.floor(hours)+':'+pad(Math.floor(minutes)%60)+':'+pad(Math.floor(seconds)%60);
  339. }
  340. function getColour(ele) {
  341.         var elevation=(170-Math.floor(ele))%170+85;
  342.         return "#"+pad(elevation.toString(16))+"0000";
  343. }
  344. function pad(num) {
  345.         var num=num+'';
  346.         if (num.length==1) return "0"+num;
  347.         return num;
  348. }
  349.  
  350. var map = new GMap(document.getElementById("map"));
  351. map.addControl(new GSmallMapControl());
  352. map.centerAndZoom(new GPoint(-3.388316631,50.629420280), 2);
  353.  
  354. function GCdistanceBetween(a,b) {
  355.         var rad=0.01745566;
  356.         var Lo=Math.abs(Number(a.x)-Number(b.x));
  357.         var val=(Math.sin(a.y*rad)*Math.sin(b.y*rad))+(Math.abs(Math.cos(a.y*rad))*Math.abs(Math.cos(b.y*rad))*Math.cos(Lo*rad));
  358.         if (val<-1) val=1;
  359.         if (val>1) val=1;
  360.         var Drad=Math.acos(val);
  361.         var val=(Math.sin(b.y*rad)-(Math.sin(a.y*rad)*Math.cos(Drad)))/(Math.cos(a.y*rad)*Math.sin(Drad));
  362.         if (val<-1) val=1;
  363.         if (val>1) val=1;
  364.         var Crad=Math.acos(val);
  365.  
  366.         var Crad=Math.acos(val);
  367.         var Cdeg = Crad * 57.295779;
  368.         return Drad * 57.295779 * 69.06;
  369. }
  370.  
  371.  
  372. function parseDate(str) {
  373.         str=str.split(/[-:TZ]/gim);
  374.         return new Date(str[0],str[1]-1,str[2],str[3],str[4],str[5])
  375. }

Paste is for source code and general debugging text.

Login or Register to edit, delete and keep track of your pastes and more.

Raw Paste

Login or Register to edit or fork this paste. It's free.