// Main Application Script // Handles UI interactions and form submission document.addEventListener('DOMContentLoaded', function() { initializeApp(); }); function initializeApp() { // Populate city datalist populateCityList(); // Set up form event listeners setupFormListeners(); // Set minimum date to today const today = new Date().toISOString().split('T')[0]; document.getElementById('departureDate').setAttribute('min', today); document.getElementById('returnDate').setAttribute('min', today); console.log('Government Travel Cost Estimator initialized'); console.log(`Loaded ${CITIES.length} Canadian cities`); } function populateCityList() { const datalist = document.getElementById('cityList'); CITIES.forEach(city => { const option = document.createElement('option'); option.value = city.name; option.textContent = `${city.name}, ${city.province}`; datalist.appendChild(option); }); } function setupFormListeners() { const form = document.getElementById('travelForm'); const privateAccomCheckbox = document.getElementById('privateAccommodation'); const departureCityInput = document.getElementById('departureCity'); const destinationCityInput = document.getElementById('destinationCity'); const departureDateInput = document.getElementById('departureDate'); const returnDateInput = document.getElementById('returnDate'); // Form submission form.addEventListener('submit', handleFormSubmit); // Private accommodation toggle privateAccomCheckbox.addEventListener('change', function() { const details = document.getElementById('privateAccommodationDetails'); details.style.display = this.checked ? 'block' : 'none'; }); // City validation departureCityInput.addEventListener('blur', function() { validateCityInput(this, 'departureCityError'); }); destinationCityInput.addEventListener('blur', function() { validateCityInput(this, 'destinationCityError'); }); // Date validation departureDateInput.addEventListener('change', function() { if (returnDateInput.value) { validateDateRange(); } }); returnDateInput.addEventListener('change', function() { if (departureDateInput.value) { validateDateRange(); } }); } function validateCityInput(input, errorId) { const errorSpan = document.getElementById(errorId); const cityName = input.value.trim(); if (!cityName) { errorSpan.textContent = ''; return true; } if (!validateCity(cityName)) { errorSpan.textContent = `"${cityName}" is not in our database. Please select a valid Canadian city.`; input.setCustomValidity('Invalid city'); return false; } errorSpan.textContent = ''; input.setCustomValidity(''); return true; } function validateDateRange() { const departureDateInput = document.getElementById('departureDate'); const returnDateInput = document.getElementById('returnDate'); const validation = validateDates(departureDateInput.value, returnDateInput.value); if (!validation.valid) { returnDateInput.setCustomValidity(validation.error); alert(validation.error); return false; } returnDateInput.setCustomValidity(''); return true; } async function handleFormSubmit(event) { event.preventDefault(); // Clear previous results and errors document.getElementById('results').style.display = 'none'; document.getElementById('error').style.display = 'none'; // Get form values const departureCity = document.getElementById('departureCity').value.trim(); const destinationCity = document.getElementById('destinationCity').value.trim(); const departureDate = document.getElementById('departureDate').value; const returnDate = document.getElementById('returnDate').value; const currency = document.getElementById('currency').value; const privateAccommodation = document.getElementById('privateAccommodation').checked; const privateAccommodationRate = parseFloat(document.getElementById('privateAccommodationRate').value) || null; const searchFlightsOption = document.getElementById('searchFlights').checked; // Validate cities if (!validateCityInput(document.getElementById('departureCity'), 'departureCityError') || !validateCityInput(document.getElementById('destinationCity'), 'destinationCityError')) { return; } // Validate dates if (!validateDateRange()) { return; } try { // Show loading state showLoading(); // Calculate costs const results = await calculateTravelCosts({ departureCity, destinationCity, departureDate, returnDate, currency, privateAccommodation, privateAccommodationRate, searchFlights: searchFlightsOption }); // Display results displayResults(results); // Store results for export window.lastCalculation = results; } catch (error) { console.error('Calculation error:', error); showError(error.message); } finally { hideLoading(); } } function showLoading() { const submitBtn = document.querySelector('button[type="submit"]'); submitBtn.disabled = true; submitBtn.textContent = 'Calculating...'; } function hideLoading() { const submitBtn = document.querySelector('button[type="submit"]'); submitBtn.disabled = false; submitBtn.textContent = 'Calculate Travel Costs'; } function displayResults(results) { const resultsDiv = document.getElementById('results'); const { tripDetails, costs, totals } = results; // Accommodation section const accommodationDetails = document.getElementById('accommodationDetails'); accommodationDetails.innerHTML = `
${flight.note}
`; } else { document.getElementById('flightInfo').style.display = 'none'; } // Currency conversion info if (totals.conversion) { const currencyInfo = document.getElementById('currencyInfo'); const currencyDetails = document.getElementById('currencyDetails'); currencyInfo.style.display = 'block'; currencyDetails.innerHTML = `