{"version":3,"sources":["webpack:///./assets/src/js/parts/search.js"],"names":["$","document","ready","translationData","dr","js_data","translation_data","JSON","parse","message","resource_found","resources_found","e","searchForm","hitsContainer","paginationContainer","statsContainer","featuredContainer","skeletonContainer","length","addClass","perfMetrics","initialPageLoad","filterSearch","paginationSearch","lastSearchStart","isInitialLoad","initialUrlParams","URLSearchParams","window","location","search","hasInitialFilters","forEach","value","key","startsWith","removeClass","find","refinementsContainer","before","empty","hide","statsHtml","total","data","replace","html","concat","off","currentState","query","page","filters","loading","initialLoadComplete","abortController","isPaginationClick","on","preventDefault","filterType","this","filterValue","closest","updateRefinementTags","updateAvailableFilters","performSearch","resultsCache","getCacheKey","stringify","q","p","f","urlParams","parseInt","get","searchQuery","val","filterName","values","split","trimmedVal","trim","checkbox","prop","includes","push","match","algoliaFilterName","decodeURIComponent","foundCheckbox","matchedCheckboxElement","correctValueForFilter","each","labelElement","labelText","text","checkboxValue","toLowerCase","Object","keys","initializeFromURL","filterParts","attr","isChecked","is","index","indexOf","splice","searchTimer","_currentState$abortCo","arguments","undefined","abort","performance","now","controller","AbortController","postType","cacheKey","processResults","drAjax","ajaxurl","remove","formData","FormData","append","nonce","fetch","method","body","credentials","signal","then","response","ok","Error","json","success","error","name","duration","current_page","updateStats","updateURLParameters","animate","scrollTop","offset","top","setTimeout","toggleFeaturedPosts","some","Array","isArray","pages","updatePagination","hasActiveFilters","entries","_ref","_ref2","_slicedToArray","filterKey","_toConsumableArray","Set","filterLabel","tabLink","filterInput","textNode","firstChild","nodeType","nodeValue","show","stopPropagation","filter","tabListItem","hasClass","tabList","removeData","hasFeaturedPosts","trigger","currentPage","totalPages","totalPosts","startPage","Math","max","endPage","min","i","params","_ref3","_ref4","uniqueValues","join","newURL","pathname","toString","history","pushState","visibilitySnapshot","$item","filterData","previousVisibility","filterGroup","terms","serverValues","map","term","$checkbox","has","countEl","count","stillHidden","processFilterResults","stats","getElementById","dataset","innerHTML","clearTimeout","keyCode","initSearch"],"mappings":"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","file":"main/parts/search-f6025e1b.js","sourcesContent":["import $ from \"jquery\";\n\nexport default function () {\n\t// Initialize search when document is ready\n\t$(document).ready(function () {\n\t\tinitSearch();\n\t});\n\n\t/**\n\t * Initialize search functionality\n\t */\n\tfunction initSearch() {\n\t\t// Parse translation data passed from PHP\n\t\tlet translationData = {};\n\t\ttry {\n\t\t\t// Check if translation_data exists and is a non-empty string\n\t\t\tif (dr && dr.js_data && dr.js_data.translation_data && typeof dr.js_data.translation_data === \"string\") {\n\t\t\t\ttranslationData = JSON.parse(dr.js_data.translation_data);\n\t\t\t} else {\n\t\t\t\t// Provide fallback default strings if parsing fails or data is missing\n\t\t\t\ttranslationData = {\n\t\t\t\t\tmessage: {\n\t\t\t\t\t\tresource_found: \"1 resource found\",\n\t\t\t\t\t\tresources_found: \"%d resources found\",\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Provide fallback default strings on error\n\t\t\ttranslationData = {\n\t\t\t\tmessage: {\n\t\t\t\t\tresource_found: \"1 resource found\",\n\t\t\t\t\tresources_found: \"%d resources found\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst searchForm = $(\"#search-results\");\n\t\tconst hitsContainer = $(\"#hits\");\n\t\tconst paginationContainer = $(\"#pagination\");\n\t\tconst statsContainer = $(\"#stats\");\n\t\tconst currentRefinementsContainer = $(\".ais-CurrentRefinements\");\n\t\tconst featuredContainer = $(\".resourceArchive\");\n\t\tconst skeletonContainer = $(\"#hits_skeleton\");\n\n\t\t// Initially hide hits and show skeleton\n\t\tif (hitsContainer.length && skeletonContainer.length) {\n\t\t\thitsContainer.addClass(\"uk-hidden\");\n\t\t\tskeletonContainer.addClass(\"uk-visible\");\n\t\t}\n\n\t\t// Add performance tracking variables\n\t\tlet perfMetrics = {\n\t\t\tinitialPageLoad: 0,\n\t\t\tfilterSearch: 0,\n\t\t\tpaginationSearch: 0,\n\t\t\tlastSearchStart: 0,\n\t\t\tisInitialLoad: true,\n\t\t};\n\n\t\t// Immediately hide featured container if any filters (standard or Algolia) are present in the URL\n\t\t// Featured container is hidden by default in Twig.\n\t\t// Show it only if NO filters are present in the URL initially.\n\t\tconst initialUrlParams = new URLSearchParams(window.location.search);\n\t\tlet hasInitialFilters = false;\n\t\tlet hasAlgoliaFilters = false; // Flag specifically for Algolia params\n\t\tinitialUrlParams.forEach((value, key) => {\n\t\t\tif (key.startsWith(\"filter_\") || key.startsWith(\"refinementList\")) {\n\t\t\t\tif (value) {\n\t\t\t\t\t// Ensure the filter has a non-empty value\n\t\t\t\t\thasInitialFilters = true;\n\t\t\t\t\tif (key.startsWith(\"refinementList\")) {\n\t\t\t\t\t\thasAlgoliaFilters = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tif (!hasInitialFilters && featuredContainer.length) {\n\t\t\t// Only remove uk-hidden if no filters were found\n\t\t\tfeaturedContainer.removeClass(\"uk-hidden\");\n\t\t}\n\n\t\t// Initial check for featured container - add uk-hidden class if it has no slides\n\t\tif (featuredContainer.length && featuredContainer.find(\".swiper-slide\").length === 0) {\n\t\t\tfeaturedContainer.addClass(\"uk-hidden\");\n\t\t}\n\n\t\t// Ensure refinements container exists\n\t\tlet refinementsContainer = $(\".ais-CurrentRefinements\");\n\t\tif (!refinementsContainer.length) {\n\t\t\t// If container doesn't exist, create it just before the hits container\n\t\t\thitsContainer.before('
');\n\t\t\trefinementsContainer = $(\".ais-CurrentRefinements\");\n\t\t}\n\n\t\t// Clear any existing content in the refinements container to start fresh\n\t\trefinementsContainer.empty().hide();\n\n\t\t// Initialize stats container using translations\n\t\tif (statsContainer.length) {\n\t\t\tconst total = statsContainer.data(\"total\") || 0;\n\t\t\tlet statsHtml;\n\t\t\tif (total === 1) {\n\t\t\t\t// Use resource_found, no need to replace %d as it's hardcoded '1' in the string\n\t\t\t\tstatsHtml = translationData.message.resource_found || \"1 resource found\";\n\t\t\t} else {\n\t\t\t\t// Use resources_found, replace %d with total\n\t\t\t\tstatsHtml = (translationData.message.resources_found || \"%d resources found\").replace(\"%d\", total);\n\t\t\t}\n\t\t\tstatsContainer.html(`
${statsHtml}
`);\n\t\t\tstatsContainer.data(\"total\", total); // Ensure data attribute is set\n\t\t}\n\n\t\t// If search form not present, return\n\t\tif (!searchForm.length) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove all existing document events to prevent duplication\n\t\t$(document).off(\"click\", \".filter-tag\");\n\t\t$(document).off(\"click\", \".ais-ClearRefinements-button\");\n\t\t$(document).off(\"click\", \".pagination-link\");\n\t\t$(document).off(\"click\", \".tab-filter\");\n\n\t\t// Save current search state\n\t\tlet currentState = {\n\t\t\tquery: \"\",\n\t\t\tpage: 1,\n\t\t\tfilters: {},\n\t\t\tloading: false,\n\t\t\tinitialLoadComplete: false,\n\t\t\tabortController: null, // Added for aborting fetch requests\n\t\t\tisPaginationClick: false, // Flag for pagination clicks\n\t\t};\n\n\t\t// Handle tabs filter clicks (for partner_type and other tab filters)\n\t\t$(document).on(\"click\", \".tab-filter\", function (e) {\n\t\t\te.preventDefault();\n\n\t\t\tconst filterType = $(this).data(\"filter-type\");\n\t\t\tconst filterValue = $(this).data(\"filter-value\");\n\n\t\t\t// Clear any existing values for this filter type\n\t\t\tdelete currentState.filters[filterType];\n\n\t\t\t// Add the new value\n\t\t\tif (filterValue) {\n\t\t\t\tcurrentState.filters[filterType] = [filterValue];\n\t\t\t}\n\n\t\t\t// Update active tab class\n\t\t\t$(this).closest(\"ul\").find(\"li\").removeClass(\"uk-active\");\n\t\t\t$(this).closest(\"li\").addClass(\"uk-active\");\n\n\t\t\t// Update refinement tags\n\t\t\tupdateRefinementTags(currentState.filters);\n\n\t\t\t// Reset to page 1 when filters change\n\t\t\tcurrentState.page = 1;\n\n\t\t\t// Update available filters and perform search\n\t\t\tupdateAvailableFilters(currentState.filters);\n\t\t\tperformSearch(1);\n\t\t});\n\n\t\t// Setup results cache to avoid unnecessary requests\n\t\tconst resultsCache = {};\n\n\t\t// Function to get cache key based on search parameters\n\t\tfunction getCacheKey(query, page, filters) {\n\t\t\treturn JSON.stringify({\n\t\t\t\tq: query,\n\t\t\t\tp: page,\n\t\t\t\tf: filters,\n\t\t\t});\n\t\t}\n\n\t\t// First initialize from URL parameters\n\t\tinitializeFromURL();\n\n\t\t// Then perform an initial search to load results\n\t\tperformSearch(currentState.page);\n\n\t\t// Attach event handlers to the search form and buttons\n\t\tfunction setupFormHandlers() {\n\t\t\t// Optimize checkbox handling with direct binding\n\t\t\tsearchForm.find('input[type=\"checkbox\"]').on(\"change\", function () {\n\t\t\t\t// Get the filter type and value\n\t\t\t\tconst filterParts = $(this)\n\t\t\t\t\t.attr(\"name\")\n\t\t\t\t\t.match(/filters\\[(.*?)\\]/);\n\t\t\t\tif (!filterParts) return;\n\n\t\t\t\tconst filterType = filterParts[1];\n\t\t\t\tconst filterValue = $(this).val();\n\t\t\t\tconst isChecked = $(this).is(\":checked\");\n\n\t\t\t\t// Initialize array if it doesn't exist\n\t\t\t\tif (!currentState.filters[filterType]) {\n\t\t\t\t\tcurrentState.filters[filterType] = [];\n\t\t\t\t}\n\n\t\t\t\t// Add or remove the filter\n\t\t\t\tif (isChecked) {\n\t\t\t\t\t// Add selection class to the list item for visual indicator\n\t\t\t\t\t$(this).closest(\"li.ais-RefinementList-item\").addClass(\"ais-RefinementList-item--selected\");\n\n\t\t\t\t\t// Add value to filters if not already present\n\t\t\t\t\tif (!currentState.filters[filterType].includes(filterValue)) {\n\t\t\t\t\t\tcurrentState.filters[filterType].push(filterValue);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Remove selection class from the list item\n\t\t\t\t\t$(this).closest(\"li.ais-RefinementList-item\").removeClass(\"ais-RefinementList-item--selected\");\n\n\t\t\t\t\t// Remove value from filters\n\t\t\t\t\tconst index = currentState.filters[filterType].indexOf(filterValue);\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tcurrentState.filters[filterType].splice(index, 1);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove the filter type entirely if no values remain\n\t\t\t\t\tif (currentState.filters[filterType].length === 0) {\n\t\t\t\t\t\tdelete currentState.filters[filterType];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update tabs UI if the filter type has tabs\n\t\t\t\tif (filterType === \"partner_type\") {\n\t\t\t\t\t$(\"#partner_type-tabs-list li\").removeClass(\"uk-active\");\n\t\t\t\t\tif (currentState.filters[filterType] && currentState.filters[filterType].length > 0) {\n\t\t\t\t\t\t$(`#partner_type-tabs-list a[data-filter-value=\"${filterValue}\"]`).closest(\"li\").addClass(\"uk-active\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If no filter selected, make \"All\" active\n\t\t\t\t\t\t$(\"#partner_type-tabs-list li:first-child\").addClass(\"uk-active\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// CRUCIAL: Always update the tags display immediately for better user experience\n\t\t\t\t// This must be called before performSearch to ensure visibility on first selection\n\t\t\t\tupdateRefinementTags(currentState.filters);\n\n\t\t\t\t// Reset to page 1 when filters change\n\t\t\t\tcurrentState.page = 1;\n\n\t\t\t\t// Update available filters based on the new filter state\n\t\t\t\tupdateAvailableFilters(currentState.filters);\n\n\t\t\t\t// Show loading indicator and run search\n\t\t\t\tperformSearch(1);\n\t\t\t});\n\t\t}\n\n\t\t// Call the setupFormHandlers function to bind events\n\t\tsetupFormHandlers();\n\n\t\t// Handle search input submit\n\t\tsearchForm.on(\"submit\", function (e) {\n\t\t\te.preventDefault();\n\t\t\t// Reset to page 1 for new searches\n\t\t\tcurrentState.page = 1;\n\t\t\tperformSearch(1);\n\t\t});\n\n\t\t// Optimize search input handling with debounce\n\t\t// This prevents excessive searches as the user types\n\t\tlet searchTimer = null;\n\t\tsearchForm.find('input[type=\"text\"]').on(\"keyup\", function (e) {\n\t\t\tclearTimeout(searchTimer);\n\n\t\t\tif (e.keyCode === 13) {\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentState.page = 1;\n\t\t\t\tperformSearch(1);\n\t\t\t} else {\n\t\t\t\t// Wait 500ms after typing stops before searching\n\t\t\t\tsearchTimer = setTimeout(function () {\n\t\t\t\t\tcurrentState.page = 1;\n\t\t\t\t\tperformSearch(1);\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t});\n\n\t\t// Optimize pagination click handling with direct binding rather than delegation\n\t\tfunction setupPaginationHandlers() {\n\t\t\tpaginationContainer\n\t\t\t\t.find(\".pagination-link\")\n\t\t\t\t.off(\"click\")\n\t\t\t\t.on(\"click\", function (e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst page = parseInt($(this).data(\"page\"));\n\n\t\t\t\t\t// Only perform search if page is different\n\t\t\t\t\tif (page !== currentState.page) {\n\t\t\t\t\t\tcurrentState.page = page;\n\t\t\t\t\t\tcurrentState.isPaginationClick = true; // Set flag before search\n\t\t\t\t\t\tperformSearch(page);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Initialize search from URL parameters\n\t\t */\n\t\tfunction initializeFromURL() {\n\t\t\tconst urlParams = new URLSearchParams(window.location.search);\n\t\t\tconst page = parseInt(urlParams.get(\"page\") || \"1\");\n\t\t\tconst searchQuery = urlParams.get(\"s\") || \"\";\n\n\t\t\t// Set search input value from URL\n\t\t\tif (searchQuery) {\n\t\t\t\tsearchForm.find('input[type=\"text\"]').val(searchQuery);\n\t\t\t}\n\n\t\t\t// Initialize empty filters\n\t\t\tconst filters = {};\n\n\t\t\t// Set filter checkboxes based on URL parameters\n\t\t\turlParams.forEach((value, key) => {\n\t\t\t\tif (key.startsWith(\"filter_\")) {\n\t\t\t\t\tconst filterName = key.replace(\"filter_\", \"\");\n\n\t\t\t\t\t// Handle comma-separated values\n\t\t\t\t\tconst values = value.split(\",\");\n\t\t\t\t\t// Store filter values in the currentState\n\t\t\t\t\tif (!filters[filterName]) {\n\t\t\t\t\t\tfilters[filterName] = [];\n\t\t\t\t\t}\n\t\t\t\t\t// Check the corresponding checkboxes for each value\n\t\t\t\t\tvalues.forEach((val) => {\n\t\t\t\t\t\t// Trim value to avoid whitespace issues\n\t\t\t\t\t\tconst trimmedVal = val.trim();\n\t\t\t\t\t\tif (trimmedVal) {\n\t\t\t\t\t\t\tconst checkbox = searchForm.find(`input[name=\"filters[${filterName}][]\"][value=\"${trimmedVal}\"]`);\n\t\t\t\t\t\t\tif (checkbox.length) {\n\t\t\t\t\t\t\t\tcheckbox.prop(\"checked\", true);\n\t\t\t\t\t\t\t\tcheckbox.closest(\"li.ais-RefinementList-item\").addClass(\"ais-RefinementList-item--selected\");\n\n\t\t\t\t\t\t\t\t// Only add unique values to the filters array\n\t\t\t\t\t\t\t\tif (!filters[filterName].includes(trimmedVal)) {\n\t\t\t\t\t\t\t\t\tfilters[filterName].push(trimmedVal);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else if (key.startsWith(\"refinementList[\")) {\n\t\t\t\t\t// Parse Algolia's refinementList format\n\t\t\t\t\tconst match = key.match(/refinementList\\[(.*?)\\]\\[(\\d+)\\]/);\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tconst algoliaFilterName = match[1];\n\t\t\t\t\t\tconst filterValue = decodeURIComponent(value.trim()); // Decode URL-encoded values\n\t\t\t\t\t\t// Map Algolia filter name to internal filter name\n\t\t\t\t\t\tlet filterName;\n\t\t\t\t\t\tif (algoliaFilterName === \"type.label\") {\n\t\t\t\t\t\t\tfilterName = \"resource_type\"; // Map Algolia's type.label to resource_type\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfilterName = algoliaFilterName; // Use the original name if not mapped\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Find the checkbox by matching its LABEL text with the Algolia filterValue\n\t\t\t\t\t\tlet foundCheckbox = false;\n\t\t\t\t\t\tlet matchedCheckboxElement = null; // Variable to store the matched checkbox element\n\t\t\t\t\t\tlet correctValueForFilter = null; // Variable to store the correct value\n\n\t\t\t\t\t\tsearchForm.find(`input[name=\"filters[${filterName}][]\"]`).each(function () {\n\t\t\t\t\t\t\tconst checkbox = $(this);\n\t\t\t\t\t\t\tconst labelElement = checkbox.closest(\"label\").find(\"span.uk-width-expand\");\n\t\t\t\t\t\t\tif (labelElement.length) {\n\t\t\t\t\t\t\t\tconst labelText = labelElement.text().trim();\n\t\t\t\t\t\t\t\tconst checkboxValue = checkbox.val();\n\n\t\t\t\t\t\t\t\tif (labelText.toLowerCase() === filterValue.toLowerCase()) {\n\t\t\t\t\t\t\t\t\t// Store the matched element and its correct value\n\t\t\t\t\t\t\t\t\tmatchedCheckboxElement = checkbox;\n\t\t\t\t\t\t\t\t\tcorrectValueForFilter = checkboxValue;\n\t\t\t\t\t\t\t\t\tfoundCheckbox = true;\n\t\t\t\t\t\t\t\t\treturn false; // Stop iterating .each()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Apply changes after the loop finishes\n\t\t\t\t\t\tif (foundCheckbox && matchedCheckboxElement && correctValueForFilter) {\n\t\t\t\t\t\t\tmatchedCheckboxElement.prop(\"checked\", true);\n\t\t\t\t\t\t\tmatchedCheckboxElement.closest(\"li.ais-RefinementList-item\").addClass(\"ais-RefinementList-item--selected\");\n\n\t\t\t\t\t\t\t// Add the correct value to the filters object\n\t\t\t\t\t\t\tif (!filters[filterName]) {\n\t\t\t\t\t\t\t\tfilters[filterName] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!filters[filterName].includes(correctValueForFilter)) {\n\t\t\t\t\t\t\t\tfilters[filterName].push(correctValueForFilter);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!foundCheckbox) {\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Update current state with filters from URL\n\t\t\tcurrentState.filters = filters;\n\t\t\tcurrentState.query = searchQuery;\n\t\t\tcurrentState.page = page;\n\n\t\t\t// Always update refinement tags on page load,\n\t\t\t// even if no filters are active (to properly hide/show the container)\n\t\t\tupdateRefinementTags(filters);\n\n\t\t\t// Initialize available filters based on URL parameters.\n\t\t\tif (Object.keys(filters).length > 0) {\n\t\t\t\tupdateAvailableFilters(filters);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Perform search with current form values and filters\n\t\t *\n\t\t * @param {number} page - The page number\n\t\t */\n\t\tfunction performSearch(page = 1) {\n\t\t\t// Prevent multiple simultaneous searches (this check might be redundant with abortController, but safe to keep)\n\t\t\tif (currentState.loading) {\n\t\t\t\t// Abort previous request if it exists\n\t\t\t\tcurrentState.abortController?.abort(\"New search started\");\n\t\t\t}\n\n\t\t\tcurrentState.loading = true;\n\n\t\t\t// Start performance timing.\n\t\t\tperfMetrics.lastSearchStart = performance.now();\n\n\t\t\t// Show skeleton and hide hits container - no need to do this again if already done initially\n\t\t\tif (!perfMetrics.isInitialLoad && skeletonContainer && skeletonContainer.length) {\n\t\t\t\tskeletonContainer.addClass(\"uk-visible\");\n\t\t\t\thitsContainer.addClass(\"uk-hidden\");\n\t\t\t}\n\n\t\t\t// Create a new AbortController for this request\n\t\t\tconst controller = new AbortController();\n\t\t\tcurrentState.abortController = controller; // Store the controller\n\n\t\t\t// Get search query from input\n\t\t\tconst searchQuery = searchForm.find('input[type=\"text\"]').val() || \"\";\n\n\t\t\t// Get post type if available\n\t\t\tconst postType = searchForm.data(\"post-type\") || \"resource\";\n\n\t\t\t// Update only the query part of the current state here\n\t\t\tcurrentState.query = searchQuery;\n\t\t\tconst filters = currentState.filters; // Use the already updated filters from currentState\n\n\t\t\t// Important: Update the UI before making the AJAX request\n\t\t\t// This provides immediate feedback to the user\n\t\t\tupdateRefinementTags(currentState.filters); // Use current state\n\n\t\t\t// Check cache first\n\t\t\tconst cacheKey = getCacheKey(searchQuery, page, filters);\n\t\t\tif (resultsCache[cacheKey]) {\n\t\t\t\tprocessResults(resultsCache[cacheKey]);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if drAjax is defined\n\t\t\tif (typeof drAjax === \"undefined\" || !drAjax.ajaxurl) {\n\t\t\t\tif (hitsContainer.length) {\n\t\t\t\t\thitsContainer.html('
Error: AJAX configuration not found. Please contact the administrator.
');\n\t\t\t\t\thitsContainer.find(\".uk-overlay\").remove();\n\t\t\t\t\thitsContainer.removeClass(\"uk-position-relative uk-hidden\");\n\t\t\t\t\tif (skeletonContainer && skeletonContainer.length) {\n\t\t\t\t\t\tskeletonContainer.removeClass(\"uk-visible\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcurrentState.loading = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Build form data for AJAX request\n\t\t\tconst formData = new FormData();\n\t\t\tformData.append(\"action\", \"ajax_search\");\n\t\t\tformData.append(\"nonce\", drAjax.nonce);\n\t\t\tformData.append(\"query\", searchQuery);\n\t\t\tformData.append(\"post_type\", postType);\n\t\t\tformData.append(\"page\", page);\n\t\t\tformData.append(\"per_page\", 12);\n\t\t\tformData.append(\"filters\", JSON.stringify(currentState.filters)); // Use current state\n\n\t\t\t// Performance optimization: Use fetch API instead of jQuery AJAX\n\t\t\t// This is more efficient and uses less memory\n\t\t\tfetch(drAjax.ajaxurl, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: formData,\n\t\t\t\tcredentials: \"same-origin\",\n\t\t\t\tsignal: controller.signal, // Pass the signal to fetch\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthrow new Error(\"Network response was not ok\");\n\t\t\t\t\t}\n\t\t\t\t\treturn response.json();\n\t\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\t// Cache the successful results (store a copy to prevent reference issues)\n\t\t\t\t\tif (response.success && response.data) {\n\t\t\t\t\t\tresultsCache[cacheKey] = JSON.parse(JSON.stringify(response));\n\t\t\t\t\t}\n\n\t\t\t\t\tprocessResults(response);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t// Check if the error was due to aborting the request.\n\t\t\t\t\t// Check error name, error message, or if the error itself is the abort reason string.\n\t\t\t\t\tif ((error instanceof Error && (error.name === \"AbortError\" || error.message === \"New search started\")) || error === \"New search started\") {\n\t\t\t\t\t\t// Don't show generic error message if it was just an abort.\n\t\t\t\t\t\t// Reset loading state as the request is finished (aborted).\n\t\t\t\t\t\tcurrentState.loading = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Log the actual error for debugging.\n\t\t\t\t\t\tif (hitsContainer.length) {\n\t\t\t\t\t\t\t// Show error message only for non-abort errors.\n\t\t\t\t\t\t\thitsContainer.html('
Error loading results. Please try again.
');\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Reset loading state on error.\n\t\t\t\t\t\tcurrentState.loading = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t/**\n\t\t\t * Process and display search results\n\t\t\t */\n\t\t\tfunction processResults(response) {\n\t\t\t\t// Calculate performance timing.\n\t\t\t\tconst endTime = performance.now();\n\t\t\t\tconst duration = endTime - perfMetrics.lastSearchStart;\n\n\t\t\t\t// Add detailed output of posts loading time to console\n\t\t\t\t// console.log(`Total posts loading time: ${duration.toFixed(2)} ms`);\n\t\t\t\t// console.log(`Request type: ${perfMetrics.isInitialLoad ? \"Initial load\" : currentState.isPaginationClick ? \"Pagination\" : \"Filtering\"}`);\n\n\t\t\t\t// Record performance metrics based on search type.\n\t\t\t\tif (perfMetrics.isInitialLoad) {\n\t\t\t\t\tperfMetrics.initialPageLoad = duration;\n\t\t\t\t\tperfMetrics.isInitialLoad = false;\n\t\t\t\t} else if (currentState.isPaginationClick) {\n\t\t\t\t\tperfMetrics.paginationSearch = duration;\n\t\t\t\t} else {\n\t\t\t\t\tperfMetrics.filterSearch = duration;\n\t\t\t\t}\n\n\t\t\t\t// Check if the response is for the current state page\n\t\t\t\tif (response.success && response.data && response.data.current_page !== currentState.page) {\n\t\t\t\t\t// Do not reset loading here, finally block will handle it.\n\t\t\t\t\treturn; // Ignore stale results\n\t\t\t\t}\n\n\t\t\t\tif (response.success && response.data) {\n\t\t\t\t\t// Add performance stats to the page if stats container exists.\n\t\t\t\t\tif (statsContainer.length) {\n\t\t\t\t\t\t// Update the existing stats element with performance data.\n\t\t\t\t\t\tconst total = response.data.total;\n\t\t\t\t\t\tupdateStats(total, duration);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update URL parameters\n\t\t\t\t\t// Pass the CURRENT filters from currentState, as these reflect the state that generated the results\n\t\t\t\t\tupdateURLParameters(currentState.query, currentState.page, currentState.filters);\n\n\t\t\t\t\t// Scroll to top ONLY if it was a pagination click\n\t\t\t\t\tif (currentState.isPaginationClick && hitsContainer.length) {\n\t\t\t\t\t\t$(\"html, body\").animate(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tscrollTop: hitsContainer.offset().top - 100,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t300 // Restore duration for smooth scroll\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// Reset the flag after scrolling\n\t\t\t\t\t\tcurrentState.isPaginationClick = false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update hit container with HTML\n\t\t\t\t\tif (hitsContainer.length) {\n\t\t\t\t\t\t// First update HTML but keep it hidden.\n\t\t\t\t\t\thitsContainer.html(response.data.html);\n\n\t\t\t\t\t\t// After updating the data, hide skeleton and show content with a small delay.\n\t\t\t\t\t\tif (skeletonContainer && skeletonContainer.length) {\n\t\t\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\t\t\tskeletonContainer.removeClass(\"uk-visible\");\n\t\t\t\t\t\t\t\thitsContainer.removeClass(\"uk-hidden\");\n\t\t\t\t\t\t\t}, 200);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// After updating the hit container, check if featured posts exist and toggle visibility\n\t\t\t\t\t\tconst hasActiveFilters = Object.keys(filters).some((key) => Array.isArray(filters[key]) && filters[key].length > 0);\n\t\t\t\t\t\ttoggleFeaturedPosts(!hasActiveFilters);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update pagination\n\t\t\t\t\tif (paginationContainer.length) {\n\t\t\t\t\t\t// Update data attributes with pagination info\n\t\t\t\t\t\tpaginationContainer.attr(\"data-total-pages\", response.data.pages);\n\t\t\t\t\t\tpaginationContainer.attr(\"data-current-page\", response.data.current_page);\n\n\t\t\t\t\t\t// Generate pagination UI\n\t\t\t\t\t\tupdatePagination(response.data.current_page, response.data.pages, response.data.total);\n\t\t\t\t\t}\n\n\t\t\t\t\t// No need to update refinement tags here anymore\n\t\t\t\t\t// The updateRefinementTags function was already called before the AJAX request\n\t\t\t\t\t// This avoids update flicker and double rendering\n\t\t\t\t\tcurrentState.loading = false;\n\t\t\t\t} else {\n\t\t\t\t\tif (hitsContainer.length) {\n\t\t\t\t\t\thitsContainer.html('
Error loading results. Please try again.
');\n\n\t\t\t\t\t\t// In case of error, also hide skeleton and show error message.\n\t\t\t\t\t\tif (skeletonContainer && skeletonContainer.length) {\n\t\t\t\t\t\t\tskeletonContainer.removeClass(\"uk-visible\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\thitsContainer.removeClass(\"uk-hidden\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Update the refinement tags display to show currently selected filters\n\t\t *\n\t\t * @param {Object} filters - The current filter values\n\t\t */\n\t\tfunction updateRefinementTags(filters) {\n\t\t\t// Find the refinements container\n\t\t\tlet refinementsContainer = $(\".ais-CurrentRefinements\");\n\n\t\t\t// If container doesn't exist, create it\n\t\t\tif (!refinementsContainer.length) {\n\t\t\t\t$(\"#hits\").before('
');\n\t\t\t\trefinementsContainer = $(\".ais-CurrentRefinements\");\n\t\t\t}\n\n\t\t\t// Always remove all existing content and handlers first\n\t\t\trefinementsContainer.empty();\n\n\t\t\t// Check if there are active filters\n\t\t\tconst hasActiveFilters = Object.keys(filters).some((key) => Array.isArray(filters[key]) && filters[key].length > 0);\n\n\t\t\t// Toggle featured posts container based on active filters\n\t\t\ttoggleFeaturedPosts(!hasActiveFilters);\n\n\t\t\t// If no active filters, keep the container empty and hidden\n\t\t\tif (!hasActiveFilters) {\n\t\t\t\trefinementsContainer.hide();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create a clean HTML structure for the refinement tags\n\t\t\tlet html = '
';\n\n\t\t\t// Add tags for each selected filter\n\t\t\tObject.entries(filters).forEach(([filterKey, values]) => {\n\t\t\t\tif (Array.isArray(values) && values.length > 0) {\n\t\t\t\t\t// Use Set to ensure unique values\n\t\t\t\t\tconst uniqueValues = [...new Set(values)];\n\n\t\t\t\t\tuniqueValues.forEach((value) => {\n\t\t\t\t\t\t// --- Start: Improved label finding ---\n\t\t\t\t\t\tlet filterLabel = value; // Default fallback label is the value itself.\n\n\t\t\t\t\t\t// Attempt 1: Check if it's a tab filter and get label from the tab link.\n\t\t\t\t\t\tconst tabLink = $(\".tab-filter[data-filter-type='\" + filterKey + \"'][data-filter-value='\" + value + \"']\");\n\t\t\t\t\t\tif (tabLink.length > 0) {\n\t\t\t\t\t\t\tfilterLabel = tabLink.text().trim();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Attempt 2: Fallback to finding the label from a checkbox input if not found in tabs.\n\t\t\t\t\t\t\tconst filterInput = searchForm.find(`input[name=\"filters[${filterKey}][]\"][value=\"${value}\"]`);\n\t\t\t\t\t\t\tif (filterInput.length) {\n\t\t\t\t\t\t\t\tconst labelElement = filterInput.closest(\"label\").find(\"span.uk-width-expand\");\n\t\t\t\t\t\t\t\tif (labelElement.length) {\n\t\t\t\t\t\t\t\t\t// Try to get the primary text node first for cleaner labels\n\t\t\t\t\t\t\t\t\tconst textNode = labelElement[0].firstChild;\n\t\t\t\t\t\t\t\t\tif (textNode && textNode.nodeType === 3) {\n\t\t\t\t\t\t\t\t\t\t// Node.TEXT_NODE\n\t\t\t\t\t\t\t\t\t\tfilterLabel = textNode.nodeValue.trim();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// Fallback to full text if no simple text node found\n\t\t\t\t\t\t\t\t\t\tfilterLabel = labelElement.text().trim();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// --- End: Improved label finding ---\n\n\t\t\t\t\t\t// Add tag HTML - use precise HTML structure matching Algolia's pattern\n\t\t\t\t\t\thtml += `\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t`;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Add the clear button with consistent styling\n\t\t\thtml += `\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t${searchForm.data(\"clear-filters-text\") || \"Clear filters\"}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t`;\n\n\t\t\thtml += \"
\";\n\n\t\t\t// Replace the entire content of the container and make sure it's visible\n\t\t\trefinementsContainer.html(html).show();\n\n\t\t\t// Remove any existing event handlers to prevent duplicates\n\t\t\trefinementsContainer.find(\".filter-tag\").off();\n\t\t\trefinementsContainer.find(\".ais-ClearRefinements-button\").off();\n\n\t\t\t// Add new click handlers for filter tags\n\t\t\trefinementsContainer.find(\".filter-tag\").on(\"click\", function (e) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\tconst filter = $(this).data(\"filter\");\n\t\t\t\tconst value = $(this).data(\"value\");\n\n\t\t\t\t// --- Start: Updated Filter Removal Logic ---\n\n\t\t\t\t// 1. Always remove the filter from the state first.\n\t\t\t\tif (currentState.filters[filter]) {\n\t\t\t\t\tconst index = currentState.filters[filter].indexOf(value);\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tcurrentState.filters[filter].splice(index, 1);\n\t\t\t\t\t}\n\t\t\t\t\t// If the filter array is now empty, remove the filter key.\n\t\t\t\t\tif (currentState.filters[filter].length === 0) {\n\t\t\t\t\t\tdelete currentState.filters[filter];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 2. Update the corresponding UI element (checkbox or tab).\n\t\t\t\t// Attempt to find the checkbox.\n\t\t\t\tconst checkbox = searchForm.find(`input[name=\"filters[${filter}][]\"][value=\"${value}\"]`);\n\t\t\t\tif (checkbox.length) {\n\t\t\t\t\t// If checkbox found, uncheck it.\n\t\t\t\t\tcheckbox.prop(\"checked\", false);\n\t\t\t\t\tcheckbox.closest(\"li.ais-RefinementList-item\").removeClass(\"ais-RefinementList-item--selected\");\n\t\t\t\t} else {\n\t\t\t\t\t// If no checkbox, check if it was a tab filter.\n\t\t\t\t\tconst tabLink = $(\".tab-filter[data-filter-type='\" + filter + \"'][data-filter-value='\" + value + \"']\");\n\t\t\t\t\tif (tabLink.length > 0) {\n\t\t\t\t\t\tconst tabListItem = tabLink.closest(\"li\");\n\t\t\t\t\t\t// Only update tabs if the one being removed was actually active.\n\t\t\t\t\t\tif (tabListItem.hasClass(\"uk-active\")) {\n\t\t\t\t\t\t\tconst tabList = tabListItem.closest(\"ul\");\n\t\t\t\t\t\t\tif (tabList.length > 0) {\n\t\t\t\t\t\t\t\ttabList.find(\"li\").removeClass(\"uk-active\");\n\t\t\t\t\t\t\t\t// Activate the \"All\" tab (first li).\n\t\t\t\t\t\t\t\ttabList.find(\"li:first-child\").addClass(\"uk-active\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 3. Common actions: Reset page, update filters, perform search.\n\t\t\t\tcurrentState.page = 1;\n\t\t\t\tupdateAvailableFilters(currentState.filters);\n\t\t\t\tperformSearch(1);\n\n\t\t\t\t// --- End: Updated Filter Removal Logic ---\n\t\t\t});\n\n\t\t\t// Add new click handler for clear all button\n\t\t\trefinementsContainer.find(\".ais-ClearRefinements-button\").on(\"click\", function (e) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\t// Clear all checkboxes and remove selected class\n\t\t\t\tsearchForm.find('input[type=\"checkbox\"]:checked').prop(\"checked\", false);\n\t\t\t\tsearchForm.find(\"li.ais-RefinementList-item--selected\").removeClass(\"ais-RefinementList-item--selected\");\n\n\t\t\t\t// Clear all filters from currentState\n\t\t\t\tcurrentState.filters = {};\n\n\t\t\t\t// Reset all tab filters to \"All\".\n\t\t\t\t$(\".tab-filter\").each(function () {\n\t\t\t\t\tconst tabList = $(this).closest(\"ul\");\n\t\t\t\t\t// Prevent multiple resets for the same list.\n\t\t\t\t\tif (tabList.length > 0 && !tabList.data(\"reset-handled\")) {\n\t\t\t\t\t\ttabList.find(\"li\").removeClass(\"uk-active\");\n\t\t\t\t\t\ttabList.find(\"li:first-child\").addClass(\"uk-active\");\n\t\t\t\t\t\t// Mark as handled.\n\t\t\t\t\t\ttabList.data(\"reset-handled\", true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Clean up handler flag after processing.\n\t\t\t\t$(\"ul[data-reset-handled]\").removeData(\"reset-handled\");\n\n\t\t\t\t// Reset to page 1 when filters change\n\t\t\t\tcurrentState.page = 1;\n\n\t\t\t\t// Update available filters after clearing all filters\n\t\t\t\tupdateAvailableFilters({});\n\n\t\t\t\tperformSearch(1);\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Toggle featured posts visibility based on filter status\n\t\t *\n\t\t * @param {boolean} show - Whether to show featured posts\n\t\t */\n\t\tfunction toggleFeaturedPosts(show) {\n\t\t\tif (!featuredContainer.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if there are any featured posts (swiper slides) in the container\n\t\t\tconst hasFeaturedPosts = featuredContainer.find(\".swiper-slide\").length > 0;\n\n\t\t\t// Simple class toggle approach - better performance\n\t\t\tif (show && hasFeaturedPosts) {\n\t\t\t\t// Add class if not already present\n\t\t\t\tif (featuredContainer.hasClass(\"uk-hidden\")) {\n\t\t\t\t\tfeaturedContainer.removeClass(\"uk-hidden\");\n\n\t\t\t\t\t// Trigger window resize to ensure any sliders reinitialize properly\n\t\t\t\t\t$(window).trigger(\"resize\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Add class if not already present\n\t\t\t\tif (!featuredContainer.hasClass(\"uk-hidden\")) {\n\t\t\t\t\tfeaturedContainer.addClass(\"uk-hidden\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Update pagination UI\n\t\t *\n\t\t * @param {number} currentPage - Current page number\n\t\t * @param {number} totalPages - Total number of pages\n\t\t * @param {number} totalPosts - Total number of posts\n\t\t */\n\t\tfunction updatePagination(currentPage, totalPages, totalPosts) {\n\t\t\tif (!paginationContainer.length || totalPosts === 0 || totalPages <= 1) {\n\t\t\t\tpaginationContainer.empty();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet html = '\";\n\t\t\tpaginationContainer.html(html);\n\n\t\t\t// Setup click handlers for the new pagination links\n\t\t\tsetupPaginationHandlers();\n\t\t}\n\n\t\t/**\n\t\t * Update URL parameters without page reload\n\t\t *\n\t\t * @param {string} query - Search query\n\t\t * @param {number} page - Page number\n\t\t * @param {Object} filters - Filter values\n\t\t */\n\t\tfunction updateURLParameters(query, page, filters) {\n\t\t\tconst params = new URLSearchParams();\n\n\t\t\t// Add search query to URL\n\t\t\tif (query) {\n\t\t\t\tparams.append(\"s\", query);\n\t\t\t}\n\n\t\t\t// Add filters to URL - use separate parameter for each filter category\n\t\t\tObject.entries(filters).forEach(([key, values]) => {\n\t\t\t\tif (values && values.length > 0) {\n\t\t\t\t\t// Ensure values are unique\n\t\t\t\t\tconst uniqueValues = [...new Set(values)];\n\t\t\t\t\t// Use a single filter_* parameter with comma-separated values\n\t\t\t\t\tparams.append(`filter_${key}`, uniqueValues.join(\",\"));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Add page to URL (only if not page 1)\n\t\t\tif (page > 1) {\n\t\t\t\tparams.append(\"page\", page);\n\t\t\t}\n\n\t\t\t// Update URL without reloading the page\n\t\t\tconst newURL = window.location.pathname + (params.toString() ? \"?\" + params.toString() : \"\");\n\t\t\twindow.history.pushState({}, \"\", newURL);\n\t\t}\n\n\t\t// Add new function for updating available filters\n\t\t/**\n\t\t * Update available filters based on current selection\n\t\t *\n\t\t * @param {Object} filters - Currently selected filters\n\t\t */\n\t\tfunction updateAvailableFilters(filters) {\n\t\t\t// Take a snapshot of current visibility state\n\t\t\tconst visibilitySnapshot = {};\n\t\t\tsearchForm.find(\".ais-RefinementList-item\").each(function () {\n\t\t\t\tconst $item = $(this);\n\t\t\t\tconst checkbox = $item.find('input[type=\"checkbox\"]');\n\t\t\t\tif (checkbox.length) {\n\t\t\t\t\tconst name = checkbox.attr(\"name\");\n\t\t\t\t\tconst value = checkbox.val();\n\t\t\t\t\tvisibilitySnapshot[`${name}:${value}`] = !$item.hasClass(\"uk-hidden\");\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Build form data for AJAX request\n\t\t\tconst formData = new FormData();\n\t\t\tformData.append(\"action\", \"ajax_get_available_filters\");\n\t\t\tformData.append(\"nonce\", drAjax.nonce);\n\t\t\tformData.append(\"filters\", JSON.stringify(filters));\n\n\t\t\t// Add context parameter to get the right filters\n\t\t\tconst postType = searchForm.data(\"post-type\") || \"resource\";\n\t\t\tformData.append(\"context\", postType);\n\n\t\t\t// Use fetch API for better performance\n\t\t\tfetch(drAjax.ajaxurl, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: formData,\n\t\t\t\tcredentials: \"same-origin\",\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthrow new Error(\"Network response was not ok\");\n\t\t\t\t\t}\n\t\t\t\t\treturn response.json();\n\t\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tif (response.success && response.data) {\n\t\t\t\t\t\t// Check if we have active filters\n\t\t\t\t\t\tconst hasActiveFilters = Object.keys(filters).some((key) => Array.isArray(filters[key]) && filters[key].length > 0);\n\n\t\t\t\t\t\t// Process the filter results with this information\n\t\t\t\t\t\tprocessFilterResults(response.data, hasActiveFilters, visibilitySnapshot);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t// Handle filter update error silently\n\t\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Process and update filter options based on available filters\n\t\t *\n\t\t * @param {Object} filterData - Filter data from server\n\t\t * @param {boolean} hasActiveFilters - Whether there are active filters\n\t\t * @param {Object} previousVisibility - Previous visibility state\n\t\t */\n\t\tfunction processFilterResults(filterData, hasActiveFilters, previousVisibility) {\n\t\t\t// If no active filters, show all filter items\n\t\t\tif (!hasActiveFilters) {\n\t\t\t\t// Show all filter items across all filter groups\n\t\t\t\tsearchForm.find(\".ais-RefinementList-item\").removeClass(\"uk-hidden\");\n\t\t\t}\n\n\t\t\t// Process each filter group\n\t\t\tObject.keys(filterData).forEach((filterName) => {\n\t\t\t\tconst filterGroup = filterData[filterName];\n\t\t\t\tif (!filterGroup || !filterGroup.terms) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Handle visibility based on active filters\n\t\t\t\tif (hasActiveFilters) {\n\t\t\t\t\t// Create a set of values from the server response for quick lookup\n\t\t\t\t\tconst serverValues = new Set(filterGroup.terms.map((term) => term.value));\n\n\t\t\t\t\t// Process all checkboxes for this filter\n\t\t\t\t\tsearchForm.find(`input[name=\"filters[${filterName}][]\"]`).each(function () {\n\t\t\t\t\t\tconst $checkbox = $(this);\n\t\t\t\t\t\tconst value = $checkbox.val();\n\t\t\t\t\t\tconst $item = $checkbox.closest(\"li.ais-RefinementList-item\");\n\n\t\t\t\t\t\t// If value is in server response or checkbox is checked, show the item\n\t\t\t\t\t\tif (serverValues.has(value) || $checkbox.is(\":checked\")) {\n\t\t\t\t\t\t\t$item.removeClass(\"uk-hidden\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Otherwise hide it\n\t\t\t\t\t\t\t$item.addClass(\"uk-hidden\");\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Always update the count for each term\n\t\t\t\tfilterGroup.terms.forEach((term) => {\n\t\t\t\t\tconst checkbox = searchForm.find(`input[name=\"filters[${filterName}][]\"][value=\"${term.value}\"]`);\n\t\t\t\t\tif (checkbox.length) {\n\t\t\t\t\t\t// Update the count\n\t\t\t\t\t\tconst countEl = checkbox.closest(\"label\").find(\".ais-RefinementList-count\");\n\t\t\t\t\t\tif (countEl.length) {\n\t\t\t\t\t\t\tcountEl.text(`${term.count}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Final verification check\n\t\t\tif (!hasActiveFilters) {\n\t\t\t\tconst stillHidden = [];\n\t\t\t\tsearchForm.find(\".ais-RefinementList-item.uk-hidden\").each(function () {\n\t\t\t\t\tconst $item = $(this);\n\t\t\t\t\tconst checkbox = $item.find('input[type=\"checkbox\"]');\n\t\t\t\t\tif (checkbox.length) {\n\t\t\t\t\t\tstillHidden.push({\n\t\t\t\t\t\t\tname: checkbox.attr(\"name\"),\n\t\t\t\t\t\t\tvalue: checkbox.val(),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction updateStats(total, duration = null) {\n\t\t\tconst stats = document.getElementById(\"stats\");\n\t\t\tif (stats) {\n\t\t\t\tstats.dataset.total = total; // Update data attribute\n\t\t\t\tlet statsHtml;\n\t\t\t\tif (total === 1) {\n\t\t\t\t\t// Use resource_found\n\t\t\t\t\tstatsHtml = translationData.message.resource_found || \"1 resource found\";\n\t\t\t\t} else {\n\t\t\t\t\t// Use resources_found, replace %d with total\n\t\t\t\t\tstatsHtml = (translationData.message.resources_found || \"%d resources found\").replace(\"%d\", total);\n\t\t\t\t}\n\n\t\t\t\t// Update the entire inner HTML\n\t\t\t\tstats.innerHTML = `
${statsHtml}
`;\n\t\t\t}\n\t\t}\n\t}\n}\n"],"sourceRoot":""}