(function () {
function parseFlights(xmlText) {
var xml = new window.DOMParser().parseFromString(xmlText, 'application/xml');
var flights = [];
xml.querySelectorAll('Flight').forEach(function (node) {
function text(tag) {
var el = node.querySelector(tag);
return el ? el.textContent : '';
}
flights.push({
flightNumber: text('FlightNumber'),
scheduledTime: text('ScheduledTime'),
currentTime: text('CurrentTime'),
delayed: text('Delayed') === 'True',
early: text('Early') === 'True'
});
});
return flights;
}
function remarkColor(flight) {
if (flight.delayed) return 'rgb(222, 38, 38)';
if (flight.early) return 'rgb(0,128,0)';
return null;
}
function refreshRows(rowClass, flights) {
document.querySelectorAll('.x-grid.' + rowClass).forEach(function (row) {
var cells = row.querySelectorAll('.x-cell');
if (cells.length < 4) return;
var flightNumberEl = cells[1].querySelector('.x-text-content-text-primary');
if (!flightNumberEl) return;
var flightNumber = flightNumberEl.textContent.trim();
var flight = flights.find(function (f) { return f.flightNumber === flightNumber; });
if (!flight) return;
var statusCell = cells[3];
var timeEl = statusCell.querySelector('.x-text-content-text-primary');
if (timeEl) timeEl.textContent = flight.scheduledTime;
var subEl = statusCell.querySelector('.x-text-content-text-subheadline');
if (subEl) {
var color = remarkColor(flight);
if (color) {
subEl.innerHTML = ' Now ' + flight.currentTime + '';
} else {
subEl.textContent = '';
}
}
});
}
function refreshArrivalsDepartures() {
var bust = Date.now();
Promise.all([
fetch('https://flight-feed.bdl.aocadp.com/v1/flights?config=webSiteAllArrivals&_=' + bust, { cache: 'no-store' }).then(function (r) { return r.text(); }),
fetch('https://flight-feed.bdl.aocadp.com/v1/flights?config=webSiteAllDepartures&_=' + bust, { cache: 'no-store' }).then(function (r) { return r.text(); })
]).then(function (results) {
refreshRows('arrivalrows', parseFlights(results[0]));
refreshRows('departurerows', parseFlights(results[1]));
}).catch(function (err) {
console.error('Arrivals/Departures refresh failed', err);
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', refreshArrivalsDepartures);
} else {
refreshArrivalsDepartures();
}
})();
(function () {
function statusColor(status) {
return status === 'Open' ? 'rgb(0,128,0)' : 'rgb(222, 38, 38)';
}
function refreshLotBadges(rows) {
var grids = document.querySelectorAll('.x-grid.e18438-e26');
grids.forEach(function (grid) {
var labelEl = grid.querySelector('.parklink');
if (!labelEl) return;
var label = labelEl.textContent.trim();
var row = rows.find(function (r) { return r.label === label; });
if (!row) return;
var cells = grid.querySelectorAll('.x-cell');
if (cells.length < 2) return;
var badge = cells[1].querySelector('div[style*="background-color"]');
if (!badge) return;
badge.textContent = row.status;
badge.style.backgroundColor = statusColor(row.status);
});
}
function refreshGarage(counts) {
var pct = Math.round((counts.occupied / counts.total) * 100);
var label = document.querySelector('.e18438-e25 h1');
if (label) label.textContent = pct + '% FULL';
var canvas = document.getElementById('e18438-e19');
if (canvas && window.Chart && typeof Chart.getChart === 'function') {
var chart = Chart.getChart(canvas);
if (chart && chart.data && chart.data.datasets && chart.data.datasets[0]) {
chart.data.datasets[0].data[0] = pct;
chart.update();
}
}
}
function refreshParkingWidget() {
var bust = Date.now();
Promise.all([
fetch('/wp-content/uploads/bdl_hangar.json?_=' + bust, { cache: 'no-store' }).then(function (r) { return r.json(); }),
fetch('/wp-content/uploads/bdl_parkassist_status.json?_=' + bust, { cache: 'no-store' }).then(function (r) { return r.json(); })
]).then(function (results) {
refreshLotBadges(results[0].rows);
refreshGarage(results[1].counts);
}).catch(function (err) {
console.error('Parking widget refresh failed', err);
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', refreshParkingWidget);
} else {
refreshParkingWidget();
}
})();