/** * Find Training Filters * * Handles filtering, searching, and geolocation functionality * for the Find Training page. * * @package HVAC_Community_Events * @since 2.2.0 */ (function($) { 'use strict'; // Namespace for filters module window.HVACTrainingFilters = { // Debounce timer for search searchTimer: null, // Current AJAX request (for aborting) currentRequest: null, // Active filters activeFilters: { state: '', certification: '', training_format: '', search: '' }, // User location (if obtained) userLocation: null, /** * Initialize filters */ init: function() { this.bindEvents(); }, /** * Bind event handlers */ bindEvents: function() { const self = this; // Search input with debounce $('#hvac-training-search').on('input', function() { clearTimeout(self.searchTimer); const value = $(this).val(); self.searchTimer = setTimeout(function() { self.activeFilters.search = value; self.applyFilters(); }, 300); }); // State filter $('#hvac-filter-state').on('change', function() { self.activeFilters.state = $(this).val(); self.applyFilters(); self.updateActiveFiltersDisplay(); }); // Certification filter $('#hvac-filter-certification').on('change', function() { self.activeFilters.certification = $(this).val(); self.applyFilters(); self.updateActiveFiltersDisplay(); }); // Training format filter $('#hvac-filter-format').on('change', function() { self.activeFilters.training_format = $(this).val(); self.applyFilters(); self.updateActiveFiltersDisplay(); }); // Near Me button $('#hvac-near-me-btn').on('click', function() { self.handleNearMeClick($(this)); }); // Clear all filters $('.hvac-clear-filters').on('click', function() { self.clearAllFilters(); }); // Remove individual filter $(document).on('click', '.hvac-active-filter button', function() { const filterType = $(this).parent().data('filter'); self.removeFilter(filterType); }); }, /** * Apply current filters */ applyFilters: function() { const self = this; // Abort any pending request to prevent race conditions if (this.currentRequest && this.currentRequest.readyState !== 4) { this.currentRequest.abort(); } // Build filter data const filterData = { action: 'hvac_filter_training_map', nonce: hvacFindTraining.nonce, state: this.activeFilters.state, certification: this.activeFilters.certification, training_format: this.activeFilters.training_format, search: this.activeFilters.search, show_trainers: $('#hvac-show-trainers').is(':checked'), show_venues: $('#hvac-show-venues').is(':checked') }; // Add user location if available if (this.userLocation) { filterData.lat = this.userLocation.lat; filterData.lng = this.userLocation.lng; filterData.radius = 100; // km } // Send filter request and store reference this.currentRequest = $.ajax({ url: hvacFindTraining.ajax_url, type: 'POST', data: filterData, success: function(response) { if (response.success) { // Update map data HVACTrainingMap.trainers = response.data.trainers || []; HVACTrainingMap.venues = response.data.venues || []; HVACTrainingMap.updateMarkers(); HVACTrainingMap.updateCounts( response.data.total_trainers, response.data.total_venues ); HVACTrainingMap.updateTrainerGrid(); } }, complete: function() { self.currentRequest = null; } }); // Show/hide clear button this.updateClearButtonVisibility(); }, /** * Handle Near Me button click */ handleNearMeClick: function($button) { const self = this; // Show loading state $button.prop('disabled', true); $button.html(' Locating...'); // Clear any previous error message this.clearLocationError(); // Get user location HVACTrainingMap.getUserLocation(function(location, error) { if (location) { self.userLocation = location; // Center map on user location HVACTrainingMap.centerOnLocation(location.lat, location.lng, 9); // Apply filters with location self.applyFilters(); // Update button state $button.html(' Near Me'); $button.addClass('active'); // Add to active filters display self.addActiveFilter('location', 'Near Me'); } else { // Show inline error instead of alert self.showLocationError(error || 'Unable to get your location. Please check browser permissions.'); // Reset button $button.html(' Near Me'); $button.prop('disabled', false); } }); }, /** * Show location error message inline */ showLocationError: function(message) { // Remove any existing error this.clearLocationError(); // Create error element const $error = $('