@ -1110,68 +1110,7 @@
< / div >
< div class = "tab-content" id = "editContent" >
< div class = "section" >
< div class = "section-title" > File< / div >
< input type = "file" id = "kmlFile" accept = ".kml" >
< button class = "action-btn" id = "reloadBtn" style = "background: #17a2b8;" > Reload Tracks< / button >
< button class = "action-btn" id = "exportBtn" > Export to File< / button >
< button class = "action-btn" id = "saveServerBtn" style = "background: #28a745;" > Save to Server< / button >
< / div >
< div class = "section" >
< div class = "section-title" > Track Tools< / div >
< div class = "tool-buttons" >
< button class = "tool-btn" id = "selectTool" title = "Select track, then press Delete key to remove" > Select< / button >
< button class = "tool-btn" id = "splitTool" title = "Click on a track to split it" > Split< / button >
< button class = "tool-btn" id = "drawTool" title = "Draw a new track" > Draw< / button >
< button class = "tool-btn" id = "reshapeTool" title = "Drag points to reshape track" > Reshape< / button >
< button class = "tool-btn" id = "smoothTool" title = "Brush over track to smooth it" > Smooth< / button >
< button class = "action-btn" id = "remeshBtn" title = "Remesh selected tracks with even spacing" > Remesh Selected< / button >
< button class = "tool-btn" id = "geocacheTool" title = "Place a geocache" > 📍 Cache< / button >
< / div >
< div class = "slider-group" id = "reshapeControls" style = "display: none;" >
< label > Anchor Distance (points beyond stay fixed)< / label >
< input type = "range" id = "anchorDistance" min = "3" max = "50" value = "10" >
< div class = "slider-value" > < span id = "anchorValue" > 10< / span > points< / div >
< label style = "margin-top: 8px;" > Falloff (how sharply effect fades)< / label >
< input type = "range" id = "reshapeFalloff" min = "0.5" max = "3" value = "1" step = "0.1" >
< div class = "slider-value" > < span id = "falloffValue" > 1.0< / span > < / div >
< / div >
< div class = "slider-group" id = "smoothControls" style = "display: none;" >
< label > Brush Size (pixels)< / label >
< input type = "range" id = "smoothBrushSize" min = "10" max = "100" value = "30" >
< div class = "slider-value" > < span id = "brushSizeValue" > 30< / span > px< / div >
< label style = "margin-top: 8px;" > Strength< / label >
< input type = "range" id = "smoothStrength" min = "0.1" max = "1" value = "0.5" step = "0.1" >
< div class = "slider-value" > < span id = "strengthValue" > 0.5< / span > < / div >
< / div >
< / div >
< div class = "section" >
< div class = "section-title" > Merge / Simplify< / div >
< div class = "slider-group" >
< label > Merge Threshold< / label >
< input type = "range" id = "mergeThreshold" min = "1" max = "10" value = "5" step = "0.5" >
< div class = "slider-value" > < span id = "thresholdValue" > 5< / span > meters< / div >
< / div >
< button class = "action-btn" id = "previewBtn" style = "background: #17a2b8;" > Preview Merge< / button >
< button class = "action-btn" id = "applyMergeBtn" style = "display: none;" > Apply Merge< / button >
< button class = "action-btn secondary" id = "cancelPreviewBtn" style = "display: none;" > Cancel Preview< / button >
< div style = "margin-top: 8px;" >
< button class = "action-btn secondary" id = "mergeConnectBtn" > Connect End-to-End< / button >
< / div >
< div style = "border-top: 1px solid #eee; margin-top: 10px; padding-top: 10px;" >
< button class = "action-btn" id = "selectAllBtn" style = "background: #6c757d;" > Select All< / button >
< button class = "action-btn secondary" id = "clearSelectionBtn" > Clear Selection< / button >
< / div >
< / div >
< div class = "section" >
< div class = "section-title" > Tracks (< span id = "trackCount" > 0< / span > )< / div >
< div class = "track-list" id = "trackList" > < / div >
< button class = "action-btn" id = "undoBtn" style = "background: #6c757d;" > Undo< / button >
< / div >
<!-- Content moved to edit overlay -->
< / div >
< div class = "tab-content active" id = "navContent" >
@ -1195,98 +1134,7 @@
< / div >
< div class = "tab-content" id = "adminContent" >
< div class = "section collapsible" data-section = "geocache" >
< div class = "section-title" > Geocache Settings< / div >
< div class = "section-content" >
< div class = "admin-setting-group" >
< div class = "admin-input-row" >
< label for = "geocacheRange" > Interaction Range:< / label >
< div class = "admin-input-container" >
< input type = "number" id = "geocacheRange" min = "1" max = "50" value = "5" >
< span class = "unit" > meters< / span >
< / div >
< / div >
< div class = "admin-input-row" >
< label for = "geocacheAlertRange" > Alert Distance:< / label >
< div class = "admin-input-container" >
< input type = "number" id = "geocacheAlertRange" min = "1" max = "50" value = "5" >
< span class = "unit" > meters< / span >
< / div >
< / div >
< div class = "admin-checkbox-row" >
< input type = "checkbox" id = "geocacheSoundEnabled" checked >
< label for = "geocacheSoundEnabled" > Enable alert sound< / label >
< / div >
< / div >
< / div >
< div class = "section" >
< div class = "section-title" > Navigation Settings< / div >
< div class = "admin-setting-group" >
< div class = "admin-input-row" >
< label > Track Proximity:< / label >
< input type = "number" id = "trackProximity" min = "10" max = "200" value = "50" >
< span class = "unit" > meters< / span >
< / div >
< div class = "admin-input-row" >
< label > Intersection Threshold:< / label >
< input type = "number" id = "intersectionThreshold" min = "5" max = "30" value = "15" >
< span class = "unit" > meters< / span >
< / div >
< div class = "admin-input-row" >
< label > On-Trail Threshold:< / label >
< input type = "number" id = "onTrailThreshold" min = "20" max = "200" value = "100" >
< span class = "unit" > meters< / span >
< / div >
< div class = "admin-input-row" >
< label > Node Spacing:< / label >
< input type = "number" id = "nodeSpacing" min = "10" max = "100" value = "50" >
< span class = "unit" > meters< / span >
< / div >
< / div >
< / div >
< div class = "section" >
< div class = "section-title" > Performance Settings< / div >
< div class = "admin-setting-group" >
< div class = "admin-input-row" >
< label > GPS Poll Interval:< / label >
< input type = "number" id = "gpsPollInterval" min = "1000" max = "10000" value = "3000" step = "500" >
< span class = "unit" > ms< / span >
< / div >
< div class = "admin-input-row" >
< label > Proximity Check Interval:< / label >
< input type = "number" id = "proximityCheckInterval" min = "1000" max = "10000" value = "3000" step = "500" >
< span class = "unit" > ms< / span >
< / div >
< / div >
< / div >
< div class = "section" >
< div class = "section-title" > Push Notifications< / div >
< div class = "admin-setting-group" >
< div id = "notificationStatus" style = "margin-bottom: 10px; color: #666;" >
Status: < span id = "notificationStatusText" > Not configured< / span >
< / div >
< button class = "action-btn" id = "enableNotifications" onclick = "setupPushNotifications()" >
Enable Push Notifications
< / button >
< button class = "action-btn secondary" id = "disableNotifications" onclick = "disablePushNotifications()" style = "display:none;" >
Disable Notifications
< / button >
< button class = "action-btn" id = "testNotification" onclick = "sendTestNotification()" style = "display:none; margin-top: 10px; background: #9c27b0;" >
📨 Send Test Notification to All Users
< / button >
< / div >
< / div >
< div class = "section" >
< div class = "admin-button-group" >
< button class = "action-btn" onclick = "resetAdminSettings()" > Reset to Defaults< / button >
< button class = "action-btn" onclick = "exportAdminSettings()" > Export Settings< / button >
< button class = "action-btn" onclick = "importAdminSettings()" > Import Settings< / button >
< / div >
< / div >
<!-- Content moved to admin overlay -->
< / div >
< div id = "status" class = "status" > Load a KML file or draw tracks< / div >