@ -5931,8 +5931,11 @@
const listEl = document.getElementById('trackList');
const listEl = document.getElementById('trackList');
const countEl = document.getElementById('trackCount');
const countEl = document.getElementById('trackCount');
if (countEl) {
countEl.textContent = tracks.length;
countEl.textContent = tracks.length;
}
if (listEl) {
listEl.innerHTML = tracks.map((track, i) => `
listEl.innerHTML = tracks.map((track, i) => `
< div class = "track-item ${selectedTracks.includes(track) ? 'selected' : ''}" data-index = "${i}" >
< div class = "track-item ${selectedTracks.includes(track) ? 'selected' : ''}" data-index = "${i}" >
< span > ${track.name}< / span >
< span > ${track.name}< / span >
@ -5959,6 +5962,7 @@
});
});
});
});
}
}
}
// Event listeners
// Event listeners
const kmlFileEl = document.getElementById('kmlFile');
const kmlFileEl = document.getElementById('kmlFile');
@ -5992,45 +5996,51 @@
const el_exportBtn = document.getElementById('exportBtn');
const el_exportBtn = document.getElementById('exportBtn');
if (el_exportBtn) {
if (el_exportBtn) {
el_exportBtn.addEventListener('click', exportToKML);
el_exportBtn.addEventListener('click', exportToKML);
}
const reloadBtn = document.getElementById('reloadBtn');
const reloadBtn = document.getElementById('reloadBtn');
if (reloadBtn) {
if (reloadBtn) {
reloadBtn.addEventListener('click', reloadTracks);
reloadBtn.addEventListener('click', reloadTracks);
}
}
}
const el_saveServerBtn = document.getElementById('saveServerBtn');
const el_saveServerBtn = document.getElementById('saveServerBtn');
if (el_saveServerBtn) {
if (el_saveServerBtn) {
el_saveServerBtn.addEventListener('click', saveToServer);
el_saveServerBtn.addEventListener('click', saveToServer);
}
const gpsBtn = document.getElementById('gpsBtn');
const gpsBtn = document.getElementById('gpsBtn');
if (gpsBtn) {
if (gpsBtn) {
gpsBtn.addEventListener('click', toggleGPS);
gpsBtn.addEventListener('click', toggleGPS);
}
}
}
const el_rotateMapBtn = document.getElementById('rotateMapBtn');
const el_rotateMapBtn = document.getElementById('rotateMapBtn');
if (el_rotateMapBtn) {
if (el_rotateMapBtn) {
el_rotateMapBtn.addEventListener('click', toggleRotateMap);
el_rotateMapBtn.addEventListener('click', toggleRotateMap);
}
const autoCenterBtn = document.getElementById('autoCenterBtn');
const autoCenterBtn = document.getElementById('autoCenterBtn');
if (autoCenterBtn) {
if (autoCenterBtn) {
autoCenterBtn.addEventListener('click', toggleAutoCenter);
autoCenterBtn.addEventListener('click', toggleAutoCenter);
}
}
}
// Tab switching
// Tab switching
const el_editTab = document.getElementById('editTab');
const el_editTab = document.getElementById('editTab');
if (el_editTab) {
if (el_editTab) {
el_editTab.addEventListener('click', () => switchTab('edit'));
el_editTab.addEventListener('click', () => switchTab('edit'));
}
const navTab = document.getElementById('navTab');
const navTab = document.getElementById('navTab');
if (navTab) {
if (navTab) {
navTab.addEventListener('click', () => switchTab('navigate'));
navTab.addEventListener('click', () => switchTab('navigate'));
}
}
}
const el_adminTab = document.getElementById('adminTab');
const el_adminTab = document.getElementById('adminTab');
if (el_adminTab) {
if (el_adminTab) {
el_adminTab.addEventListener('click', () => switchTab('admin'));
el_adminTab.addEventListener('click', () => switchTab('admin'));
}
// Edit overlay close button
// Edit overlay close button
setTimeout(() => {
setTimeout(() => {
const editCloseBtn = document.getElementById('editCloseBtn');
const editCloseBtn = document.getElementById('editCloseBtn');
}
if (editCloseBtn) {
if (editCloseBtn) {
editCloseBtn.addEventListener('click', (e) => {
editCloseBtn.addEventListener('click', (e) => {
e.preventDefault();
e.preventDefault();
@ -6074,17 +6084,18 @@
const el_passwordSubmit = document.getElementById('passwordSubmit');
const el_passwordSubmit = document.getElementById('passwordSubmit');
if (el_passwordSubmit) {
if (el_passwordSubmit) {
el_passwordSubmit.addEventListener('click', checkPassword);
el_passwordSubmit.addEventListener('click', checkPassword);
}
const passwordCancel = document.getElementById('passwordCancel');
const passwordCancel = document.getElementById('passwordCancel');
if (passwordCancel) {
if (passwordCancel) {
passwordCancel.addEventListener('click', hidePasswordDialog);
passwordCancel.addEventListener('click', hidePasswordDialog);
}
}
}
const el_passwordInput = document.getElementById('passwordInput');
const el_passwordInput = document.getElementById('passwordInput');
if (el_passwordInput) {
if (el_passwordInput) {
el_passwordInput.addEventListener('keypress', (e) => {
el_passwordInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') checkPassword();
if (e.key === 'Enter') checkPassword();
}
});
});
}
// Navigation
// Navigation
const clearNavBtn = document.getElementById('clearNavBtn');
const clearNavBtn = document.getElementById('clearNavBtn');
@ -6210,7 +6221,6 @@
if (el_anchorDistance) {
if (el_anchorDistance) {
el_anchorDistance.addEventListener('input', (e) => {
el_anchorDistance.addEventListener('input', (e) => {
document.getElementById('anchorValue').textContent = e.target.value;
document.getElementById('anchorValue').textContent = e.target.value;
}
// If currently dragging, update the affected markers display
// If currently dragging, update the affected markers display
if (isDragging & & originalCoords) {
if (isDragging & & originalCoords) {
showAffectedRange();
showAffectedRange();
@ -6223,13 +6233,13 @@
updateAffectedMarkersPositions(newCoords);
updateAffectedMarkersPositions(newCoords);
}
}
});
});
}
// Falloff slider update
// Falloff slider update
const el_reshapeFalloff = document.getElementById('reshapeFalloff');
const el_reshapeFalloff = document.getElementById('reshapeFalloff');
if (el_reshapeFalloff) {
if (el_reshapeFalloff) {
el_reshapeFalloff.addEventListener('input', (e) => {
el_reshapeFalloff.addEventListener('input', (e) => {
document.getElementById('falloffValue').textContent = parseFloat(e.target.value).toFixed(1);
document.getElementById('falloffValue').textContent = parseFloat(e.target.value).toFixed(1);
}
// If currently dragging, re-apply with new falloff
// If currently dragging, re-apply with new falloff
if (isDragging & & originalCoords) {
if (isDragging & & originalCoords) {
const anchorDist = parseInt(document.getElementById('anchorDistance').value);
const anchorDist = parseInt(document.getElementById('anchorDistance').value);
@ -6240,27 +6250,28 @@
updateAffectedMarkersPositions(newCoords);
updateAffectedMarkersPositions(newCoords);
}
}
});
});
}
// Smooth brush size slider update
// Smooth brush size slider update
const el_smoothBrushSize = document.getElementById('smoothBrushSize');
const el_smoothBrushSize = document.getElementById('smoothBrushSize');
if (el_smoothBrushSize) {
if (el_smoothBrushSize) {
el_smoothBrushSize.addEventListener('input', (e) => {
el_smoothBrushSize.addEventListener('input', (e) => {
document.getElementById('brushSizeValue').textContent = e.target.value;
document.getElementById('brushSizeValue').textContent = e.target.value;
}
// Update brush circle if currently smoothing
// Update brush circle if currently smoothing
if (isSmoothing & & smoothBrushCircle) {
if (isSmoothing & & smoothBrushCircle) {
const brushSize = parseInt(e.target.value);
const brushSize = parseInt(e.target.value);
smoothBrushCircle.setRadius(brushSize * getMetersPerPixel());
smoothBrushCircle.setRadius(brushSize * getMetersPerPixel());
}
}
});
});
}
// Smooth strength slider update
// Smooth strength slider update
const el_smoothStrength = document.getElementById('smoothStrength');
const el_smoothStrength = document.getElementById('smoothStrength');
if (el_smoothStrength) {
if (el_smoothStrength) {
el_smoothStrength.addEventListener('input', (e) => {
el_smoothStrength.addEventListener('input', (e) => {
document.getElementById('strengthValue').textContent = parseFloat(e.target.value).toFixed(1);
document.getElementById('strengthValue').textContent = parseFloat(e.target.value).toFixed(1);
}
});
});
}
// Register Service Worker for PWA functionality
// Register Service Worker for PWA functionality
if ('serviceWorker' in navigator) {
if ('serviceWorker' in navigator) {