xp12camera
Owner: IIIlllIIIllI URL: git@github.com:nyangkosense/xp12camera.git
rm mission generator, move into seperate repository
Commit 73a3e1469b5640b70c0ee19858e20da450e30e69 by SM <seb.michalk@gmail.com> on 2025-06-30 19:44:30 +0200
diff --git a/mission-generator/css/style.css b/mission-generator/css/style.css
deleted file mode 100644
index 07c2910..0000000
--- a/mission-generator/css/style.css
+++ /dev/null
@@ -1,366 +0,0 @@
-/* Military Dark Theme */
-:root {
- --primary-bg: #0d1117;
- --secondary-bg: #161b22;
- --tertiary-bg: #21262d;
- --accent-green: #00ff41;
- --military-blue: #1e3a5f;
- --warning-amber: #ffb000;
- --danger-red: #ff4444;
- --text-primary: #f0f6fc;
- --text-secondary: #8b949e;
- --border-color: #30363d;
- --hover-bg: #292e36;
-}
-
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- background: var(--primary-bg);
- color: var(--text-primary);
- font-family: 'Courier New', 'Monaco', monospace;
- font-size: 14px;
- line-height: 1.5;
- overflow: hidden;
-}
-
-.mission-interface {
- height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-/* Header */
-.mission-header {
- background: linear-gradient(135deg, var(--secondary-bg), var(--tertiary-bg));
- border-bottom: 2px solid var(--accent-green);
- padding: 15px;
- text-align: center;
- position: relative;
-}
-
-.mission-header h1 {
- color: var(--accent-green);
- font-size: 24px;
- letter-spacing: 3px;
- text-shadow: 0 0 10px rgba(0, 255, 65, 0.5);
- margin-bottom: 5px;
-}
-
-.classification {
- color: var(--warning-amber);
- font-size: 12px;
- letter-spacing: 2px;
- font-weight: bold;
-}
-
-/* Main Container */
-.main-container {
- display: flex;
- flex: 1;
- height: calc(100vh - 80px);
-}
-
-/* Left Panel - Configuration */
-.config-panel {
- width: 300px;
- background: var(--secondary-bg);
- border-right: 1px solid var(--border-color);
- padding: 20px;
- overflow-y: auto;
-}
-
-.panel-section {
- margin-bottom: 25px;
-}
-
-.panel-section h3 {
- color: var(--accent-green);
- font-size: 12px;
- letter-spacing: 1px;
- margin-bottom: 10px;
- border-bottom: 1px solid var(--border-color);
- padding-bottom: 5px;
-}
-
-.military-select {
- width: 100%;
- background: var(--tertiary-bg);
- border: 1px solid var(--border-color);
- color: var(--text-primary);
- padding: 10px;
- font-family: inherit;
- font-size: 12px;
- border-radius: 3px;
- transition: all 0.3s ease;
-}
-
-.military-select:focus {
- outline: none;
- border-color: var(--accent-green);
- box-shadow: 0 0 5px rgba(0, 255, 65, 0.3);
-}
-
-.military-select option {
- background: var(--tertiary-bg);
- color: var(--text-primary);
-}
-
-.airbase-info {
- margin-top: 10px;
- padding: 10px;
- background: var(--tertiary-bg);
- border-radius: 3px;
- font-size: 11px;
- line-height: 1.4;
- display: none;
-}
-
-.airbase-info.show {
- display: block;
-}
-
-.airbase-info .info-item {
- margin-bottom: 5px;
-}
-
-.airbase-info .info-label {
- color: var(--text-secondary);
- display: inline-block;
- width: 80px;
-}
-
-.generate-btn, .export-btn {
- width: 100%;
- background: linear-gradient(135deg, var(--military-blue), var(--accent-green));
- border: none;
- color: var(--text-primary);
- padding: 15px;
- font-family: inherit;
- font-size: 12px;
- font-weight: bold;
- letter-spacing: 1px;
- border-radius: 3px;
- cursor: pointer;
- transition: all 0.3s ease;
- text-transform: uppercase;
-}
-
-.generate-btn:hover, .export-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 5px 15px rgba(0, 255, 65, 0.3);
-}
-
-/* Center Panel - Map */
-.map-panel {
- flex: 1;
- position: relative;
- background: var(--tertiary-bg);
-}
-
-.world-map {
- width: 100%;
- height: 100%;
-}
-
-.map-legend {
- position: absolute;
- bottom: 20px;
- left: 20px;
- background: rgba(33, 38, 45, 0.9);
- border: 1px solid var(--border-color);
- border-radius: 3px;
- padding: 15px;
- backdrop-filter: blur(5px);
-}
-
-.legend-item {
- display: flex;
- align-items: center;
- margin-bottom: 8px;
- font-size: 11px;
-}
-
-.legend-color {
- width: 12px;
- height: 12px;
- border-radius: 50%;
- margin-right: 8px;
-}
-
-.legend-color.airbase {
- background: var(--accent-green);
- box-shadow: 0 0 5px rgba(0, 255, 65, 0.5);
-}
-
-.legend-color.patrol-zone {
- background: var(--military-blue);
- box-shadow: 0 0 5px rgba(30, 58, 95, 0.5);
-}
-
-/* Right Panel - Briefing */
-.briefing-panel {
- width: 400px;
- background: var(--secondary-bg);
- border-left: 1px solid var(--border-color);
- display: flex;
- flex-direction: column;
-}
-
-.briefing-display {
- flex: 1;
- padding: 20px;
- overflow-y: auto;
- font-size: 11px;
- line-height: 1.6;
-}
-
-.briefing-placeholder h3 {
- color: var(--accent-green);
- margin-bottom: 15px;
- text-align: center;
- letter-spacing: 1px;
-}
-
-.briefing-placeholder p {
- color: var(--text-secondary);
- margin-bottom: 20px;
- text-align: center;
-}
-
-.flir-info {
- background: var(--tertiary-bg);
- border: 1px solid var(--border-color);
- border-radius: 3px;
- padding: 15px;
- margin-top: 20px;
-}
-
-.flir-info h4 {
- color: var(--warning-amber);
- margin-bottom: 10px;
- font-size: 10px;
- letter-spacing: 1px;
-}
-
-.flir-info ul {
- list-style: none;
- padding-left: 0;
-}
-
-.flir-info li {
- margin-bottom: 5px;
- color: var(--text-secondary);
-}
-
-.flir-info li::before {
- content: "▶ ";
- color: var(--accent-green);
- margin-right: 5px;
-}
-
-.export-btn {
- margin: 20px;
- margin-top: 0;
-}
-
-/* Mission Briefing Styles */
-.mission-briefing {
- font-family: 'Courier New', monospace;
- white-space: pre-line;
- color: var(--text-primary);
-}
-
-.mission-briefing .briefing-header {
- color: var(--accent-green);
- text-align: center;
- margin-bottom: 20px;
- font-weight: bold;
- text-shadow: 0 0 5px rgba(0, 255, 65, 0.3);
-}
-
-.mission-briefing .section-header {
- color: var(--warning-amber);
- font-weight: bold;
- margin: 15px 0 5px 0;
-}
-
-.mission-briefing .objective-item {
- color: var(--text-secondary);
- margin-left: 15px;
-}
-
-.mission-briefing .objective-item::before {
- content: "▶ ";
- color: var(--accent-green);
-}
-
-.mission-briefing .coordinates {
- color: var(--military-blue);
- background: var(--tertiary-bg);
- padding: 2px 6px;
- border-radius: 2px;
- font-weight: bold;
-}
-
-.mission-briefing .frequency {
- color: var(--accent-green);
- font-weight: bold;
-}
-
-.mission-briefing .auth-code {
- color: var(--danger-red);
- font-weight: bold;
- background: var(--tertiary-bg);
- padding: 2px 6px;
- border-radius: 2px;
-}
-
-/* Responsive Design */
-@media (max-width: 1200px) {
- .config-panel {
- width: 250px;
- }
-
- .briefing-panel {
- width: 350px;
- }
-}
-
-@media (max-width: 900px) {
- .main-container {
- flex-direction: column;
- }
-
- .config-panel,
- .briefing-panel {
- width: 100%;
- height: 200px;
- }
-
- .map-panel {
- height: calc(100vh - 480px);
- }
-}
-
-/* Scrollbar Styling */
-::-webkit-scrollbar {
- width: 8px;
-}
-
-::-webkit-scrollbar-track {
- background: var(--primary-bg);
-}
-
-::-webkit-scrollbar-thumb {
- background: var(--border-color);
- border-radius: 4px;
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: var(--accent-green);
-}
\ No newline at end of file
diff --git a/mission-generator/index.html b/mission-generator/index.html
deleted file mode 100644
index 8fd0c28..0000000
--- a/mission-generator/index.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Maritime Patrol Mission Generator</title>
- <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
- <link rel="stylesheet" href="css/style.css">
-</head>
-<body>
- <div class="mission-interface">
- <header class="mission-header">
- <h1>MARITIME PATROL MISSION GENERATOR</h1>
- <div class="classification">NATO RESTRICTED</div>
- </header>
-
- <div class="main-container">
- <!-- Left Panel: Mission Configuration -->
- <div class="config-panel">
- <div class="panel-section">
- <h3>DEPARTURE AIRBASE</h3>
- <select id="airbaseSelect" class="military-select">
- <option value="">Select Airbase...</option>
- </select>
- <div id="airbaseInfo" class="airbase-info"></div>
- </div>
-
- <div class="panel-section">
- <h3>MISSION TYPE</h3>
- <select id="missionType" class="military-select">
- <option value="MARITIME_PATROL">Maritime Patrol</option>
- <option value="SAR">Search and Rescue</option>
- <option value="RECON">Reconnaissance</option>
- <option value="ASW">Anti-Submarine Warfare</option>
- <option value="FISHERY_PATROL">Fishery Protection</option>
- </select>
- </div>
-
- <div class="panel-section">
- <h3>PATROL AREA</h3>
- <select id="patrolArea" class="military-select">
- <option value="">Auto-select based on airbase</option>
- </select>
- </div>
-
- <div class="panel-section">
- <h3>AIRCRAFT TYPE</h3>
- <select id="aircraftType" class="military-select">
- <option value="">Auto-select based on airbase</option>
- </select>
- </div>
-
- <button id="generateMission" class="generate-btn">GENERATE MISSION</button>
- </div>
-
- <!-- Center: World Map -->
- <div class="map-panel">
- <div id="worldMap" class="world-map"></div>
- <div class="map-legend">
- <div class="legend-item">
- <span class="legend-color airbase"></span>
- <span>Military Airbases</span>
- </div>
- <div class="legend-item">
- <span class="legend-color patrol-zone"></span>
- <span>Patrol Areas</span>
- </div>
- </div>
- </div>
-
- <!-- Right Panel: Mission Briefing -->
- <div class="briefing-panel">
- <div id="missionBriefing" class="briefing-display">
- <div class="briefing-placeholder">
- <h3>MISSION BRIEFING</h3>
- <p>Select an airbase and generate a mission to view the operational briefing.</p>
- <div class="flir-info">
- <h4>FLIR CAMERA INTEGRATION</h4>
- <ul>
- <li>F9: Activate Camera</li>
- <li>Mouse: Pan/Tilt</li>
- <li>+/-: Zoom</li>
- <li>T: Visual Modes</li>
- <li>SPACE: Target Lock</li>
- </ul>
- </div>
- </div>
- </div>
- <button id="exportBriefing" class="export-btn" style="display: none;">EXPORT BRIEFING</button>
- </div>
- </div>
- </div>
-
- <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
- <script src="js/airbase-database.js"></script>
- <script src="js/patrol-areas.js"></script>
- <script src="js/mission-generator.js"></script>
- <script src="js/map-controller.js"></script>
- <script src="js/app.js"></script>
-</body>
-</html>
\ No newline at end of file
diff --git a/mission-generator/js/airbase-database.js b/mission-generator/js/airbase-database.js
deleted file mode 100644
index 7c1b1b2..0000000
--- a/mission-generator/js/airbase-database.js
+++ /dev/null
@@ -1,1022 +0,0 @@
-// Comprehensive Military Airbase Database
-const MILITARY_AIRBASES = {
- // === UNITED STATES ===
- // Atlantic Coast
- 'KNHK': {
- name: 'NAS Patuxent River',
- country: 'USA',
- region: 'Atlantic',
- aircraft: ['P-8A Poseidon', 'P-3C Orion'],
- coords: [38.286, -76.412],
- description: 'Naval Air Systems Command test center'
- },
- 'KNIP': {
- name: 'NAS Jacksonville',
- country: 'USA',
- region: 'Atlantic',
- aircraft: ['P-8A Poseidon', 'EP-3E Aries'],
- coords: [30.236, -81.876],
- description: 'Primary East Coast maritime patrol base'
- },
- 'KNSE': {
- name: 'NAS Oceana',
- country: 'USA',
- region: 'Atlantic',
- aircraft: ['F/A-18E/F Super Hornet'],
- coords: [36.821, -76.033],
- description: 'Master Jet Base for East Coast'
- },
- 'KNGP': {
- name: 'NAS Pensacola',
- country: 'USA',
- region: 'Gulf_of_Mexico',
- aircraft: ['T-6A Texan II', 'T-45 Goshawk'],
- coords: [30.352, -87.320],
- description: 'Cradle of Naval Aviation'
- },
-
- // Pacific Coast
- 'PHIK': {
- name: 'NAS Kaneohe Bay',
- country: 'USA',
- region: 'Pacific',
- aircraft: ['P-8A Poseidon', 'MV-22 Osprey'],
- coords: [21.450, -157.768],
- description: 'Pacific maritime patrol operations'
- },
- 'PHNL': {
- name: 'Hickam AFB',
- country: 'USA',
- region: 'Pacific',
- aircraft: ['C-17A Globemaster', 'KC-135 Stratotanker'],
- coords: [21.319, -157.922],
- description: 'Pacific Air Forces headquarters'
- },
- 'KNKX': {
- name: 'NAS Miramar',
- country: 'USA',
- region: 'Pacific',
- aircraft: ['F/A-18C/D Hornet', 'F-35C Lightning II'],
- coords: [32.868, -117.142],
- description: 'Marine Corps Air Station'
- },
- 'KNUW': {
- name: 'NAS Whidbey Island',
- country: 'USA',
- region: 'Pacific',
- aircraft: ['P-8A Poseidon', 'EA-18G Growler'],
- coords: [48.351, -122.656],
- description: 'Electronic attack and maritime patrol hub'
- },
-
- // === UNITED KINGDOM ===
- 'EGPK': {
- name: 'RAF Kinloss',
- country: 'UK',
- region: 'North_Sea',
- aircraft: ['P-8A Poseidon'],
- coords: [57.649, -3.560],
- description: 'Maritime patrol aircraft base'
- },
- 'EGQL': {
- name: 'RAF Lossiemouth',
- country: 'UK',
- region: 'North_Sea',
- aircraft: ['Typhoon FGR4', 'P-8A Poseidon'],
- coords: [57.705, -3.323],
- description: 'Quick reaction alert and maritime patrol'
- },
- 'EGVA': {
- name: 'RAF Fairford',
- country: 'UK',
- region: 'English_Channel',
- aircraft: ['B-52H Stratofortress', 'KC-135 Stratotanker'],
- coords: [51.682, -1.790],
- description: 'US strategic bomber forward operating base'
- },
- 'EGUL': {
- name: 'RAF Lakenheath',
- country: 'UK',
- region: 'North_Sea',
- aircraft: ['F-15E Strike Eagle', 'F-35A Lightning II'],
- coords: [52.409, 0.561],
- description: 'USAFE fighter operations'
- },
- 'EGYM': {
- name: 'RAF Marham',
- country: 'UK',
- region: 'North_Sea',
- aircraft: ['F-35B Lightning II'],
- coords: [52.648, 0.550],
- description: 'Lightning Force headquarters'
- },
- 'EGXC': {
- name: 'RAF Coningsby',
- country: 'UK',
- region: 'North_Sea',
- aircraft: ['Typhoon FGR4'],
- coords: [53.093, -0.166],
- description: 'Typhoon operations and training'
- },
-
- // === FRANCE ===
- 'LFRB': {
- name: 'BAN Brest-Lanvéoc',
- country: 'France',
- region: 'Atlantic',
- aircraft: ['Atlantique 2', 'Dauphin'],
- coords: [48.281, -4.456],
- description: 'French Navy maritime patrol base'
- },
- 'LFTH': {
- name: 'BAN Hyères',
- country: 'France',
- region: 'Mediterranean',
- aircraft: ['Atlantique 2', 'Falcon 50M'],
- coords: [43.097, 6.146],
- description: 'Mediterranean maritime surveillance'
- },
- 'LFSI': {
- name: 'BA 113 Saint-Dizier',
- country: 'France',
- region: 'English_Channel',
- aircraft: ['Rafale B/C'],
- coords: [48.636, 4.899],
- description: 'Rafale fighter base'
- },
- 'LFSO': {
- name: 'BA 118 Mont-de-Marsan',
- country: 'France',
- region: 'Atlantic',
- aircraft: ['Rafale B/C', 'Mirage 2000D'],
- coords: [43.909, -0.507],
- description: 'Fighter and attack aircraft base'
- },
- 'LFOA': {
- name: 'BA 705 Tours',
- country: 'France',
- region: 'English_Channel',
- aircraft: ['C-135FR', 'C-160 Transall'],
- coords: [47.432, 0.728],
- description: 'Air transport and refueling'
- },
-
- // === GERMANY ===
- 'EDXF': {
- name: 'Nordholz Naval Airbase',
- country: 'Germany',
- region: 'North_Sea',
- aircraft: ['P-3C Orion', 'Sea King'],
- coords: [53.768, 8.658],
- description: 'German Navy maritime patrol'
- },
- 'ETNW': {
- name: 'Wittmund AB',
- country: 'Germany',
- region: 'North_Sea',
- aircraft: ['Typhoon'],
- coords: [53.548, 7.667],
- description: 'Air defense and QRA'
- },
- 'ETNG': {
- name: 'Geilenkirchen AB',
- country: 'Germany',
- region: 'North_Sea',
- aircraft: ['E-3A Sentry'],
- coords: [50.961, 6.042],
- description: 'NATO AWACS base'
- },
- 'ETAR': {
- name: 'Ramstein AB',
- country: 'Germany',
- region: 'English_Channel',
- aircraft: ['C-130J Super Hercules', 'C-17A Globemaster'],
- coords: [49.437, 7.600],
- description: 'USAFE headquarters and airlift hub'
- },
- 'ETAD': {
- name: 'Spangdahlem AB',
- country: 'Germany',
- region: 'English_Channel',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [49.973, 6.692],
- description: 'USAFE fighter operations'
- },
-
- // === NETHERLANDS ===
- 'EHVK': {
- name: 'Volkel AB',
- country: 'Netherlands',
- region: 'North_Sea',
- aircraft: ['F-16AM/BM Fighting Falcon'],
- coords: [51.656, 5.709],
- description: 'Primary fighter base'
- },
- 'EHLW': {
- name: 'Leeuwarden AB',
- country: 'Netherlands',
- region: 'North_Sea',
- aircraft: ['F-16AM/BM Fighting Falcon'],
- coords: [53.229, 5.761],
- description: 'Fighter operations and training'
- },
- 'EHGR': {
- name: 'Gilze-Rijen AB',
- country: 'Netherlands',
- region: 'North_Sea',
- aircraft: ['C-130H Hercules', 'CH-47D Chinook'],
- coords: [51.567, 4.932],
- description: 'Transport and helicopter operations'
- },
-
- // === ITALY ===
- 'LICA': {
- name: 'NAS Catania-Fontanarossa',
- country: 'Italy',
- region: 'Mediterranean',
- aircraft: ['ATR 72MP', 'AV-8B+ Harrier II'],
- coords: [37.467, 15.066],
- description: 'Italian Navy air station'
- },
- 'LIPR': {
- name: 'NAS Pratica di Mare',
- country: 'Italy',
- region: 'Mediterranean',
- aircraft: ['ATR 72MP', 'C-27J Spartan'],
- coords: [41.652, 12.444],
- description: 'Italian Air Force coastal command'
- },
- 'LIRN': {
- name: 'NAS Naples (Capodichino)',
- country: 'Italy',
- region: 'Mediterranean',
- aircraft: ['P-8A Poseidon', 'C-40A Clipper'],
- coords: [40.886, 14.291],
- description: 'US Navy support facility'
- },
- 'LIRS': {
- name: 'NAS Sigonella',
- country: 'Italy',
- region: 'Mediterranean',
- aircraft: ['P-8A Poseidon', 'MQ-4C Triton'],
- coords: [37.402, 14.922],
- description: 'Strategic maritime patrol hub'
- },
-
- // === SPAIN ===
- 'LERT': {
- name: 'Rota Naval Station',
- country: 'Spain',
- region: 'Atlantic',
- aircraft: ['P-8A Poseidon', 'KC-130J Super Hercules'],
- coords: [36.645, -6.349],
- description: 'US/Spanish maritime operations'
- },
- 'LEZL': {
- name: 'Zaragoza AB',
- country: 'Spain',
- region: 'Mediterranean',
- aircraft: ['C-130H Hercules', 'KC-130H'],
- coords: [41.666, -1.042],
- description: 'Air transport and refueling'
- },
-
- // === NORWAY ===
- 'ENAT': {
- name: 'Andøya Air Station',
- country: 'Norway',
- region: 'Arctic',
- aircraft: ['P-3C Orion', 'P-8A Poseidon'],
- coords: [69.293, 16.144],
- description: 'Arctic maritime patrol operations'
- },
- 'ENBR': {
- name: 'Bergen Airport Flesland',
- country: 'Norway',
- region: 'North_Sea',
- aircraft: ['Sea King', 'NH90'],
- coords: [60.294, 5.218],
- description: 'Search and rescue operations'
- },
- 'ENTC': {
- name: 'Tromsø Airport',
- country: 'Norway',
- region: 'Arctic',
- aircraft: ['F-16AM/BM Fighting Falcon'],
- coords: [69.683, 18.919],
- description: 'Arctic air operations'
- },
-
- // === PORTUGAL ===
- 'LPMT': {
- name: 'Montijo Air Base',
- country: 'Portugal',
- region: 'Atlantic',
- aircraft: ['P-3C Orion', 'C-295M'],
- coords: [38.703, -8.973],
- description: 'Maritime patrol and transport'
- },
- 'LPLA': {
- name: 'Lajes Field',
- country: 'Portugal',
- region: 'Atlantic',
- aircraft: ['KC-10A Extender', 'C-130J Super Hercules'],
- coords: [38.762, -27.091],
- description: 'Atlantic refueling and transport hub'
- },
-
- // === CANADA ===
- 'CYAW': {
- name: '14 Wing Greenwood',
- country: 'Canada',
- region: 'Atlantic',
- aircraft: ['CP-140 Aurora'],
- coords: [44.984, -64.917],
- description: 'Atlantic maritime patrol operations'
- },
- 'CYCO': {
- name: '19 Wing Comox',
- country: 'Canada',
- region: 'Pacific',
- aircraft: ['CP-140 Aurora'],
- coords: [49.711, -124.887],
- description: 'Pacific maritime patrol operations'
- },
- 'CYBG': {
- name: 'CFB Bagotville',
- country: 'Canada',
- region: 'Atlantic',
- aircraft: ['CF-188 Hornet'],
- coords: [48.331, -70.996],
- description: 'NORAD air defense'
- },
-
- // === AUSTRALIA ===
- 'YPED': {
- name: 'RAAF Base Edinburgh',
- country: 'Australia',
- region: 'Pacific',
- aircraft: ['P-8A Poseidon', 'KC-30A MRTT'],
- coords: [-34.702, 138.621],
- description: 'Maritime patrol and air-to-air refueling'
- },
- 'YWLM': {
- name: 'RAAF Base Williamtown',
- country: 'Australia',
- region: 'Pacific',
- aircraft: ['F/A-18F Super Hornet', 'E-7A Wedgetail'],
- coords: [-32.792, 151.841],
- description: 'Fighter operations and AEW&C'
- },
-
- // === JAPAN ===
- 'RJOI': {
- name: 'Iwakuni AB',
- country: 'Japan',
- region: 'Pacific',
- aircraft: ['F/A-18C/D Hornet', 'F-35B Lightning II'],
- coords: [34.144, 132.236],
- description: 'US Marine Corps air station'
- },
- 'RJTY': {
- name: 'Yokota AB',
- country: 'Japan',
- region: 'Pacific',
- aircraft: ['C-130J Super Hercules', 'UH-1N Huey'],
- coords: [35.748, 139.348],
- description: 'PACAF headquarters and airlift'
- },
-
- // === SOUTH KOREA ===
- 'RKSO': {
- name: 'Osan AB',
- country: 'South Korea',
- region: 'Pacific',
- aircraft: ['F-16C/D Fighting Falcon', 'A-10C Thunderbolt II'],
- coords: [37.090, 127.030],
- description: '7th Air Force operations'
- },
- 'RKJK': {
- name: 'Kunsan AB',
- country: 'South Korea',
- region: 'Pacific',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [35.904, 126.616],
- description: 'Wolf Pack fighter operations'
- },
-
- // === ICELAND ===
- 'BIKF': {
- name: 'Keflavik Air Base',
- country: 'Iceland',
- region: 'Arctic',
- aircraft: ['P-8A Poseidon', 'KC-135 Stratotanker'],
- coords: [63.985, -22.605],
- description: 'NATO maritime patrol operations'
- },
-
- // === TURKEY ===
- 'LTAG': {
- name: 'Incirlik AB',
- country: 'Turkey',
- region: 'Mediterranean',
- aircraft: ['F-16C/D Fighting Falcon', 'KC-135 Stratotanker'],
- coords: [37.002, 35.426],
- description: 'NATO southern flank operations'
- },
- 'LTBM': {
- name: 'Merzifon AB',
- country: 'Turkey',
- region: 'Mediterranean',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [40.828, 35.522],
- description: 'Central Anatolia air defense'
- },
-
- // === GREECE ===
- 'LGSO': {
- name: 'Souda Bay',
- country: 'Greece',
- region: 'Mediterranean',
- aircraft: ['P-8A Poseidon', 'C-130H Hercules'],
- coords: [35.546, 24.127],
- description: 'Eastern Mediterranean operations'
- },
- 'LGTT': {
- name: 'Tanagra AB',
- country: 'Greece',
- region: 'Mediterranean',
- aircraft: ['F-16C/D Fighting Falcon', 'Mirage 2000'],
- coords: [38.344, 23.565],
- description: 'Hellenic Air Force fighter operations'
- },
- 'LGSM': {
- name: 'Kastelli AB',
- country: 'Greece',
- region: 'Mediterranean',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [35.421, 25.327],
- description: 'Aegean Sea air patrol'
- },
-
- // === SWEDEN ===
- 'ESGG': {
- name: 'Säve Air Base',
- country: 'Sweden',
- region: 'North_Sea',
- aircraft: ['JAS 39 Gripen', 'C-130H Hercules'],
- coords: [57.774, 11.870],
- description: 'West coast air defense'
- },
- 'ESPA': {
- name: 'Luleå Air Base',
- country: 'Sweden',
- region: 'Arctic',
- aircraft: ['JAS 39 Gripen'],
- coords: [65.548, 22.122],
- description: 'Arctic air surveillance'
- },
- 'ESSA': {
- name: 'Stockholm Arlanda',
- country: 'Sweden',
- region: 'North_Sea',
- aircraft: ['JAS 39 Gripen', 'S 102B Korpen'],
- coords: [59.651, 17.918],
- description: 'Capital region air defense'
- },
-
- // === FINLAND ===
- 'EFTU': {
- name: 'Turku Air Base',
- country: 'Finland',
- region: 'Arctic',
- aircraft: ['F/A-18C/D Hornet'],
- coords: [60.514, 22.262],
- description: 'Southwestern Finland air defense'
- },
- 'EFRV': {
- name: 'Rovaniemi Air Base',
- country: 'Finland',
- region: 'Arctic',
- aircraft: ['F/A-18C/D Hornet'],
- coords: [66.564, 25.830],
- description: 'Arctic Circle air operations'
- },
- 'EFTP': {
- name: 'Tampere-Pirkkala',
- country: 'Finland',
- region: 'Arctic',
- aircraft: ['F/A-18C/D Hornet', 'C-295M'],
- coords: [61.414, 23.604],
- description: 'Central Finland air base'
- },
-
- // === DENMARK ===
- 'EKKA': {
- name: 'Karup Air Base',
- country: 'Denmark',
- region: 'North_Sea',
- aircraft: ['F-16AM/BM Fighting Falcon'],
- coords: [56.297, 9.124],
- description: 'Primary Danish fighter base'
- },
- 'EKAH': {
- name: 'Aalborg Air Base',
- country: 'Denmark',
- region: 'North_Sea',
- aircraft: ['F-35A Lightning II'],
- coords: [57.092, 9.849],
- description: 'Northern Jutland air operations'
- },
-
- // === POLAND ===
- 'EPKS': {
- name: 'Krzesiny Air Base',
- country: 'Poland',
- region: 'North_Sea',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [52.331, 16.833],
- description: 'Western Poland air defense'
- },
- 'EPML': {
- name: 'Malbork Air Base',
- country: 'Poland',
- region: 'North_Sea',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [54.026, 19.134],
- description: 'Baltic coast air operations'
- },
- 'EPDE': {
- name: 'Deblin Air Base',
- country: 'Poland',
- region: 'North_Sea',
- aircraft: ['TS-11 Iskra', 'PZL-130 Orlik'],
- coords: [51.552, 21.893],
- description: 'Polish Air Force Academy'
- },
-
- // === CZECH REPUBLIC ===
- 'LKCV': {
- name: 'Čáslav Air Base',
- country: 'Czech Republic',
- region: 'English_Channel',
- aircraft: ['JAS 39 Gripen'],
- coords: [49.937, 15.381],
- description: 'Central Europe air defense'
- },
- 'LKNA': {
- name: 'Náměšť Air Base',
- country: 'Czech Republic',
- region: 'English_Channel',
- aircraft: ['JAS 39 Gripen'],
- coords: [49.094, 16.125],
- description: 'Southern Czech air operations'
- },
-
- // === HUNGARY ===
- 'LHKE': {
- name: 'Kecskemét Air Base',
- country: 'Hungary',
- region: 'English_Channel',
- aircraft: ['JAS 39 Gripen'],
- coords: [46.917, 19.749],
- description: 'Hungarian air defense hub'
- },
- 'LHPA': {
- name: 'Pápa Air Base',
- country: 'Hungary',
- region: 'English_Channel',
- aircraft: ['C-17A Globemaster III'],
- coords: [47.364, 17.500],
- description: 'NATO strategic airlift'
- },
-
- // === ROMANIA ===
- 'LRCV': {
- name: 'Câmpia Turzii',
- country: 'Romania',
- region: 'Mediterranean',
- aircraft: ['F-16AM/BM Fighting Falcon'],
- coords: [46.504, 23.885],
- description: 'Transylvanian air defense'
- },
- 'LRBC': {
- name: 'Bacău Air Base',
- country: 'Romania',
- region: 'Mediterranean',
- aircraft: ['MiG-21 LanceR'],
- coords: [46.521, 26.910],
- description: 'Eastern Romania air operations'
- },
-
- // === BULGARIA ===
- 'LBPG': {
- name: 'Graf Ignatievo Air Base',
- country: 'Bulgaria',
- region: 'Mediterranean',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [42.288, 25.653],
- description: 'Central Bulgaria air defense'
- },
-
- // === CROATIA ===
- 'LDPL': {
- name: 'Pleso Air Base',
- country: 'Croatia',
- region: 'Mediterranean',
- aircraft: ['PC-9M', 'Mi-8/17'],
- coords: [45.742, 16.068],
- description: 'Croatian Air Force headquarters'
- },
-
- // === SLOVENIA ===
- 'LJCE': {
- name: 'Cerklje ob Krki',
- country: 'Slovenia',
- region: 'Mediterranean',
- aircraft: ['PC-9M Hudournik'],
- coords: [45.898, 15.530],
- description: 'Slovenian air operations'
- },
-
- // === BELGIUM ===
- 'EBFS': {
- name: 'Florennes Air Base',
- country: 'Belgium',
- region: 'English_Channel',
- aircraft: ['F-16AM/BM Fighting Falcon'],
- coords: [50.243, 4.646],
- description: 'Belgian air defense'
- },
- 'EBBL': {
- name: 'Kleine Brogel',
- country: 'Belgium',
- region: 'English_Channel',
- aircraft: ['F-16AM/BM Fighting Falcon'],
- coords: [51.168, 5.470],
- description: 'NATO tactical fighter wing'
- },
-
- // === LUXEMBOURG ===
- 'ELLX': {
- name: 'Luxembourg Airport',
- country: 'Luxembourg',
- region: 'English_Channel',
- aircraft: ['A400M Atlas'],
- coords: [49.623, 6.204],
- description: 'NATO airlift coordination'
- },
-
- // === SWITZERLAND ===
- 'LSMP': {
- name: 'Payerne Air Base',
- country: 'Switzerland',
- region: 'English_Channel',
- aircraft: ['F/A-18C/D Hornet'],
- coords: [46.843, 6.915],
- description: 'Swiss air policing'
- },
- 'LSMM': {
- name: 'Meiringen Air Base',
- country: 'Switzerland',
- region: 'English_Channel',
- aircraft: ['F/A-18C/D Hornet'],
- coords: [46.743, 8.108],
- description: 'Alpine air operations'
- },
-
- // === AUSTRIA ===
- 'LOWZ': {
- name: 'Zeltweg Air Base',
- country: 'Austria',
- region: 'English_Channel',
- aircraft: ['Eurofighter Typhoon'],
- coords: [47.203, 14.744],
- description: 'Austrian air surveillance'
- },
-
- // === ISRAEL ===
- 'LLBG': {
- name: 'Nevatim Airbase',
- country: 'Israel',
- region: 'Mediterranean',
- aircraft: ['F-35I Adir', 'F-16I Sufa'],
- coords: [31.208, 34.926],
- description: 'Southern command air operations'
- },
- 'LLHS': {
- name: 'Hatzerim Air Base',
- country: 'Israel',
- region: 'Mediterranean',
- aircraft: ['F-16I Sufa', 'AH-64 Apache'],
- coords: [31.234, 34.665],
- description: 'Desert air combat training'
- },
- 'LLET': {
- name: 'Tel Nof Airbase',
- country: 'Israel',
- region: 'Mediterranean',
- aircraft: ['F-15I Ra\'am', 'C-130J Samson'],
- coords: [31.838, 34.821],
- description: 'Central command operations'
- },
-
- // === INDIA ===
- 'VOBL': {
- name: 'INS Hansa Goa',
- country: 'India',
- region: 'Indian_Ocean',
- aircraft: ['P-8I Neptune', 'MiG-29K'],
- coords: [15.381, 73.831],
- description: 'Indian Navy western fleet'
- },
- 'VOCP': {
- name: 'Port Blair',
- country: 'India',
- region: 'Indian_Ocean',
- aircraft: ['Dornier 228', 'Mi-8'],
- coords: [11.641, 92.730],
- description: 'Andaman & Nicobar operations'
- },
- 'VOKX': {
- name: 'Kochi Naval Base',
- country: 'India',
- region: 'Indian_Ocean',
- aircraft: ['P-8I Neptune', 'Sea King'],
- coords: [9.942, 76.267],
- description: 'Southern naval aviation'
- },
-
- // === SINGAPORE ===
- 'WSAP': {
- name: 'Paya Lebar Air Base',
- country: 'Singapore',
- region: 'Pacific',
- aircraft: ['F-15SG Strike Eagle', 'F-16C/D Fighting Falcon'],
- coords: [1.360, 103.909],
- description: 'Republic of Singapore Air Force'
- },
- 'WSSL': {
- name: 'Sembawang Air Base',
- country: 'Singapore',
- region: 'Pacific',
- aircraft: ['C-130H Hercules', 'AS332 Super Puma'],
- coords: [1.425, 103.813],
- description: 'Transport and SAR operations'
- },
-
- // === MALAYSIA ===
- 'WMKD': {
- name: 'Kuantan Air Base',
- country: 'Malaysia',
- region: 'Pacific',
- aircraft: ['F/A-18D Hornet', 'Hawk 208'],
- coords: [3.775, 103.209],
- description: 'East coast air defense'
- },
- 'WMKB': {
- name: 'Butterworth Air Base',
- country: 'Malaysia',
- region: 'Pacific',
- aircraft: ['F/A-18D Hornet'],
- coords: [5.465, 100.390],
- description: 'FPDA air operations'
- },
-
- // === THAILAND ===
- 'VTBD': {
- name: 'Don Muang Air Base',
- country: 'Thailand',
- region: 'Pacific',
- aircraft: ['F-16A/B Fighting Falcon', 'JAS 39 Gripen'],
- coords: [13.912, 100.607],
- description: 'Royal Thai Air Force headquarters'
- },
- 'VTBU': {
- name: 'U-Tapao Air Base',
- country: 'Thailand',
- region: 'Pacific',
- aircraft: ['C-130H Hercules', 'Saab 340 AEW'],
- coords: [12.680, 101.005],
- description: 'Maritime patrol and transport'
- },
-
- // === PHILIPPINES ===
- 'RPLC': {
- name: 'Clark Air Base',
- country: 'Philippines',
- region: 'Pacific',
- aircraft: ['FA-50 Fighting Eagle'],
- coords: [15.186, 120.560],
- description: 'Philippine Air Force operations'
- },
- 'RPLL': {
- name: 'Villamor Air Base',
- country: 'Philippines',
- region: 'Pacific',
- aircraft: ['C-130T Hercules', 'UH-1H Huey'],
- coords: [14.509, 121.020],
- description: 'Capital air defense'
- },
-
- // === INDONESIA ===
- 'WIHH': {
- name: 'Halim Perdanakusuma',
- country: 'Indonesia',
- region: 'Pacific',
- aircraft: ['F-16A/B Fighting Falcon', 'Su-27/30'],
- coords: [-6.266, 106.891],
- description: 'Jakarta air defense'
- },
- 'WIDD': {
- name: 'Ngurah Rai Air Base',
- country: 'Indonesia',
- region: 'Pacific',
- aircraft: ['F-16A/B Fighting Falcon'],
- coords: [-8.748, 115.167],
- description: 'Bali air operations'
- },
-
- // === NEW ZEALAND ===
- 'NZOH': {
- name: 'RNZAF Base Ohakea',
- country: 'New Zealand',
- region: 'Pacific',
- aircraft: ['C-130H Hercules', 'P-3K2 Orion'],
- coords: [-40.206, 175.388],
- description: 'Transport and maritime patrol'
- },
- 'NZWN': {
- name: 'RNZAF Base Woodbourne',
- country: 'New Zealand',
- region: 'Pacific',
- aircraft: ['King Air 350', 'NH90'],
- coords: [-41.518, 173.870],
- description: 'South Island operations'
- },
-
- // === SOUTH AFRICA ===
- 'FAOY': {
- name: 'Ysterplaat AFB',
- country: 'South Africa',
- region: 'Atlantic',
- aircraft: ['C-130BZ Hercules', 'Casa 212'],
- coords: [-33.900, 18.498],
- description: 'Cape Town maritime patrol'
- },
- 'FAOR': {
- name: 'OR Tambo International',
- country: 'South Africa',
- region: 'Indian_Ocean',
- aircraft: ['A400M Atlas', 'C-47TP Turbo Dakota'],
- coords: [-26.139, 28.246],
- description: 'Central command operations'
- },
- 'FADN': {
- name: 'Durban Air Station',
- country: 'South Africa',
- region: 'Indian_Ocean',
- aircraft: ['Lynx Mk7', 'Casa 212'],
- coords: [-29.970, 30.951],
- description: 'East coast maritime operations'
- },
-
- // === CHILE ===
- 'SCEL': {
- name: 'Los Cerrillos Air Base',
- country: 'Chile',
- region: 'Pacific',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [-33.490, -70.704],
- description: 'Santiago air defense'
- },
- 'SCIP': {
- name: 'Iquique Air Base',
- country: 'Chile',
- region: 'Pacific',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [-20.565, -70.181],
- description: 'Northern Chile operations'
- },
- 'SCTE': {
- name: 'Teniente Julio Gallardo',
- country: 'Chile',
- region: 'Pacific',
- aircraft: ['C-130H Hercules'],
- coords: [-53.779, -70.856],
- description: 'Patagonian operations'
- },
-
- // === BRAZIL ===
- 'SBNT': {
- name: 'Natal Air Base',
- country: 'Brazil',
- region: 'Atlantic',
- aircraft: ['P-3AM Orion', 'EMB-111'],
- coords: [-5.911, -35.247],
- description: 'Atlantic maritime patrol'
- },
- 'SBAN': {
- name: 'Anápolis Air Base',
- country: 'Brazil',
- region: 'Atlantic',
- aircraft: ['F-5EM Tiger II', 'A-29 Super Tucano'],
- coords: [-16.223, -48.996],
- description: 'Central Brazil air defense'
- },
- 'SBSV': {
- name: 'Salvador Air Base',
- country: 'Brazil',
- region: 'Atlantic',
- aircraft: ['A-29 Super Tucano'],
- coords: [-12.911, -38.322],
- description: 'Northeast coast operations'
- },
-
- // === ARGENTINA ===
- 'SAEZ': {
- name: 'Ezeiza Air Base',
- country: 'Argentina',
- region: 'Atlantic',
- aircraft: ['A-4AR Fightinghawk'],
- coords: [-34.822, -58.536],
- description: 'Buenos Aires air operations'
- },
- 'SAWC': {
- name: 'Comodoro Rivadavia',
- country: 'Argentina',
- region: 'Atlantic',
- aircraft: ['IA-58 Pucará'],
- coords: [-45.785, -67.465],
- description: 'Patagonian coastal patrol'
- },
-
- // === MOROCCO ===
- 'GMMN': {
- name: 'Sale Air Base',
- country: 'Morocco',
- region: 'Atlantic',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [34.051, -6.751],
- description: 'Royal Moroccan Air Force'
- },
-
- // === EGYPT ===
- 'HEAX': {
- name: 'Alexandria Air Base',
- country: 'Egypt',
- region: 'Mediterranean',
- aircraft: ['F-16C/D Fighting Falcon'],
- coords: [31.184, 29.949],
- description: 'Mediterranean coast operations'
- },
- 'HECA': {
- name: 'Cairo West Air Base',
- country: 'Egypt',
- region: 'Mediterranean',
- aircraft: ['F-16C/D Fighting Falcon', 'Rafale'],
- coords: [30.115, 30.916],
- description: 'Capital air defense'
- },
-
- // === UAE ===
- 'OMAM': {
- name: 'Al Minhad Air Base',
- country: 'UAE',
- region: 'Indian_Ocean',
- aircraft: ['F-16E/F Desert Falcon'],
- coords: [25.027, 55.366],
- description: 'Coalition air operations'
- },
- 'OMAA': {
- name: 'Al Dhafra Air Base',
- country: 'UAE',
- region: 'Indian_Ocean',
- aircraft: ['F-35A Lightning II', 'Rafale'],
- coords: [24.248, 54.547],
- description: 'Western region air defense'
- },
-
- // === SAUDI ARABIA ===
- 'OEPR': {
- name: 'Prince Sultan Air Base',
- country: 'Saudi Arabia',
- region: 'Indian_Ocean',
- aircraft: ['F-15SA Eagle', 'Typhoon'],
- coords: [24.069, 47.680],
- description: 'Central command operations'
- },
- 'OERY': {
- name: 'King Faisal Air Base',
- country: 'Saudi Arabia',
- region: 'Indian_Ocean',
- aircraft: ['F-15SA Eagle'],
- coords: [27.900, 45.528],
- description: 'Northern border operations'
- }
-};
-
-// Export for use in other modules
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = { MILITARY_AIRBASES };
-}
\ No newline at end of file
diff --git a/mission-generator/js/app.js b/mission-generator/js/app.js
deleted file mode 100644
index 9a3d417..0000000
--- a/mission-generator/js/app.js
+++ /dev/null
@@ -1,353 +0,0 @@
-// Main Application Controller
-class MissionPlannerApp {
- constructor() {
- this.missionGenerator = new MissionGenerator();
- this.mapController = null;
- this.currentMission = null;
-
- this.initializeApp();
- }
-
- initializeApp() {
- // Wait for DOM to be ready
- if (document.readyState === 'loading') {
- document.addEventListener('DOMContentLoaded', () => this.setup());
- } else {
- this.setup();
- }
- }
-
- setup() {
- // Initialize map controller
- this.mapController = new MapController('worldMap');
-
- // Make map controller globally accessible for popup callbacks
- window.mapController = this.mapController;
-
- // Populate airbase dropdown
- this.populateAirbaseDropdown();
-
- // Setup event listeners
- this.setupEventListeners();
-
- // Initialize UI state
- this.updatePatrolAreaOptions();
- this.updateAircraftOptions();
-
- console.log('Maritime Patrol Mission Generator initialized');
- }
-
- populateAirbaseDropdown() {
- const select = document.getElementById('airbaseSelect');
- if (!select) return;
-
- // Clear existing options except the first one
- select.innerHTML = '<option value="">Select Airbase...</option>';
-
- // Group airbases by country
- const groupedAirbases = {};
- Object.entries(MILITARY_AIRBASES).forEach(([icao, airbase]) => {
- if (!groupedAirbases[airbase.country]) {
- groupedAirbases[airbase.country] = [];
- }
- groupedAirbases[airbase.country].push({ icao, ...airbase });
- });
-
- // Sort countries and add options
- Object.keys(groupedAirbases).sort().forEach(country => {
- const optgroup = document.createElement('optgroup');
- optgroup.label = country;
-
- groupedAirbases[country]
- .sort((a, b) => a.name.localeCompare(b.name))
- .forEach(airbase => {
- const option = document.createElement('option');
- option.value = airbase.icao;
- option.textContent = `${airbase.icao} - ${airbase.name}`;
- optgroup.appendChild(option);
- });
-
- select.appendChild(optgroup);
- });
- }
-
- setupEventListeners() {
- // Airbase selection
- const airbaseSelect = document.getElementById('airbaseSelect');
- if (airbaseSelect) {
- airbaseSelect.addEventListener('change', (e) => {
- this.onAirbaseSelected(e.target.value);
- });
- }
-
- // Mission type selection
- const missionTypeSelect = document.getElementById('missionType');
- if (missionTypeSelect) {
- missionTypeSelect.addEventListener('change', () => {
- this.updateAircraftOptions();
- });
- }
-
- // Patrol area selection
- const patrolAreaSelect = document.getElementById('patrolArea');
- if (patrolAreaSelect) {
- patrolAreaSelect.addEventListener('change', (e) => {
- this.onPatrolAreaSelected(e.target.value);
- });
- }
-
- // Generate mission button
- const generateBtn = document.getElementById('generateMission');
- if (generateBtn) {
- generateBtn.addEventListener('click', () => {
- this.generateMission();
- });
- }
-
- // Export briefing button
- const exportBtn = document.getElementById('exportBriefing');
- if (exportBtn) {
- exportBtn.addEventListener('click', () => {
- this.exportBriefing();
- });
- }
- }
-
- onAirbaseSelected(icao) {
- if (!icao) {
- this.clearAirbaseInfo();
- this.updatePatrolAreaOptions();
- this.updateAircraftOptions();
- return;
- }
-
- const airbase = MILITARY_AIRBASES[icao];
- if (!airbase) return;
-
- // Update airbase info display
- this.displayAirbaseInfo(icao, airbase);
-
- // Update patrol area options based on airbase
- this.updatePatrolAreaOptions(icao);
-
- // Update aircraft options based on airbase
- this.updateAircraftOptions();
-
- // Highlight on map
- this.mapController.highlightSelectedAirbase(icao);
- this.mapController.fitToAirbase(icao);
- }
-
- displayAirbaseInfo(icao, airbase) {
- const infoDiv = document.getElementById('airbaseInfo');
- if (!infoDiv) return;
-
- infoDiv.innerHTML = `
- <div class="info-item">
- <span class="info-label">Country:</span> ${airbase.country}
- </div>
- <div class="info-item">
- <span class="info-label">Region:</span> ${airbase.region.replace('_', ' ')}
- </div>
- <div class="info-item">
- <span class="info-label">Coordinates:</span> ${airbase.coords[0].toFixed(3)}°N, ${Math.abs(airbase.coords[1]).toFixed(3)}°${airbase.coords[1] < 0 ? 'W' : 'E'}
- </div>
- <div class="info-item">
- <span class="info-label">Aircraft:</span> ${airbase.aircraft.slice(0, 2).join(', ')}${airbase.aircraft.length > 2 ? '...' : ''}
- </div>
- <div class="info-item" style="margin-top: 8px; font-size: 10px; color: var(--text-secondary);">
- ${airbase.description}
- </div>
- `;
-
- infoDiv.classList.add('show');
- }
-
- clearAirbaseInfo() {
- const infoDiv = document.getElementById('airbaseInfo');
- if (infoDiv) {
- infoDiv.classList.remove('show');
- }
- }
-
- updatePatrolAreaOptions(selectedAirbaseIcao = null) {
- const select = document.getElementById('patrolArea');
- if (!select) return;
-
- // Clear existing options
- select.innerHTML = '<option value="">Auto-select based on airbase</option>';
-
- if (!selectedAirbaseIcao) return;
-
- const airbase = MILITARY_AIRBASES[selectedAirbaseIcao];
- if (!airbase) return;
-
- // Get appropriate patrol areas
- const { primary, secondary } = getPatrolAreasForAirbase(airbase);
-
- // Add primary areas
- if (primary.length > 0) {
- const primaryGroup = document.createElement('optgroup');
- primaryGroup.label = 'Primary Areas';
-
- primary.forEach(areaKey => {
- const area = PATROL_AREAS[areaKey];
- if (area) {
- const option = document.createElement('option');
- option.value = areaKey;
- option.textContent = area.name;
- primaryGroup.appendChild(option);
- }
- });
-
- select.appendChild(primaryGroup);
- }
-
- // Add secondary areas
- if (secondary.length > 0) {
- const secondaryGroup = document.createElement('optgroup');
- secondaryGroup.label = 'Secondary Areas';
-
- secondary.forEach(areaKey => {
- const area = PATROL_AREAS[areaKey];
- if (area) {
- const option = document.createElement('option');
- option.value = areaKey;
- option.textContent = area.name;
- secondaryGroup.appendChild(option);
- }
- });
-
- select.appendChild(secondaryGroup);
- }
-
- // Auto-select the first primary area
- if (primary.length > 0) {
- select.value = primary[0];
- this.onPatrolAreaSelected(primary[0]);
- }
- }
-
- updateAircraftOptions() {
- const airbaseSelect = document.getElementById('airbaseSelect');
- const aircraftSelect = document.getElementById('aircraftType');
- const missionTypeSelect = document.getElementById('missionType');
-
- if (!aircraftSelect || !airbaseSelect) return;
-
- aircraftSelect.innerHTML = '<option value="">Auto-select based on airbase</option>';
-
- const selectedAirbase = airbaseSelect.value;
- if (!selectedAirbase) return;
-
- const airbase = MILITARY_AIRBASES[selectedAirbase];
- if (!airbase || !airbase.aircraft) return;
-
- // Add aircraft options
- airbase.aircraft.forEach(aircraft => {
- const option = document.createElement('option');
- option.value = aircraft;
- option.textContent = aircraft;
- aircraftSelect.appendChild(option);
- });
-
- // Auto-select best aircraft for mission type
- const missionType = missionTypeSelect.value;
- if (missionType) {
- const bestAircraft = this.missionGenerator.selectAircraft(airbase.aircraft, missionType);
- aircraftSelect.value = bestAircraft;
- }
- }
-
- onPatrolAreaSelected(areaKey) {
- if (areaKey) {
- this.mapController.showPatrolArea(areaKey);
- } else {
- this.mapController.clearPatrolAreas();
- }
- }
-
- generateMission() {
- const airbaseIcao = document.getElementById('airbaseSelect').value;
- const missionType = document.getElementById('missionType').value;
- const patrolArea = document.getElementById('patrolArea').value;
-
- if (!airbaseIcao) {
- alert('Please select an airbase first.');
- return;
- }
-
- // Auto-select patrol area if not specified
- let selectedPatrolArea = patrolArea;
- if (!selectedPatrolArea) {
- const airbase = MILITARY_AIRBASES[airbaseIcao];
- const areas = getPatrolAreasForAirbase(airbase);
- selectedPatrolArea = areas.primary[0];
-
- // Update UI
- document.getElementById('patrolArea').value = selectedPatrolArea;
- this.onPatrolAreaSelected(selectedPatrolArea);
- }
-
- try {
- // Generate the mission
- this.currentMission = this.missionGenerator.generateMission(
- airbaseIcao,
- missionType,
- selectedPatrolArea
- );
-
- // Display the briefing
- this.displayBriefing(this.currentMission);
-
- // Show export button
- document.getElementById('exportBriefing').style.display = 'block';
-
- } catch (error) {
- console.error('Mission generation failed:', error);
- alert('Failed to generate mission. Please check your selections.');
- }
- }
-
- displayBriefing(mission) {
- const briefingDiv = document.getElementById('missionBriefing');
- if (!briefingDiv) return;
-
- const briefingText = this.missionGenerator.generateBriefing(mission);
-
- briefingDiv.innerHTML = `
- <div class="mission-briefing">
- <pre>${briefingText}</pre>
- </div>
- `;
- }
-
- exportBriefing() {
- if (!this.currentMission) {
- alert('No mission generated to export.');
- return;
- }
-
- const briefingText = this.missionGenerator.generateBriefing(this.currentMission);
- const filename = `Mission_${this.currentMission.id}_${this.currentMission.codename.replace(' ', '_')}.txt`;
-
- // Create download link
- const blob = new Blob([briefingText], { type: 'text/plain' });
- const url = window.URL.createObjectURL(blob);
- const link = document.createElement('a');
- link.href = url;
- link.download = filename;
-
- // Trigger download
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- window.URL.revokeObjectURL(url);
- }
-}
-
-// Initialize application when page loads
-let app;
-document.addEventListener('DOMContentLoaded', () => {
- app = new MissionPlannerApp();
-});
\ No newline at end of file
diff --git a/mission-generator/js/map-controller.js b/mission-generator/js/map-controller.js
deleted file mode 100644
index 7ec8163..0000000
--- a/mission-generator/js/map-controller.js
+++ /dev/null
@@ -1,318 +0,0 @@
-// Map Controller for Leaflet Integration
-class MapController {
- constructor(mapElementId) {
- this.mapElementId = mapElementId;
- this.map = null;
- this.airbaseMarkers = [];
- this.patrolAreaLayers = [];
- this.selectedAirbase = null;
- this.selectedPatrolArea = null;
-
- this.initializeMap();
- this.loadAirbases();
- }
-
- initializeMap() {
- // Initialize map centered on Europe/North Atlantic
- this.map = L.map(this.mapElementId, {
- center: [55.0, -5.0],
- zoom: 4,
- minZoom: 2,
- maxZoom: 10,
- worldCopyJump: true
- });
-
- // Dark theme tile layer
- L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', {
- attribution: '© <a href="https://carto.com/attributions">CARTO</a>',
- subdomains: 'abcd',
- maxZoom: 19
- }).addTo(this.map);
-
- // Add custom CSS for dark theme
- this.addMapStyles();
- }
-
- addMapStyles() {
- const style = document.createElement('style');
- style.textContent = `
- .leaflet-popup-content-wrapper {
- background: var(--secondary-bg);
- color: var(--text-primary);
- border: 1px solid var(--accent-green);
- border-radius: 3px;
- }
-
- .leaflet-popup-tip {
- background: var(--secondary-bg);
- border: 1px solid var(--accent-green);
- }
-
- .airbase-popup {
- font-family: 'Courier New', monospace;
- font-size: 11px;
- line-height: 1.4;
- min-width: 200px;
- }
-
- .airbase-popup .popup-header {
- color: var(--accent-green);
- font-weight: bold;
- margin-bottom: 8px;
- text-align: center;
- border-bottom: 1px solid var(--border-color);
- padding-bottom: 5px;
- }
-
- .airbase-popup .popup-info {
- margin-bottom: 5px;
- }
-
- .airbase-popup .popup-label {
- color: var(--text-secondary);
- display: inline-block;
- width: 60px;
- }
-
- .airbase-popup .popup-aircraft {
- color: var(--warning-amber);
- font-size: 10px;
- margin-top: 5px;
- padding: 3px;
- background: var(--tertiary-bg);
- border-radius: 2px;
- }
-
- .select-airbase-btn {
- background: var(--military-blue);
- color: var(--text-primary);
- border: 1px solid var(--accent-green);
- padding: 5px 10px;
- font-family: inherit;
- font-size: 10px;
- cursor: pointer;
- width: 100%;
- margin-top: 8px;
- border-radius: 2px;
- transition: all 0.3s ease;
- }
-
- .select-airbase-btn:hover {
- background: var(--accent-green);
- color: var(--primary-bg);
- }
- `;
- document.head.appendChild(style);
- }
-
- loadAirbases() {
- // Clear existing markers
- this.airbaseMarkers.forEach(marker => this.map.removeLayer(marker));
- this.airbaseMarkers = [];
-
- // Create markers for each airbase
- Object.entries(MILITARY_AIRBASES).forEach(([icao, airbase]) => {
- const marker = this.createAirbaseMarker(icao, airbase);
- this.airbaseMarkers.push(marker);
- marker.addTo(this.map);
- });
- }
-
- createAirbaseMarker(icao, airbase) {
- const [lat, lon] = airbase.coords;
-
- // Custom airbase icon
- const airbaseIcon = L.divIcon({
- className: 'airbase-marker',
- html: `<div style="
- width: 8px;
- height: 8px;
- background: var(--accent-green);
- border: 2px solid var(--primary-bg);
- border-radius: 50%;
- box-shadow: 0 0 8px rgba(0, 255, 65, 0.6);
- "></div>`,
- iconSize: [12, 12],
- iconAnchor: [6, 6]
- });
-
- const marker = L.marker([lat, lon], { icon: airbaseIcon });
-
- // Create popup content
- const popupContent = this.createAirbasePopup(icao, airbase);
- marker.bindPopup(popupContent, {
- maxWidth: 250,
- className: 'airbase-popup-container'
- });
-
- // Add click handler
- marker.on('click', () => {
- this.selectAirbase(icao);
- });
-
- return marker;
- }
-
- createAirbasePopup(icao, airbase) {
- const aircraftList = Array.isArray(airbase.aircraft) ?
- airbase.aircraft.slice(0, 3).join(', ') +
- (airbase.aircraft.length > 3 ? '...' : '') :
- 'Various aircraft';
-
- return `
- <div class="airbase-popup">
- <div class="popup-header">${airbase.name}</div>
- <div class="popup-info">
- <span class="popup-label">ICAO:</span> ${icao}
- </div>
- <div class="popup-info">
- <span class="popup-label">Country:</span> ${airbase.country}
- </div>
- <div class="popup-info">
- <span class="popup-label">Region:</span> ${airbase.region.replace('_', ' ')}
- </div>
- <div class="popup-info">
- <span class="popup-label">Coords:</span> ${airbase.coords[0].toFixed(3)}°, ${airbase.coords[1].toFixed(3)}°
- </div>
- <div class="popup-aircraft">
- Aircraft: ${aircraftList}
- </div>
- <button class="select-airbase-btn" onclick="window.mapController.selectAirbase('${icao}')">
- SELECT AIRBASE
- </button>
- </div>
- `;
- }
-
- selectAirbase(icao) {
- this.selectedAirbase = icao;
- const airbase = MILITARY_AIRBASES[icao];
-
- // Update airbase selection in UI
- const airbaseSelect = document.getElementById('airbaseSelect');
- if (airbaseSelect) {
- airbaseSelect.value = icao;
- airbaseSelect.dispatchEvent(new Event('change'));
- }
-
- // Highlight selected airbase
- this.highlightSelectedAirbase(icao);
-
- // Pan to airbase
- const [lat, lon] = airbase.coords;
- this.map.setView([lat, lon], 6);
-
- // Close popup
- this.map.closePopup();
- }
-
- highlightSelectedAirbase(icao) {
- // Reset all markers to normal
- this.airbaseMarkers.forEach(marker => {
- const element = marker.getElement();
- if (element) {
- const icon = element.querySelector('div');
- if (icon) {
- icon.style.background = 'var(--accent-green)';
- icon.style.boxShadow = '0 0 8px rgba(0, 255, 65, 0.6)';
- }
- }
- });
-
- // Highlight selected marker
- const selectedMarker = this.airbaseMarkers.find(marker => {
- const airbase = Object.entries(MILITARY_AIRBASES).find(([code, data]) =>
- data.coords[0] === marker.getLatLng().lat &&
- data.coords[1] === marker.getLatLng().lng
- );
- return airbase && airbase[0] === icao;
- });
-
- if (selectedMarker) {
- const element = selectedMarker.getElement();
- if (element) {
- const icon = element.querySelector('div');
- if (icon) {
- icon.style.background = 'var(--warning-amber)';
- icon.style.boxShadow = '0 0 12px rgba(255, 176, 0, 0.8)';
- }
- }
- }
- }
-
- showPatrolArea(patrolAreaKey) {
- // Clear existing patrol area layers
- this.clearPatrolAreas();
-
- const area = PATROL_AREAS[patrolAreaKey];
- if (!area) return;
-
- const { bounds } = area;
-
- // Create rectangle for patrol area
- const rectangle = L.rectangle([
- [bounds.south, bounds.west],
- [bounds.north, bounds.east]
- ], {
- color: '#1e3a5f',
- fillColor: '#1e3a5f',
- fillOpacity: 0.1,
- weight: 2,
- opacity: 0.6,
- dashArray: '5, 5'
- });
-
- rectangle.addTo(this.map);
- this.patrolAreaLayers.push(rectangle);
-
- // Add label
- const center = area.center;
- const label = L.marker(center, {
- icon: L.divIcon({
- className: 'patrol-area-label',
- html: `<div style="
- color: var(--military-blue);
- font-family: 'Courier New', monospace;
- font-size: 11px;
- font-weight: bold;
- text-shadow: 1px 1px 2px rgba(0,0,0,0.8);
- white-space: nowrap;
- ">${area.name}</div>`,
- iconSize: [120, 20],
- iconAnchor: [60, 10]
- })
- });
-
- label.addTo(this.map);
- this.patrolAreaLayers.push(label);
-
- // Fit bounds to show both airbase and patrol area
- if (this.selectedAirbase) {
- const airbase = MILITARY_AIRBASES[this.selectedAirbase];
- const group = new L.featureGroup([rectangle, L.marker(airbase.coords)]);
- this.map.fitBounds(group.getBounds(), { padding: [20, 20] });
- }
- }
-
- clearPatrolAreas() {
- this.patrolAreaLayers.forEach(layer => this.map.removeLayer(layer));
- this.patrolAreaLayers = [];
- }
-
- fitToAirbase(icao) {
- const airbase = MILITARY_AIRBASES[icao];
- if (airbase) {
- const [lat, lon] = airbase.coords;
- this.map.setView([lat, lon], 6);
- }
- }
-
- getMap() {
- return this.map;
- }
-}
-
-// Export for use in other modules
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = { MapController };
-}
\ No newline at end of file
diff --git a/mission-generator/js/mission-generator.js b/mission-generator/js/mission-generator.js
deleted file mode 100644
index eb08ba6..0000000
--- a/mission-generator/js/mission-generator.js
+++ /dev/null
@@ -1,350 +0,0 @@
-// Mission Generation Logic
-class MissionGenerator {
- constructor() {
- this.missionTypes = {
- 'MARITIME_PATROL': {
- name: 'Maritime Patrol',
- description: 'Search and surveillance of designated maritime areas',
- objectives: [
- 'Conduct surface surveillance of assigned patrol area',
- 'Report any suspicious vessel activity to Maritime Operations Center',
- 'Use FLIR camera system for vessel identification and classification',
- 'Maintain communication with home base every 30 minutes',
- 'Document all surface contacts with position and bearing'
- ],
- duration: '4-8 hours',
- minAltitude: 1000,
- maxAltitude: 25000,
- equipment: ['FLIR-25HD Camera', 'Maritime Radar', 'ESM Suite', 'SATCOM']
- },
- 'SAR': {
- name: 'Search and Rescue',
- description: 'Locate and assist vessels or aircraft in distress',
- objectives: [
- 'Search designated area using FLIR and visual systems',
- 'Identify and classify any surface contacts or debris',
- 'Coordinate with rescue vessels and helicopters if targets located',
- 'Provide accurate position updates to SAR coordination center',
- 'Maintain search pattern integrity throughout operation'
- ],
- duration: '6-10 hours',
- minAltitude: 500,
- maxAltitude: 15000,
- equipment: ['FLIR-25HD Camera', 'SAR Radar', 'Emergency Beacons', 'Life Rafts']
- },
- 'RECON': {
- name: 'Reconnaissance',
- description: 'Intelligence gathering over specified maritime areas',
- objectives: [
- 'Conduct covert surveillance of designated target area',
- 'Use FLIR camera system for detailed observation and recording',
- 'Document vessel movements, types, and activities',
- 'Maintain operational security throughout mission',
- 'Collect electronic intelligence where possible'
- ],
- duration: '3-6 hours',
- minAltitude: 2000,
- maxAltitude: 30000,
- equipment: ['FLIR-25HD Camera', 'Electronic Intelligence Suite', 'Secure Communications']
- },
- 'ASW': {
- name: 'Anti-Submarine Warfare',
- description: 'Submarine detection and tracking operations',
- objectives: [
- 'Deploy sonobuoys in designated search pattern',
- 'Monitor passive and active sonar contacts',
- 'Use FLIR to identify surface vessels and periscopes',
- 'Coordinate with naval vessels for prosecution',
- 'Maintain acoustic tracking of subsurface contacts'
- ],
- duration: '6-12 hours',
- minAltitude: 200,
- maxAltitude: 10000,
- equipment: ['FLIR-25HD Camera', 'Sonobuoy Dispenser', 'MAD Boom', 'Torpedoes']
- },
- 'FISHERY_PATROL': {
- name: 'Fishery Protection',
- description: 'Monitor fishing activities and enforce maritime regulations',
- objectives: [
- 'Patrol designated fishing zones and protected areas',
- 'Identify and inspect fishing vessels using FLIR camera',
- 'Report illegal fishing activities to coast guard',
- 'Document vessel positions and fishing equipment',
- 'Coordinate with patrol vessels for enforcement action'
- ],
- duration: '4-8 hours',
- minAltitude: 1000,
- maxAltitude: 15000,
- equipment: ['FLIR-25HD Camera', 'Maritime Radar', 'Camera Systems', 'GPS Tracker']
- }
- };
- }
-
- generateMission(airbaseIcao, missionType, patrolArea) {
- const airbase = MILITARY_AIRBASES[airbaseIcao];
- const mission = this.missionTypes[missionType];
- const area = PATROL_AREAS[patrolArea];
-
- if (!airbase || !mission || !area) {
- throw new Error('Invalid mission parameters');
- }
-
- const missionData = {
- id: this.generateMissionId(),
- codename: this.generateCodename(),
- type: mission,
- airbase: airbase,
- airbaseIcao: airbaseIcao,
- patrolArea: area,
- patrolAreaKey: patrolArea,
- callsign: this.generateCallsign(airbase.country),
- aircraft: this.selectAircraft(airbase.aircraft, missionType),
-
- // Timing
- startTime: this.generateMissionTime(),
- duration: mission.duration,
-
- // Navigation
- waypoints: generatePatrolWaypoints(patrolArea, 4),
- distance: calculateDistanceToPatrolArea(airbase.coords, patrolArea),
-
- // Communications
- frequencies: this.generateFrequencies(),
-
- // Security
- authCode: this.generateAuthCode(),
- classification: 'NATO RESTRICTED',
-
- // Environmental
- threatLevel: this.generateThreatLevel(),
-
- // Generated timestamp
- generatedAt: new Date().toISOString()
- };
-
- return missionData;
- }
-
- generateMissionId() {
- const prefix = 'MP'; // Maritime Patrol
- const date = new Date().toISOString().slice(2, 10).replace(/-/g, '');
- const random = Math.floor(Math.random() * 1000).toString().padStart(3, '0');
- return `${prefix}${date}${random}`;
- }
-
- generateCodename() {
- const adjectives = [
- 'NORTHERN', 'SOUTHERN', 'EASTERN', 'WESTERN', 'CENTRAL',
- 'BLUE', 'GREEN', 'RED', 'GOLD', 'SILVER',
- 'SWIFT', 'SILENT', 'DEEP', 'HIGH', 'LONG',
- 'SHARP', 'BRIGHT', 'DARK', 'CLEAR', 'STORM'
- ];
-
- const nouns = [
- 'SENTINEL', 'GUARDIAN', 'WATCHER', 'HUNTER', 'SEEKER',
- 'FALCON', 'EAGLE', 'HAWK', 'RAVEN', 'ALBATROSS',
- 'TRIDENT', 'ANCHOR', 'COMPASS', 'BEACON', 'LIGHTHOUSE',
- 'WAVE', 'TIDE', 'CURRENT', 'REEF', 'DEPTH'
- ];
-
- const adj = adjectives[Math.floor(Math.random() * adjectives.length)];
- const noun = nouns[Math.floor(Math.random() * nouns.length)];
-
- return `${adj} ${noun}`;
- }
-
- generateCallsign(country) {
- const callsigns = {
- 'USA': ['POSEIDON', 'CLIPPER', 'SEAHAWK', 'NEPTUNE', 'MARINER'],
- 'UK': ['KINGFISHER', 'NIMROD', 'GUARDIAN', 'SENTINEL', 'PHOENIX'],
- 'France': ['ATLANTIQUE', 'FALCON', 'DAUPHIN', 'MISTRAL', 'NAVAL'],
- 'Germany': ['ORION', 'SEAKING', 'HURRICANE', 'VIKING', 'MARITIME'],
- 'Italy': ['ATLANTICO', 'SPARTAN', 'HARRIER', 'VESUVIO', 'MARE'],
- 'Canada': ['AURORA', 'MAPLE', 'ARCTIC', 'PACIFIC', 'ATLANTIC'],
- 'Australia': ['WEDGETAIL', 'SOUTHERN', 'PACIFIC', 'ANZAC', 'CORAL'],
- 'Netherlands': ['ORANGE', 'FALCON', 'SEAHORSE', 'NORDKAPP', 'ZUIDERZEE'],
- 'Norway': ['POLAR', 'VIKING', 'ARCTIC', 'FJORD', 'MIDNIGHT'],
- 'Spain': ['EAGLE', 'IBERIAN', 'ATLANTIC', 'PELICAN', 'GIBRALTAR'],
- 'Portugal': ['NAVIGATOR', 'ATLANTIC', 'AZORES', 'CORMORANT', 'MAGELLAN']
- };
-
- const countryCallsigns = callsigns[country] || callsigns['USA'];
- const base = countryCallsigns[Math.floor(Math.random() * countryCallsigns.length)];
- const number = Math.floor(Math.random() * 99) + 1;
-
- return `${base} ${number.toString().padStart(2, '0')}`;
- }
-
- selectAircraft(availableAircraft, missionType) {
- // Mission-specific aircraft preferences
- const preferences = {
- 'MARITIME_PATROL': ['P-8A Poseidon', 'P-3C Orion', 'Atlantique 2', 'CP-140 Aurora'],
- 'SAR': ['P-8A Poseidon', 'P-3C Orion', 'C-130J Super Hercules', 'ATR 72MP'],
- 'RECON': ['P-8A Poseidon', 'EP-3E Aries', 'Atlantique 2', 'ATR 72MP'],
- 'ASW': ['P-8A Poseidon', 'P-3C Orion', 'Atlantique 2', 'CP-140 Aurora'],
- 'FISHERY_PATROL': ['P-3C Orion', 'ATR 72MP', 'C-295M', 'Falcon 50M']
- };
-
- const preferred = preferences[missionType] || availableAircraft;
-
- // Find best match
- for (const aircraft of preferred) {
- if (availableAircraft.includes(aircraft)) {
- return aircraft;
- }
- }
-
- // Fallback to first available
- return availableAircraft[0] || 'P-8A Poseidon';
- }
-
- generateMissionTime() {
- const now = new Date();
- // Generate mission start time 1-4 hours from now
- const hoursFromNow = Math.floor(Math.random() * 3) + 1;
- const startTime = new Date(now.getTime() + hoursFromNow * 60 * 60 * 1000);
-
- // Round to nearest 15 minutes
- const minutes = Math.round(startTime.getMinutes() / 15) * 15;
- startTime.setMinutes(minutes, 0, 0);
-
- return startTime.toISOString().slice(11, 16) + ' ZULU';
- }
-
- generateFrequencies() {
- return {
- base: `${(250 + Math.random() * 150).toFixed(3)}`,
- maritime: `${(250 + Math.random() * 150).toFixed(3)}`,
- guard: '121.500',
- emergency: '243.000',
- sar: `${(250 + Math.random() * 150).toFixed(3)}`
- };
- }
-
- generateAuthCode() {
- const words = [
- 'ALPHA', 'BRAVO', 'CHARLIE', 'DELTA', 'ECHO', 'FOXTROT',
- 'GOLF', 'HOTEL', 'INDIA', 'JULIET', 'KILO', 'LIMA',
- 'MIKE', 'NOVEMBER', 'OSCAR', 'PAPA', 'QUEBEC', 'ROMEO',
- 'SIERRA', 'TANGO', 'UNIFORM', 'VICTOR', 'WHISKEY', 'XRAY',
- 'YANKEE', 'ZULU'
- ];
-
- const word1 = words[Math.floor(Math.random() * words.length)];
- const word2 = words[Math.floor(Math.random() * words.length)];
- const number = Math.floor(Math.random() * 100).toString().padStart(2, '0');
-
- return `${word1}-${word2}-${number}`;
- }
-
- generateThreatLevel() {
- const levels = ['LOW', 'MODERATE', 'ELEVATED', 'HIGH'];
- const weights = [0.4, 0.35, 0.2, 0.05]; // Probability weights
-
- const random = Math.random();
- let cumulative = 0;
-
- for (let i = 0; i < levels.length; i++) {
- cumulative += weights[i];
- if (random <= cumulative) {
- return levels[i];
- }
- }
-
- return 'LOW';
- }
-
- generateBriefing(missionData) {
- const {
- codename, type, callsign, aircraft, airbase, airbaseIcao,
- patrolArea, startTime, duration, waypoints, distance,
- frequencies, authCode, classification, threatLevel
- } = missionData;
-
- return `═══════════════════════════════════════
- MARITIME PATROL MISSION
- OPERATION ${codename}
-═══════════════════════════════════════
-
-CLASSIFICATION: ${classification}
-
-MISSION TYPE: ${type.name}
-CALLSIGN: ${callsign}
-AIRCRAFT: ${aircraft}
-
-DEPARTURE: ${airbase.name} (${airbaseIcao})
-PATROL AREA: ${patrolArea.name}
-MISSION START: ${startTime}
-ESTIMATED DURATION: ${duration}
-DISTANCE TO AREA: ${distance} nm
-
-PRIMARY OBJECTIVES:
-${type.objectives.map(obj => `▶ ${obj}`).join('\n')}
-
-AREA OF OPERATIONS:
-${patrolArea.description}
-
-KEY PATROL AREAS:
-${patrolArea.keyAreas ? patrolArea.keyAreas.map(area => `• ${area}`).join('\n') : 'Standard patrol pattern'}
-
-PATROL WAYPOINTS:
-${waypoints.map((wp, i) => `${i + 1}. ${wp.name}: ${wp.coords[0].toFixed(3)}°N ${Math.abs(wp.coords[1]).toFixed(3)}°${wp.coords[1] < 0 ? 'W' : 'E'}`).join('\n')}
-
-EQUIPMENT LOADOUT:
-${type.equipment.map(eq => `▶ ${eq}`).join('\n')}
-
-FLIR CAMERA OPERATION:
-▶ F9: Activate/Deactivate Camera
-▶ Mouse: Pan/Tilt Control
-▶ +/-: Zoom In/Out
-▶ Arrow Keys: Fine Adjustment
-▶ T: Cycle Visual Modes (Standard/Mono/Thermal)
-▶ SPACE: Target Lock (Red=Locked, Green=Scanning)
-
-COMMUNICATION FREQUENCIES:
-Home Base: ${frequencies.base}
-Maritime Ops: ${frequencies.maritime}
-SAR Coordination: ${frequencies.sar}
-Guard: ${frequencies.guard}
-Emergency: ${frequencies.emergency}
-
-THREAT ASSESSMENT: ${threatLevel}
-${this.getThreatDescription(threatLevel)}
-
-POTENTIAL HAZARDS:
-${patrolArea.threats ? patrolArea.threats.map(threat => `⚠ ${threat}`).join('\n') : '⚠ Standard maritime hazards'}
-
-SPECIAL INSTRUCTIONS:
-▶ Report all surface contacts immediately
-▶ Maintain minimum altitude ${type.minAltitude}ft AGL
-▶ Weather updates every 30 minutes
-▶ Emergency procedures per SOP-MAR-001
-
-AUTHENTICATION CODE: ${authCode}
-
-MISSION COMMANDER: Duty Operations Officer
-WEATHER BRIEFING: Available via SimBrief/PFPX
-NOTAMS: Check current NOTAMs for patrol area
-
-═══════════════════════════════════════
- GOOD HUNTING - STAY VIGILANT
-═══════════════════════════════════════
-
-Generated: ${new Date().toUTCString()}`;
- }
-
- getThreatDescription(level) {
- const descriptions = {
- 'LOW': 'Routine patrol environment. Standard precautions apply.',
- 'MODERATE': 'Heightened awareness required. Additional reporting protocols in effect.',
- 'ELEVATED': 'Increased security measures. Avoid unnecessary risks.',
- 'HIGH': 'Significant threat indicators. Mission-critical security protocols active.'
- };
- return descriptions[level] || descriptions['LOW'];
- }
-}
-
-// Export for use in other modules
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = { MissionGenerator };
-}
\ No newline at end of file
diff --git a/mission-generator/js/patrol-areas.js b/mission-generator/js/patrol-areas.js
deleted file mode 100644
index e779d86..0000000
--- a/mission-generator/js/patrol-areas.js
+++ /dev/null
@@ -1,297 +0,0 @@
-// Patrol Areas Database with intelligent region matching
-const PATROL_AREAS = {
- 'North_Sea': {
- name: 'North Sea Patrol Zone',
- bounds: {
- north: 62.0,
- south: 51.0,
- east: 8.0,
- west: -4.0
- },
- center: [56.5, 2.0],
- description: 'High-traffic shipping lane surveillance and fishery protection',
- threats: ['Heavy commercial traffic', 'Weather deterioration', 'Fishing vessel interference'],
- keyAreas: [
- 'Dogger Bank fishing grounds',
- 'Norwegian shipping lanes',
- 'UK-Netherlands ferry routes',
- 'Oil platform approaches'
- ]
- },
-
- 'English_Channel': {
- name: 'English Channel Transit Zone',
- bounds: {
- north: 51.5,
- south: 49.0,
- east: 2.5,
- west: -5.0
- },
- center: [50.25, -1.25],
- description: 'Critical maritime chokepoint monitoring and cross-channel surveillance',
- threats: ['Dense commercial traffic', 'Multiple national jurisdictions', 'Restricted military areas'],
- keyAreas: [
- 'Dover Strait separation scheme',
- 'Portsmouth-Le Havre ferry routes',
- 'Channel Islands approaches',
- 'Cherbourg naval approaches'
- ]
- },
-
- 'Atlantic': {
- name: 'North Atlantic Patrol Area',
- bounds: {
- north: 65.0,
- south: 35.0,
- east: -5.0,
- west: -70.0
- },
- center: [50.0, -37.5],
- description: 'Long-range maritime patrol and search and rescue operations',
- threats: ['Extreme weather conditions', 'Long transit times', 'Limited diversion airfields'],
- keyAreas: [
- 'GIUK Gap surveillance',
- 'Trans-Atlantic shipping lanes',
- 'Grand Banks fishing areas',
- 'Mid-Atlantic Ridge approaches'
- ]
- },
-
- 'Mediterranean': {
- name: 'Mediterranean Security Zone',
- bounds: {
- north: 45.0,
- south: 30.0,
- east: 36.0,
- west: -6.0
- },
- center: [37.5, 15.0],
- description: 'Central and Eastern Mediterranean patrol operations',
- threats: ['International tensions', 'Migration routes', 'Multiple sovereign waters'],
- keyAreas: [
- 'Strait of Gibraltar approaches',
- 'Central Mediterranean corridor',
- 'Aegean Sea patrol zones',
- 'Libyan coast surveillance'
- ]
- },
-
- 'Gulf_of_Mexico': {
- name: 'Gulf of Mexico Operations Area',
- bounds: {
- north: 31.0,
- south: 18.0,
- east: -80.0,
- west: -98.0
- },
- center: [24.5, -89.0],
- description: 'Gulf coast security and hurricane response operations',
- threats: ['Hurricane season', 'Oil platform density', 'Drug interdiction operations'],
- keyAreas: [
- 'Mississippi Delta approaches',
- 'Texas offshore platforms',
- 'Florida Keys corridor',
- 'Yucatan Channel surveillance'
- ]
- },
-
- 'Pacific': {
- name: 'Pacific Operations Area',
- bounds: {
- north: 50.0,
- south: 20.0,
- east: -120.0,
- west: 120.0
- },
- center: [35.0, -180.0],
- description: 'Wide-area Pacific maritime surveillance and patrol',
- threats: ['Vast distances', 'Weather systems', 'International waters complexity'],
- keyAreas: [
- 'Hawaiian approaches',
- 'Alaska fishing grounds',
- 'West Coast shipping lanes',
- 'Trans-Pacific routes'
- ]
- },
-
- 'Arctic': {
- name: 'Arctic Maritime Zone',
- bounds: {
- north: 85.0,
- south: 66.5,
- east: 180.0,
- west: -180.0
- },
- center: [75.0, 0.0],
- description: 'Arctic Ocean surveillance and search and rescue',
- threats: ['Extreme cold conditions', 'Limited infrastructure', 'Ice navigation hazards'],
- keyAreas: [
- 'Northwest Passage routes',
- 'Barents Sea approaches',
- 'Greenland Sea patrol zones',
- 'Svalbard approaches'
- ]
- },
-
- 'Indian_Ocean': {
- name: 'Indian Ocean Operations Area',
- bounds: {
- north: 30.0,
- south: -50.0,
- east: 120.0,
- west: 30.0
- },
- center: [-10.0, 75.0],
- description: 'Indian Ocean maritime security and anti-piracy operations',
- threats: ['Piracy activity', 'Monsoon weather patterns', 'Long transit distances'],
- keyAreas: [
- 'Arabian Sea patrol zones',
- 'Bay of Bengal surveillance',
- 'Strait of Hormuz approaches',
- 'Mozambique Channel security',
- 'Malacca Strait monitoring',
- 'Somali Basin anti-piracy'
- ]
- }
-};
-
-// Function to determine appropriate patrol areas based on airbase location
-function getPatrolAreasForAirbase(airbaseData) {
- const { region, coords } = airbaseData;
- const [lat, lon] = coords;
-
- // Primary region assignment
- const primaryAreas = [region];
-
- // Add secondary areas based on geographic proximity
- const secondaryAreas = [];
-
- // Logic for secondary area assignment
- switch (region) {
- case 'North_Sea':
- if (lat > 55) secondaryAreas.push('Arctic');
- if (lon < 0) secondaryAreas.push('Atlantic');
- secondaryAreas.push('English_Channel');
- break;
-
- case 'English_Channel':
- secondaryAreas.push('North_Sea', 'Atlantic');
- if (lat < 50) secondaryAreas.push('Mediterranean');
- break;
-
- case 'Atlantic':
- if (lat > 55) secondaryAreas.push('Arctic');
- if (lat < 45) secondaryAreas.push('Mediterranean');
- if (lon > -20) secondaryAreas.push('North_Sea');
- if (lon < -60) secondaryAreas.push('Gulf_of_Mexico');
- break;
-
- case 'Mediterranean':
- secondaryAreas.push('Atlantic');
- if (lat > 42) secondaryAreas.push('English_Channel');
- break;
-
- case 'Pacific':
- if (lat > 45) secondaryAreas.push('Arctic');
- if (lon > -130 && lat < 35) secondaryAreas.push('Gulf_of_Mexico');
- break;
-
- case 'Gulf_of_Mexico':
- secondaryAreas.push('Atlantic');
- if (lon < -90) secondaryAreas.push('Pacific');
- break;
-
- case 'Arctic':
- if (lon > -30 && lon < 30) secondaryAreas.push('North_Sea');
- secondaryAreas.push('Atlantic', 'Pacific');
- break;
-
- case 'Indian_Ocean':
- if (lat > 20) secondaryAreas.push('Mediterranean');
- if (lon > 100) secondaryAreas.push('Pacific');
- if (lon < 50) secondaryAreas.push('Atlantic');
- break;
- }
-
- return {
- primary: primaryAreas,
- secondary: secondaryAreas.filter(area => !primaryAreas.includes(area))
- };
-}
-
-// Function to calculate distance between airbase and patrol area center
-function calculateDistanceToPatrolArea(airbaseCoords, patrolAreaKey) {
- const area = PATROL_AREAS[patrolAreaKey];
- if (!area) return Infinity;
-
- const [lat1, lon1] = airbaseCoords;
- const [lat2, lon2] = area.center;
-
- // Haversine formula for great circle distance
- const R = 6371; // Earth's radius in kilometers
- const dLat = (lat2 - lat1) * Math.PI / 180;
- const dLon = (lon2 - lon1) * Math.PI / 180;
-
- const a = Math.sin(dLat/2) * Math.sin(dLat/2) +
- Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
- Math.sin(dLon/2) * Math.sin(dLon/2);
-
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
- const distance = R * c;
-
- return Math.round(distance);
-}
-
-// Function to generate patrol waypoints within an area
-function generatePatrolWaypoints(patrolAreaKey, numWaypoints = 4) {
- const area = PATROL_AREAS[patrolAreaKey];
- if (!area) return [];
-
- const waypoints = [];
- const { bounds } = area;
-
- // Generate waypoints in a rough patrol pattern
- for (let i = 0; i < numWaypoints; i++) {
- const latRange = bounds.north - bounds.south;
- const lonRange = bounds.east - bounds.west;
-
- // Create a roughly rectangular patrol pattern
- let lat, lon;
-
- if (i === 0) {
- // Northwest corner
- lat = bounds.south + latRange * 0.8;
- lon = bounds.west + lonRange * 0.2;
- } else if (i === 1) {
- // Northeast corner
- lat = bounds.south + latRange * 0.8;
- lon = bounds.west + lonRange * 0.8;
- } else if (i === 2) {
- // Southeast corner
- lat = bounds.south + latRange * 0.2;
- lon = bounds.west + lonRange * 0.8;
- } else {
- // Southwest corner
- lat = bounds.south + latRange * 0.2;
- lon = bounds.west + lonRange * 0.2;
- }
-
- waypoints.push({
- name: `PATROL_${i + 1}`,
- coords: [parseFloat(lat.toFixed(3)), parseFloat(lon.toFixed(3))],
- description: `Patrol waypoint ${i + 1}`
- });
- }
-
- return waypoints;
-}
-
-// Export for use in other modules
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = {
- PATROL_AREAS,
- getPatrolAreasForAirbase,
- calculateDistanceToPatrolArea,
- generatePatrolWaypoints
- };
-}
\ No newline at end of file