window.Phase3SeoExitIntentConfig = {"endpoint":"https://phase3.biz/core/p3nurture/api/subscribe.cfm","cookieName":"phase3_seo_challenge_popup_complete","submissionCookieDays":365,"noThanksCookieDays":180,"dismissCookieDays":7,"activationDelayMs":900,"source":"phase3.net | 30-Day SEO Challenge | Exit Intent","campaign":"seo_5_minutes_30_days","autoShow":false,"useCookie":true}; /* * Phase 3 30-Day SEO Challenge exit-intent popup * Requires the configuration object output by /includes/phase3-seo-exit-intent.php. */ (function (window, document) { 'use strict'; var config = Object.assign({ endpoint: 'https://phase3.biz/REPLACE-WITH-YOUR-COLDFUSION-ENDPOINT.cfm', cookieName: 'phase3_seo_challenge_popup_complete', submissionCookieDays: 365, noThanksCookieDays: 180, dismissCookieDays: 7, activationDelayMs: 900, source: 'phase3.net | 30-Day SEO Challenge | Exit Intent', campaign: 'seo_5_minutes_30_days', autoShow: false, useCookie: true }, window.Phase3SeoExitIntentConfig || {}); var popupId = 'phase3-seo-exit-intent'; var canDisplay = !config.useCookie || (!readCookie(config.cookieName) && !window.sessionStorage.getItem(popupId + '-shown')); var hasShown = false; var previousActiveElement = null; if (!canDisplay) { return; } function readCookie(name) { var match = document.cookie.match(new RegExp('(?:^|; )' + escapeRegExp(name) + '=([^;]*)')); return match ? decodeURIComponent(match[1]) : ''; } function escapeRegExp(value) { return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } function writeCookie(value, days) { if (!config.useCookie) { return; } var expires = new Date(Date.now() + (days * 864e5)).toUTCString(); var secure = window.location.protocol === 'https:' ? '; Secure' : ''; document.cookie = config.cookieName + '=' + encodeURIComponent(value) + '; expires=' + expires + '; max-age=' + Math.floor(days * 86400) + '; path=/; SameSite=Lax' + secure; } function injectPopup() { if (document.getElementById(popupId)) { return; } var container = document.createElement('div'); container.id = popupId; container.className = 'p3-seo-popup'; container.setAttribute('aria-hidden', 'true'); container.innerHTML = [ '', '
', '' ].join(''); document.body.appendChild(container); bindPopupEvents(container); } function openPopup() { if (hasShown || (config.useCookie && readCookie(config.cookieName))) { return; } injectPopup(); var popup = document.getElementById(popupId); previousActiveElement = document.activeElement; hasShown = true; if (config.useCookie) { window.sessionStorage.setItem(popupId + '-shown', '1'); } popup.classList.add('p3-is-open'); popup.setAttribute('aria-hidden', 'false'); window.setTimeout(function () { var firstName = popup.querySelector('#p3-seo-first-name'); if (firstName) { firstName.focus(); } }, 80); } function closePopup() { var popup = document.getElementById(popupId); if (!popup) { return; } popup.classList.remove('p3-is-open'); popup.setAttribute('aria-hidden', 'true'); if (previousActiveElement && typeof previousActiveElement.focus === 'function') { previousActiveElement.focus(); } } function bindPopupEvents(popup) { popup.addEventListener('click', function (event) { var dismissButton = event.target.closest('[data-p3-dismiss]'); if (!dismissButton) { return; } var reason = dismissButton.getAttribute('data-p3-dismiss'); if (reason === 'no-thanks') { writeCookie('no-thanks', config.noThanksCookieDays); } else if (reason === 'close' || reason === 'overlay') { writeCookie('dismissed', config.dismissCookieDays); } closePopup(); }); document.addEventListener('keydown', function (event) { if (event.key === 'Escape' && popup.classList.contains('p3-is-open')) { writeCookie('dismissed', config.dismissCookieDays); closePopup(); } }); popup.querySelector('.p3-seo-popup__form').addEventListener('submit', function (event) { event.preventDefault(); submitForm(popup); }); } function submitForm(popup) { var form = popup.querySelector('.p3-seo-popup__form'); var submitButton = form.querySelector('.p3-seo-popup__submit'); var error = form.querySelector('.p3-seo-popup__error'); var firstName = form.elements.first_name.value.trim(); var lastName = form.elements.last_name.value.trim(); var email = form.elements.email.value.trim(); error.classList.remove('p3-is-visible'); error.textContent = ''; if (!firstName || !lastName || !email) { showError(error, 'Please enter your first name, last name, and email address.'); return; } if (!isValidEmail(email)) { showError(error, 'Please enter a valid email address.'); return; } if (config.endpoint.indexOf('REPLACE-WITH-YOUR-COLDFUSION-ENDPOINT') !== -1) { showError(error, 'The form destination has not been configured yet. Please contact Phase 3 for help.'); return; } submitButton.disabled = true; submitButton.textContent = 'Signing you up…'; var payload = new URLSearchParams({ first_name: firstName, last_name: lastName, email: email, consent: 'true', consent_text: 'Agreed to receive emails from Phase 3; may opt out at any time.', source: config.source, campaign: config.campaign, page_url: window.location.href, referrer: document.referrer || '' }); fetch(config.endpoint, { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }, body: payload.toString(), keepalive: true }).then(function () { finishSubmission(popup); }).catch(function () { // With mode:no-cors the browser cannot expose a cross-origin response. A network failure // still receives a thank-you state so a valid sign-up is not interrupted by UI uncertainty. finishSubmission(popup); }); } function finishSubmission(popup) { writeCookie('submitted', config.submissionCookieDays); popup.querySelector('.p3-seo-popup__content').style.display = 'none'; popup.querySelector('.p3-seo-popup__close').style.display = 'none'; popup.querySelector('.p3-seo-popup__thank-you').classList.add('p3-is-visible'); } function showError(errorElement, message) { errorElement.textContent = message; errorElement.classList.add('p3-is-visible'); errorElement.focus(); } function isValidEmail(email) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); } function enableExitIntent() { var listener = function (event) { if (event.clientY <= 0 && event.relatedTarget === null) { document.removeEventListener('mouseout', listener); openPopup(); } }; document.addEventListener('mouseout', listener); } function startPopup() { if (config.autoShow) { openPopup(); return; } enableExitIntent(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', function () { window.setTimeout(startPopup, config.activationDelayMs); }); } else { window.setTimeout(startPopup, config.activationDelayMs); } }(window, document));