(function() { var _PRODUCT_CODE = 'QYvSfyqS9468'; var _PERMISSIONS_KEY = '_BEAMER_NOTIFICATIONS_PERMITTED_' + _PRODUCT_CODE; var _FILTER_KEY = '_BEAMER_FILTER_' + _PRODUCT_CODE; var _USER_KEY = '_BEAMER_USER_' + _PRODUCT_CODE; var _FIRSTNAME_KEY = '_BEAMER_FIRSTNAME_' + _PRODUCT_CODE; var _LASTNAME_KEY = '_BEAMER_LASTNAME_' + _PRODUCT_CODE; var _EMAIL_KEY = '_BEAMER_EMAIL_' + _PRODUCT_CODE; var _CUSTOM_USER_KEY = '_BEAMER_CUSTOM_USER_' + _PRODUCT_CODE; var _LANGUAGE_KEY = '_BEAMER_LANGUAGE_' + _PRODUCT_CODE; var _LAST_REQUEST_DATE_KEY = '_BEAMER_NOTIFICATIONS_LAST_REQUEST_' + _PRODUCT_CODE; var _REQUEST_ATTEPMTS_KEY = '_BEAMER_NOTIFICATIONS_REQUEST_ATTEPMTS_' + _PRODUCT_CODE; var _LAST_DATA_UPDATE = '_BEAMER_LAST_DATA_UPDATE_' + _PRODUCT_CODE; var _LAST_UPDATE_REQUEST = '_BEAMER_LAST_UPDATE_REQUEST_' + _PRODUCT_CODE; var _PUBLIC = false; var _LANGUAGE = 'EN'; var _BASE_URL = "https://push.getbeamer.com/"; var _USER_DETAILS; var _PENDING_BACKEND_SAVES = []; var _BACKEND_SAVE_TIMEOUT; function sendTokenToServer(token, alreadyGranted) { var data = 'token=' + token; data += '&product=' + _PRODUCT_CODE; return buildTokenUrl(data).then(function(url) { if (url.indexOf('custom_user_id') < 0 && typeof custom_user_id !== 'undefined' && custom_user_id !== '') { url += '&custom_user_id=' + encodeURIComponent(custom_user_id); } if (typeof alreadyGranted !== 'undefined' && alreadyGranted) { url += '&alreadyGranted=true'; } if (typeof _REF_URL !== 'undefined' && _REF_URL) { url += '&ref=' + encodeURIComponent(_REF_URL); } doSubscriptionRequest(url, function(xhttp) { if(xhttp.readyState == 4) { if (xhttp.status == 200) { saveInStorage(_PERMISSIONS_KEY, true); saveInDB(_LAST_UPDATE_REQUEST, new Date().getTime()) .then(exit); } else { exit(); } } }); }); } function doSubscriptionRequest(data, callback) { if (typeof XMLHttpRequest !== 'undefined') { var xhttp = new XMLHttpRequest(); xhttp.open('POST', _BASE_URL + 'subscribeToPush', true); xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhttp.onreadystatechange = function() { if (callback) { callback(xhttp); } }; xhttp.send(data); } else { var request = new Request(_BASE_URL + 'subscribeToPush?' + data); var options = { method: 'GET', } return fetch(request, options).then(callback); } } function logError(error) { var baseData = 'message=' + encodeURIComponent(error) + '&product=' + _PRODUCT_CODE; buildTokenUrl(baseData).then(function(data) { if (typeof XMLHttpRequest !== 'undefined') { var xhttp = new XMLHttpRequest(); xhttp.open('POST', _BASE_URL + 'logPushError', true); xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhttp.send(data); } else { var request = new Request(_BASE_URL + 'logPushError?' + data); var options = { method: 'GET', } return fetch(request, options); } }); } function saveInStorage(key, data) { try { // if (window.localStorage) { // if (typeof data !== 'string') { // data = JSON.stringify(data); // } // localStorage.setItem(key, data); // } //Backend Fallback setToBackend(key, data); } catch (e) { } } function getFromStorage(key) { try { return getFromBackend(key); // var value; // if (window.localStorage) { // value = localStorage.getItem(key); // if (typeof value !== 'undefined') { // return value; // } // } // var value = getFromBackend(key); // if (window.localStorage) { // var data = value; // if (typeof data !== 'string') { // data = JSON.stringify(data); // } // localStorage.setItem(key, data); // } // return value; } catch (e) { } } function removeFromStorage(key) { try { // if (window.localStorage) { // localStorage.removeItem(key); // } setToBackend(key, ''); } catch(e) { } } function getFromDB(key) { if (typeof getFromWorkerDB !== 'undefined') { return getFromWorkerDB(key); } // return idbKeyval.get(key).then(function(value) { // if (typeof value !== 'undefined') { // return value; // } // return getFromBackend(key); // }); return Promise.resolve(getFromBackend(key)); } function saveInDB(key, data) { // setToBackend(key, data); // return idbKeyval.set(key, data); return new Promise(function(resolve) { setToBackend(key, data); resolve(); }); } function getFromBackend(cname) { var value = _USER_DETAILS[cname]; if (typeof value === 'string' && /^-?\d+$/.test(value)) { return parseInt(value); } return value; // var url = _BASE_URL + 'getPushPromptLastInteraction' // var data = Beamer.ajax(url, function(response) { return response }) // var formData = { // product: _PRODUCT_CODE, // user_id: _USER, // key: cname // } // sendData(formData, url, 'GET', function(xhttp) { // if (xhttp.readyState == 4) { // if (xhttp.status == 200) { // return xhttp.data; // } else { // exit(); // } // } // }); } function setToBackend(cname, data) { var currentValue = getFromBackend(cname); if ( (typeof currentValue === 'undefined' && (typeof data === 'undefined' || data === '')) || (typeof currentValue !== 'undefined' && currentValue == data) ) { return; } _USER_DETAILS[cname] = data; if (typeof _BACKEND_SAVE_TIMEOUT !== 'undefined' && !!_BACKEND_SAVE_TIMEOUT) { clearTimeout(_BACKEND_SAVE_TIMEOUT); } _PENDING_BACKEND_SAVES.push({key: cname, value: data}); _BACKEND_SAVE_TIMEOUT = setTimeout(function() { var keyValues = {}; while (_PENDING_BACKEND_SAVES.length > 0) { var keyValue = _PENDING_BACKEND_SAVES.pop(); keyValues[keyValue.key] = keyValue.value; } var url = _BASE_URL + 'updateUserPushDetails' var formData = { product: _PRODUCT_CODE, user_id: _USER, keyValues: JSON.stringify(keyValues) } sendData(formData, url, 'POST'); _BACKEND_SAVE_TIMEOUT = null; }, 500); } function exit() { if ( (typeof _useCustomPushDomain === 'undefined' || !_useCustomPushDomain) && ( typeof Beamer === 'undefined' || typeof Beamer.pushDomain === 'undefined' || ( Beamer.pushDomain !== window.location.host && (!window.location.host.endsWith('.' + Beamer.pushDomain)) ) ) ) { if (typeof _BACKEND_SAVE_TIMEOUT !== 'undefined' && !!_BACKEND_SAVE_TIMEOUT) { setTimeout(function() { window.close(); }, 1000); } else { window.close(); } } } function initMessaging() { firebase.initializeApp({ messagingSenderId: '703343904461' }); var messaging = firebase.messaging(); messaging.usePublicVapidKey('BPR-CP0AilWhA7D6O8MsdxTkJsWkIvPSr5N3_7N1PNi0Nr3xGK4BrJ_3moF6QHSWGLI8kEpxD9za0HBg2XWb58E'); return messaging; } function detectOS() { try { var nAgt = navigator.userAgent; var os = ''; var clientStrings = [ {s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/}, {s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/}, {s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/}, {s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/}, {s:'Windows Vista', r:/Windows NT 6.0/}, {s:'Windows Server 2003', r:/Windows NT 5.2/}, {s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/}, {s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/}, {s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/}, {s:'Windows 98', r:/(Windows 98|Win98)/}, {s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/}, {s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/}, {s:'Windows CE', r:/Windows CE/}, {s:'Windows 3.11', r:/Win16/}, {s:'Android', r:/Android/}, {s:'Open BSD', r:/OpenBSD/}, {s:'Sun OS', r:/SunOS/}, {s:'Linux', r:/(Linux|X11)/}, {s:'iOS', r:/(iPhone|iPad|iPod)/}, {s:'Mac OS X', r:/Mac OS X/}, {s:'Mac OS', r:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/}, {s:'QNX', r:/QNX/}, {s:'UNIX', r:/UNIX/}, {s:'BeOS', r:/BeOS/}, {s:'OS/2', r:/OS\/2/}, {s:'Search Bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/} ]; for (var id in clientStrings) { var cs = clientStrings[id]; if (cs.r.test(nAgt)) { os = cs.s; break; } } return os; } catch(e) { } } function isMacOS() { var os = detectOS(); return os && os.indexOf('Mac') > -1; } function isSafari() { return /^((?!chrome|android).)*safari/i.test(navigator.userAgent); } function buildTokenUrl(url) { return appendUrlParameter(url, _FILTER_KEY, 'role') .then(function(url) { return appendUrlParameter(url, _USER_KEY, 'user_id'); }) .then(function(url) { return appendUrlParameter(url, _FIRSTNAME_KEY, 'user_firstname'); }) .then(function(url) { return appendUrlParameter(url, _LASTNAME_KEY, 'user_lastname'); }) .then(function(url) { return appendUrlParameter(url, _EMAIL_KEY, 'user_email'); }) .then(function(url) { return appendUrlParameter(url, _CUSTOM_USER_KEY, 'custom_user_id'); }) .then(function(url) { return appendUrlParameter(url, _LANGUAGE_KEY, 'language'); }); } function appendUrlParameter(url, dbKey, parameter) { return getFromDB(dbKey).then(function(value) { if (value && (typeof value !== 'string' || value.trim() !== '')) { if (url.indexOf('?') < 0 && url.indexOf('&') < 0) { url += '?'; } else { url += '&'; } url += parameter + '=' + encodeURIComponent(value); } return url; }); } function sendData(data, url, method, callback) { if (typeof XMLHttpRequest !== 'undefined') { if (typeof data !== 'undefined' && method === 'GET') { data = new URLSearchParams(data).toString(); if (url.indexOf('?') > -1) { url += '&'; } else { url += '?'; } url += data; } var xhttp = new XMLHttpRequest(); xhttp.open(method, url, true); xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhttp.onreadystatechange = function() { if (xhttp.readyState == 4) { if (xhttp.status == 200) { if (typeof callback !== 'undefined' && !!callback) { callback(JSON.parse(xhttp.responseText)); } } else { exit(); } } }; if (typeof data !== 'undefined' && method !== 'GET') { data = new URLSearchParams(data).toString(); xhttp.send(data); } else { xhttp.send(); } } else if (typeof postFetch !== 'undefined') { if (typeof data !== 'undefined' && method === 'GET') { data = new URLSearchParams(data).toString(); if (url.indexOf('?') > -1) { url += '&'; } else { url += '?'; } url += data; } postFetch(url).then(function(response) { response.json().then(function(data) { if (typeof callback !== 'undefined' && !!callback) { callback(data); } }); }) } else { var request = new Request(url + '?' + data); var options = { method, } return fetch(request, options).then(callback); } } function retrieveBackendDetails(callback) { var url = _BASE_URL + 'userPushDetails'; var formData = { product: _PRODUCT_CODE }; if (typeof _USER !== 'undefined') { formData.user_id = _USER; } if (typeof _TOKEN !== 'undefined') { formData.token = _TOKEN; } if (typeof _LANGUAGE !== 'undefined') { formData.language = _LANGUAGE; } if (typeof _LAST_PUSH_UPDATE_TIME !== 'undefined') { formData.l = _LAST_PUSH_UPDATE_TIME; } sendData(formData, url, 'GET', function(data) { _USER_DETAILS = data; if (typeof callback !== 'undefined' && !!callback) { callback(); } }); } var language = 'EN'; function showTopAlert(message) { if (!window.location.host.endsWith('.getbeamer.com')) { return; } var div = document.createElement('div'); div.className = 'alert red'; div.innerHTML = message; document.body.appendChild(div); setTimeout(function() { div.className += ' active'; }, 100); } function isFirefox() { try { return document.body.className.indexOf('firefox') > -1; } catch(e) { return false; } } function init() { var hasPermission; if (isSafari()) { hasPermission = false; } else { hasPermission = getFromStorage(_PERMISSIONS_KEY); } var permissionGranted = typeof Notification !== 'undefined' && Notification.permission && Notification.permission === 'granted'; if (!permissionGranted && hasPermission !== undefined && hasPermission !== null) { if (hasPermission === 'false' || hasPermission == false) { showTopAlert('Seems notifications are blocked for push.getbeamer.com!
Click here to learn how to unblock'); removeFromStorage(_PERMISSIONS_KEY); logError('Notifications already blocked'); } else { exit(); } return; } var messaging = initMessaging(); var alreadyGranted = (typeof welcome === 'undefined' || !welcome) && permissionGranted && hasPermission !== 'false' && hasPermission !== false; navigator.serviceWorker.register('/beamer-push-sw.js') .then(function(registration) { messaging.useServiceWorker(registration); var requestTimestamp = new Date().getTime(); messaging.requestPermission() .then(function() { console.log('Notification permission granted.'); messaging.onMessage(function(payload) { if (payload && payload.data && typeof payload.data.welcome !== 'undefined' && payload.data.welcome == 'true' && typeof Notification !== 'undefined') { var title = payload.data.title; var options = { body: payload.data.body, image: payload.data.image, icon: payload.data.icon, badge: payload.data.badge, requireInteraction: true, data: { url: payload.data.url, productId: payload.data.productId } }; if (isMacOS()) { if (payload.data.image) { options.icon = payload.data.image; } else { delete options.icon; } } var notification = new Notification(title, options); notification.onclick = function(event) { event.preventDefault(); window.open(event.target.data.url, '_blank'); notification.close(); } } }); return messaging.getToken(); }) .then(function(currentToken) { if (currentToken) { return sendTokenToServer(currentToken, alreadyGranted); } }) .catch(function(err) { if ((new Date().getTime() - requestTimestamp) < 400 && !isFirefox()) { showTopAlert('Seems notifications are blocked for push.getbeamer.com!
Click here to learn how to unblock'); logError('Notifications automatically blocked (' + err.code + ')'); saveInStorage(_PERMISSIONS_KEY, false); saveInStorage(_LAST_REQUEST_DATE_KEY, new Date().toISOString()); saveInStorage(_REQUEST_ATTEPMTS_KEY, 1); } else { saveInStorage(_PERMISSIONS_KEY, false); saveInStorage(_LAST_REQUEST_DATE_KEY, new Date().toISOString()); var attempts = getFromStorage(_REQUEST_ATTEPMTS_KEY); if (!attempts) { attempts = 0; } attempts++; saveInStorage(_REQUEST_ATTEPMTS_KEY, attempts); if (!isFirefox()) { console.log('Unable to get permission to notify.', err); exit(); } } }); }) .catch(function(err) { exit(); }); } retrieveBackendDetails(init); })();