analytics/assets/js/plausible.js
2019-09-04 10:50:56 +01:00

87 lines
2.8 KiB
JavaScript

(function(window, plausibleHost){
'use strict';
try {
function setCookie(name,value) {
var date = new Date();
date.setTime(date.getTime() + (3*365*24*60*60*1000)); // 3 YEARS
var expires = "; expires=" + date.toUTCString();
document.cookie = name + "=" + (value || "") + expires + "; path=/";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
function pseudoUUIDv4() {
var d = new Date().getTime();
if (typeof performance !== 'undefined' && typeof performance.now === 'function'){
d += performance.now(); //use high-precision timer if available
}
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
function ignore(reason) {
console.warn('[Plausible] Ignoring pageview because ' + reason);
}
function getUrl() {
return window.location.protocol + '//' + window.location.hostname + window.location.pathname + window.location.search;
}
function page() {
if (/localhost$/.test(window.location.hostname)) return ignore('website is running locally');
if (window.location.protocol === 'file:') return ignore('website is running locally');
if (window.document.visibilityState === 'prerender') return ignore('document is prerendering');
var existingUid = getCookie('nm_uid');
var request = new XMLHttpRequest();
request.open('POST', plausibleHost + '/api/page', true);
request.setRequestHeader('Content-Type', 'text/plain');
var uid = existingUid || pseudoUUIDv4()
request.send(JSON.stringify({
url: getUrl(),
new_visitor: !existingUid,
uid: uid,
user_agent: window.navigator.userAgent,
referrer: window.document.referrer,
screen_width: window.innerWidth
}));
request.onreadystatechange = function() {
if (request.readyState == XMLHttpRequest.DONE) {
if (!existingUid) {
setCookie('nm_uid', uid)
}
}
}
}
var his = window.history
if (his.pushState) {
var originalFn = his['pushState']
his.pushState = function() {
originalFn.apply(this, arguments)
page();
}
}
page()
} catch (e) {
new Image().src = plausibleHost + '/api/error?message=' + encodeURIComponent(e.message);
}
})(window, BASE_URL);