var EW = { isEmail: function(email) { let re = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i; return re.test(email); }, isUrl: function(url) { let re =/^(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)$/i; return re.test(url); }, getUrlParameter: function(sParam) { var sPageURL = decodeURIComponent(window.location.search.substring(1)), sURLVariables = sPageURL.split('&'), sParameterName, i; for (i = 0; i < sURLVariables.length; i++) { sParameterName = sURLVariables[i].split('='); if (sParameterName[0] === sParam) { return sParameterName[1] === undefined ? !0 : sParameterName[1] } } }, track: function(names) { let _saveOrigin = this.getUrlParameter('save_origin') || save_origin; try{_saveOrigin = JSON.parse(_saveOrigin)}catch(e){_saveOrigin = false;}; names.forEach(n => { let param = this.getUrlParameter(n); if (param) { if (this.storage.getItem(n) && _saveOrigin) { console.log(n, 'origin saved'); } else { console.log(n, 'origin overwritten'); this.setItem(n, param); } } }); }, storage: (function() { var uid = new Date; var storage; var result; try { if (tracking_per_session) { (storage = window.sessionStorage).setItem(uid, uid); result = storage.getItem(uid) == uid; storage.removeItem(uid); return result && storage; } else { (storage = window.localStorage).setItem(uid, uid); result = storage.getItem(uid) == uid; storage.removeItem(uid); return result && storage; } } catch (exception) {} }()), removeItem: function(name) { if (this.storage) this.storage.removeItem(name); }, setItem: function(name, value) { if (this.storage) this.storage.setItem(name, value); }, getItem: function(name) { if (!this.storage) return null; let _saveOrigin = this.getUrlParameter('save_origin') || save_origin; try{_saveOrigin = JSON.parse(_saveOrigin)}catch(e){_saveOrigin = false;}; let v = this.getUrlParameter(name); if (v) { if (!this.storage.getItem(name) || !_saveOrigin) { this.setItem(name, v); } } return this.storage.getItem(name); }, storePayload: function(payload) { Object.keys(payload).forEach(key => { if (!payload.hasOwnProperty(key)) return; this.setItem(key, payload[key]); }) }, Roles: { Subscriber: 1, /* SomethingElse: 2, YetAnother: 4, SomethingEntirelyDifferent: 8 */ }, setRoles: function(roles) { if (this.storage) this.storage.setItem('roles', roles); }, hasRole: function(role, callback, softEnforcement) { role = role || this.Roles.Subscriber; if (!this.storage && softEnforcement) return true; let roles; if (this.storage) roles = this.storage.getItem('roles'); let bypass = this.getUrlParameter('utm_medium') === 'email'; if (!bypass && (!roles || !(role & roles))){ if (typeof(callback) == 'function') callback.apply(this); else if (this.isUrl(callback)) window.location.href = callback; return false; } return true; }, singleVisit: function(alternateUrl) { let visited = false; if (this.storage) visited = this.storage.getItem(window.location.href); if (visited) window.location.href = alternateUrl; else this.setItem(window.location.href, 'true'); }, transformUrl: function(sources, targets, url, defaultUrl) { url = url.replace(/&/g, "&"); defaultUrl = defaultUrl.replace(/&/g, "&"); let qs = ''; let requirementsMet = true; if (sources.length !== targets.length) requirementsMet = false; sources.forEach((s, i) => { if (!this.getItem(s.key) && s.required) requirementsMet = false; if (this.getItem(s.key)) { qs += targets[i] + '=' + this.getItem(s.key); if (i !== sources.length - 1) qs += '&'; } }); if (!requirementsMet) return defaultUrl; if (url.indexOf('?')!=-1) url += '&' + qs; else url += '?' + qs; return url; } }