Generate speed considering the slope and the activity type erases all existing time data
diff --git a/js/buttons.js b/js/buttons.js
index e0034759..853aa343 100644
--- a/js/buttons.js
+++ b/js/buttons.js
@@ -234,6 +234,7 @@ export default class Buttons {
this.speed_text = document.getElementById('speed-text').textContent;
this.pace_text = document.getElementById('pace-text').textContent;
this.start_text = document.getElementById('start-text').textContent;
+ this.end_text = document.getElementById('end-text').textContent;
this.experimental_info_text = document.getElementById('experimental-info-text').innerHTML;
this.name_text = document.getElementById('name-text').textContent;
this.comment_text = document.getElementById('comment-text').textContent;
@@ -1006,6 +1007,22 @@ export default class Buttons {
}
}
+ toLocalDTLFormat(inDate) {
+ var mdy = inDate.toLocaleDateString().split('/'); // split "mm/dd/yyyy" into array
+ var hms = inDate.toLocaleTimeString().split(/:| /); // split "(h)h:mm:ss (AM/PM)"" into array with regex
+ if (mdy[2].length < 4) {
+ return null;
+ }
+ // vvv toLocaleTimeString() outputs in 12hr format so this converts to 24hr format
+ if (hms[3] == "PM" && hms[0] != "12") { // 12pm doesnt need adjusted
+ hms[0] = String(parseInt(hms[0]) + 12); // adds 12hrs to 1pm - 11pm (1300-2300)
+ }
+ else if (hms[3] == "AM" && hms[0] == "12") {
+ hms[0] = String(parseInt(hms[0]) - 12); // 12am represented as 12 in 12hr format but needs to be 0 in 24hr so subtract 12
+ }
+ return mdy[2] + '-' + mdy[0].padStart(2, '0') + '-' + mdy[1].padStart(2, '0') + "T" + hms[0].padStart(2, '0') + ':' + hms[1] + ':' + hms[2]; // datetime-local format needs to be "yyyy-mm-ddThh:mm:ss"
+ }
+
addHandlersWithTotal(total) {
this.total = total;
this.elev.total = total;
@@ -1605,8 +1622,10 @@ export default class Buttons {
else content += buttons.unit_minutes_text + '/' + buttons.unit_miles_text + `
`;
}
- content += `
`+buttons.start_text+`
-
+ content += `
`+buttons.start_text+`
+
+
`+buttons.end_text+`
+
`+buttons.experimental_info_text+`
`+buttons.ok_button_text+`
`+buttons.cancel_button_text+`
`;
@@ -1624,13 +1643,49 @@ export default class Buttons {
var minutes = document.getElementById("minutes");
var seconds = document.getElementById("seconds");
var slope_speed = document.getElementById("slope-speed");
+ var start = document.getElementById("start-time");
+ var end = document.getElementById("end-time");
var speedChange = false;
+ // Change end time when start time is changed based on set speed
+ start.addEventListener("change", function () {
+ var dist = trace.getDistance() / 1000;
+ var timeMS = (dist / speed.value) * 60 * 60 * 1000; // time it takes to travel dist in milliseconds
+ var st = new Date(Date.parse(start.value));
+ var et = new Date(st.getTime() + (timeMS)); // gets end time by adding start time plus timeMS
+ end.value = buttons.toLocalDTLFormat(et);
+ /*
+ // This commentedcode would change the speed instead of the end time when start time is changed
+ var dist = trace.getDistance() / 1000;
+ var st = new Date(Date.parse(start.value));
+ var et = new Date(Date.parse(end.value));
+ var calcSpeed = dist / ((et.getTime() - st.getTime()) / 3600000); // speed in km/h or m/h depending on unit, (3,600,000 is to convert from ms to hours)
+ speed.value = calcSpeed.toFixed(3);
+ */
+ });
+
+ // Calculate speed when end time is changed based on distance over difference between start and end time
+ end.addEventListener("change", function () {
+ var dist = trace.getDistance() / 1000;
+ var st = new Date(Date.parse(start.value));
+ var et = new Date(Date.parse(end.value));
+ var calcSpeed = dist / ((et.getTime() - st.getTime()) / 3600000); // speed in km/h or m/h depending on unit, (3,600,000 is to convert from ms to hours)
+ speed.value = calcSpeed.toFixed(3);
+ speedChange = true;
+ });
+
if (buttons.speed_units) {
- speed.value = Math.max(1, trace.getMovingSpeed().toFixed(1));
+ speed.value = Math.max(1, trace.getMovingSpeed().toFixed(3));
speed.addEventListener("change", function () {
speedChange = true;
+ // vvv this code calculates end time based on speed change and start time
+ var dist = trace.getDistance() / 1000;
+ var timeMS = (dist / speed.value) * 60 * 60 * 1000; // time it takes to travel dist in milliseconds
+ var st = new Date(Date.parse(start.value));
+ var et = new Date(st.getTime() + (timeMS)); // gets end time by adding start time plus timeMS
+ end.value = buttons.toLocalDTLFormat(et);
+ // ^^^
});
} else {
var pace = Math.floor(trace.getMovingPace() / 1000);
@@ -1643,12 +1698,16 @@ export default class Buttons {
speedChange = true;
});
}
-
+
var start = document.getElementById("start-time");
if (trace.hasPoints()) {
const points = trace.getPoints();
if (points[0].meta.time) start.value = (new Date(points[0].meta.time.getTime() + offset * 60 * 60 * 1000)).toISOString().substring(0, 19);
- else start.value = new Date().toISOString().substring(0, 19);
+ else {
+ start.value = buttons.toLocalDTLFormat(new Date());
+ }
+
+ if (points[points.length - 1].meta.time) end.value = (new Date(points[points.length - 1].meta.time.getTime() + offset * 60 * 60 * 1000)).toISOString().substring(0, 19);
}
const ok = document.getElementById("edit-speed");
@@ -1659,7 +1718,7 @@ export default class Buttons {
v = Number(speed.value);
if (!buttons.km) v *= 1.609344;
} else {
- v = Number(minutes.value) * 60 + Number(seconds.value);
+ v = Number(minutes.value) * 60 + Number(seconds.value);
v = Math.max(v, 1);
if (!buttons.km) v /= 1.609344;
v = 1 / v; // km/s