@ -5931,33 +5931,37 @@
const listEl = document.getElementById('trackList');
const countEl = document.getElementById('trackCount');
countEl.textContent = tracks.length;
if (countEl) {
countEl.textContent = tracks.length;
}
listEl.innerHTML = tracks.map((track, i) => `
if (listEl) {
listEl.innerHTML = tracks.map((track, i) => `
< div class = "track-item ${selectedTracks.includes(track) ? 'selected' : ''}" data-index = "${i}" >
< span > ${track.name}< / span >
< button class = "delete-btn" data-index = "${i}" > ×< / button >
< / div >
`).join('');
// Add click handlers
listEl.querySelectorAll('.track-item').forEach(item => {
item.addEventListener('click', (e) => {
if (!e.target.classList.contains('delete-btn')) {
const idx = parseInt(item.dataset.index);
selectTrack(tracks[idx]);
map.fitBounds(tracks[idx].layer.getBounds(), { padding: [50, 50] });
}
// Add click handlers
listEl.querySelectorAll('.track-item').forEach(item => {
item.addEventListener('click', (e) => {
if (!e.target.classList.contains('delete-btn')) {
const idx = parseInt(item.dataset.index);
selectTrack(tracks[idx]);
map.fitBounds(tracks[idx].layer.getBounds(), { padding: [50, 50] });
}
});
});
});
listEl.querySelectorAll('.delete-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.stopPropagation();
const idx = parseInt(btn.dataset.index);
deleteTrack(tracks[idx]);
listEl.querySelectorAll('.delete-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.stopPropagation();
const idx = parseInt(btn.dataset.index);
deleteTrack(tracks[idx]);
});
});
});
}
}
// Event listeners
@ -5992,45 +5996,51 @@
const el_exportBtn = document.getElementById('exportBtn');
if (el_exportBtn) {
el_exportBtn.addEventListener('click', exportToKML);
const reloadBtn = document.getElementById('reloadBtn');
}
const reloadBtn = document.getElementById('reloadBtn');
if (reloadBtn) {
reloadBtn.addEventListener('click', reloadTracks);
}
}
const el_saveServerBtn = document.getElementById('saveServerBtn');
if (el_saveServerBtn) {
el_saveServerBtn.addEventListener('click', saveToServer);
const gpsBtn = document.getElementById('gpsBtn');
}
const gpsBtn = document.getElementById('gpsBtn');
if (gpsBtn) {
gpsBtn.addEventListener('click', toggleGPS);
}
}
const el_rotateMapBtn = document.getElementById('rotateMapBtn');
if (el_rotateMapBtn) {
el_rotateMapBtn.addEventListener('click', toggleRotateMap);
const autoCenterBtn = document.getElementById('autoCenterBtn');
}
const autoCenterBtn = document.getElementById('autoCenterBtn');
if (autoCenterBtn) {
autoCenterBtn.addEventListener('click', toggleAutoCenter);
}
}
// Tab switching
const el_editTab = document.getElementById('editTab');
if (el_editTab) {
el_editTab.addEventListener('click', () => switchTab('edit'));
const navTab = document.getElementById('navTab');
}
const navTab = document.getElementById('navTab');
if (navTab) {
navTab.addEventListener('click', () => switchTab('navigate'));
}
}
const el_adminTab = document.getElementById('adminTab');
if (el_adminTab) {
el_adminTab.addEventListener('click', () => switchTab('admin'));
// Edit overlay close button
setTimeout(() => {
const editCloseBtn = document.getElementById('editCloseBtn');
}
// Edit overlay close button
setTimeout(() => {
const editCloseBtn = document.getElementById('editCloseBtn');
if (editCloseBtn) {
editCloseBtn.addEventListener('click', (e) => {
e.preventDefault();
@ -6074,17 +6084,18 @@
const el_passwordSubmit = document.getElementById('passwordSubmit');
if (el_passwordSubmit) {
el_passwordSubmit.addEventListener('click', checkPassword);
const passwordCancel = document.getElementById('passwordCancel');
}
const passwordCancel = document.getElementById('passwordCancel');
if (passwordCancel) {
passwordCancel.addEventListener('click', hidePasswordDialog);
}
}
const el_passwordInput = document.getElementById('passwordInput');
if (el_passwordInput) {
el_passwordInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') checkPassword();
});
}
});
// Navigation
const clearNavBtn = document.getElementById('clearNavBtn');
@ -6210,57 +6221,57 @@
if (el_anchorDistance) {
el_anchorDistance.addEventListener('input', (e) => {
document.getElementById('anchorValue').textContent = e.target.value;
// If currently dragging, update the affected markers display
if (isDragging & & originalCoords) {
showAffectedRange();
// Re-apply rope physics with new anchor distance
const anchorDist = parseInt(e.target.value);
const draggedPoint = dragTrack.coords[dragPointIndex];
const newCoords = applyRopePhysics(originalCoords, dragPointIndex, draggedPoint, anchorDist);
dragTrack.coords = newCoords;
dragTrack.layer.setLatLngs(newCoords);
updateAffectedMarkersPositions(newCoords);
}
});
}
// If currently dragging, update the affected markers display
if (isDragging & & originalCoords) {
showAffectedRange();
// Re-apply rope physics with new anchor distance
const anchorDist = parseInt(e.target.value);
const draggedPoint = dragTrack.coords[dragPointIndex];
const newCoords = applyRopePhysics(originalCoords, dragPointIndex, draggedPoint, anchorDist);
dragTrack.coords = newCoords;
dragTrack.layer.setLatLngs(newCoords);
updateAffectedMarkersPositions(newCoords);
}
});
// Falloff slider update
const el_reshapeFalloff = document.getElementById('reshapeFalloff');
if (el_reshapeFalloff) {
el_reshapeFalloff.addEventListener('input', (e) => {
document.getElementById('falloffValue').textContent = parseFloat(e.target.value).toFixed(1);
// If currently dragging, re-apply with new falloff
if (isDragging & & originalCoords) {
const anchorDist = parseInt(document.getElementById('anchorDistance').value);
const draggedPoint = dragTrack.coords[dragPointIndex];
const newCoords = applyRopePhysics(originalCoords, dragPointIndex, draggedPoint, anchorDist);
dragTrack.coords = newCoords;
dragTrack.layer.setLatLngs(newCoords);
updateAffectedMarkersPositions(newCoords);
}
});
}
// If currently dragging, re-apply with new falloff
if (isDragging & & originalCoords) {
const anchorDist = parseInt(document.getElementById('anchorDistance').value);
const draggedPoint = dragTrack.coords[dragPointIndex];
const newCoords = applyRopePhysics(originalCoords, dragPointIndex, draggedPoint, anchorDist);
dragTrack.coords = newCoords;
dragTrack.layer.setLatLngs(newCoords);
updateAffectedMarkersPositions(newCoords);
}
});
// Smooth brush size slider update
const el_smoothBrushSize = document.getElementById('smoothBrushSize');
if (el_smoothBrushSize) {
el_smoothBrushSize.addEventListener('input', (e) => {
document.getElementById('brushSizeValue').textContent = e.target.value;
// Update brush circle if currently smoothing
if (isSmoothing & & smoothBrushCircle) {
const brushSize = parseInt(e.target.value);
smoothBrushCircle.setRadius(brushSize * getMetersPerPixel());
}
});
}
// Update brush circle if currently smoothing
if (isSmoothing & & smoothBrushCircle) {
const brushSize = parseInt(e.target.value);
smoothBrushCircle.setRadius(brushSize * getMetersPerPixel());
}
});
// Smooth strength slider update
const el_smoothStrength = document.getElementById('smoothStrength');
if (el_smoothStrength) {
el_smoothStrength.addEventListener('input', (e) => {
document.getElementById('strengthValue').textContent = parseFloat(e.target.value).toFixed(1);
});
}
});
// Register Service Worker for PWA functionality
if ('serviceWorker' in navigator) {