{"id":4178,"date":"2022-04-26T13:20:05","date_gmt":"2022-04-26T12:20:05","guid":{"rendered":"https:\/\/bestatterportal.ch\/result\/"},"modified":"2025-04-23T13:22:02","modified_gmt":"2025-04-23T12:22:02","slug":"result","status":"publish","type":"page","link":"https:\/\/bestatter.ch\/en\/result\/","title":{"rendered":"Result"},"content":{"rendered":"<!-- Block in dem alle Ergebnisse aus der ElasticSearch dargestellt werden -->\n<style>\n\t.result-search-bar.modal-content {\n\t\tpadding: 0;\n\t}\n\t\n\t.result-search-bar #result-search-input {\n\t\tborder: none;\n\t\tmargin: 0;\n\t\tpadding-right: 0;\n\t}\n\t\n\t.result-search-bar #result-search-input:focus,\n\t.result-search-bar #result-search-input:active {\n\t\tborder: none;\n\t\tbox-shadow: none;\n\t\toutline: none;\n\t}\n\t\n\t.result-search-bar .yxt-AutoComplete {\n\t\tborder: 4.5px solid #2F5D63 !important;\n\t\tborder-top: 0px;\n\t\tborder-radius: 0px 0px 20px 20px;\n\t\tbackground-color: #ffffff;\n\t}\n\n\t.result-search-bar form#result-search-form button[type=\"submit\"] {\n\t\tbackground: none;\n\t\tborder: none;\n\t\tpadding: 0.75rem 1rem;\n\t}\n\t\n\t.result-search-bar form#result-search-form button[type=\"submit\"] img {\n\t\theight: 2em;\n\t\twidth: 2em;\n\t}\n\t\n\t\n\t.result-search-bar .autocomplete-box {\n\t\tposition: absolute;\n\t\tmargin-top: 10px;\n\t\twidth: 100%;\n\t\toverflow-y: auto;\n\t\tdisplay: none;\n\t\tz-index: 1000;\n\t\tborder: 4px solid #2F5D63;\n\t\tborder-radius: 0px 0px 20px 20px;\n\t\tbackground-color: #ffffff;\n\t}\n\n\t.result-search-bar .autocomplete-box.active {\n\t\tdisplay: block;\n\t}\n\n\t.result-search-bar .autocomplete-box ul {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tlist-style: none;\n\t}\n\n\t.result-search-bar .autocomplete-box li {\n\t\tpadding: 5px 15px;\n\t\tcursor: pointer;\n\t\tline-height: 1.4;\n\t\tfont-size: 1rem;\n\t\tcolor: #212121;\n\t\tfont-weight: 400;\n\t}\n\n\t.result-search-bar .autocomplete-box li:hover {\n\t\tbackground: #f0f0f0;\n\t}\n\n\t.result-universal-results.searching {\n\t\topacity: 0.5\n\t}\n<\/style>\n<div class=\"section\">\n\t<div class=\"container-xl\">\n\t\t<div class=\"row\">\n\t\t\t<div class=\"result-search-bar modal-content\"><\/div>\n\t\t\t<div class=\"result-universal-results\"><\/div>\n\t\t\t<div class=\"pagination justify-content-center\"><\/div>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n<script>\n\t\/\/ === CONFIG \/ PHP \u2192 JS ===\n\tconst BESTATTER_SEARCH_ENDPOINT      = \"https:\/\/bestatter.ch\/en\/wp-json\/bestatter\/v1\/search\";\n\tconst BESTATTER_AUTOCOMPLETE_ENDPOINT = \"https:\/\/bestatter.ch\/en\/wp-json\/bestatter\/v1\/autocomplete\";\n\tconst IS_SEARCH_ONLY                 = false;\n\tconst MORE_COMPANIES_LABEL          = \"More companies\";\n\t\n\t\/\/ Icon paths\n\tconst SEARCH_ICON_SRC  = \"https:\/\/bestatter.ch\/wp-content\/themes\/bestatter-ch\/bestatterfile\/assets\/searchglass.png\";\n\tconst SPINNER_ICON_SRC = \"https:\/\/bestatter.ch\/wp-content\/themes\/bestatter-ch\/bestatterfile\/assets\/spinner.svg\";\n\t\n\t\/\/ Dynamic selectors based on section\n\tconst buttonImgSelector   = '#result-search-form button[type=\"submit\"] img';\n\tconst lang = \"en\";\n\tconst FIXED_SUGGESTIONS = {\n\t\tde: [\n\t\t\t\"Was kostet eine Bestattungsvorsorge?\",\n\t\t\t\"Was tun im Todesfall?\",\n\t\t],\n\t\ten: [\n\t\t\t\"What does a funeral pre-arrangement cost?\",\n\t\t\t\"What to do in case of death?\",\n\t\t],\n\t\tfr: [\n\t\t\t\"Combien coute une prevoyance funeraire ?\",\n\t\t\t\"Que faire en cas de deces ?\",\n\t\t],\n\t\tit: [\n\t\t\t\"Quanto costa una previdenza funeraria?\",\n\t\t\t\"Cosa fare in caso di decesso?\",\n\t\t],\n\t};\n\n\t\/\/ === Autocomplete globals ===\n\tlet autocompleteTimer        = null;\n\tlet autocompleteController   = null;\n\tlet autocompleteCache        = {};\n\tlet autocompleteLastRequestId  = 0;\n\tlet autocompleteLastHandledId  = 0;\n\tlet currentLoadingRequestId     = 0; \/\/ tracks which request controls the spinner\n\n\t\/\/ === Helpers ===\n\tfunction getQueryParam(name) {\n\t\tconst urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.get(name);\n\t}\n\n\tfunction setQueryParam(name, value) {\n\t\tconst url = new URL(window.location.href);\n\t\tif (value === null || value === undefined || value === '') {\n\t\t\turl.searchParams.delete(name);\n\t\t} else {\n\t\t\turl.searchParams.set(name, value);\n\t\t}\n\t\twindow.history.replaceState({}, '', url);\n\t}\n\n\tfunction setButtonLoading(isLoading, requestId) {\n\t\t\/\/ If we're tying spinner to a specific request, ensure only that request can turn it off\n\t\tif (typeof requestId !== \"undefined\" && !isLoading && requestId !== currentLoadingRequestId) {\n\t\t\t\/\/ Not the latest request, don't change spinner\n\t\t\treturn;\n\t\t}\n\n\t\tconst img = document.querySelector(buttonImgSelector);\n\t\tif (!img) return;\n\n\t\tif (isLoading) {\n\t\t\timg.src = SPINNER_ICON_SRC;\n\t\t} else {\n\t\t\timg.src = SEARCH_ICON_SRC;\n\t\t}\n\t}\n\t\n\t\/\/ --- Kanton detection ---\n\tfunction detectKanton(query) {\n\t\tif (!query) return '';\n\t\tconst q = query.toLowerCase();\n\n\t\tconst map = {\n\t\t\tZH: ['kanton z\u00fcrich', 'canton z\u00fcrich'],\n\t\t\tBE: ['kanton bern', 'canton bern'],\n\t\t\tLU: ['kanton luzern', 'canton luzern'],\n\t\t\tUR: ['kanton uri', 'canton uri'],\n\t\t\tSZ: ['kanton schwyz', 'canton schwyz'],\n\t\t\tOW: ['kanton obwalden', 'canton obwalden'],\n\t\t\tNW: ['kanton nidwalden', 'canton nidwalden'],\n\t\t\tGL: ['kanton glarus', 'canton glarus'],\n\t\t\tZG: ['kanton zug', 'canton zug'],\n\t\t\tFR: ['kanton freiburg', 'kanton fribourg', 'canton freiburg', 'canton fribourg'],\n\t\t\tSO: ['kanton solothurn', 'canton solothurn'],\n\t\t\tBS: [\n\t\t\t\t'kanton basel-stadt', 'kanton baselstadt', 'kanton basel stadt',\n\t\t\t\t'canton basel-stadt', 'canton baselstadt', 'canton basel stadt'\n\t\t\t],\n\t\t\tBL: [\n\t\t\t\t'kanton basel-landschaft', 'kanton basel landschaft', 'kanton basellandschaft',\n\t\t\t\t'kanton basel-land', 'kanton basel land', 'kanton baselland',\n\t\t\t\t'canton basel-landschaft', 'canton basel landschaft', 'canton basellandschaft',\n\t\t\t\t'canton basel-land', 'canton basel land', 'canton baselland'\n\t\t\t],\n\t\t\tSH: ['kanton schaffhausen', 'canton schaffhausen'],\n\t\t\tAR: [\n\t\t\t\t'kanton appenzell a.r.', 'kanton appenzell ar', 'kanton appenzell ausserrhoden',\n\t\t\t\t'canton appenzell a.r.', 'canton appenzell ar', 'canton appenzell ausserrhoden'\n\t\t\t],\n\t\t\tAI: [\n\t\t\t\t'kanton appenzell i.r.', 'kanton appenzell ir', 'kanton appenzell innerrhoden',\n\t\t\t\t'canton appenzell i.r.', 'canton appenzell ir', 'canton appenzell innerrhoden'\n\t\t\t],\n\t\t\tSG: [\n\t\t\t\t'kanton st. gallen', 'kanton st.gallen', 'kanton st gallen', 'kanton stgallen',\n\t\t\t\t'canton st. gallen', 'canton st.gallen', 'canton st gallen', 'canton stgallen'\n\t\t\t],\n\t\t\tGR: ['kanton graub\u00fcnden', 'canton graub\u00fcnden'],\n\t\t\tAG: ['kanton aargau', 'canton aargau'],\n\t\t\tTG: ['kanton thurgau', 'canton thurgau'],\n\t\t\tTI: ['kanton tessin', 'canton tessin'],\n\t\t\tVD: ['kanton waadt', 'kanton vaud', 'canton waadt', 'canton vaud'],\n\t\t\tVS: ['kanton wallis', 'kanton valais', 'canton wallis', 'canton valais'],\n\t\t\tNE: ['kanton neuenburg', 'kanton neuenbourg', 'canton neuenburg', 'canton neuenbourg'],\n\t\t\tGE: ['kanton genf', 'canton genf'],\n\t\t\tJU: ['kanton jura', 'canton jura', 'jura']\n\t\t};\n\n\t\tfor (const [code, patterns] of Object.entries(map)) {\n\t\t\tfor (const p of patterns) {\n\t\t\t\tif (q.includes(p)) return code;\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t}\n\t\n\tfunction formatDisplayUrl(url) {\n\t\tif (!url) return '';\n\n\t\turl = url.trim();\n\n\t\t\/\/ Add protocol if missing so URL() works reliably\n\t\tif (!\/^https?:\\\/\\\/\/i.test(url)) {\n\t\t\turl = 'https:\/\/' + url;\n\t\t}\n\n\t\tlet parsed;\n\n\t\ttry {\n\t\t\tparsed = new URL(url);\n\t\t} catch (e) {\n\t\t\treturn '';\n\t\t}\n\n\t\tlet host = parsed.hostname;\n\t\tlet path = parsed.pathname.replace(\/\\\/$\/, '');\n\n\t\t\/\/ Ensure www. prefix\n\t\tif (!host.startsWith('www.')) {\n\t\t\thost = 'www.' + host;\n\t\t}\n\n\t\treturn path && path !== '\/' ? host + path : host;\n\t}\n\n\n\t\/\/ --- Render Standorte cards ---\n\tfunction renderStandortCards(standorte, kantonFilter, isSearchOnly) {\n\t\tif (!Array.isArray(standorte) || standorte.length === 0) return '';\n\n\t\tlet title =\n\t\t\t(typeof window.langforsearch !== 'undefined' && window.langforsearch !== null)\n\t\t\t\t? (langforsearch[\"Bestattungsunternehmen\"] || 'Bestattungsunternehmen')\n\t\t\t\t: 'Bestattungsunternehmen';\n\n\t\tlet html = '<div class=\"container\"><div class=\"row\"><h3 class=\"mt-4\">' + title + '<\/h3>';\n\n\t\tlet count = 0;\n\n\t\tstandorte.forEach(function (item) {\n\t\t\tconst addr    = item.address || {};\n\t\t\tconst region  = addr.region || '';\n\t\t\tconst street  = addr.street || '';\n\t\t\tconst plz     = addr.plz || '';\n\t\t\tconst ort     = addr.ort || '';\n\t\t\tconst country = addr.countryCode || '';\n\n\t\t\tif (kantonFilter && region !== kantonFilter) return;\n\n\t\t\tconst link        = item.link || '#';\n\t\t\tconst logo        = item.logo || '';\n\t\t\tconst phone       = item.phone || '';\n\t\t\tconst formatPhone = item.formatPhone || '';\n\t\t\tconst emails      = item.emails || '';\n\t\t\tconst website     = item.website || '';\n\t\t\tconst gutesiegel  = !!item.gutesiegel;\n\n\t\t\thtml += '<div class=\"col-lg-6 mb-4\"><div class=\"card\" style=\"height:100%\"';\n\t\t\tif (isSearchOnly){\n\t\t\t\tif (count === 6){\n\t\t\t\t\thtml += ' id=\"all-bestatter\"';\n\t\t\t\t}\n\t\t\t}\n\t\t\thtml += '>';\n\n\t\t\tif (logo) {\n\t\t\t\thtml +=\n\t\t\t\t\t'<a class=\"row pb-5\" href=\"' + link + '\">' +\n\t\t\t\t\t'<div class=\"col col-lg-3 d-flex\"><\/div>' +\n\t\t\t\t\t'<div class=\"col d-flex col-lg-6\">' +\n\t\t\t\t\t'<img decoding=\"async\" src=\"' + logo + '\" class=\"mx-auto w-100 lazy\" alt=\"\">' +\n\t\t\t\t\t'<\/div>' +\n\t\t\t\t\t'<div class=\"col col-lg-3\">';\n\n\t\t\t\tif (gutesiegel) {\n\t\t\t\t\thtml += '<img decoding=\"async\" src=\"https:\/\/bestatter.ch\/wp-content\/themes\/bestatter-ch\/bestatterfile\/assets\/\/SVB-Guetesiegel-Logo-kombiniert.jpg\" style=\"max-width: 80%;\">';\n\t\t\t\t}\n\n\t\t\t\thtml += '<\/div><\/a>';\n\t\t\t}\n\n\t\t\thtml +=\n\t\t\t\t'<div class=\"content\">' +\n\t\t\t\t'<a style=\"text-decoration: none;\" href=\"' + link + '\">' +\n\t\t\t\t'<h4 class=\"h5 mb-3\">' + (item.title || '') + '<\/h4>' +\n\t\t\t\t'<\/a>' +\n\t\t\t\t'<p class=\"\">' +\n\t\t\t\t(street ? street + '<br>' : '') +\n\t\t\t\tplz + ' ' + ort + (country && country !== 'CH' ? ' ' + country : '') +\n\t\t\t\t'<\/p>';\n\n\t\t\tif (emails || phone || website) {\n\t\t\t\thtml += '<p>';\n\n\t\t\t\tif (emails) {\n\t\t\t\t\temails.forEach(v => {\n\t\t\t\t\t\tif (v['e-mail'] !== '') {\n\t\t\t\t\t\t\thtml += '<a class=\"text-decoration-none\" href=\"mailto:' + v['e-mail'] + '\">' + v['e-mail'] + '<\/a><br>';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (phone) {\n\t\t\t\t\thtml += '<a class=\"text-decoration-none\" href=\"tel:' + phone + '\">' + formatPhone + '<\/a><br>';\n\t\t\t\t}\n\n\t\t\t\tif (website) {\n\t\t\t\t\thtml += '<a class=\"text-decoration-none\" href=\"' + website + '\">' + formatDisplayUrl(website) + '<\/a><br>';\n\t\t\t\t}\n\n\t\t\t\thtml += '<\/p>';\n\t\t\t}\n\n\t\t\tlet zb =\n\t\t\t\t(typeof window.langforsearch !== 'undefined' && window.langforsearch !== null)\n\t\t\t\t\t? (langforsearch[\"abesttater\"] || 'Zum Bestatter')\n\t\t\t\t\t: 'Zum Bestatter';\n\n\t\t\thtml +=\n\t\t\t\t'<\/div>' +\n\t\t\t\t'<a class=\"link-btn\" href=\"' + link + '\">' + zb + '<\/a>' +\n\t\t\t\t'<\/div><\/div>';\n\n\t\t\tcount++;\n\t\t});\n\n\t\thtml += '<\/div><\/div>';\n\t\treturn html;\n\t}\n\n\t\/\/ --- Render FAQs ---\n\tfunction renderFaqs(faqs) {\n\t\tif (!Array.isArray(faqs) || faqs.length === 0) return '';\n\n\t\tlet faqTitle =\n\t\t\t(typeof window.langforsearch !== 'undefined' && window.langforsearch !== null)\n\t\t\t\t? (langforsearch[\"faq\"] || 'FAQ')\n\t\t\t\t: 'FAQ';\n\n\t\tlet html = '<div class=\"container\"><div class=\"row\"><h3 class=\"mt-4\">' + faqTitle + '<\/h3>';\n\n\t\tfaqs.forEach(function (item, idx) {\n\t\t\tconst q      = item.question || '';\n\t\t\tconst answer = item.answer_html || '';\n\t\t\tconst link   = item.link || '';\n\n\t\t\thtml +=\n\t\t\t\t'<div class=\"collapse-container collapsed\">' +\n\t\t\t\t'<div class=\"card\">' +\n\t\t\t\t'<div data-bs-toggle=\"collapse\" href=\"#faqs' + idx + '\">' +\n\t\t\t\t'<div class=\"faq-header\">' +\n\t\t\t\t'<p class=\"question\" style=\"color:#2F5D63;\">' + q + '<\/p>' +\n\t\t\t\t'<\/div><\/div>' +\n\t\t\t\t'<div class=\"collapse\" id=\"faqs' + idx + '\">' +\n\t\t\t\t'<div class=\"faq-answer\">' + answer + '<\/div>';\n\n\t\t\tif (link) {\n\t\t\t\tlet mehr =\n\t\t\t\t\t(typeof window.langforsearch !== 'undefined' && window.langforsearch !== null)\n\t\t\t\t\t\t? (langforsearch[\"mehranz\"] || 'Mehr anzeigen')\n\t\t\t\t\t\t: 'Mehr anzeigen';\n\n\t\t\t\thtml +=\n\t\t\t\t\t'<div class=\"link-btn\" onclick=\"window.location.href=\\'' + link + '\\'\">' +\n\t\t\t\t\tmehr +\n\t\t\t\t\t'<\/div>';\n\t\t\t}\n\n\t\t\thtml +=\n\t\t\t\t'<div class=\"spacer\"><\/div>' +\n\t\t\t\t'<\/div><\/div><\/div>';\n\t\t});\n\n\t\thtml += '<\/div><\/div>';\n\t\treturn html;\n\t}\n\n\t\/\/ --- Pagination ---\n\tfunction renderPagination(total, page, perPage) {\n\t\ttotal   = parseInt(total || 0, 10);\n\t\tpage    = parseInt(page || 1, 10);\n\t\tperPage = parseInt(perPage || 10, 10);\n\n\t\tif (!total || total <= perPage) return '';\n\n\t\tconst totalPages = Math.ceil(total \/ perPage);\n\t\tlet html = '<ul class=\"list-unstyled pagination-list d-flex flex-wrap\">';\n\n\t\tif (page > 1) {\n\t\t\thtml += '<li class=\"page-item\"><a href=\"javascript:void(0)\" data-page=\"' + (page - 1) + '\" class=\"page-link\">&laquo;<\/a><\/li>';\n\t\t}\n\n\t\tfor (let p = 1; p <= totalPages; p++) {\n\t\t\thtml +=\n\t\t\t\t'<li class=\"page-item' + (p === page ? ' active' : '') + '\">' +\n\t\t\t\t'<a href=\"javascript:void(0)\" data-page=\"' + p + '\" class=\"page-link\">' + p + '<\/a><\/li>';\n\t\t}\n\n\t\tif (page < totalPages) {\n\t\t\thtml += '<li class=\"page-item\"><a href=\"javascript:void(0)\" data-page=\"' + (page + 1) + '\" class=\"page-link\">&raquo;<\/a><\/li>';\n\t\t}\n\n\t\thtml += '<\/ul>';\n\t\treturn html;\n\t}\n\n\t\/\/ --- Search bar ---\n\tfunction initSearchBar(initialQuery) {\n\t\tconst bar = document.querySelector('.result-search-bar');\n\t\tif (!bar) return;\n\n\t\tlet ph = \"Search by location or topic...\";\n\n\t\tbar.innerHTML =\n\t\t\t'<form id=\"result-search-form\" class=\"result-search-form\">' +\n\t\t\t'<div class=\"input-group\">' +\n\t\t\t'<input type=\"search\" id=\"result-search-input\" class=\"form-control\" placeholder=\"' + ph + '\" value=\"' + (initialQuery || '') + '\" autocomplete=\"off\"\/>' +\n\t\t\t'<button type=\"submit\" class=\"btn btn-primary\">' +\n\t\t\t'<img decoding=\"async\" src=\"https:\/\/bestatter.ch\/wp-content\/themes\/bestatter-ch\/bestatterfile\/assets\/searchglass.png\" alt=\"Search Icon\" class=\"Icon-image\">' +\n\t\t\t'<\/button>' +\n\t\t\t'<\/div>' +\n\t\t\t'<div class=\"autocomplete-box\"><\/div>' +\n\t\t\t'<\/form>';\n\t}\n\n\tfunction attachSearchHandlers(onSearch) {\n\t\tconst form  = document.getElementById('result-search-form');\n\t\tconst input = document.getElementById('result-search-input');\n\t\tconst box   = document.querySelector(\"#result-search-form .autocomplete-box\");\n\t\tif (!form || !input || !box) return;\n\n\t\tform.addEventListener('submit', function (e) {\n\t\t\te.preventDefault();\n\t\t\tconst q = input.value.trim();\n\t\t\tif (q !== '') {\n\t\t\t\tsetQueryParam('query', q);\n\t\t\t\tsetQueryParam('page', 1);\n\t\t\t\tonSearch(q, 1);\n\t\t\t}\n\t\t});\n\t\t\n\t\tinput.addEventListener('focus', function () {\n\t\t\tshowFixedSuggestionsIfEmpty();\n\t\t});\n\n\t\tinput.addEventListener('keydown', function (e) {\n\t\t\tif (e.key === 'Enter') {\n\t\t\t\te.preventDefault();\n\t\t\t\tform.dispatchEvent(new Event('submit'));\n\t\t\t\tbox.innerHTML = \"\";\n\t\t\t\tbox.classList.remove(\"active\");\n\t\t\t}\n\t\t});\n\n\t\tinput.addEventListener(\"keyup\", function () {\n\t\t\tconst q = this.value.trim();\n\t\t\tif (q === \"\") {\n\t\t\t\tclearTimeout(autocompleteTimer);\n\t\t\t\tshowFixedSuggestionsIfEmpty();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t\/\/ Debounce API calls\n\t\t\tclearTimeout(autocompleteTimer);\n\t\t\tconst currentValue = q;\n\t\t\tautocompleteTimer = setTimeout(() => {\n\t\t\t\trunAutocomplete(currentValue);\n\t\t\t}, 150);\n\t\t});\n\t}\n\n\tfunction initPaginationHandlers(onSearch) {\n\t\tconst pagination = document.querySelector('.pagination');\n\t\tif (!pagination) return;\n\n\t\tpagination.addEventListener('click', function (e) {\n\t\t\tconst target = e.target;\n\t\t\tif (target.tagName.toLowerCase() === 'a' && target.dataset.page) {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst page = parseInt(target.dataset.page, 10) || 1;\n\t\t\t\tconst input = document.getElementById('result-search-input');\n\t\t\t\tconst q = input ? input.value.trim() : '';\n\t\t\t\tif (q !== '') {\n\t\t\t\t\tsetQueryParam('page', page);\n\t\t\t\t\tonSearch(q, page, 'standort');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t\/\/ --- Main search ---\n\tfunction doSearch(query, page = 1, mode = 'universal') {\n\t\tconst resultsContainer    = document.querySelector('.result-universal-results');\n\t\tconst paginationContainer = document.querySelector('.pagination');\n\n\t\tif (!resultsContainer || query === '') return;\n\n\t\tconst kanton = detectKanton(query);\n\t\tresultsContainer.classList.add('searching');\n\n\t\tconst params = {\n\t\t\tq: query,\n\t\t\tpage,\n\t\t\tper_page: 10,\n\t\t};\n\n\t\tif (mode === 'standort') {\n\t\t\tparams.search_only = 'standort';\n\t\t}\n\n\t\taxios.get(BESTATTER_SEARCH_ENDPOINT, { params })\n\t\t\t.then((response) => {\n\t\t\t\tconst data      = response.data || {};\n\t\t\t\tconst sData     = data.standort || {};\n\t\t\t\tconst fData     = data.faqs || {};\n\t\t\t\tconst standorte = sData.results || [];\n\t\t\t\tconst faqs      = fData.results || [];\n\n\t\t\t\tlet html = '';\n\n\t\t\t\t\/\/ 1. Standort results\n\t\t\t\thtml += renderStandortCards(standorte, kanton, mode === 'standort');\n\n\t\t\t\t\/\/ 2. \"Mehr Unternehmen\" in universal mode\n\t\t\t\tif (mode === 'universal' && sData.total > params.per_page) {\n\t\t\t\t\tconst baseUrl = window.location.origin + window.location.pathname;\n\t\t\t\t\tconst link    = baseUrl + '?query=' + encodeURIComponent(query) + '&search_only=standort';\n\n\t\t\t\t\thtml += '<a class=\"link-btn px-4 mt-3 d-inline-block\" href=\"' + link + '\">' + MORE_COMPANIES_LABEL + '<\/a>';\n\t\t\t\t}\n\n\t\t\t\t\/\/ 3. FAQs (only in universal mode)\n\t\t\t\tif (mode === 'universal') {\n\t\t\t\t\thtml += renderFaqs(faqs);\n\t\t\t\t}\n\n\t\t\t\tif (standorte.length === 0 && faqs.length === 0) {\n\t\t\t\t\thtml += '<p class=\"mt-4\">Nothing found. Please try another search.<\/p>';\n\t\t\t\t}\n\n\t\t\t\tresultsContainer.innerHTML = html;\n\t\t\t\tresultsContainer.classList.remove('searching');\n\n\t\t\t\tif (paginationContainer) {\n\t\t\t\t\tif (mode === 'standort') {\n\t\t\t\t\t\tpaginationContainer.innerHTML = renderPagination(sData.total, data.page, data.per_page);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpaginationContainer.innerHTML = '';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\tjQuery('.search-bar-searchsection-footer form input').val(query);\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Search error', error);\n\t\t\t\tresultsContainer.innerHTML = '<p>Fehler bei der Suche.<\/p>';\n\t\t\t\tresultsContainer.classList.remove('searching');\n\t\t\t\tif (paginationContainer) paginationContainer.innerHTML = '';\n\t\t\t});\n\t}\n\n\t\/\/ --- Autocomplete rendering ---\n\tfunction renderAutocomplete(box, titles) {\n\t\tif (!titles || !titles.length) {\n\t\t\tbox.innerHTML = \"\";\n\t\t\tbox.classList.remove(\"active\");\n\t\t\treturn;\n\t\t}\n\n\t\tlet html = \"<ul>\";\n\t\ttitles.forEach((title) => {\n\t\t\thtml += '<li class=\"autocomplete-item\" data-value=\"' + title + '\">' + title + '<\/li>';\n\t\t});\n\t\thtml += \"<\/ul>\";\n\n\t\tbox.innerHTML = html;\n\t\tbox.classList.add(\"active\");\n\n\t\tbox.querySelectorAll(\".autocomplete-item\").forEach((li) => {\n\t\t\tli.addEventListener(\"click\", function () {\n\t\t\t\tconst val = this.getAttribute(\"data-value\");\n\t\t\t\tselectSuggestion(val);\n\t\t\t});\n\t\t});\n\t}\n\n\t\/\/ --- Autocomplete main ---\n\tfunction runAutocomplete(searchText) {\n\t\tconst input = document.getElementById('result-search-input');\n\t\tconst box   = document.querySelector(\"#result-search-form .autocomplete-box\");\n\t\tif (!input || !box) return;\n\n\t\tconst q = searchText.trim();\n\t\tif (!q) {\n\t\t\tbox.innerHTML = \"\";\n\t\t\tbox.classList.remove(\"active\");\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/ 1) From cache\n\t\tif (autocompleteCache[q]) {\n\t\t\trenderAutocomplete(box, autocompleteCache[q]);\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/ 2) Cancel previous request\n\t\tif (autocompleteController) {\n\t\t\tautocompleteController.abort();\n\t\t}\n\n\t\tconst controller = new AbortController();\n\t\tautocompleteController = controller;\n\n\t\tconst requestId = ++autocompleteLastRequestId;\n\t\tcurrentLoadingRequestId = requestId;\n\t\tsetButtonLoading(true, requestId);\n\n\t\taxios.get(BESTATTER_AUTOCOMPLETE_ENDPOINT, {\n\t\t\tparams: { q, limit: 10 },\n\t\t\tsignal: controller.signal,\n\t\t})\n\t\t.then((response) => {\n\t\t\t\/\/ Ignore outdated responses\n\t\t\tif (requestId < autocompleteLastHandledId) return;\n\t\t\tautocompleteLastHandledId = requestId;\n\n\t\t\tlet titles = [];\n\t\t\tif (response.data) {\n\t\t\t\tif (response.data.titles) {\n\t\t\t\t\ttitles = response.data.titles;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tautocompleteCache[q] = titles;\n\t\t\trenderAutocomplete(box, titles);\n\t\t\tsetButtonLoading(false, requestId);\n\t\t})\n\t\t.catch((error) => {\n\t\t\tsetButtonLoading(false, requestId);\n\t\t\tif (\n\t\t\t\t(controller.signal && controller.signal.aborted) ||\n\t\t\t\terror.name === \"CanceledError\" ||\n\t\t\t\terror.code === \"ERR_CANCELED\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconsole.error(\"Autocomplete error:\", error);\n\t\t});\n\t}\n\n\tfunction selectSuggestion(text) {\n\t\tconst input = document.getElementById('result-search-input');\n\t\tconst box   = document.querySelector(\"#result-search-form .autocomplete-box\");\n\t\tif (!input || !box) return;\n\n\t\tinput.value = text;\n\t\tbox.innerHTML = \"\";\n\t\tbox.classList.remove(\"active\");\n\n\t\tsetQueryParam('query', text);\n\t\tsetQueryParam('page', 1);\n\n\t\tif (IS_SEARCH_ONLY) {\n\t\t\tdoSearch(text, 1, 'standort');\n\t\t} else {\n\t\t\tdoSearch(text, 1);\n\t\t}\n\t}\n\t\t\t\n\tfunction showFixedSuggestionsIfEmpty() {\n\t\tif (!FIXED_SUGGESTIONS || typeof FIXED_SUGGESTIONS !== \"object\" || Object.keys(FIXED_SUGGESTIONS).length === 0) return;\n\n\t\tconst input = document.getElementById(\"result-search-input\");\n\t\tconst box   = document.querySelector(\"#result-search-form .autocomplete-box\");\n\t\tif (!input || !box) return;\n\n\t\tconst q = input.value.trim();\n\t\tif (q !== \"\") return;\n\n\t\t\/\/ No spinner for fixed suggestions\n\t\trenderAutocomplete(box, FIXED_SUGGESTIONS[lang]);\n\t}\n\n\t\/\/ --- Entry point ---\n\tfunction fullSearch() {\n\t\tconst initialQuery = getQueryParam('query') || '';\n\t\tconst initialPage  = parseInt(getQueryParam('page') || '1', 10);\n\n\t\tinitSearchBar(initialQuery);\n\n\t\tif (IS_SEARCH_ONLY) {\n\t\t\tattachSearchHandlers(function (q, page) {\n\t\t\t\tdoSearch(q, page, 'standort');\n\t\t\t});\n\t\t\tinitPaginationHandlers(function (q, page) {\n\t\t\t\tdoSearch(q, page, 'standort');\n\t\t\t});\n\t\t\tif (initialQuery) {\n\t\t\t\tdoSearch(initialQuery, initialPage, 'standort');\n\t\t\t}\n\t\t} else {\n\t\t\tattachSearchHandlers(function (q, page) {\n\t\t\t\tdoSearch(q, page, 'universal');\n\t\t\t});\n\t\t\t\/\/ No pagination in universal mode\n\t\t\tif (initialQuery) {\n\t\t\t\tdoSearch(initialQuery, initialPage, 'universal');\n\t\t\t}\n\t\t}\n\t}\n\n\tdocument.addEventListener('DOMContentLoaded', fullSearch);\n\n\t\/\/ Close autocomplete when clicking outside\n\tdocument.addEventListener(\"click\", function (e) {\n\t\tconst input = document.getElementById('result-search-input');\n\t\tconst box   = document.querySelector(\"#result-search-form .autocomplete-box\");\n\n\t\tif (!box || !input) return;\n\n\t\tif (!box.contains(e.target) && e.target !== input) {\n\t\t\tbox.innerHTML = \"\";\n\t\t\tbox.classList.remove(\"active\");\n\t\t}\n\t});\n<\/script>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"ep_latitude":0,"ep_longitude":0,"ep_address":"","ep_exclude_from_search":false,"_vp_format_video_url":"","_vp_image_focal_point":[],"footnotes":""},"class_list":["post-4178","page","type-page","status-publish","hentry"],"acf":{"font":"","background_shape":"type3"},"_links":{"self":[{"href":"https:\/\/bestatter.ch\/en\/wp-json\/wp\/v2\/pages\/4178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bestatter.ch\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bestatter.ch\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bestatter.ch\/en\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/bestatter.ch\/en\/wp-json\/wp\/v2\/comments?post=4178"}],"version-history":[{"count":0,"href":"https:\/\/bestatter.ch\/en\/wp-json\/wp\/v2\/pages\/4178\/revisions"}],"wp:attachment":[{"href":"https:\/\/bestatter.ch\/en\/wp-json\/wp\/v2\/media?parent=4178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}