diff --git a/templates/index.html b/templates/index.html index 2ddc460..8731871 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1710,26 +1710,38 @@ // Sync header stats with output panel stats function syncHeaderStats() { // Pager stats - document.getElementById('headerMsgCount').textContent = msgCount; - document.getElementById('headerPocsagCount').textContent = pocsagCount; - document.getElementById('headerFlexCount').textContent = flexCount; + const headerMsgCount = document.getElementById('headerMsgCount'); + const headerPocsagCount = document.getElementById('headerPocsagCount'); + const headerFlexCount = document.getElementById('headerFlexCount'); + if (headerMsgCount) headerMsgCount.textContent = msgCount; + if (headerPocsagCount) headerPocsagCount.textContent = pocsagCount; + if (headerFlexCount) headerFlexCount.textContent = flexCount; // Sensor stats - document.getElementById('headerSensorCount').textContent = document.getElementById('sensorCount')?.textContent || '0'; - document.getElementById('headerDeviceTypeCount').textContent = document.getElementById('deviceCount')?.textContent || '0'; + const headerSensorCount = document.getElementById('headerSensorCount'); + const headerDeviceTypeCount = document.getElementById('headerDeviceTypeCount'); + if (headerSensorCount) headerSensorCount.textContent = document.getElementById('sensorCount')?.textContent || '0'; + if (headerDeviceTypeCount) headerDeviceTypeCount.textContent = document.getElementById('deviceCount')?.textContent || '0'; // WiFi stats - document.getElementById('headerApCount').textContent = document.getElementById('apCount')?.textContent || '0'; - document.getElementById('headerClientCount').textContent = document.getElementById('clientCount')?.textContent || '0'; - document.getElementById('headerHandshakeCount').textContent = document.getElementById('handshakeCount')?.textContent || '0'; - document.getElementById('headerDroneCount').textContent = document.getElementById('droneCount')?.textContent || '0'; + const headerApCount = document.getElementById('headerApCount'); + const headerClientCount = document.getElementById('headerClientCount'); + const headerHandshakeCount = document.getElementById('headerHandshakeCount'); + const headerDroneCount = document.getElementById('headerDroneCount'); + if (headerApCount) headerApCount.textContent = document.getElementById('apCount')?.textContent || '0'; + if (headerClientCount) headerClientCount.textContent = document.getElementById('clientCount')?.textContent || '0'; + if (headerHandshakeCount) headerHandshakeCount.textContent = document.getElementById('handshakeCount')?.textContent || '0'; + if (headerDroneCount) headerDroneCount.textContent = document.getElementById('droneCount')?.textContent || '0'; // Bluetooth stats - document.getElementById('headerBtDeviceCount').textContent = document.getElementById('btDeviceCount')?.textContent || '0'; - document.getElementById('headerBtBeaconCount').textContent = document.getElementById('btBeaconCount')?.textContent || '0'; + const headerBtDeviceCount = document.getElementById('headerBtDeviceCount'); + const headerBtBeaconCount = document.getElementById('headerBtBeaconCount'); + if (headerBtDeviceCount) headerBtDeviceCount.textContent = document.getElementById('btDeviceCount')?.textContent || '0'; + if (headerBtBeaconCount) headerBtBeaconCount.textContent = document.getElementById('btBeaconCount')?.textContent || '0'; // Satellite stats - document.getElementById('headerPassCount').textContent = document.getElementById('passCount')?.textContent || '0'; + const headerPassCount = document.getElementById('headerPassCount'); + if (headerPassCount) headerPassCount.textContent = document.getElementById('passCount')?.textContent || '0'; } // Sync stats periodically setInterval(syncHeaderStats, 500); @@ -1993,30 +2005,36 @@ btn.classList.add('active'); } }); - document.getElementById('pagerMode').classList.toggle('active', mode === 'pager'); - document.getElementById('sensorMode').classList.toggle('active', mode === 'sensor'); - document.getElementById('rtlamrMode').classList.toggle('active', mode === 'rtlamr'); - document.getElementById('satelliteMode').classList.toggle('active', mode === 'satellite'); - document.getElementById('wifiMode').classList.toggle('active', mode === 'wifi'); - document.getElementById('bluetoothMode').classList.toggle('active', mode === 'bluetooth'); - document.getElementById('listeningPostMode').classList.toggle('active', mode === 'listening'); - document.getElementById('aprsMode').classList.toggle('active', mode === 'aprs'); - document.getElementById('tscmMode').classList.toggle('active', mode === 'tscm'); - document.getElementById('pagerStats').style.display = mode === 'pager' ? 'flex' : 'none'; - document.getElementById('sensorStats').style.display = mode === 'sensor' ? 'flex' : 'none'; - document.getElementById('satelliteStats').style.display = mode === 'satellite' ? 'flex' : 'none'; - document.getElementById('wifiStats').style.display = mode === 'wifi' ? 'flex' : 'none'; - document.getElementById('btStats').style.display = mode === 'bluetooth' ? 'flex' : 'none'; + document.getElementById('pagerMode')?.classList.toggle('active', mode === 'pager'); + document.getElementById('sensorMode')?.classList.toggle('active', mode === 'sensor'); + document.getElementById('rtlamrMode')?.classList.toggle('active', mode === 'rtlamr'); + document.getElementById('satelliteMode')?.classList.toggle('active', mode === 'satellite'); + document.getElementById('wifiMode')?.classList.toggle('active', mode === 'wifi'); + document.getElementById('bluetoothMode')?.classList.toggle('active', mode === 'bluetooth'); + document.getElementById('listeningPostMode')?.classList.toggle('active', mode === 'listening'); + document.getElementById('aprsMode')?.classList.toggle('active', mode === 'aprs'); + document.getElementById('tscmMode')?.classList.toggle('active', mode === 'tscm'); + const pagerStats = document.getElementById('pagerStats'); + const sensorStats = document.getElementById('sensorStats'); + const satelliteStats = document.getElementById('satelliteStats'); + const wifiStats = document.getElementById('wifiStats'); + const btStats = document.getElementById('btStats'); + if (pagerStats) pagerStats.style.display = mode === 'pager' ? 'flex' : 'none'; + if (sensorStats) sensorStats.style.display = mode === 'sensor' ? 'flex' : 'none'; + if (satelliteStats) satelliteStats.style.display = mode === 'satellite' ? 'flex' : 'none'; + if (wifiStats) wifiStats.style.display = mode === 'wifi' ? 'flex' : 'none'; + if (btStats) btStats.style.display = mode === 'bluetooth' ? 'flex' : 'none'; // Update header stats groups - document.getElementById('headerPagerStats').classList.toggle('active', mode === 'pager'); - document.getElementById('headerSensorStats').classList.toggle('active', mode === 'sensor'); - document.getElementById('headerSatelliteStats').classList.toggle('active', mode === 'satellite'); - document.getElementById('headerWifiStats').classList.toggle('active', mode === 'wifi'); - document.getElementById('headerBtStats').classList.toggle('active', mode === 'bluetooth'); + document.getElementById('headerPagerStats')?.classList.toggle('active', mode === 'pager'); + document.getElementById('headerSensorStats')?.classList.toggle('active', mode === 'sensor'); + document.getElementById('headerSatelliteStats')?.classList.toggle('active', mode === 'satellite'); + document.getElementById('headerWifiStats')?.classList.toggle('active', mode === 'wifi'); + document.getElementById('headerBtStats')?.classList.toggle('active', mode === 'bluetooth'); // Show/hide dashboard buttons in nav bar - document.getElementById('satelliteDashboardBtn').style.display = mode === 'satellite' ? 'inline-flex' : 'none'; + const satelliteDashboardBtn = document.getElementById('satelliteDashboardBtn'); + if (satelliteDashboardBtn) satelliteDashboardBtn.style.display = mode === 'satellite' ? 'inline-flex' : 'none'; // Update active mode indicator const modeNames = { @@ -2030,17 +2048,26 @@ 'aprs': 'APRS', 'tscm': 'TSCM' }; - document.getElementById('activeModeIndicator').innerHTML = '' + modeNames[mode]; - document.getElementById('wifiLayoutContainer').style.display = mode === 'wifi' ? 'flex' : 'none'; - document.getElementById('btLayoutContainer').style.display = mode === 'bluetooth' ? 'flex' : 'none'; - document.getElementById('satelliteVisuals').style.display = mode === 'satellite' ? 'block' : 'none'; - document.getElementById('listeningPostVisuals').style.display = mode === 'listening' ? 'grid' : 'none'; - document.getElementById('aprsVisuals').style.display = mode === 'aprs' ? 'flex' : 'none'; - document.getElementById('tscmVisuals').style.display = mode === 'tscm' ? 'flex' : 'none'; + const activeModeIndicator = document.getElementById('activeModeIndicator'); + if (activeModeIndicator) activeModeIndicator.innerHTML = '' + (modeNames[mode] || mode.toUpperCase()); + const wifiLayoutContainer = document.getElementById('wifiLayoutContainer'); + const btLayoutContainer = document.getElementById('btLayoutContainer'); + const satelliteVisuals = document.getElementById('satelliteVisuals'); + const listeningPostVisuals = document.getElementById('listeningPostVisuals'); + const aprsVisuals = document.getElementById('aprsVisuals'); + const tscmVisuals = document.getElementById('tscmVisuals'); + if (wifiLayoutContainer) wifiLayoutContainer.style.display = mode === 'wifi' ? 'flex' : 'none'; + if (btLayoutContainer) btLayoutContainer.style.display = mode === 'bluetooth' ? 'flex' : 'none'; + if (satelliteVisuals) satelliteVisuals.style.display = mode === 'satellite' ? 'block' : 'none'; + if (listeningPostVisuals) listeningPostVisuals.style.display = mode === 'listening' ? 'grid' : 'none'; + if (aprsVisuals) aprsVisuals.style.display = mode === 'aprs' ? 'flex' : 'none'; + if (tscmVisuals) tscmVisuals.style.display = mode === 'tscm' ? 'flex' : 'none'; // Show/hide mode-specific timeline containers - document.getElementById('pagerTimelineContainer').style.display = mode === 'pager' ? 'block' : 'none'; - document.getElementById('sensorTimelineContainer').style.display = mode === 'sensor' ? 'block' : 'none'; + const pagerTimelineContainer = document.getElementById('pagerTimelineContainer'); + const sensorTimelineContainer = document.getElementById('sensorTimelineContainer'); + if (pagerTimelineContainer) pagerTimelineContainer.style.display = mode === 'pager' ? 'block' : 'none'; + if (sensorTimelineContainer) sensorTimelineContainer.style.display = mode === 'sensor' ? 'block' : 'none'; // Update output panel title based on mode const titles = { @@ -2054,7 +2081,8 @@ 'aprs': 'APRS Tracker', 'tscm': 'TSCM Counter-Surveillance' }; - document.getElementById('outputTitle').textContent = titles[mode] || 'Signal Monitor'; + const outputTitle = document.getElementById('outputTitle'); + if (outputTitle) outputTitle.textContent = titles[mode] || 'Signal Monitor'; // Initialize mode-specific timelines initializeModeTimeline(mode); @@ -2068,33 +2096,41 @@ // Show/hide Device Intelligence for modes that use it (not for satellite/aircraft/tscm) const reconBtn = document.getElementById('reconBtn'); const intelBtn = document.querySelector('[onclick="exportDeviceDB()"]'); + const reconPanel = document.getElementById('reconPanel'); if (mode === 'satellite' || mode === 'listening' || mode === 'aprs' || mode === 'tscm') { - document.getElementById('reconPanel').style.display = 'none'; + if (reconPanel) reconPanel.style.display = 'none'; if (reconBtn) reconBtn.style.display = 'none'; if (intelBtn) intelBtn.style.display = 'none'; } else { if (reconBtn) reconBtn.style.display = 'inline-block'; if (intelBtn) intelBtn.style.display = 'inline-block'; // Restore panel visibility based on reconEnabled state - if (reconEnabled) { - document.getElementById('reconPanel').style.display = 'block'; + if (reconEnabled && reconPanel) { + reconPanel.style.display = 'block'; } } // Show RTL-SDR device section for modes that use it - document.getElementById('rtlDeviceSection').style.display = (mode === 'pager' || mode === 'sensor' || mode === 'rtlamr' || mode === 'listening' || mode === 'aprs') ? 'block' : 'none'; + const rtlDeviceSection = document.getElementById('rtlDeviceSection'); + if (rtlDeviceSection) rtlDeviceSection.style.display = (mode === 'pager' || mode === 'sensor' || mode === 'rtlamr' || mode === 'listening' || mode === 'aprs') ? 'block' : 'none'; // Toggle mode-specific tool status displays - document.getElementById('toolStatusPager').style.display = (mode === 'pager') ? 'grid' : 'none'; - document.getElementById('toolStatusSensor').style.display = (mode === 'sensor') ? 'grid' : 'none'; + const toolStatusPager = document.getElementById('toolStatusPager'); + const toolStatusSensor = document.getElementById('toolStatusSensor'); + if (toolStatusPager) toolStatusPager.style.display = (mode === 'pager') ? 'grid' : 'none'; + if (toolStatusSensor) toolStatusSensor.style.display = (mode === 'sensor') ? 'grid' : 'none'; // Hide waterfall and output console for modes with their own visualizations // Pager waterfall: show only for pager mode - document.getElementById('pagerWaterfallPanel').style.display = (mode === 'pager') ? 'block' : 'none'; + const pagerWaterfallPanel = document.getElementById('pagerWaterfallPanel'); + const sensorWaterfallPanel = document.getElementById('sensorWaterfallPanel'); + const outputEl = document.getElementById('output'); + const statusBar = document.querySelector('.status-bar'); + if (pagerWaterfallPanel) pagerWaterfallPanel.style.display = (mode === 'pager') ? 'block' : 'none'; // Sensor waterfall: show only for sensor (433MHz) mode - document.getElementById('sensorWaterfallPanel').style.display = (mode === 'sensor') ? 'block' : 'none'; - document.getElementById('output').style.display = (mode === 'satellite' || mode === 'aprs' || mode === 'wifi' || mode === 'bluetooth' || mode === 'listening' || mode === 'tscm') ? 'none' : 'block'; - document.querySelector('.status-bar').style.display = (mode === 'satellite') ? 'none' : 'flex'; + if (sensorWaterfallPanel) sensorWaterfallPanel.style.display = (mode === 'sensor') ? 'block' : 'none'; + if (outputEl) outputEl.style.display = (mode === 'satellite' || mode === 'aprs' || mode === 'wifi' || mode === 'bluetooth' || mode === 'listening' || mode === 'tscm') ? 'none' : 'block'; + if (statusBar) statusBar.style.display = (mode === 'satellite') ? 'none' : 'flex'; // Load interfaces and initialize visualizations when switching modes if (mode === 'wifi') {