Pilot Domiciles
body {
background-color: #f0f2f5;
font-family: ‘Segoe UI’, Tahoma, Geneva, Verdana, sans-serif;
}
.btn-custom {
background-color: #ffffff;
border: 1px solid #dee2e6;
border-radius: 8px;
padding: 10px 20px;
margin: 5px;
color: #2c3e50;
text-decoration: none;
transition: transform 0.2s, box-shadow 0.2s;
display: inline-block;
}
.btn-custom:hover {
transform: scale(1.05);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
background-color: #e9ecef;
}
.search-bar { max-width: 500px; margin: 20px auto; }
.accordion-button { font-weight: 600; color: #2c3e50; }
#map { height: 70vh; margin-top: 20px; border-radius: 10px; box-shadow: 0 4px 12px rgba(0,0,0,0.2); }
.filter-section {
background: white;
padding: 15px;
border-radius: 10px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
margin-bottom: 20px;
}
.filter-group { margin-bottom: 15px; }
.filter-group h5 { margin-bottom: 8px; }
.select-all-btn { font-size: 0.85rem; margin-left: 10px; }
.domicile-label { cursor: help; text-decoration: underline dotted; }
.state-label { cursor: help; }
.category-divider {
margin: 12px 0 8px;
font-weight: bold;
color: #495057;
border-top: 1px solid #dee2e6;
padding-top: 8px;
}
.global-select { font-size: 0.9rem; margin-left: 15px; }
.filter-header {
margin-bottom: 20px; /* adds extra space below the header line */
}
.raw-data { display: none; }
Pilot Domiciles
Pilot Domiciles
https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js
https://unpkg.com/leaflet@1.9.4/dist/leaflet.js
https://unpkg.com/leaflet.markercluster@1.4.1/dist/leaflet.markercluster.js
# Legacy Carriers Alaska Airlines | https://careers.alaskaair.com/career-opportunities/pilots/alaska-airlines/ | ANC, LAX, PDX, SEA, SFO American Airlines | https://jobs.aa.com/go/Pilot/9286400/ | BOS, CLT, DCA, DFW, LAX, LGA, MIA, ORD, PHL, PHX Delta Air Lines | https://www.delta.com/us/en/careers/pilots/overview | ATL, DTW, LAX, MSP, NYC, SEA, SLC Hawaiian Airlines | https://www.hawaiianairlines.com/careers/first-officer | CVG, HNL United Airlines | https://careers.united.com/us/en/pilots | CLE, DEN, EWR, GUM, IAD, IAH, LAX, MCO, ORD, TPA, SFO # Major / National / Low Cost Carriers (LCC) Allegiant Air | https://www.allegiantair.com/careers/pilots | ABE, ATW, AVL, BLI, BNA, CVG, DSM, FLL, FNT, GRR, IND, IWA, LAS, LAX, PGD, PIE, PIT, PVU, SAV, SFB, TYS, VPS Avelo Airlines | https://www.aveloair.com/pilots | BDL, ELP, HVN, ILG, IWA, LAL, MCO, RDU Breeze Airways | https://jobs.flybreeze.com/ | BDL, CHS, MCO, MSY, ORF, PVD, PVU, RSW, TPA, VRB Frontier Airlines | https://www.flyfrontier.com/careers/pilot/ | ATL, CLE, CVG, DEN, DFW, LAS, MCO, MDW, MIA, ORD, PHL, PHX, TPA JetBlue Airways | https://careers.jetblue.com/go/First-Officer/8044500/ | BOS, EWR, FLL, JFK, LAX, MCO Southwest Airlines | https://careers.southwestair.com/pilots | ATL, BNA, BWI, DAL, DEN, HOU, MCO, MDW, LAS, LAX, OAK, PHX Spirit Airlines | https://careers.spirit.com/pilots-go-further | ACY, ATL, DFW, DTW, FLL, IAH, LAS, MCO, MIA Sun Country Airlines | https://careers.suncountry.com/pilots | MSP # Cargo Airlines ABX Air | https://www.abxair.com/careers/abx-air-pilots | CVG, ILN Atlas Air | https://careers.atlasairworldwide.com/careers/?departments=Crew | MIA Empire Airlines | https://www.empireairlines.com/pilots/ | ANC, HNL Everts Air Cargo | https://evertsair.com/careers/operations-jobs | ANC, FAI FedEx Express | https://careers.fedex.com/career-areas/pilot/ | ANC, IND, LAX, MEM, OAK Kalitta Air | https://www.kalittaair.com/teams/pilots | CVG, JFK Key Lime Air | https://www.keylimeair.com/about/careers/ | DEN Mountain Air Cargo | https://mtaircargo.com/pilot-careers/ | DEN, MEM United Parcel Service | https://www.jobs-ups.com/us/en/airline | SDF, MIA, ONT # Regional Airlines Cape Air | https://www.capeairpilots.com | HYA, BOS, STL CommuteAir | https://www.commuteair.com/careers/pilots/ | IAD, IAH Endeavor Air | https://www.endeavorair.com/content/endeavor-air/en_us/careers/pilots.html | ATL, CVG, DTW, JFK, LGA, MSP, RDU Envoy Air | https://www.envoyair.com/careers/pilots/ | DFW, ORD, MIA, PHX GoJet Airlines | https://www.gojetairlines.com/pilot-careers/ | ORD, RDU, STL Horizon Air | https://careers.alaskaair.com/career-opportunities/pilots/horizon-air/ | ANC, BOI, GEG, MFR, PAE, PDX, SEA Mesa Airlines | https://www.mesa-air.com/home-1 | DFW, IAH, PHX Piedmont Airlines | https://piedmont-airlines.com/first-officer/ | CLT, PHL PSA Airlines | https://www.psaairlines.com/first-officers/ | CLT, DAY, DCA, DFW, PHL Republic Airways | https://rjet.com/pilots/ | BOS, CMH, DCA, EWR, IND, LGA, ORD, PHL, PIT, SDF, SkyWest | https://www.skywest.com/skywest-airline-jobs/career-guides/pilot-jobs | DEN, DFW, DTW, LAX, MSP, ORD, PHX, SEA, SLC
{
“type”: “FeatureCollection”,
“features”: [
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-149.9964,61.1744]},”properties”:{“code”:”ANC”,”name”:”Ted Stevens Anchorage International”,”city”:”Anchorage”,”state”:”AK”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-118.4081,33.9425]},”properties”:{“code”:”LAX”,”name”:”Los Angeles International”,”city”:”Los Angeles”,”state”:”CA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-122.5967,45.5231]},”properties”:{“code”:”PDX”,”name”:”Portland International”,”city”:”Portland”,”state”:”OR”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-122.3093,47.449]},”properties”:{“code”:”SEA”,”name”:”Seattle-Tacoma International”,”city”:”Seattle”,”state”:”WA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-122.3755,37.6188]},”properties”:{“code”:”SFO”,”name”:”San Francisco International”,”city”:”San Francisco”,”state”:”CA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-71.0052,42.3643]},”properties”:{“code”:”BOS”,”name”:”Boston Logan International”,”city”:”Boston”,”state”:”MA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-80.9431,35.214]},”properties”:{“code”:”CLT”,”name”:”Charlotte Douglas International”,”city”:”Charlotte”,”state”:”NC”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-77.0377,38.8521]},”properties”:{“code”:”DCA”,”name”:”Ronald Reagan Washington National”,”city”:”Washington”,”state”:”DC”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-97.038,32.8968]},”properties”:{“code”:”DFW”,”name”:”Dallas/Fort Worth International”,”city”:”Dallas/Fort Worth”,”state”:”TX”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-73.8726,40.7772]},”properties”:{“code”:”LGA”,”name”:”LaGuardia (New York)”,”city”:”New York”,”state”:”NY”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-80.2906,25.7933]},”properties”:{“code”:”MIA”,”name”:”Miami International”,”city”:”Miami”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-87.9048,41.9786]},”properties”:{“code”:”ORD”,”name”:”Chicago O’Hare International”,”city”:”Chicago”,”state”:”IL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-75.2411,39.8719]},”properties”:{“code”:”PHL”,”name”:”Philadelphia International”,”city”:”Philadelphia”,”state”:”PA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-112.0116,33.4343]},”properties”:{“code”:”PHX”,”name”:”Phoenix Sky Harbor International”,”city”:”Phoenix”,”state”:”AZ”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-84.4281,33.6367]},”properties”:{“code”:”ATL”,”name”:”Hartsfield-Jackson Atlanta International”,”city”:”Atlanta”,”state”:”GA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-83.3534,42.2124]},”properties”:{“code”:”DTW”,”name”:”Detroit Metropolitan Wayne County”,”city”:”Detroit”,”state”:”MI”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-93.2218,44.882]},”properties”:{“code”:”MSP”,”name”:”Minneapolis-St. Paul International”,”city”:”Minneapolis”,”state”:”MN”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-111.9778,40.7884]},”properties”:{“code”:”SLC”,”name”:”Salt Lake City International”,”city”:”Salt Lake City”,”state”:”UT”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-84.6678,39.0488]},”properties”:{“code”:”CVG”,”name”:”Cincinnati/Northern Kentucky International”,”city”:”Cincinnati”,”state”:”KY”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-157.9224,21.3187]},”properties”:{“code”:”HNL”,”name”:”Daniel K. Inouye International (Honolulu)”,”city”:”Honolulu”,”state”:”HI”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-81.8547,41.4094]},”properties”:{“code”:”CLE”,”name”:”Cleveland Hopkins International”,”city”:”Cleveland”,”state”:”OH”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-104.6732,39.8617]},”properties”:{“code”:”DEN”,”name”:”Denver International”,”city”:”Denver”,”state”:”CO”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-74.1687,40.6925]},”properties”:{“code”:”EWR”,”name”:”Newark Liberty International”,”city”:”Newark”,”state”:”NJ”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-95.3414,29.9844]},”properties”:{“code”:”IAH”,”name”:”George Bush Intercontinental (Houston)”,”city”:”Houston”,”state”:”TX”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-81.3089,28.4294]},”properties”:{“code”:”MCO”,”name”:”Orlando International”,”city”:”Orlando”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-82.5332,27.9755]},”properties”:{“code”:”TPA”,”name”:”Tampa International”,”city”:”Tampa”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-117.6012,34.056]},”properties”:{“code”:”ONT”,”name”:”Ontario International”,”city”:”Ontario”,”state”:”CA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-115.1522,36.0801]},”properties”:{“code”:”LAS”,”name”:”Harry Reid International (Las Vegas)”,”city”:”Las Vegas”,”state”:”NV”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-76.6683,39.1754]},”properties”:{“code”:”BWI”,”name”:”Baltimore/Washington International Thurgood Marshall”,”city”:”Baltimore”,”state”:”MD”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-96.8518,32.8471]},”properties”:{“code”:”DAL”,”name”:”Dallas Love Field”,”city”:”Dallas”,”state”:”TX”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-95.2789,29.6454]},”properties”:{“code”:”HOU”,”name”:”William P. Hobby (Houston)”,”city”:”Houston”,”state”:”TX”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-87.7524,41.786]},”properties”:{“code”:”MDW”,”name”:”Chicago Midway International”,”city”:”Chicago”,”state”:”IL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-122.2207,37.7213]},”properties”:{“code”:”OAK”,”name”:”Oakland International”,”city”:”Oakland”,”state”:”CA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-80.1527,26.0726]},”properties”:{“code”:”FLL”,”name”:”Fort Lauderdale-Hollywood International”,”city”:”Fort Lauderdale”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-73.7789,40.6398]},”properties”:{“code”:”JFK”,”name”:”John F. Kennedy International (New York)”,”city”:”New York”,”state”:”NY”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-75.1826,39.8744]},”properties”:{“code”:”ACY”,”name”:”Atlantic City International”,”city”:”Atlantic City”,”state”:”NJ”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-147.8564,64.8151]},”properties”:{“code”:”FAI”,”name”:”Fairbanks International Airport”,”city”:”Fairbanks”,”state”:”AK”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-83.7921,39.4279]},”properties”:{“code”:”ILN”,”name”:”Wilmington Air Park”,”city”:”Wilmington”,”state”:”OH”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-85.736,38.1744]},”properties”:{“code”:”SDF”,”name”:”Louisville Muhammad Ali International”,”city”:”Louisville”,”state”:”KY”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-70.2804,41.6693]},”properties”:{“code”:”HYA”,”name”:”Barnstable Municipal Airport”,”city”:”Hyannis”,”state”:”MA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-77.4558,38.9445]},”properties”:{“code”:”IAD”,”name”:”Washington Dulles International”,”city”:”Washington”,”state”:”VA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-86.2944,39.7173]},”properties”:{“code”:”IND”,”name”:”Indianapolis International”,”city”:”Indianapolis”,”state”:”IN”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-117.8682,47.6219]},”properties”:{“code”:”GEG”,”name”:”Spokane International”,”city”:”Spokane”,”state”:”WA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-122.5975,45.5887]},”properties”:{“code”:”MFR”,”name”:”Rogue Valley International-Medford”,”city”:”Medford”,”state”:”OR”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-122.2917,47.9013]},”properties”:{“code”:”PAE”,”name”:”Paine Field (Everett)”,”city”:”Everett”,”state”:”WA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-78.7875,35.8776]},”properties”:{“code”:”RDU”,”name”:”Raleigh-Durham International”,”city”:”Raleigh”,”state”:”NC”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-90.3613,38.7477]},”properties”:{“code”:”STL”,”name”:”St. Louis Lambert International”,”city”:”St. Louis”,”state”:”MO”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-84.2194,39.9024]},”properties”:{“code”:”DAY”,”name”:”Dayton International”,”city”:”Dayton”,”state”:”OH”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-112.6738,33.3077]},”properties”:{“code”:”IWA”,”name”:”Phoenix-Mesa Gateway Airport”,”city”:”Mesa”,”state”:”AZ”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-81.9911,26.9202]},”properties”:{“code”:”PGD”,”name”:”Punta Gorda Airport”,”city”:”Punta Gorda”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-82.6874,27.9102]},”properties”:{“code”:”PIE”,”name”:”St. Pete–Clearwater International Airport”,”city”:”Clearwater”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-111.6654,40.2165]},”properties”:{“code”:”PVU”,”name”:”Provo Municipal Airport”,”city”:”Provo”,”state”:”UT”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-81.2433,28.7776]},”properties”:{“code”:”SFB”,”name”:”Orlando Sanford International Airport”,”city”:”Sanford”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-83.3538,35.8111]},”properties”:{“code”:”TYS”,”name”:”McGhee Tyson Airport”,”city”:”Knoxville”,”state”:”TN”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-86.6782,30.4861]},”properties”:{“code”:”VPS”,”name”:”Destin–Fort Walton Beach Airport”,”city”:”Valparaiso”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-72.6832,41.939]},”properties”:{“code”:”BDL”,”name”:”Bradley International Airport”,”city”:”Windsor Locks”,”state”:”CT”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-106.6092,31.8067]},”properties”:{“code”:”ELP”,”name”:”El Paso International Airport”,”city”:”El Paso”,”state”:”TX”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-72.7756,41.2637]},”properties”:{“code”:”HVN”,”name”:”Tweed-New Haven Regional Airport”,”city”:”New Haven”,”state”:”CT”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-75.4404,39.6787]},”properties”:{“code”:”ILG”,”name”:”Wilmington Airport”,”city”:”Wilmington”,”state”:”DE”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-81.7552,27.9889]},”properties”:{“code”:”LAL”,”name”:”Lakeland Linder International Airport”,”city”:”Lakeland”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-80.6549,32.8986]},”properties”:{“code”:”CHS”,”name”:”Charleston International Airport”,”city”:”Charleston”,”state”:”SC”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-90.0701,29.9934]},”properties”:{“code”:”MSY”,”name”:”Louis Armstrong New Orleans International Airport”,”city”:”New Orleans”,”state”:”LA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-76.2012,36.8946]},”properties”:{“code”:”ORF”,”name”:”Norfolk International Airport”,”city”:”Norfolk”,”state”:”VA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-71.436,41.7249]},”properties”:{“code”:”PVD”,”name”:”Rhode Island T. F. Green International Airport”,”city”:”Warwick”,”state”:”RI”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-82.5541,26.5362]},”properties”:{“code”:”RSW”,”name”:”Southwest Florida International Airport”,”city”:”Fort Myers”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-80.3956,27.5432]},”properties”:{“code”:”VRB”,”name”:”Vero Beach Regional Airport”,”city”:”Vero Beach”,”state”:”FL”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-86.7703,36.1245]},”properties”:{“code”:”BNA”,”name”:”Nashville International Airport”,”city”:”Nashville”,”state”:”TN”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-93.669,41.534]},”properties”:{“code”:”DSM”,”name”:”Des Moines International Airport”,”city”:”Des Moines”,”state”:”IA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-83.1943,42.8808]},”properties”:{“code”:”FNT”,”name”:”Bishop International Airport”,”city”:”Flint”,”state”:”MI”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-85.5228,42.8808]},”properties”:{“code”:”GRR”,”name”:”Gerald R. Ford International Airport”,”city”:”Grand Rapids”,”state”:”MI”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-79.9373,32.8986]},”properties”:{“code”:”SAV”,”name”:”Savannah/Hilton Head International Airport”,”city”:”Savannah”,”state”:”GA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-88.1296,44.2619]},”properties”:{“code”:”ATW”,”name”:”Appleton International Airport”,”city”:”Appleton”,”state”:”WI”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-82.5541,35.8111]},”properties”:{“code”:”AVL”,”name”:”Asheville Regional Airport”,”city”:”Asheville”,”state”:”NC”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-122.5975,48.7928]},”properties”:{“code”:”BLI”,”name”:”Bellingham International Airport”,”city”:”Bellingham”,”state”:”WA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-75.4404,40.6521]},”properties”:{“code”:”ABE”,”name”:”Lehigh Valley International Airport”,”city”:”Allentown”,”state”:”PA”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[144.73,13.483]},”properties”:{“code”:”GUM”,”name”:”Antonio B. Won Pat International Airport”,”city”:”Tamuning”,”state”:”GU”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-89.9767,35.0424]},”properties”:{“code”:”MEM”,”name”:”Memphis International Airport”,”city”:”Memphis”,”state”:”TN”}},
{“type”:”Feature”,”geometry”:{“type”:”Point”,”coordinates”:[-116.2229,43.5644]},”properties”:{“code”:”BOI”,”name”:”Boise Airport”,”city”:”Boise”,”state”:”ID”}}
]
}
let linkData = [];
let domicileData = {};
let airportInfo = {};
let stateSet = new Set();
const geojson = JSON.parse(document.getElementById(‘mapData’).textContent);
document.addEventListener(‘DOMContentLoaded’, () => {
geojson.features.forEach(f => {
const p = f.properties;
airportInfo[p.code] = { name: p.name, city: p.city || ”, state: p.state || ” };
if (p.state) stateSet.add(p.state);
});
const rawText = document.getElementById(‘rawData’).textContent.trim();
parseRawData(rawText);
renderAccordion();
buildDomicileData();
initMap();
buildFilters();
applyFilters();
document.getElementById(‘clearSearch’).addEventListener(‘click’, () => {
document.getElementById(‘searchInput’).value = ”;
searchLinks();
});
// Individual group All / None
document.querySelectorAll(‘.select-all-btn’).forEach(btn => {
btn.addEventListener(‘click’, function(e) {
e.preventDefault();
const group = this.dataset.group;
const action = this.dataset.action;
const selector = group === ‘category’ ? ‘#categoryFilters input’ :
group === ‘airline’ ? ‘#airlineFilters input’ :
group === ‘domicile’ ? ‘#domicileFilters input’ :
‘#stateFilters input’;
document.querySelectorAll(selector).forEach(cb => cb.checked = (action === ‘select’));
applyFilters();
});
});
// Global All / None
document.getElementById(‘globalSelectAll’).addEventListener(‘click’, e => {
e.preventDefault();
document.querySelectorAll(‘.form-check-input’).forEach(cb => cb.checked = true);
applyFilters();
});
document.getElementById(‘globalDeselectAll’).addEventListener(‘click’, e => {
e.preventDefault();
document.querySelectorAll(‘.form-check-input’).forEach(cb => cb.checked = false);
applyFilters();
});
});
function parseRawData(text) {
const lines = text.split(‘\n’).map(l => l.trim()).filter(l => l);
let current = null;
linkData = [];
lines.forEach(line => {
if (line.startsWith(‘# ‘)) {
const cat = line.slice(2).trim();
if (cat) current = { category: cat, links: [] };
linkData.push(current);
} else if (line.includes(‘|’) && current) {
const parts = line.split(‘|’).map(s => s.trim());
const name = parts[0];
const url = parts[1] || ‘#’;
const domiciles = parts[2] ? parts[2].split(‘,’).map(c => c.trim()).filter(c => c) : [];
current.links.push({ name, url, domiciles });
}
});
}
function buildDomicileData() {
linkData.forEach(cat => {
const category = cat.category;
cat.links.forEach(link => {
link.domiciles.forEach(code => {
if (!domicileData) domicileData = { airlines: [], categories: [], urls: {} };
domicileData.airlines.push(link.name);
domicileData.urls[link.name] = link.url;
if (!domicileData.categories.includes(category)) domicileData.categories.push(category);
});
});
});
Object.keys(domicileData).forEach(code => domicileData.airlines.sort());
}
function renderAccordion() {
const container = document.getElementById(‘accordionLinks’);
container.innerHTML = ”;
linkData.forEach((cat, index) => {
const collapsed = index > 0 ? ‘collapsed’ : ”;
const show = index === 0 ? ‘show’ : ”;
const item = document.createElement(‘div’);
item.className = ‘accordion-item’;
item.innerHTML = `
`;
container.appendChild(item);
const body = item.querySelector(‘.accordion-body’);
cat.links.forEach(l => {
const a = document.createElement(‘a’);
a.href = l.url;
if (l.url !== ‘#’) a.target = ‘_blank’;
a.className = ‘btn btn-custom’;
a.textContent = l.name;
body.appendChild(a);
});
});
}
let map;
let clusterGroup = L.markerClusterGroup();
function initMap() {
map = L.map(‘map’).setView([39.8, -98.5], 4);
L.tileLayer(‘https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png’, {
attribution: ‘© OpenStreetMap contributors’
}).addTo(map);
clusterGroup.addTo(map);
}
// Airplane SVG (Bootstrap Icons – open source)
const airplaneSvg = “;
const categoryColors = {
“Legacy Carriers “: “#0066cc”,
“Major / National / Low Cost Carriers (LCC)”: “#cc0000”,
“Cargo Airlines”: “#ff8800”,
“Regional Airlines”: “#9900cc”
};
function getAirplaneIcon(primaryCategory) {
const color = categoryColors[primaryCategory] || “#808080”;
const svg = airplaneSvg.replace(“%color”, color.replace(“#”,”%23″));
const iconUrl = ‘data:image/svg+xml,’ + svg;
return L.icon({
iconUrl: iconUrl,
iconSize: [32, 32],
iconAnchor: [16, 16],
popupAnchor: [0, -16]
});
}
function buildMarkers() {
clusterGroup.clearLayers();
const selectedCategories = Array.from(document.querySelectorAll(‘#categoryFilters input:checked’)).map(cb => cb.value);
const selectedAirlines = Array.from(document.querySelectorAll(‘#airlineFilters input:checked’)).map(cb => cb.value);
const selectedDomiciles = Array.from(document.querySelectorAll(‘#domicileFilters input:checked’)).map(cb => cb.value);
const selectedStates = Array.from(document.querySelectorAll(‘#stateFilters input:checked’)).map(cb => cb.value);
geojson.features.forEach(feature => {
const code = feature.properties.code;
if (!domicileData) return;
const dom = domicileData;
const airportState = airportInfo?.state || ”;
const matchesCategory = selectedCategories.length === 0 || dom.categories.some(c => selectedCategories.includes(c));
const matchesAirline = selectedAirlines.length === 0 || dom.airlines.some(a => selectedAirlines.includes(a));
const matchesDomicile = selectedDomiciles.length === 0 || selectedDomiciles.includes(code);
const matchesState = selectedStates.length === 0 || selectedStates.includes(airportState);
if (matchesCategory && matchesAirline && matchesDomicile && matchesState) {
const primaryCategory = dom.categories[0];
const marker = L.marker([feature.geometry.coordinates[1], feature.geometry.coordinates[0]], {
icon: getAirplaneIcon(primaryCategory)
});
let popupContent = `${code} – ${feature.properties.name}
`;
const grouped = {};
dom.categories.forEach(cat => grouped[cat] = []);
dom.airlines.forEach(airline => {
for (const catObj of linkData) {
if (catObj.links.some(l => l.name === airline)) {
grouped[catObj.category].push(`${airline}`);
break;
}
}
});
popupContent += Object.keys(grouped).sort().map(cat => `${cat}:
${grouped[cat].join(‘
‘) || ‘None’}
`).join(”);
marker.bindPopup(popupContent);
clusterGroup.addLayer(marker);
}
});
}
function buildFilters() {
const categories = linkData.map(c => c.category);
const allAirlines = linkData.flatMap(c => c.links.map(l => ({name: l.name, url: l.url, category: c.category})));
const allDomiciles = Object.keys(domicileData).sort();
const catDiv = document.getElementById(‘categoryFilters’);
categories.forEach(cat => {
catDiv.innerHTML += `
`;
});
const airlineDiv = document.getElementById(‘airlineFilters’);
let currentCategory = ”;
allAirlines.forEach(airline => {
if (airline.category !== currentCategory) {
if (currentCategory !== ”) airlineDiv.innerHTML += ‘
‘;
airlineDiv.innerHTML += `
`;
currentCategory = airline.category;
}
const safeId = airline.name.replace(/[^a-z0-9]/gi,”);
airlineDiv.innerHTML += `
`;
});
const domDiv = document.getElementById(‘domicileFilters’);
allDomiciles.forEach(code => {
const info = airportInfo || { name: code, city: ”, state: ” };
const tooltip = `${info.name} (${info.city ? info.city + ‘, ‘ : ”}${info.state})`;
domDiv.innerHTML += `
${code}
`;
});
const stateDiv = document.getElementById(‘stateFilters’);
Array.from(stateSet).sort().forEach(state => {
stateDiv.innerHTML += `
`;
});
document.querySelectorAll(‘.form-check-input’).forEach(cb => cb.addEventListener(‘change’, applyFilters));
}
function applyFilters() {
buildMarkers();
}
function searchLinks() {
const query = document.getElementById(‘searchInput’).value.toLowerCase();
document.querySelectorAll(‘.btn-custom’).forEach(btn => {
btn.style.display = btn.textContent.toLowerCase().includes(query) ? ‘inline-block’ : ‘none’;
});
document.querySelectorAll(‘.accordion-item’).forEach(item => {
const visible = item.querySelectorAll(‘.btn-custom[style*=”inline-block”]’).length > 0;
item.style.display = visible ? ‘block’ : ‘none’;
});
}
document.getElementById(‘searchInput’).addEventListener(‘input’, searchLinks);