Sign up for the Daily Briefing
Get the morning's top news in this easy-to-read newsletter to help navigate your day.
We're sorry, an error occured while subscribing to this newsletter. Please try again later.
You are now signed up for
Thanks for already signing up for
the Daily Briefing newsletter.
Don't forget to register for FREE. Add a password to your account to access exclusive perks and content.
Create your account
const _newsletterName = $('#newsletterName').val();
const _emailRegEx = /(^$)|(^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$)/;
let _siteCode = '';
let _hostUrl = '';
let _domain = '';
let _listCode = '';
let customVariablesFromEvent = '';
// event handlers
const handleFieldFocus = (e) => {
$(e.currentTarget).parent().addClass('has-focus');
};
const handleFieldKeyPresss = (e) => {
const field = $(e.currentTarget);
const fieldParent = field.parent();
const keyCode = e.keyCode || e.which;
const keyValue = [8,9,46].indexOf(keyCode) === -1 ? String.fromCharCode(keyCode) : '';
const newValue = `${field.val()}${keyValue}`.trim();
fieldParent.removeClass('has-error');
if (field.attr('id') === 'email' && newValue && _emailRegEx.test(newValue)) {
$('form').addClass('form-valid');
$('#submitForm').removeAttr('disabled');
} else {
$('form').removeClass('form-valid');
$('#submitForm').attr('disabled', 'disabled');
}
};
const handleFieldKeyDown = (e) => {
const field = $(e.currentTarget);
const keyCode = e.keyCode || e.which;
// Remove the error indicator when the user presses the backspace or delete keys
if (field.val().length && (keyCode === 8 || keyCode === 46)) {
$(e.currentTarget).parent().removeClass('has-error');
setTimeout(() => { handleFieldKeyPresss(e); }, 1);
}
};
const handleFieldBlur = (e) => {
const field = $(e.currentTarget)
const fieldParent = field.parent();
field.parent().removeClass('has-focus');
if (field.val().trim()) {
fieldParent.addClass('has-value');
} else {
fieldParent.removeClass('has-value');
}
validateForm();
};
const handleFormSubmit = async (e) => {
const form = $(e.currentTarget);
const email = form.find('#email').val();
const submitForm = form.find('#submitForm');
const loadWrapper = $('.loader-wrapper');
const payload = {
request: {
email,
newsletters: [
{
listCode: _listCode,
isSubscribed: true
}
]
}
};
submitForm.css('opacity', 0.5);
loadWrapper.fadeIn();
const url = `https://user.${_domain}/${_siteCode}-GUP-NWSLTRMNGMNT/user/newsletters/`;
const response = await fetch(url, {method: 'POST', body: JSON.stringify(payload)});
const userNewsletterResponse = await response.json();
const { iframeId, displayMode} = window.TPParam.params;
loadWrapper.fadeOut('fast');
$('form').hide();
if (userNewsletterResponse && userNewsletterResponse.meta && userNewsletterResponse.meta.status === 200) {
$('#successWrapper').show();
$('#viewAllNewsletters').attr('href', `https://profile.${_domain}/newsletters/manage/?email=${email}`);
$('#signedUpBottomMessage').show();
// Notify the parent that the user has signed up to the newsletter so it can flag the user as signed up.
window.parent.postMessage(`{"sender":"${iframeId}","displayMode":"${displayMode}","recipient":"opener","event":"customEvent","params":{"eventName":"tracking","params":{"category":"newsletter","action":"signup","label":"success","type":"newsletter-signup","moduleName":"newsletter-modal","clientAction":"newsletterAnon|signup"}}}`, _hostUrl);
} else {
$('#submitErrorMessage').show();
window.parent.postMessage(`{"sender":"${iframeId}","displayMode":"${displayMode}","recipient":"opener","event":"customEvent","params":{"eventName":"tracking","params":{"category":"newsletter","action":"signup","label":"fail: ${userNewsletterResponse.meta.message}","type":"newsletter-signup","moduleName":"newsletter-modal","clientAction":"newsletterAnon|signup"}}}`, _hostUrl);
}
};
// validators
const validateField = (fieldSelector, errorMessageSelector, errorMessge, regExValidator, regValidatorErrorMessage) => {
const field = $(fieldSelector);
if (field.val()) {
if (regExValidator && !regExValidator.test(field.val())) {
// field value failed regular expression validation
field.parent().addClass('has-error');
$(errorMessageSelector + ' div').html(regValidatorErrorMessage || errorMessge);
return false;
}
// field value is valid
field.parent().removeClass('has-error');
return true;
}
// field is invalid
field.parent().addClass('has-error');
$(errorMessageSelector + ' div').html(errorMessge);
return false;
}
const validateForm = () => {
const emailValid = validateField('#email', '#emailErrorMessage', 'Email required', _emailRegEx, 'Please enter a valid email address');
if (emailValid) {
$('form').addClass('form-valid');
$('#submitForm').removeAttr('disabled');
} else {
$('form').removeClass('form-valid');
$('#submitForm').attr('disabled', 'disabled');
}
};
// fetch data
const fetchNewsletters = async() => {
let userNewsletters, userNewslettersError;
try {
if (_domain && _siteCode) {
const url = `https://user.${_domain}/${_siteCode}-GUP-NWSLTRMNGMNT/user/newsletters/`;
const response = await fetch(url);
const userNewsletterResponse = await response.json();
if (userNewsletterResponse && userNewsletterResponse.meta && userNewsletterResponse.meta.status === 200) {
userNewsletters = userNewsletterResponse.response.newsletters;
} else {
userNewslettersError = Error('The user was not found or not authorized in current context');
}
}
} catch (error) {
console.error(`newsletter error: ${error}`);
userNewslettersError = error;
}
return [userNewsletters, userNewslettersError];
};
const loadNewsletterInfo = async () => {
const to = setTimeout(() => { $('.loader-wrapper').fadeIn(); }, 1000);
const [newsletters, err] = await fetchNewsletters();
clearTimeout(to);
$('.loader-wrapper').fadeOut('fast');
if (!err) {
const newsletter = newsletters.find(nl => nl.newsletterName.toLowerCase().indexOf(_newsletterName.toLowerCase()) > -1);
_listCode = newsletter && newsletter.listCode;
return newsletter.isSubscribed;
}
return false;
};
// initialize
const initialize = async () => {
const customVariables = window.TPParam.params.customVariables ? JSON.parse(window.TPParam.params.customVariables) : JSON.parse(customVariablesFromEvent);
const { iframeId, displayMode } = window.TPParam.params;
const hostUrl = new URL(customVariables.hostUrl);
_domain = hostUrl.hostname.substring(hostUrl.hostname.lastIndexOf(".", hostUrl.hostname.lastIndexOf(".") - 1) + 1);
_hostUrl = customVariables.hostUrl;
_siteCode = customVariables.siteCode;
if (_domain && _siteCode) {
const isSubscribedToNewsletter = await loadNewsletterInfo();
//trigger the modal open custom event
window.parent.postMessage(`{"sender":"${iframeId}","displayMode":"${displayMode}","recipient":"opener","event":"customEvent","params":{"eventName":"tracking","params":{"category":"newsletter","action":"impression","moduleName":"newsletter-modal","clientAction":"newsletterAnon|modalOpen"}}}`, _hostUrl);
if (!_listCode) {
// close the modal if the newsletter with _newsletterName was not found
$('.modal-close').click();
return;
}
if (isSubscribedToNewsletter) {
// show already signed up message
$('#nowSignedUp').hide();
$('#alreadySignedUp').show();
$('#alreadySignedUpBottomMessage').fadeIn();
$('#createYourAccountLink').attr('href', `https://login.${_domain}/${_siteCode}-GUP/authenticate?success-url=currenturl`);
} else {
// Show the signup form
$('#email').focus(handleFieldFocus).keydown(handleFieldKeyDown).keypress(handleFieldKeyPresss).blur(handleFieldBlur);
$('form').submit(handleFormSubmit).fadeIn();
}
} else {
$('.modal-close').click();
}
};
(() => {
if (window.TPParam.params.customVariables) {
initialize();
} else {
// Before we can initialize we have to wait for the setupCustomVariables event to fire so that window.TPParam.params.customVariables is defined
const handleWindowEvent = async (e) => {
if (e.data && typeof(e.data) === 'string' && e.data.indexOf('{') === 0) {
const data = JSON.parse(e.data);
if (data.sender === window.TPParam.params.iframeId && data.event === 'setupCustomVariables') {
window.removeEventListener('message', handleWindowEvent);
customVariablesFromEvent = data.params;
initialize();
}
}
};
window.addEventListener('message', handleWindowEvent);
}
})();