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=[],route_pt_ahrs=[],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,NewRouteID="",routeCals=0; function Ellipsoid(a,b){var c,e;this.A=a;this.B=b;c=a*a;e=b*b;this.EC=(c-e)/c;this.EC2=(c-e)/e}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 g,h;if(c==null)c=0;if(e==null)e=WGS84;a=deg2rad(a);b=deg2rad(b);g=[Math.sin(a),Math.sin(b)];a=[Math.cos(a),Math.cos(b)];b=e.A/Math.sqrt(1-e.EC*g[0]*g[0]);h={};h.X=(b+c)*a[0]*a[1];h.Y=(b+c)*a[0]*g[1];h.Z=(b*(1-e.EC)+c)*g[0];return h}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);return(c+e)*Math.acos((a.X*b.X+a.Y*b.Y+a.Z*b.Z)/(e*c))/2} function ecef_distance(a,b){var c,e,g;c=b.X-a.X;e=b.Y-a.Y;g=b.Z-a.Z;return Math.sqrt(c*c+e*e+g*g)}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),g=a.substring(6,8),h=0,l=b.substring(0,2),k=b.substring(3,5),j=b.substring(6,8),f=0;if(!isNaN(c)&&!isNaN(e)&&!isNaN(g)){c=parseInt(c,10);e=parseInt(e,10);g=parseInt(g,10);h=c*60*60+e*60+g}if(!isNaN(l)&&!isNaN(k)&&!isNaN(j)){l=parseInt(l,10);k=parseInt(k,10);j=parseInt(j,10);f=l*60*60+k*60+j}c=0;if(h>0&&f>0)c=f-h;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(a,b){display=new Garmin.DeviceDisplay("garminDisplay",{pathKeyPairsArray:[a,b],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(c){}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="310" cellpadding="3"><tr><td align="center" class="LapHead">LAP</td><td align="center" class="LapHead">TIME</td><td align="center" class="LapHead">DISTANCE</td><td align="center" class="LapHead">AHR (bpm)</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><td align="center" class="LapRow">';a+=LapsData[c].AHR!=null?String(LapsData[c].AHR):"&nbsp;";a+="</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,g=0;LapsData.length=0;var h="";GPSActivID=1;try{h=Activities[a].getAttribute("Sport")}catch(l){}if(h=="Biking")GPSActivID=2;if(NumLaps>0){h=a="00:00:00";for(var k=0;k<NumLaps;k++){var j={},f=b[k].getElementsByTagName("TotalTimeSeconds");if(isNaN(f[0].firstChild.nodeValue))j.LapSecs=0;else{j.LapSecs=parseFloat(f[0].firstChild.nodeValue);e+=parseFloat(j.LapSecs)}f=b[k].getElementsByTagName("AverageHeartRateBpm"); j.AHR=f.length>0?f[0].getElementsByTagName("Value")[0].firstChild.nodeValue:null;f=b[k].getElementsByTagName("Calories");j.Cals=f.length>0?f[0].firstChild.nodeValue:null;f=b[k].getElementsByTagName("Trackpoint");var o=lap_totaldist=lap_totaldistmetres=j.TrkPts=0,p=0,m=0,t="",u="";if(f.length>0){for(g=0;g<f.length;g++){m={};var q=f[g].getElementsByTagName("LatitudeDegrees"),r=f[g].getElementsByTagName("LongitudeDegrees"),n=f[g].getElementsByTagName("Time"),s=f[g].getElementsByTagName("HeartRateBpm"), v=null;if(s.length>0&&s[0].getElementsByTagName("Value").length>0)v=s[0].getElementsByTagName("Value")[0].firstChild.nodeValue;if(q.length>0&&r.length>0){if(k==0)if(a=="00:00:00"&&n.length>0){a=n[0].firstChild.nodeValue.substring(11,19);routedate=n[0].firstChild.nodeValue.substring(8,10)+"/"+n[0].firstChild.nodeValue.substring(5,7)+"/"+n[0].firstChild.nodeValue.substring(0,4)}if(n.length>0){h=n[0].firstChild.nodeValue.substring(11,19);if(t=="")t=n[0].firstChild.nodeValue.substring(11,19);u=h}q=q[0].firstChild.nodeValue; r=r[0].firstChild.nodeValue;n=n[0].firstChild.nodeValue.substring(11,19);if(k>0||g>0){LapPtTime=CalcRouteTime(a,n);if(String(LapPtTime)=="0")LapPtTime=route_pt_times[route_pt_times.length-1]}else LapPtTime=0;if(!isNaN(String(q))&&!isNaN(String(r))){m.y=parseFloat(q);m.x=parseFloat(r);n=geo2ecef(m.y,m.x);lap_ecef_points[g]=n;route_ecef_points.push(n);route_pt_times.push(LapPtTime);route_pt_ahrs.push(v);j.TrkPts++;gpx_poly_comp.push(m);if(o>0){d=ecef_distance(lap_ecef_points[g],lap_ecef_points[p]); if(d>1E4)d=ecef_gc_distance(lap_ecef_points[g],lap_ecef_points[p]);lap_totaldistmetres+=parseFloat(d);lap_totaldist=parseFloat(lap_totaldistmetres/1609.344)}o++;p=g}}}route_totaldist=calcRouteLength(route_ecef_points)}g=CalcRouteTime(a,u);m=CalcRouteTime(t,u);c+=lap_totaldist;j.LapDist=lap_totaldist;j.CumDist=c;j.CumSecs=e;j.TrkPts=f.length;j.ElapsedSecs=m;j.CumElapsedSecs=g;j.LapSecsNoStop=j.LapSecs;j.CumSecsNoStop=e;LapsData.push(j)}elapsedtime=CalcRouteTime(a,h);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}if(b>0)routeAHR=Math.floor(c/b);for(e=routeCals=0;e<LapsData.length;e++)if(!isNaN(LapsData[e].Cals)&&parseInt(LapsData[e].Cals)>0)routeCals+=parseInt(LapsData[e].Cals)}}else{b=GPSxml.getElementsByTagName("trk");if(b.length>a){f=b[a].getElementsByTagName("trkpt");RouteTrkPts=f.length;if(f.length>0){h=a="00:00:00";if(f[0].getElementsByTagName("time")){a= f[0].getElementsByTagName("time")[0].firstChild.nodeValue.substring(11,19);routedate=f[0].getElementsByTagName("time")[0].firstChild.nodeValue.substring(8,10)+"/"+f[0].getElementsByTagName("time")[0].firstChild.nodeValue.substring(5,7)+"/"+f[0].getElementsByTagName("time")[0].firstChild.nodeValue.substring(0,4)}if(f[f.length-1].getElementsByTagName("time"))h=f[f.length-1].getElementsByTagName("time")[0].firstChild.nodeValue.substring(11,19);routetime=elapsedtime=CalcRouteTime(a,h);for(g=0;g<f.length;g++){m= {};b=f[g].getAttribute("lat");c=f[g].getAttribute("lon");n=f[g].getElementsByTagName("time");n=n[0].firstChild.nodeValue.substring(11,19);if(g>0){LapPtTime=CalcRouteTime(a,n);if(String(LapPtTime)=="0")LapPtTime=route_pt_times[route_pt_times.length-1]}else LapPtTime=0;if(!isNaN(String(b))&&!isNaN(String(c))){m.y=parseFloat(b);m.x=parseFloat(c);n=geo2ecef(m.y,m.x);route_ecef_points.push(n);route_pt_times.push(LapPtTime);gpx_poly_comp.push(m)}}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(){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){var 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";if(routeCals!= 0)document.getElementById("RouteCals").firstChild.nodeValue=String(routeCals);else document.getElementById("RouteCals").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";document.getElementById("RouteCals").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;routeCals=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="";document.getElementById("Calories").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="";if(routeCals!=0)document.getElementById("Calories").value=String(routeCals);else document.getElementById("Calories").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,g=0,h=0,l=1,k=0;k<LapsData.length;k++){e=LapsData[k].TrkPts;b=LapsData[k].LapDist;c=LapsData[k].CumDist;h=0;for(var j=l+e,f=l;f<route_ecef_points.length&&f<j;f++){var o=ecef_distance(route_ecef_points[f],route_ecef_points[f-1]);if(o>1E4)o=ecef_gc_distance(route_ecef_points[f],route_ecef_points[f-1]);if(o>0)var p=(route_pt_times[f]-route_pt_times[f-1])/o;if(o>0&&p>maxpace){g+=route_pt_times[f]-route_pt_times[f-1];h+=route_pt_times[f]- route_pt_times[f-1]}}j={};j.LapDist=b;j.CumDist=c;j.ElapsedSecs=LapsData[k].ElapsedSecs;j.CumElapsedSecs=LapsData[k].CumElapsedSecs;j.LapSecsNoStop=LapsData[k].LapSecs;j.CumSecsNoStop=LapsData[k].CumSecs;j.LapSecs=LapsData[k].ElapsedSecs-h;j.CumSecs=LapsData[k].CumElapsedSecs-g;j.TrkPts=e;LapsData[k]=j;l+=e}showLapsData()}if(!a){var m=0;for(f=1;f<route_ecef_points.length;f++){o=ecef_distance(route_ecef_points[f],route_ecef_points[f-1]);if(o>1E4)o=ecef_gc_distance(route_ecef_points[f],route_ecef_points[f- 1]);if(o>0)p=(route_pt_times[f]-route_pt_times[f-1])/o;if(o>0&&p>maxpace)m+=route_pt_times[f]-route_pt_times[f-1]}if(m>0){routetime=elapsedtime-m;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=m;StopsExcluded=true;m=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(m)))+")";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;LapsData.length=0;var b,c=parseFloat(document.getElementById("AutoLapUnits").value);nextLap=c;for(var e=1,g=0,h=0,l=1;l<route_ecef_points.length;l++){e++;var k=ecef_distance(route_ecef_points[l],route_ecef_points[l-1]);if(k>1E4)k=ecef_gc_distance(route_ecef_points[l],route_ecef_points[l-1]);a+=parseFloat(k);parseFloat(a/1609.344);if(route_pt_ahrs[l]>0&&route_pt_times[l]- route_pt_times[l-1]>0){h+=route_pt_ahrs[l]*(route_pt_times[l]-route_pt_times[l-1]);g+=route_pt_times[l]-route_pt_times[l-1]}for(;parseFloat(a)>nextLap;){b=parseFloat((nextLap-(a-k))/k);var j=parseFloat((route_pt_times[l]-route_pt_times[l-1])*b+parseFloat(route_pt_times[l-1]));parseFloat(k*b+parseFloat(a-k));b=LapsData.length>0?j-LapsData[LapsData.length-1].CumSecs:j;var f={};f.LapSecs=b;f.CumSecs=j;f.LapDist=parseFloat(c/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;f.AHR=h>0&&g>0?Math.floor(h/g):null;h=g=0;LapsData.push(f);e=0;nextLap+=c}}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;f.AHR=h>0&&g>0?Math.floor(h/g):null;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,g=b[0].childNodes[3].firstChild.nodeValue,h="";if(c=="A")h=b[0].childNodes[5].firstChild.nodeValue;b=true;if(parseFloat(route_totaldist).toFixed(1)!=parseFloat(g).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(g).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=h;document.getElementById("RunType").value= 8}route_totaldist=parseFloat(g)}}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(g){try{c=new ActiveXObject("Microsoft.XMLHTTP")}catch(h){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,g=0,h=a+1;h<=b-1;h++){c=calcDisttoSegment(gpx_poly_comp[h],gpx_poly_comp[a],gpx_poly_comp[b]);if(!(c<=tolerance))if(c>e){e=c;g=h}}if(e>tolerance){gpx_poly_comp[g].discard=false;simplifySegment(a,g);simplifySegment(g,b)}}} function calcDisttoSegment(a,b,c){var e,g;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)g=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)g=Math.sqrt(Math.pow(a.y-b.y,2)+Math.pow(a.x-b.x,2));if(e>=1)g=Math.sqrt(Math.pow(a.y-c.y,2)+Math.pow(a.x-c.x,2));if(0<e&&e<1)g=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 g} function hideSaveWait(){document.getElementById("SaveWait").style.display="none"}function untickSave(){document.getElementById("CreateRoute").checked=false;document.getElementById("CreateLog").checked=false} function postData(a,b,c){var e;try{e=new XMLHttpRequest}catch(g){try{e=new ActiveXObject("Msxml2.XMLHTTP")}catch(h){try{e=new ActiveXObject("Microsoft.XMLHTTP")}catch(l){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)),g=document.getElementById("Mins").value,h=document.getElementById("Secs").value,l=document.getElementById("LogBookNotes").value,k=0;if(document.getElementById("CheckforPB").checked)k=1;var j=document.getElementById("RunType").value,f=document.getElementById("Terrain").value, o=document.getElementById("GRGRunNumber").value,p=document.getElementById("RouteType").value,m=document.getElementById("RouteID").value;if(document.getElementById("CreateRoute").checked)m=a;a=document.getElementById("AHR").value;var t=document.getElementById("HRR").value,u=document.getElementById("Calories").value,q=document.getElementById("ActivID").value;if(String(q)!="1")j="6";var r="";if(document.getElementById("ShoeID"))r=document.getElementById("ShoeID").value;var n=0;if(document.getElementById("UpdatePlanner").checked)n= 1;var s=0;if(document.getElementById("AgeG").checked)s=1;var v=String(document.getElementById("DOB").value),w=String(document.getElementById("Sex").value);b="DateRan="+escape(b)+"&RunName="+escape(c)+"&Distance="+escape(e)+"&Mins="+escape(g)+"&Secs="+escape(h)+"&Notes="+escape(l)+"&CheckforPB="+escape(k)+"&RunType="+escape(j)+"&Terrain="+escape(f)+"&GRGRunNumber="+escape(o)+"&RouteType="+escape(p)+"&RouteID="+escape(m)+"&AHR="+escape(a)+"&HRR="+escape(t)+"&Calories="+escape(u)+"&ActivID="+escape(q)+ "&ShoeID="+escape(r)+"&UpdatePlanner="+escape(n)+"&CalcAgeG="+escape(s)+"&DOB="+escape(v)+"&Sex="+escape(w);postData("PostNewActivity.asp","A",b)} function upload_route(){var a=document.getElementById("RouteName").value,b=document.getElementById("FolderNo").value,c=document.getElementById("RouteNotes").value;NewRouteID="";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 g=Math.floor(LapsData[e].CumSecs-c);b+="<Lap Int='"+LapsData[e].LapDist.toFixed(2)+"' Cum='"+LapsData[e].CumDist.toFixed(2)+"' Time='"+Math.round(g)+"' AHR='"+String(LapsData[e].AHR)+"'></Lap>";c+=g}b+="</Laps>";a="RunID="+escape(a)+"&LapsXML="+escape(b);postData("PostNewLaps.asp","L",a)} function hill_profile(a){document.getElementById("RouteName");document.getElementById("FolderNo");document.getElementById("RouteNotes");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("");var b='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>';if(NewRouteID!= "")b+='<br /><br />Could your route be useful to othe runners?<br /><a href="SavedRouteResult.asp?SRouteID='+NewRouteID+'">Share race route / recommend as good training route </a>';document.getElementById("SaveActivityResult").innerHTML=b;hideSaveWait()}else{document.getElementById("SaveWarnings").firstChild.nodeValue=String(a);hideSaveWait()}} function postRouteResponse(a){if(!isNaN(a)&&parseInt(a)>0){NewRouteID=a;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";var b='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(NewRouteID!="")b+='<br /><br />Could your route be useful to othe runners?<br /><a href="SavedRouteResult.asp?SRouteID='+NewRouteID+ '">Share race route / recommend as good training route </a>';document.getElementById("SaveActivityResult").innerHTML=b;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{var b='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>';if(NewRouteID!="")b+='<br /><br />Could your route be useful to othe runners?<br /><a href="SavedRouteResult.asp?SRouteID='+NewRouteID+'">Share race route / recommend as good training route </a>';document.getElementById("SaveActivityResult").innerHTML= b;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};
