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