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));