function logJSErrors(a){(new Image).src="LogJSError.asp?msg="+encodeURIComponent(a.message)+"&ln="+encodeURIComponent(a.lineNumber)+"&url="+encodeURIComponent(a.fileName)+"&browser="+encodeURIComponent(a.browserInfo)}window.onerror=function(a,b,c){logJSErrors({message:a,lineNumber:c,fileName:b,browserInfo:window.navigator.userAgent});return true}; var display,lap_ecef_points=[],route_ecef_points=[],route_pt_times=[],routetime=0,elapsedtime=0,routedate="",rundatestring,lap_totaldistmetres=0,route_totaldistmetres=0,lap_totaldist,route_totaldist,NumLaps=0,LapsData=[],RouteTrkPts=0,routeAHR=0,GPSxml,Activities=[],gpx_poly=[],gpx_poly_comp=[],max_minspermile=60,maxpace=max_minspermile*60/1.609344/1E3,StopsExcluded=false,stoppage_time=0,GPSActivID=1;function Ellipsoid(a,b){this.A=a;this.B=b;a=a*a;b=b*b;this.EC=(a-b)/a;this.EC2=(a-b)/b} Ellipsoid.prototype.toString=function(){return"("+this.A+","+this.B+")"};var WGS84=new Ellipsoid(6378137,6356752.314);function deg2rad(a){return a*Math.PI/180}function geo2ecef(a,b,c,e){var h,j;if(c==null)c=0;if(e==null)e=WGS84;a=deg2rad(a);b=deg2rad(b);h=[Math.sin(a),Math.sin(b)];a=[Math.cos(a),Math.cos(b)];b=e.A/Math.sqrt(1-e.EC*h[0]*h[0]);j={};j.X=(b+c)*a[0]*a[1];j.Y=(b+c)*a[0]*h[1];j.Z=(b*(1-e.EC)+c)*h[0];return j} function ecef_gc_distance(a,b){var c,e;c=Math.sqrt(a.X*a.X+a.Y*a.Y+a.Z*a.Z);e=Math.sqrt(b.X*b.X+b.Y*b.Y+b.Z*b.Z);a=Math.acos((a.X*b.X+a.Y*b.Y+a.Z*b.Z)/(e*c));return(c+e)*a/2}function ecef_distance(a,b){var c,e;c=b.X-a.X;e=b.Y-a.Y;a=b.Z-a.Z;return Math.sqrt(c*c+e*e+a*a)}function PadDigits(a,b){a=String(a);var c="";if(b>a.length)for(i=0;i<b-a.length;i++)c+="0";return c+String(a)} function FormatTime(a){var b=Math.floor(a/60);a=Math.floor(a-b*60);var c=Math.floor(b/60);b=b-c*60;return PadDigits(c,2)+":"+PadDigits(b,2)+":"+PadDigits(a,2)}function FormatPace(a){var b=Math.floor(a/60);a=PadDigits(Math.floor(a)-Math.floor(a/60)*60,2);return String(b)+":"+String(a)} function CalcRouteTime(a,b){var c=a.substring(0,2),e=a.substring(3,5),h=a.substring(6,8);a=0;var j=b.substring(0,2),o=b.substring(3,5),f=b.substring(6,8);b=0;if(!isNaN(c)&&!isNaN(e)&&!isNaN(h)){c=parseInt(c,10);e=parseInt(e,10);h=parseInt(h,10);a=c*60*60+e*60+h}if(!isNaN(j)&&!isNaN(o)&&!isNaN(f)){j=parseInt(j,10);o=parseInt(o,10);f=parseInt(f,10);b=j*60*60+o*60+f}c=0;if(a>0&&b>0)c=b-a;return c} function MM_showHideLayers(){var a,b,c,e=MM_showHideLayers.arguments;for(a=0;a<e.length-2;a+=3)if((c=MM_findObj(e[a]))!=null){b=e[a+2];if(c.style){c=c.style;b=b=="show"?"visible":b=="hide"?"hidden":b}c.visibility=b}}function MM_callJS(a){return eval(a)}function MM_preloadImages(){var a=document;if(a.images){if(!a.MM_p)a.MM_p=[];var b,c=a.MM_p.length,e=MM_preloadImages.arguments;for(b=0;b<e.length;b++)if(e[b].indexOf("#")!=0){a.MM_p[c]=new Image;a.MM_p[c++].src=e[b]}}} function MM_swapImgRestore(){var a,b,c=document.MM_sr;for(a=0;c&&a<c.length&&(b=c[a])&&b.oSrc;a++)b.src=b.oSrc}function MM_findObj(a,b){var c,e;b||(b=document);if((c=a.indexOf("?"))>0&&parent.frames.length){b=parent.frames[a.substring(c+1)].document;a=a.substring(0,c)}if(!(e=b[a])&&b.all)e=b.all[a];for(c=0;!e&&c<b.forms.length;c++)e=b.forms[c][a];for(c=0;!e&&b.layers&&c<b.layers.length;c++)e=MM_findObj(a,b.layers[c].document);if(!e&&b.getElementById)e=b.getElementById(a);return e} function MM_swapImage(){var a,b=0,c,e=MM_swapImage.arguments;document.MM_sr=[];for(a=0;a<e.length-2;a+=3)if((c=MM_findObj(e[a]))!=null){document.MM_sr[b++]=c;if(!c.oSrc)c.oSrc=c.src;c.src=e[a+2]}} function loadGarmin(){display=new Garmin.DeviceDisplay("garminDisplay",{pathKeyPairsArray:["http://www.goodrunguide.co.uk","7007d266098c95b8a499dc0bcfba0816"],downloadAndInstall:"<br/>Download and install",showFindDevicesButton:true,autoFindDevices:true,deviceSelectLabel:"",findDevicesButtonText:"Find GPS",showDeviceButtonsOnFound:false,noDeviceDetectedStatusText:"Please connect your GPS to your computer and click the Find GPS button",showStatusElement:true,showReadDataElementOnDeviceFound:true,readDataButtonText:"Read GPS", showCancelReadDataButton:true,cancelReadDataButtonText:"Cancel",readDataTypes:["FitnessHistory","GPSData"],trackListing:"#{date} #{time} (Duration: #{duration} )",lookingForDevices:'<div align="center">Searching for GPS<br/><br/> <img src="images/ajax-loader.gif"/></div>',showReadGoogleMap:true,showProgressBar:true,showReadTracksSelect:true,readDataType:null,readTracksSelectLabel:"",afterFinishReadFromDevice:function(){document.getElementById("readTracksSelect").onchange=function(){displayTrackMap(); getRouteStats()};try{loadActivities()}catch(a){}getRouteStats();if(String(document.getElementById("Guest").value)!="1")document.getElementById("SaveBut").style.display="block"},showReadWaypointsSelect:false,dataFound:"Please select the route to upload"});Garmin.DateTimeFormat.FORMAT={date:"#{day}/#{month}/#{year}",time:"#{hour}:#{minute}:#{second}",timestamp:"#{day}/#{month}/#{year} #{hour}:#{minute}:#{second}",timestamp12hour:"#{day}/#{month}/#{year} #{hour}:#{minute}:#{second} #{meridian}"}} function showLapsData(){if(LapsData.length>1){for(var a='<table width="300" cellpadding="4"><tr><td align="center" class="LapHead">LAP/SPLIT</td><td align="center" class="LapHead">TIME</td><td align="center" class="LapHead">DISTANCE</td></tr>',b=0,c=0;c<LapsData.length;c++){var e=Math.floor(LapsData[c].CumSecs-b);a+='<tr><td align="center" class="LapRow">'+String(c+1)+'</td><td align="center" class="LapRow">'+FormatTime(e)+'</td><td align="center" class="LapRow">'+LapsData[c].LapDist.toFixed(2)+" miles ("+ (parseFloat(LapsData[c].LapDist.toFixed(2))*1.609344).toFixed(1)+" km)</td></tr>";b+=e}a+="</table>";document.getElementById("LapScroll").innerHTML=a;document.getElementById("RouteLaps").firstChild.nodeValue=String(LapsData.length)}else{document.getElementById("LapScroll").innerHTML=" ";document.getElementById("RouteLaps").firstChild.nodeValue="0"}} function loadGPSxml(a){try{xmlDoc=new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async="false";xmlDoc.loadXML(a);return xmlDoc}catch(b){parser=new DOMParser;return xmlDoc=parser.parseFromString(a,"text/xml")}}function calcRouteLength(a){for(var b=0,c=1;c<a.length;c++){var e=ecef_distance(route_ecef_points[c],route_ecef_points[c-1]);if(e>1E4)e=ecef_gc_distance(route_ecef_points[c],route_ecef_points[c-1]);b+=parseFloat(e)}return parseFloat(b/1609.344)} function loadActivities(){GPSxml=loadGPSxml(display.readDataString);display.readDataString=null;for(var a=GPSxml.getElementsByTagName("Activity"),b=0;b<a.length;b++)a[b].getElementsByTagName("Track").length>0&&Activities.push(a[b])} function loadRouteStats(a){if(Activities.length>a){var b=Activities[a].getElementsByTagName("Lap");NumLaps=b.length;var c=0,e=0,h=0;LapsData.length=0;var j="";GPSActivID=1;try{j=Activities[a].getAttribute("Sport")}catch(o){}if(j=="Biking")GPSActivID=2;if(NumLaps>0){j=a="00:00:00";for(var f=0;f<NumLaps;f++){var k={},g=b[f].getElementsByTagName("TotalTimeSeconds");if(isNaN(g[0].firstChild.nodeValue))k.LapSecs=0;else{k.LapSecs=parseFloat(g[0].firstChild.nodeValue);e+=parseFloat(k.LapSecs)}g=b[f].getElementsByTagName("AverageHeartRateBpm"); k.AHR=g.length>0?g[0].getElementsByTagName("Value")[0].firstChild.nodeValue:null;g=b[f].getElementsByTagName("Trackpoint");var n=h=lap_totaldist=lap_totaldistmetres=k.TrkPts=0,l=0;l=0;var q="",t="";if(g.length>0){for(l=0;l<g.length;l++){var p={},r=g[l].getElementsByTagName("LatitudeDegrees"),s=g[l].getElementsByTagName("LongitudeDegrees"),m=g[l].getElementsByTagName("Time");if(r.length>0&&s.length>0){if(f==0)if(a=="00:00:00"&&m.length>0){a=m[0].firstChild.nodeValue.substring(11,19);routedate=m[0].firstChild.nodeValue.substring(8, 10)+"/"+m[0].firstChild.nodeValue.substring(5,7)+"/"+m[0].firstChild.nodeValue.substring(0,4)}if(m.length>0){j=m[0].firstChild.nodeValue.substring(11,19);if(q=="")q=m[0].firstChild.nodeValue.substring(11,19);t=j}r=r[0].firstChild.nodeValue;s=s[0].firstChild.nodeValue;m=m[0].firstChild.nodeValue.substring(11,19);if(f>0||l>0){LapPtTime=CalcRouteTime(a,m);if(String(LapPtTime)=="0")LapPtTime=route_pt_times[route_pt_times.length-1]}else LapPtTime=0;if(!isNaN(String(r))&&!isNaN(String(s))){p.y=parseFloat(r); p.x=parseFloat(s);m=geo2ecef(p.y,p.x);lap_ecef_points[l]=m;route_ecef_points.push(m);route_pt_times.push(LapPtTime);k.TrkPts++;gpx_poly_comp.push(p);if(h>0){d=ecef_distance(lap_ecef_points[l],lap_ecef_points[n]);if(d>1E4)d=ecef_gc_distance(lap_ecef_points[l],lap_ecef_points[n]);lap_totaldistmetres+=parseFloat(d);lap_totaldist=parseFloat(lap_totaldistmetres/1609.344)}h++;n=l}}}route_totaldist=calcRouteLength(route_ecef_points)}h=CalcRouteTime(a,t);l=CalcRouteTime(q,t);n=lap_totaldist;c+=lap_totaldist; k.LapDist=lap_totaldist;k.CumDist=c;k.CumSecs=e;k.TrkPts=g.length;k.ElapsedSecs=l;k.CumElapsedSecs=h;k.LapSecsNoStop=k.LapSecs;k.CumSecsNoStop=e;LapsData.push(k)}elapsedtime=CalcRouteTime(a,j);routetime=LapsData[LapsData.length-1].CumSecs;for(e=c=b=0;e<LapsData.length;e++){if(LapsData[e].AHR>0&&LapsData[e].LapSecs>0){c+=LapsData[e].AHR*LapsData[e].LapSecs;b+=LapsData[e].LapSecs}routeAHR=Math.floor(c/b)}}}else{b=GPSxml.getElementsByTagName("trk");if(b.length>a){g=b[a].getElementsByTagName("trkpt"); RouteTrkPts=g.length;if(g.length>0){j=a="00:00:00";if(g[0].getElementsByTagName("time")){a=g[0].getElementsByTagName("time")[0].firstChild.nodeValue.substring(11,19);routedate=g[0].getElementsByTagName("time")[0].firstChild.nodeValue.substring(8,10)+"/"+g[0].getElementsByTagName("time")[0].firstChild.nodeValue.substring(5,7)+"/"+g[0].getElementsByTagName("time")[0].firstChild.nodeValue.substring(0,4)}if(g[g.length-1].getElementsByTagName("time"))j=g[g.length-1].getElementsByTagName("time")[0].firstChild.nodeValue.substring(11, 19);routetime=elapsedtime=CalcRouteTime(a,j);for(l=0;l<g.length;l++){p={};b=g[l].getAttribute("lat");c=g[l].getAttribute("lon");m=g[l].getElementsByTagName("time");m=m[0].firstChild.nodeValue.substring(11,19);if(l>0){LapPtTime=CalcRouteTime(a,m);if(String(LapPtTime)=="0")LapPtTime=route_pt_times[route_pt_times.length-1]}else LapPtTime=0;if(!isNaN(String(b))&&!isNaN(String(c))){p.y=parseFloat(b);p.x=parseFloat(c);m=geo2ecef(p.y,p.x);route_ecef_points.push(m);route_pt_times.push(LapPtTime);gpx_poly_comp.push(p)}}route_totaldist= calcRouteLength(route_ecef_points)}else alert("Sorry - we were unable to read any route data from your device.")}else alert("Sorry - there was a problem reading the data")}} function displayRouteStats(){var a="";if(LapsData.length>0){if(isNaN(route_totaldist))document.getElementById("RouteLength").firstChild.nodeValue="n/a";else document.getElementById("RouteLength").firstChild.nodeValue=route_totaldist.toFixed(2)+" miles ("+(parseFloat(route_totaldist.toFixed(2))*1.609344).toFixed(1)+" km)";if(isNaN(routetime))document.getElementById("ExTime").firstChild.nodeValue="n/a";else document.getElementById("ExTime").firstChild.nodeValue=FormatTime(Math.floor(routetime));if(elapsedtime> 0&&route_ecef_points.length>0){document.getElementById("RecTime").firstChild.nodeValue=String(route_ecef_points.length)+" points over "+FormatTime(elapsedtime);if(stoppage_time>0){a=parseFloat(LapsData[LapsData.length-1].CumSecsNoStop);document.getElementById("StopsText").firstChild.nodeValue="("+FormatPace(stoppage_time-(elapsedtime-Math.floor(a)))+")"}else document.getElementById("StopsText").firstChild.nodeValue=" "}else{document.getElementById("RecTime").firstChild.nodeValue="n/a";document.getElementById("StopsText").firstChild.nodeValue= " "}if(!isNaN(routetime)&&routetime>0&&!isNaN(route_totaldist)&&route_totaldist.toFixed(2)>0){a=Math.floor(routetime/route_totaldist.toFixed(2));document.getElementById("RoutePace").firstChild.nodeValue=FormatPace(a)+" mins/mile ("+FormatPace(a/1.609344)+" mins/km)"}else document.getElementById("RoutePace").firstChild.nodeValue="n/a";if(routeAHR>0)document.getElementById("RouteAHR").firstChild.nodeValue=String(routeAHR)+" bpm";else document.getElementById("RouteAHR").firstChild.nodeValue="n/a";showLapsData()}else{if(isNaN(route_totaldist))document.getElementById("RouteLength").firstChild.nodeValue= "n/a";else document.getElementById("RouteLength").firstChild.nodeValue=route_totaldist.toFixed(2)+" miles ("+(parseFloat(route_totaldist.toFixed(2))*1.609344).toFixed(1)+" km)";if(elapsedtime>0&&route_ecef_points.length>0){document.getElementById("RecTime").firstChild.nodeValue=String(route_ecef_points.length)+" points over "+FormatTime(elapsedtime);document.getElementById("ExTime").firstChild.nodeValue=FormatTime(routetime);if(stoppage_time>0)document.getElementById("StopsText").firstChild.nodeValue= "("+FormatPace(stoppage_time)+")";else document.getElementById("StopsText").firstChild.nodeValue=" "}else{document.getElementById("RecTime").firstChild.nodeValue="n/a";document.getElementById("ExTime").firstChild.nodeValue="n/a";document.getElementById("StopsText").firstChild.nodeValue=" "}if(!isNaN(routetime)&&routetime>0&&!isNaN(route_totaldist)&&route_totaldist.toFixed(2)>0){a=Math.floor(routetime/route_totaldist.toFixed(2));document.getElementById("RoutePace").firstChild.nodeValue=FormatPace(a)+ " mins/mile ("+FormatPace(a/1.609344)+" mins/km)"}else document.getElementById("RoutePace").firstChild.nodeValue="n/a";document.getElementById("RouteLaps").firstChild.nodeValue="0";document.getElementById("RouteAHR").firstChild.nodeValue="n/a"}}function displayTrackMap(){var a=$("readTracksSelect");display.displayTrack(display._seriesFromSelect(a))} function clearRouteData(){route_ecef_points.length=0;elapsedtime=routetime=route_totaldist=route_pt_times.length=0;routedate="";routeAHR=0;gpx_poly_comp.length=0;LapsData.length=0;StopsExcluded=false;stoppage_time=0;document.getElementById("LapScroll").innerHTML=" "} function getRouteStats(){clearRouteData();var a=$("readTracksSelect"),b=a.selectedIndex;if(isNaN(a)){loadRouteStats(b);displayRouteStats();document.getElementById("GenLaps").style.display="block";document.getElementById("GPSLaps").style.display="none";document.getElementById("ExcStopsDiv").style.display="block";document.getElementById("IncStopsDiv").style.display="none"}else alert("Please select a route first")} function processRoute(){var a=$("readTracksSelect").selectedIndex;if(isNaN(a))alert("Please read the data from your GPS first");else{showSave();document.getElementById("DateRan").value=routedate;document.getElementById("RunName").value="";document.getElementById("RouteType").value="";document.getElementById("RouteID").value="";document.getElementById("GRGRunNumber").value="";document.getElementById("HRR").value="";document.getElementById("RouteName").value="";document.getElementById("RouteNotes").value= "";document.getElementById("LogBookNotes").value="";if(isNaN(route_totaldist)){document.getElementById("SaveDistance").firstChild.nodeValue="Unavailable - please reload";document.getElementById("Distance").value=""}else{document.getElementById("SaveDistance").firstChild.nodeValue=route_totaldist.toFixed(2)+" miles ("+(parseFloat(route_totaldist.toFixed(2))*1.609344).toFixed(1)+" km)";document.getElementById("Distance").value=route_totaldist.toFixed(2)}if(!isNaN(routetime)&&routetime>0){a=FormatTime(Math.floor(routetime)); document.getElementById("Hours").value=parseInt(a.substring(0,2),10);document.getElementById("MinsField").value=parseInt(a.substring(3,5),10);document.getElementById("Mins").value=parseInt(a.substring(0,2),10)+parseInt(a.substring(0,2),10)*60;document.getElementById("Secs").value=parseInt(a.substring(6,8),10)}else{document.getElementById("Hours").value="";document.getElementById("MinsField").value="";document.getElementById("Mins").value="";document.getElementById("Secs").value=""}if(LapsData.length> 0){document.getElementById("UploadLaps").style.display="block";document.getElementById("Lapsna").firstChild.nodeValue=" "}else{document.getElementById("UploadLaps").style.display="none";document.getElementById("Lapsna").firstChild.nodeValue="n/a"}if(routeAHR>0)document.getElementById("AHR").value=String(routeAHR);else document.getElementById("AHR").value="";document.getElementById("ActivID").value=GPSActivID;changeActivity()}} function create_gpx(){var a=[];a.push('<?xml version="1.0" encoding="UTF-8" standalone="no" ?>\n<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="www.GoodRunGuide.co.uk" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">\n<metadata>\n<desc>This file was created at http://www.GoodRunGuide.co.uk using the Good Run Gudie Garmin Uploader</desc>\n</metadata>\n');a.push("<trk>\n<name>Route recorded on : "+ String(routedate)+"</name>\n<trkseg>\n");for(var b=0;b<gpx_poly_comp.length;b++)a.push('<trkpt lat="'+gpx_poly_comp[b].y+'" lon="'+gpx_poly_comp[b].x+'"><ele>0</ele></trkpt>\n');a.push("</trkseg>\n</trk>\n</gpx>");gpx_text=a.join("");a.length=0} function updateMins(){var a;if(String(document.getElementById("Hours").value)!="")a=parseInt(document.getElementById("Hours").value,10);else{if(String(document.getElementById("MinsField").value)!=""||String(document.getElementById("Secs").value)!="")document.getElementById("Hours").value=0;a=0}if(String(document.getElementById("MinsField").value)!="")mns=parseInt(document.getElementById("MinsField").value,10);else{if(String(document.getElementById("Hours").value)!=""||String(document.getElementById("Secs").value)!= "")document.getElementById("MinsField").value=0;mns=0}if(String(document.getElementById("Secs").value)=="")if(String(document.getElementById("Hours").value)!=""||String(document.getElementById("MinsField").value)!="")document.getElementById("Secs").value=0;a=a*60+mns;if(a==0&&(String(document.getElementById("Secs").value)=="0"||String(document.getElementById("Secs").value)==""))document.getElementById("Mins").value="";else document.getElementById("Mins").value=a} function showUpload(){document.getElementById("HowToUseDiv").style.display="none";document.getElementById("HelpDiv").style.display="none";document.getElementById("SaveDiv").style.display="none";document.getElementById("UploadDiv").style.display="block";document.getElementById("HowToUseTab").className="";document.getElementById("HelpTab").className="";document.getElementById("UploadTab").className="current"} function showHowToUse(){document.getElementById("HelpDiv").style.display="none";document.getElementById("UploadDiv").style.display="none";document.getElementById("SaveDiv").style.display="none";document.getElementById("HowToUseDiv").style.display="block";document.getElementById("HowToUseTab").className="current";document.getElementById("HelpTab").className="";document.getElementById("UploadTab").className=""} function showHelp(){document.getElementById("HowToUseDiv").style.display="none";document.getElementById("UploadDiv").style.display="none";document.getElementById("SaveDiv").style.display="none";document.getElementById("HelpDiv").style.display="block";document.getElementById("HowToUseTab").className="";document.getElementById("HelpTab").className="current";document.getElementById("UploadTab").className=""} function showSave(){document.getElementById("HowToUseDiv").style.display="none";document.getElementById("UploadDiv").style.display="none";document.getElementById("HelpDiv").style.display="none";document.getElementById("SaveDiv").style.display="block";document.getElementById("HowToUseTab").className="";document.getElementById("HelpTab").className="";document.getElementById("UploadTab").className="current"} function toggleCreateRoute(){if(document.getElementById("CreateRoute").checked==true){document.getElementById("CreateRouteTab").style.display="block";newRoute()}else{document.getElementById("CreateRouteTab").style.display="none";existingRoute()}}function toggleCreateLog(){if(document.getElementById("CreateLog").checked==true)document.getElementById("CreateLogTab").style.display="block";else document.getElementById("CreateLogTab").style.display="none"} function changeActivity(){if(String(document.getElementById("ActivID").value)=="1"){document.getElementById("RunType").style.display="block";document.getElementById("AgeG").style.display="block";document.getElementById("CheckPBDiv").style.display="block";document.getElementById("AGPna").firstChild.nodeValue=" "}else{document.getElementById("RunType").style.display="none";document.getElementById("AgeG").style.display="none";document.getElementById("CheckPBDiv").style.display="none";document.getElementById("AGPna").firstChild.nodeValue= "n/a"}}function showAutoLapsBox(){MM_showHideLayers("AutoLapsBox","","show")} function excludeStops(a){if(LapsData.length>1){for(var b=0,c=0,e=0,h=0,j=0,o=1,f=0;f<LapsData.length;f++){e=LapsData[f].TrkPts;b=LapsData[f].LapDist;c=LapsData[f].CumDist;j=0;for(var k=o+e,g=o;g<route_ecef_points.length&&g<k;g++){var n=ecef_distance(route_ecef_points[g],route_ecef_points[g-1]);if(n>1E4)n=ecef_gc_distance(route_ecef_points[g],route_ecef_points[g-1]);if(n>0)var l=(route_pt_times[g]-route_pt_times[g-1])/n;if(n>0&&l>maxpace){h+=route_pt_times[g]-route_pt_times[g-1];j+=route_pt_times[g]- route_pt_times[g-1]}}k={};k.LapDist=b;k.CumDist=c;k.ElapsedSecs=LapsData[f].ElapsedSecs;k.CumElapsedSecs=LapsData[f].CumElapsedSecs;k.LapSecsNoStop=LapsData[f].LapSecs;k.CumSecsNoStop=LapsData[f].CumSecs;k.LapSecs=LapsData[f].ElapsedSecs-j;k.CumSecs=LapsData[f].CumElapsedSecs-h;k.TrkPts=e;LapsData[f]=k;o+=e}showLapsData()}if(!a){var q=0;for(g=1;g<route_ecef_points.length;g++){n=ecef_distance(route_ecef_points[g],route_ecef_points[g-1]);if(n>1E4)n=ecef_gc_distance(route_ecef_points[g],route_ecef_points[g- 1]);if(n>0)l=(route_pt_times[g]-route_pt_times[g-1])/n;if(n>0&&l>maxpace)q+=route_pt_times[g]-route_pt_times[g-1]}if(q>0){routetime=elapsedtime-q;if(isNaN(routetime))document.getElementById("ExTime").firstChild.nodeValue="n/a";else document.getElementById("ExTime").firstChild.nodeValue=FormatTime(routetime);if(!isNaN(routetime)&&routetime>0&&!isNaN(route_totaldist)&&route_totaldist.toFixed(2)>0){a=Math.floor(routetime/route_totaldist.toFixed(2));document.getElementById("RoutePace").firstChild.nodeValue= FormatPace(a)+" mins/mile ("+FormatPace(a/1.609344)+" mins/km)"}else document.getElementById("RoutePace").firstChild.nodeValue="n/a"}}stoppage_time=q;StopsExcluded=true;q=LapsData.length>0?parseFloat(LapsData[LapsData.length-1].CumSecsNoStop):parseFloat(routetime-stoppage_time);if(stoppage_time>0&&elapsedtime>0)document.getElementById("StopsText").firstChild.nodeValue="("+FormatPace(stoppage_time-(elapsedtime-Math.floor(q)))+")";else document.getElementById("StopsText").firstChild.nodeValue="(00:00)"; document.getElementById("ExcStopsDiv").style.display="none";document.getElementById("IncStopsDiv").style.display="block"} function includeStops(){document.getElementById("ExcStopsDiv").style.display="block";document.getElementById("IncStopsDiv").style.display="none";if(LapsData.length>0){for(var a=0;a<LapsData.length;a++){LapsData[a].LapSecs=LapsData[a].LapSecsNoStop;LapsData[a].CumSecs=LapsData[a].CumSecsNoStop}routetime=LapsData[LapsData.length-1].CumSecs}else routetime+=stoppage_time;stoppage_time=0;StopsExcluded=false;displayRouteStats()} function autoGenLaps(){LapsData.length=0;document.getElementById("LapScroll").innerHTML=" ";MM_showHideLayers("AutoLapsBox","","hide");var a=0,b=0;LapsData.length=0;var c;nextLap=b=parseFloat(document.getElementById("AutoLapUnits").value);for(var e=1,h=1;h<route_ecef_points.length;h++){e++;var j=ecef_distance(route_ecef_points[h],route_ecef_points[h-1]);if(j>1E4)j=ecef_gc_distance(route_ecef_points[h],route_ecef_points[h-1]);a+=parseFloat(j);for(parseFloat(a/1609.344);parseFloat(a)>nextLap;){c=parseFloat((nextLap- (a-j))/j);var o=parseFloat((route_pt_times[h]-route_pt_times[h-1])*c+parseFloat(route_pt_times[h-1]));c=parseFloat(j*c+parseFloat(a-j));c=LapsData.length>0?o-LapsData[LapsData.length-1].CumSecs:o;var f={};f.LapSecs=c;f.CumSecs=o;f.LapDist=parseFloat(b/1609.344);f.CumDist=LapsData.length>0?LapsData[LapsData.length-1].CumDist+f.LapDist:f.LapDist;f.TrkPts=e;f.ElapsedSecs=f.LapSecs;f.CumElapsedSecs=f.CumSecs;f.LapSecsNoStop=f.LapSecs;f.CumSecsNoStop=f.CumSecs;LapsData.push(f);e=0;nextLap+=b}}if(LapsData.length> 0&&LapsData[LapsData.length-1].CumDist<route_totaldist){f={};f.LapSecs=route_pt_times[route_pt_times.length-1]-LapsData[LapsData.length-1].CumSecs;f.CumSecs=route_pt_times[route_pt_times.length-1];f.LapDist=route_totaldist-LapsData[LapsData.length-1].CumDist;f.CumDist=route_totaldist;f.TrkPts=e;f.ElapsedSecs=f.LapSecs;f.CumElapsedSecs=f.CumSecs;f.LapSecsNoStop=f.LapSecs;f.CumSecsNoStop=f.CumSecs;LapsData.push(f)}if(LapsData.length>0){routetime=LapsData[LapsData.length-1].CumSecs;document.getElementById("ExTime").firstChild.nodeValue= FormatTime(Math.floor(routetime))}StopsExcluded&&excludeStops(true);LapsData.length<=1&&alert("Sorry - we are unable to generate laps/splits at the requested intervals for this route as it is too short.");showLapsData();document.getElementById("GPSLaps").style.display="block";document.getElementById("GenLaps").style.display="none"}function undoAutoLaps(){getRouteStats();document.getElementById("GPSLaps").style.display="none";document.getElementById("GenLaps").style.display="block"} function existingRoute(){document.getElementById("RouteNameTab").style.display="block";document.getElementById("NewRouteMsg").style.display="none"}function newRoute(){document.getElementById("RouteNameTab").style.display="none";document.getElementById("NewRouteMsg").style.display="block"}function PopulateRoutesList(a){document.getElementById("AjaxLoader").style.display="none";document.getElementById("RouteSelectDiv").style.display="block";document.getElementById("RoutesDiv").innerHTML=a} function PopulateRouteDetails(a){var b=a.getElementsByTagName("Route");if(b.length>=1){a=b[0].childNodes[0].firstChild.nodeValue;var c=b[0].childNodes[1].firstChild.nodeValue,e=b[0].childNodes[2].firstChild.nodeValue,h=b[0].childNodes[3].firstChild.nodeValue,j=b[0].childNodes[4].firstChild.nodeValue;j="";if(c=="A")j=b[0].childNodes[5].firstChild.nodeValue;b=true;if(parseFloat(route_totaldist).toFixed(1)!=parseFloat(h).toFixed(1))if(confirm("The length of this route is not the same as the route you have uploaded from your GPS. Your GPS route is "+ String(parseFloat(route_totaldist).toFixed(1))+" miles long and this route is "+String(parseFloat(h).toFixed(1))+" miles long. Are you sure you want to use this route?")!=true)b=false;if(b){document.getElementById("RunName").value=unescape(e);if(c=="R")document.getElementById("GRGRunNumber").value=a;else document.getElementById("GRGRunNumber").value=0;document.getElementById("RouteID").value=a;document.getElementById("RouteType").value=c;if(c=="A"){document.getElementById("DateRan").value=j;document.getElementById("RunType").value= 8}route_totaldist=parseFloat(h)}}else alert("Sorry - there was a problem retrieving the route information");document.getElementById("AjaxLoader").style.display="none";MM_showHideLayers("ChooseRoute","","hide")} function loadXMLDoc(a,b){var c;try{c=new XMLHttpRequest}catch(e){try{c=new ActiveXObject("Msxml2.XMLHTTP")}catch(h){try{c=new ActiveXObject("Microsoft.XMLHTTP")}catch(j){alert("Sorry - your browser does not support this function.");return false}}}c.onreadystatechange=function(){if(c.readyState==4&&c.status==200)switch(b){case "L":PopulateRoutesList(c.responseText);break;case "D":PopulateRouteDetails(c.responseXML);break;case "A":showPerfLevel(c.responseText);break;case "H":hillProfileResponse(c.responseText); break}else c.readyState==4&&c.status!=200&&alert("Sorry - a problem occured. Please try again. If this problem persists please let us know.")};c.open("GET",a,true);c.send(null)}function getRoutes(a,b){document.getElementById("RouteSelectDiv").style.display="none";document.getElementById("AjaxLoader").style.display="block";var c=document.getElementById("RouteFolder").value;loadXMLDoc("GetRoutesforLogRun.asp?Type="+a+"&Folder="+c+"&Units="+b,"L")} function showRouteSelect(a){if(document.getElementById("RoutesList").options.length==0){document.RouteTypeForm.RouteType[1].checked=false;document.RouteTypeForm.RouteType[2].checked=false;document.RouteTypeForm.RouteType[0].checked=true;getRoutes("S",1,a)}}function getTheRouteInfo(a,b,c){document.getElementById("AjaxLoader").style.display="block";loadXMLDoc("GetRouteDetails.asp?Type="+b+"&RouteID="+a+"&Units="+c,"D")} function confirmRoute(a){var b=document.getElementById("RoutesList").value;if(b>0){var c="S";if(document.RouteTypeForm.RouteType[1].checked)c="A";else if(document.RouteTypeForm.RouteType[2].checked)c="R";getTheRouteInfo(b,c,a,true)}} function compressRoute(){if(gpx_poly_comp.length>=3){removeIdenticalPoints();var a=gpx_poly_comp.length-1;gpx_poly_comp[0].discard=false;gpx_poly_comp[gpx_poly_comp.length-1].discard=false;for(b=1;b<gpx_poly_comp.length-1;b++)gpx_poly_comp[b].discard=true;simplifySegment(0,a);for(var b=1;b<gpx_poly_comp.length-1;)if(gpx_poly_comp[b].discard==true)gpx_poly_comp.splice(b,1);else b++}} function removeIdenticalPoints(){for(var a=1;a<gpx_poly_comp.length;)if(gpx_poly_comp[a].x==gpx_poly_comp[a-1].x&&gpx_poly_comp[a].y==gpx_poly_comp[a-1].y)gpx_poly_comp.splice(a,1);else a++}function simplifySegment(a,b){var c;if(!(b<=a)){for(var e=0,h=0,j=a+1;j<=b-1;j++){c=calcDisttoSegment(gpx_poly_comp[j],gpx_poly_comp[a],gpx_poly_comp[b]);if(!(c<=tolerance))if(c>e){e=c;h=j}}if(e>tolerance){gpx_poly_comp[h].discard=false;simplifySegment(a,h);simplifySegment(h,b)}}} function calcDisttoSegment(a,b,c){var e,h;e=(c.x-b.x)*(c.x-b.x)+(c.y-b.y)*(c.y-b.y);if(b.y==c.y&&b.x==c.x)h=Math.sqrt(Math.pow(c.y-a.y,2)+Math.pow(c.x-a.x,2));else{e=((a.y-b.y)*(c.y-b.y)+(a.x-b.x)*(c.x-b.x))/e;if(e<=0)h=Math.sqrt(Math.pow(a.y-b.y,2)+Math.pow(a.x-b.x,2));if(e>=1)h=Math.sqrt(Math.pow(a.y-c.y,2)+Math.pow(a.x-c.x,2));if(0<e&&e<1)h=Math.sqrt(Math.pow(a.y-b.y-e*(c.y-b.y),2)+Math.pow(a.x-b.x-e*(c.x-b.x),2))}return h} function hideSaveWait(){document.getElementById("SaveWait").style.display="none"}function untickSave(){document.getElementById("CreateRoute").checked=false;document.getElementById("CreateLog").checked=false;document.getElementById("AgeG").checked=false} function postData(a,b,c){var e;try{e=new XMLHttpRequest}catch(h){try{e=new ActiveXObject("Msxml2.XMLHTTP")}catch(j){try{e=new ActiveXObject("Microsoft.XMLHTTP")}catch(o){alert("Sorry - your browser does not support this function.");return false}}}e.onreadystatechange=function(){if(e.readyState==4&&e.status==200)switch(b){case "R":postRouteResponse(e.responseText);break;case "A":postActivityResponse(e.responseText);break;case "L":postLapsResponse(e.responseText);break}else if(e.readyState==4&&e.status!= 200)switch(b){case "R":postRouteResponse("ERROR - An unknown error has occured.");break;case "A":postActivityResponse("ERROR - An unknown error has occured.");break;case "L":postLapsResponse("ERROR - An unknown error has occured.");break}};e.open("POST",a,true);e.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8");e.send(c)} function upload_activity(a){var b=String(document.getElementById("DateRan").value),c="";c=document.getElementById("CreateRoute").checked?document.getElementById("RouteName").value:document.getElementById("RunName").value;var e=String(route_totaldist.toFixed(2)),h=document.getElementById("Mins").value,j=document.getElementById("Secs").value,o=document.getElementById("LogBookNotes").value,f=0;if(document.getElementById("CheckforPB").checked)f=1;var k=document.getElementById("RunType").value,g=document.getElementById("Terrain").value, n=document.getElementById("GRGRunNumber").value,l=document.getElementById("RouteID").value;if(document.getElementById("CreateRoute").checked)l=a;a=document.getElementById("AHR").value;var q=document.getElementById("HRR").value,t=document.getElementById("ActivID").value;if(String(t)!="1")k="6";var p="";if(document.getElementById("ShoeID"))p=document.getElementById("ShoeID").value;var r=0;if(document.getElementById("UpdatePlanner").checked)r=1;var s=0;if(document.getElementById("AgeG").checked)s=1; var m=String(document.getElementById("DOB").value),u=String(document.getElementById("Sex").value);b="DateRan="+escape(b)+"&RunName="+escape(c)+"&Distance="+escape(e)+"&Mins="+escape(h)+"&Secs="+escape(j)+"&Notes="+escape(o)+"&CheckforPB="+escape(f)+"&RunType="+escape(k)+"&Terrain="+escape(g)+"&GRGRunNumber="+escape(n)+"&RouteID="+escape(l)+"&AHR="+escape(a)+"&HRR="+escape(q)+"&ActivID="+escape(t)+"&ShoeID="+escape(p)+"&UpdatePlanner="+escape(r)+"&CalcAgeG="+escape(s)+"&DOB="+escape(m)+"&Sex="+escape(u); postData("PostNewActivity.asp","A",b)}function upload_route(){var a=document.getElementById("RouteName").value,b=document.getElementById("FolderNo").value,c=document.getElementById("RouteNotes").value;a="RouteName="+escape(a)+"&FolderNo="+escape(b)+"&Dist="+escape(String(route_totaldist.toFixed(2)))+"&Notes="+escape(c)+"&GPX="+escape(gpx_text);postData("PostNewSavedRoute.asp","R",a)} function upload_laps(a){for(var b="<Laps>",c=0,e=0;e<LapsData.length;e++){var h=Math.floor(LapsData[e].CumSecs-c);b+="<Lap Int='"+LapsData[e].LapDist.toFixed(2)+"' Cum='"+LapsData[e].CumDist.toFixed(2)+"' Time='"+Math.round(h)+"'></Lap>";c+=h}b+="</Laps>";a="RunID="+escape(a)+"&LapsXML="+escape(b);postData("PostNewLaps.asp","L",a)} function hill_profile(a){var b=document.getElementById("RouteName").value;b=document.getElementById("FolderNo").value;b=document.getElementById("RouteNotes").value;a="GetNewHillProfile.asp?RouteID="+escape(a);loadXMLDoc(a,"H")} function postActivityResponse(a){if(!isNaN(a)&&parseInt(a)>0)if(document.getElementById("UploadLaps").checked&&LapsData.length>1){saveStatus("Uploading laps/splits to your Log Book...");setTimeout(function(){upload_laps(a)},500)}else{saveStatus("");document.getElementById("SaveActivityResult").innerHTML='THE ACTIVITY HAS BEEN SAVED TO YOUR LOG BOOK<img src="Images/TickSmall.gif" alt="Route Saved OK" width="21" height="23" hspace="5" /><br/><br/><span class="CommentText">Select the Upload tab to upload more data<br/>or choose another page from the menu.</span>'; hideSaveWait()}else{document.getElementById("SaveWarnings").firstChild.nodeValue=String(a);hideSaveWait()}}function postRouteResponse(a){if(!isNaN(a)&&parseInt(a)>0)setTimeout(function(){saveStatus("Generating Hill Profile...");hill_profile(a)},100);else{document.getElementById("SaveWarnings").firstChild.nodeValue=String(a);saveStatus(" ");document.getElementById("SaveWait").style.display="none"}} function postLapsResponse(a){saveStatus(" ");document.getElementById("SaveWait").style.display="none";document.getElementById("SaveActivityResult").innerHTML='THE ACTIVITY HAS BEEN SAVED TO YOUR LOG BOOK<img src="Images/TickSmall.gif" alt="Route Saved OK" width="21" height="23" hspace="5" /><br/><br/><span class="CommentText">Select the Upload tab to upload more data or choose another page from the menu.</span>';if(!(!isNaN(a)&&parseInt(a)>0))document.getElementById("SaveWarnings").firstChild.nodeValue= String(a)} function hillProfileResponse(a){if(!(!isNaN(a)&&String(a)!="-1"))document.getElementById("SaveWarnings").firstChild.nodeValue="NOTE: A problem occured while generating the Hill Profile.";if(document.getElementById("CreateLog").checked){document.getElementById("SaveRouteResult").innerHTML='THE ROUTE HAS BEEN SAVED TO YOUR SAVED ROUTES <img src="Images/TickSmall.gif" alt="Route Saved OK" width="21" height="23" hspace="5" />';setTimeout(function(){saveStatus("Uploading activity to your Log Book...");upload_activity(a)}, 500)}else{document.getElementById("SaveRouteResult").innerHTML='THE ROUTE HAS BEEN SAVED TO YOUR SAVED ROUTES <img src="Images/TickSmall.gif" alt="Route Saved OK" width="21" height="23" hspace="5" /><br/><br/><span class="CommentText">Select the Upload tab to upload more data or choose another page from the menu.</span>';saveStatus(" ");document.getElementById("SaveWait").style.display="none"}}function saveStatus(a){document.getElementById("SaveStatusText").firstChild.nodeValue=a} function saveAllData(){updateMins();if(VF_SaveForm()){saveStatus(" ");document.getElementById("SaveWarnings").firstChild.nodeValue=" ";document.getElementById("SaveRouteResult").innerHTML=" ";document.getElementById("SaveActivityResult").innerHTML=" ";document.getElementById("SaveWait").style.display="block";MM_showHideLayers("SaveStatus","","show");if(document.getElementById("CreateRoute").checked){saveStatus("Removing redundant points from route...");setTimeout(function(){tolerance=parseFloat(1.798E-5); compressRoute();saveStatus("Preparing route file for uploading...");setTimeout(function(){create_gpx();saveStatus("Uploading route to your Saved Routes...");setTimeout(function(){upload_route()},500)},500)},500)}else if(document.getElementById("CreateLog").checked){saveStatus("Uploading activity to your Log Book...");setTimeout(function(){upload_activity()},500)}else{saveStatus("You have not selected anything to save");hideSaveWait()}}} function VF_SaveForm(){var a=true,b="",c=/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20)\d\d$/;if(document.getElementById("CreateRoute").checked)if(String(document.getElementById("RouteName").value)==""){a=false;b="Please enter a name for the new Saved Route"}if(document.getElementById("CreateLog").checked){if(!c.test(String(document.getElementById("DateRan").value))){a=false;b="Invalid date for the activity - please check it is in the format dd/mm/yyyy."}if(!document.getElementById("CreateRoute").checked)if(String(document.getElementById("RunName").value)== ""){a=false;b="No route has been specified. Please upload the route from your GPS, select an existing mapped route or enter a route name."}if(String(document.getElementById("Hours").value)!=""){c=String(document.getElementById("Hours").value);if(isNaN(c)||c.indexOf(".")!=-1||parseInt(c)<0){a=false;b="The number of hours for the activity is invalid."}}if(String(document.getElementById("MinsField").value)!=""){c=String(document.getElementById("MinsField").value);if(isNaN(c)||c.indexOf(".")!=-1||parseInt(c)< 0||parseInt(c)>59){a=false;b="The number of minutes for the activity is invalid."}}if(String(document.getElementById("Secs").value)!=""){c=String(document.getElementById("Secs").value);if(isNaN(c)||c.indexOf(".")!=-1||parseInt(c)<0||parseInt(c)>59){a=false;b="The number of seconds for the activity is invalid."}}if(String(document.getElementById("AHR").value)!=""){c=String(document.getElementById("AHR").value);if(isNaN(c)||c.indexOf(".")!=-1||parseInt(c)<30||parseInt(c)>300){a=false;b="The number entered for the Average Heart Rate is invalid. Please enter a whole number of beats per minute between 30 and 300."}}if(String(document.getElementById("HRR").value)!= ""){c=String(document.getElementById("HRR").value);if(isNaN(c)||c.indexOf(".")!=-1||parseInt(c)<2||parseInt(c)>90){a=false;b="The number entered for the Heart Rate Recovery is invalid. Please enter a whole number of beats per minute between 2 and 90."}}}b!=""&&alert(b);return a};
