Frequently Asked Questions

yLinks = () => { qsa('.copyLink').forEach(btn => { btn.addEventListener('click', async () => { const anchor = btn.getAttribute('data-anchor') || ''; const url = location.origin + location.pathname + anchor; try { await navigator.clipboard.writeText(url); showToast('Link copied'); } catch { const t = document.createElement('textarea'); t.value = url; document.body.appendChild(t); t.select(); document.execCommand('copy'); t.remove(); showToast('Link copied'); } const id = anchor.replace('#', ''); const details = document.getElementById(id); if (details && !details.open) details.open = true; history.replaceState(null, '', anchor); }); }); }; const normalize = (s) => (s || '').toLowerCase().normalize('NFKD').replace(/[\u0300-\u036f]/g, ''); const initSearch = () => { const input = qs('#faqSearch'); const list = qs('#faqList'); const items = qsa('details', list); const nores = qs('#noResults'); const applyQuery = (q) => { const nq = normalize(q); let visible = 0; items.forEach(d => { const text = d.textContent || ''; const hit = normalize(text).includes(nq); d.classList.toggle('hidden', nq.length > 0 && !hit); if (hit) visible++; }); nores.classList.toggle('hidden', visible !== 0); }; const urlParams = new URLSearchParams(location.search); const q = urlParams.get('q') || ''; if (q) { input.value = q; applyQuery(q); } input.addEventListener('input', (e) => { const value = e.target.value; applyQuery(value); const sp = new URLSearchParams(location.search); if (value) sp.set('q', value); else sp.delete('q'); const newUrl = location.pathname + (sp.toString() ? '?' + sp.toString() : '') + location.hash; history.replaceState(null, '', newUrl); }); window.addEventListener('keydown', (e) => { if (e.key === '/' && document.activeElement !== input) { e.preventDefault(); input.focus(); } }); }; const openHashTarget = () => { if (!location.hash) return; const el = document.getElementById(location.hash.replace('#', '')); if (el && el.tagName.toLowerCase() === 'details') { el.open = true; el.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }; const bindDetailsHash = () => { qsa('#faqList details').forEach(d => { d.addEventListener('toggle', () => { if (d.open) history.replaceState(null, '', '#' + d.id); }); }); }; const initConsent = () => { const box = qs('#cookieBox'); try { const saved = JSON.parse(localStorage.getItem('cg_consent') || 'null'); if (!saved || !saved.status) { box.classList.remove('hidden'); } } catch { box.classList.remove('hidden'); } qs('#cookieAccept').addEventListener('click', () => { localStorage.setItem('cg_consent', JSON.stringify({ status: 'granted', ts: Date.now() })); box.classList.add('hidden'); showToast('Cookies accepted'); }); qs('#cookieDecline').addEventListener('click', () => { localStorage.setItem('cg_consent', JSON.stringify({ status: 'denied', ts: Date.now() })); box.classList.add('hidden'); showToast('Cookies declined'); }); }; const initAskModal = () => { const dlg = qs('#askModal'); const openBtn = qs('#openAsk'); const closeBtn = qs('#closeAsk'); const form = qs('#askForm'); const nameEl = qs('#askName'); const emailEl = qs('#askEmail'); const msgEl = qs('#askMsg'); const status = qs('#askStatus'); const validate = () => { let ok = true; const nameOk = (nameEl.value || '').trim().length >= 2; const emailOk = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test((emailEl.value || '').trim()); const msgOk = (msgEl.value || '').trim().length >= 10; qs('#errName').classList.toggle('hidden', nameOk); qs('#errEmail').classList.toggle('hidden', emailOk); qs('#errMsg').classList.toggle('hidden', msgOk); if (!nameOk || !emailOk || !msgOk) ok = false; return ok; }; openBtn.addEventListener('click', () => dlg.showModal()); closeBtn.addEventListener('click', () => dlg.close()); [nameEl, emailEl, msgEl].forEach(i => i.addEventListener('input', validate)); form.addEventListener('submit', (e) => { e.preventDefault(); if (!validate() || !qs('#askAgree').checked) { validate(); showToast('Please fix form errors'); return; } status.classList.remove('hidden'); status.textContent = 'Sending...'; setTimeout(() => { status.textContent = 'Thank you! Your question has been received. We usually reply within 24 hours.'; showToast('Question sent'); setTimeout(() => dlg.close(), 1000); form.reset(); status.classList.add('hidden'); qs('#errName').classList.add('hidden'); qs('#errEmail').classList.add('hidden'); qs('#errMsg').classList.add('hidden'); }, 700); }); }; const initQuickTheme = () => { qs('#toggleThemeQuick')?.addEventListener('click', () => { const cur = localStorage.getItem('theme') || 'system'; const next = cur === 'dark' ? 'light' : 'dark'; localStorage.setItem('theme', next); const html = document.documentElement; html.classList.toggle('dark', next === 'dark'); }); }; document.addEventListener('DOMContentLoaded', () => { injectPartials(); startQATimer(); initCopyLinks(); initSearch(); initConsent(); initAskModal(); initQuickTheme(); bindDetailsHash(); openHashTarget(); }); window.addEventListener('hashchange', openHashTarget);