jQuery(document).ready(function ($) {
// Use event delegation to handle AJAX-loaded or dynamically rendered forms
$(document).on('blur', '.zip-lookup input', function () {
lookupZip($(this));
});
$(document).on('keydown', '.zip-lookup input', function (e) {
if (e.key === 'Enter') {
e.preventDefault();
lookupZip($(this));
}
});
function lookupZip($zipInput) {
var zip = $.trim($zipInput.val());
// Only lookup valid 5-digit US ZIP codes
if (!/^\d{5}$/.test(zip)) {
return;
}
// Find the matching City and State fields relative to the form container
var $form = $zipInput.closest('form');
var cityField = $form.find('.zip-city input');
var stateField = $form.find('.zip-state select');
// Fallback to global search if elements aren't found within a form wrapper
if (cityField.length === 0) cityField = $('.zip-city input');
if (stateField.length === 0) stateField = $('.zip-state select');
$.getJSON('https://api.zippopotam.us/us/' + zip)
.done(function (data) {
if (data.places && data.places.length > 0) {
var place = data.places[0];
var city = place['place name'];
var state = place['state abbreviation']; // e.g., "CA"
// Populate City
cityField.val(city).trigger('input').trigger('change');
// Populate State and trigger change for both standard and Select2 dropdowns
stateField.val(state).trigger('change');
if (stateField.hasClass('select2-hidden-accessible')) {
stateField.trigger('change.select2');
}
} else {
clearFields(cityField, stateField);
}
})
.fail(function () {
console.log('ZIP code lookup failed.');
clearFields(cityField, stateField);
});
}
function clearFields(cityField, stateField) {
cityField.val('').trigger('input').trigger('change');
stateField.val('').trigger('change');
if (stateField.hasClass('select2-hidden-accessible')) {
stateField.trigger('change.select2');
}
}
});