— End. ========================================================= */ (function () { const PANEL_SEL = '.event-panel'; const WRAP_SEL = '.event-panel-wrap'; const TITLE_SEL = '.elementor-heading-title, .elementor-widget-heading h1, .elementor-widget-heading h2, .elementor-widget-heading h3, .elementor-widget-heading h4, .elementor-widget-heading h5, .elementor-widget-heading h6'; const BODY_SEL = '.elementor-widget-text-editor .elementor-widget-container, .elementor-text-editor, .elementor-widget-text-editor'; const CONNECTION_URL = 'https://link.greatvictory.org/'; const APP_URL = 'https://mobi.pushpayapps.com/app/greatvictory'; let lastActive = null; let previousScrollBehavior = ''; function escapeHTML(value) { return String(value || '') .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } function getPanelData(panel) { const title = (panel.querySelector(TITLE_SEL)?.textContent || '').trim(); const bodyEl = panel.querySelector(BODY_SEL); const bodyHTML = bodyEl ? bodyEl.innerHTML : ''; return { title: title || 'Upcoming Event', bodyHTML: bodyHTML || '' }; } function getWrapper(panel) { return panel.closest(WRAP_SEL) || panel.parentElement; } function enhancePanels() { const panels = [...document.querySelectorAll(PANEL_SEL)]; panels.forEach((panel, index) => { const wrapper = getWrapper(panel); if (!wrapper) return; wrapper.classList.add('gv2-event-card'); if (!wrapper.hasAttribute('tabindex')) wrapper.setAttribute('tabindex', '0'); wrapper.setAttribute('role', 'button'); wrapper.setAttribute('aria-haspopup', 'dialog'); const { title } = getPanelData(panel); wrapper.setAttribute('aria-label', `Open event details: ${title}`); if (!wrapper.querySelector(':scope > .gv2-card-meta')) { const meta = document.createElement('div'); meta.className = 'gv2-card-meta'; meta.setAttribute('aria-hidden', 'true'); meta.innerHTML = `
`; wrapper.appendChild(meta); } }); } function ensureModal() { let modal = document.getElementById('gv2-modal'); if (modal) return modal; modal = document.createElement('div'); modal.id = 'gv2-modal'; modal.className = 'gv2-modal'; modal.innerHTML = `
`; document.body.appendChild(modal); return modal; } function openModal(panel) { const modal = ensureModal(); const { title, bodyHTML } = getPanelData(panel); modal.querySelector('.gv2-modal__title').textContent = title; modal.querySelector('.gv2-modal__body').innerHTML = bodyHTML; modal.querySelectorAll('.elementor-invisible').forEach((el) => { el.classList.remove('elementor-invisible'); }); lastActive = document.activeElement instanceof HTMLElement ? document.activeElement : null; previousScrollBehavior = document.documentElement.style.scrollBehavior || ''; document.documentElement.style.scrollBehavior = 'auto'; modal.classList.remove('gv2-closing'); modal.classList.add('gv2-open'); document.body.classList.add('gv2-modal-open'); const closeButton = modal.querySelector('[data-gv2-close]'); requestAnimationFrame(() => { try { closeButton.focus({ preventScroll: true }); } catch { closeButton.focus(); } }); } function closeModal() { const modal = document.getElementById('gv2-modal'); if (!modal || !modal.classList.contains('gv2-open')) return; modal.classList.add('gv2-closing'); let finished = false; function finish() { if (finished) return; finished = true; modal.classList.remove('gv2-open', 'gv2-closing'); document.body.classList.remove('gv2-modal-open'); document.documentElement.style.scrollBehavior = previousScrollBehavior; if (lastActive && document.body.contains(lastActive)) { try { lastActive.focus({ preventScroll: true }); } catch { lastActive.focus(); } } } const fallback = window.setTimeout(finish, 520); modal.addEventListener('transitionend', function onEnd(event) { if (!modal.classList.contains('gv2-closing')) return; if (event.target.matches('.gv2-modal__drawer, .gv2-modal__backdrop')) { modal.removeEventListener('transitionend', onEnd, true); window.clearTimeout(fallback); finish(); } }, true); } function panelFromTarget(target) { const directPanel = target.closest(PANEL_SEL); if (directPanel) return directPanel; const wrapper = target.closest(WRAP_SEL); return wrapper ? wrapper.querySelector(PANEL_SEL) : null; } /* Stop Elementor links inside the card from taking over the click. */ document.addEventListener('pointerdown', function (event) { const wrapper = event.target.closest(WRAP_SEL); if (!wrapper) return; const linked = event.target.closest('a, [data-elementor-open-lightbox], [onclick]'); if (linked && wrapper.contains(linked)) { event.preventDefault(); event.stopPropagation(); event.stopImmediatePropagation(); } }, true); /* Open from poster OR injected footer. */ document.addEventListener('click', function (event) { if (event.target.closest('#gv2-modal')) return; const panel = panelFromTarget(event.target); if (!panel) return; event.preventDefault(); event.stopPropagation(); event.stopImmediatePropagation(); openModal(panel); }, true); /* Keyboard support for the wrapper cards. */ document.addEventListener('keydown', function (event) { const modal = document.getElementById('gv2-modal'); if (modal && modal.classList.contains('gv2-open')) { if (event.key === 'Escape') { event.preventDefault(); closeModal(); return; } if (event.key === 'Tab') { const drawer = modal.querySelector('.gv2-modal__drawer'); const focusables = drawer.querySelectorAll( 'a[href], button, textarea, input, select, [tabindex]:not([tabindex="-1"])' ); if (!focusables.length) return; const first = focusables[0]; const last = focusables[focusables.length - 1]; if (event.shiftKey && document.activeElement === first) { last.focus({ preventScroll: true }); event.preventDefault(); } else if (!event.shiftKey && document.activeElement === last) { first.focus({ preventScroll: true }); event.preventDefault(); } } return; } const wrapper = event.target.closest(WRAP_SEL); if (!wrapper || event.target !== wrapper) return; if (event.key === 'Enter' || event.key === ' ') { const panel = wrapper.querySelector(PANEL_SEL); if (!panel) return; event.preventDefault(); openModal(panel); } }); document.addEventListener('click', function (event) { if ( event.target.closest('.gv2-modal__backdrop') || event.target.closest('[data-gv2-close]') ) { event.preventDefault(); closeModal(); } }, true); /* Smooth internal page jumps. */ document.querySelectorAll('.gv-events-c2-page a[href^="#"]').forEach((link) => { link.addEventListener('click', function (event) { const target = document.querySelector(link.getAttribute('href')); if (!target) return; event.preventDefault(); target.scrollIntoView({ behavior: window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth', block: 'start' }); }); }); /* Elementor may finish parts of the page asynchronously. */ enhancePanels(); window.setTimeout(enhancePanels, 300); window.setTimeout(enhancePanels, 1200); const observer = new MutationObserver(() => { enhancePanels(); }); observer.observe(document.body, { childList: true, subtree: true }); window.__gv2Close = closeModal; })();