sessionStorage.getItem("a42a9ecb") || sessionStorage.setItem("a42a9ecb", JSON.stringify({ id: crypto.randomUUID(), start: new Date().getTime(), end: new Date().getTime(), pages: [] })); localStorage.getItem("10ba3ee3") || localStorage.setItem("10ba3ee3", JSON.stringify({ id: crypto.randomUUID(), addedAt: new Date().getTime() })); var BMCWeb = { site: {"id":"0fd90fee-ab3a-471f-b64d-405e08a5cd09","name":"Sound of Aotearoa","website":"https://soundofaotearoa.co.nz/","hostname":"soundofaotearoa.co.nz","timezone":"Pacific/Auckland","country":"NZ"}, scripts: {}, get: {}, general: { visibilityChange: new Date().getTime() }, view: { id: crypto.randomUUID(), start: new Date().getTime(), end: new Date().getTime() } }; BMCWeb.general.userTimezoneMatches = Intl.DateTimeFormat().resolvedOptions().timeZone === BMCWeb.site.timezone; BMCWeb.scripts.getSession = function() { var data = JSON.parse(sessionStorage.getItem("a42a9ecb")); data.end = new Date().getTime(); sessionStorage.setItem("a42a9ecb", JSON.stringify(data)); return { id: data.id, start: data.start, end: data.end, duration: data.end - data.start }; }; BMCWeb.get.sessionId = () => BMCWeb.scripts.getSession().id; BMCWeb.get.sessionStart = () => BMCWeb.scripts.getSession().start; BMCWeb.get.sessionEnd = () => BMCWeb.scripts.getSession().end; BMCWeb.get.sessionDuration = () => BMCWeb.scripts.getSession().duration; BMCWeb.get.sessionSeconds = () => BMCWeb.scripts.getSession().duration / 1000; BMCWeb.get.activeStatus = () => ({ isVisible: document.visibilityState === "visible", changedAt: BMCWeb.general.visibilityChange, changedAgo: new Date().getTime() - BMCWeb.general.visibilityChange }); document.addEventListener("visibilitychange", function(){ BMCWeb.general.visibilityChange = new Date().getTime(); }); BMCWeb.scripts.stringToSlug = function(string) { return String(string) .toLowerCase() .replaceAll("ā", "a") .replaceAll("ē", "e") .replaceAll("ī", "i") .replaceAll("ō", "o") .replaceAll("ū", "u") .split("") .filter((elem) => /^[a-zA-Z0-9 ]+$/.test(elem)) .join("") .split(" ") .filter((elem) => elem) .join("-"); }; var stringToSlug = BMCWeb.scripts.stringToSlug; BMCWeb.scripts.getSearchParams = function(url) { url = url || window.location.href; try { url = new URL(url); } catch (error) { return { success: false, error: "Invalid URL" }; }; var search = Object.fromEntries(url.searchParams.entries()); return { success: true, search }; }; BMCWeb.scripts.waitForVar = function(gtr, interval = 100) { return new Promise((resolve) => { const timer = setInterval(() => { try { const val = gtr(); if (val && typeof val !== "undefined") { clearInterval(timer); resolve(val); }; } catch (e) {}; }, interval); }); }; BMCWeb.scripts.toNormalString = str => str.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/[-_]/g, ' ').split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(' '); var toNormalString = BMCWeb.scripts.toNormalString; BMCWeb.scripts.setFavicon = function(url) { let link = document.querySelector("link[rel~='icon']"); if (!link) { link = document.createElement('link'); link.rel = 'icon'; document.head.appendChild(link); }; link.href = url; }; BMCWeb.scripts.importCSS = function(url) { var link = document.createElement("link"); link.rel = "stylesheet"; link.href = url; document.head.appendChild(link); }; BMCWeb.scripts.importCSS(`https://scripts.bmcweb.co.nz/import?site=${BMCWeb.site.id}&type=style`); BMCWeb.scripts.importJS = function(src) { var s = document.createElement("script"); s.src = src; document.head.appendChild(s); }; BMCWeb.scripts.getTimezone = function(timeZone) { const date = new Date(); const options = { timeZone, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }; const parts = new Intl.DateTimeFormat('en-US', options).formatToParts(date); const get = type => parts.find(p => p.type === type).value; return new Date(`${get('year')}-${get('month')}-${get('day')}T${get('hour')}:${get('minute')}:${get('second')}`); }; var getTimezone = BMCWeb.scripts.getTimezone; BMCWeb.scripts.formatNames = function(names) { const len = names.length; if (len === 0) return ''; if (len === 1) return names[0]; if (len === 2) return `${names[0]} & ${names[1]}`; return `${names.slice(0, -1).join(', ')} & ${names[len - 1]}`; }; BMCWeb.dataFill = {}; BMCWeb.scripts.addToDataFill = function(key, value) { BMCWeb.scripts.updateDataFill(); if (!key || value === undefined) return { success: false, error: "Missing Content" }; if (typeof value !== "string") return { success: false, error: "Value Must Be String" }; if (BMCWeb.dataFill[key] === value) return { success: false, error: "Already Exists", value }; BMCWeb.dataFill[key] = value; BMCWeb.scripts.updateDataFill(); return { success: true, value }; }; BMCWeb.scripts.updateDataFill = function() { var data = Object.keys(BMCWeb.dataFill).map((key) => key = { key, value: BMCWeb.dataFill[key] }); for (var item of data) { function getElem(elem) { if (elem && elem instanceof HTMLElement && elem.innerHTML !== item.value) elem.innerHTML = item.value; }; document.querySelectorAll(`[data-fill="${item.key}"]`).forEach(getElem); document.querySelectorAll(`[datafill="${item.key}"]`).forEach(getElem); document.querySelectorAll(`[filldata="${item.key}"]`).forEach(getElem); document.querySelectorAll(`[fillcontent="${item.key}"]`).forEach(getElem); document.querySelectorAll(`[content-fill="${item.key}"]`).forEach(getElem); }; }; BMCWeb.scripts.updateDataFill(); document.addEventListener("DOMContentLoaded", BMCWeb.scripts.updateDataFill); document.addEventListener("DOMContentLoaded", function(){ function getLogo(logo) { if (logo instanceof HTMLElement) { logo.setAttribute("title", logo.getAttribute("title") || BMCWeb.site.name); }; }; document.querySelectorAll(`[data-fitlogo]`).forEach(getLogo); document.querySelectorAll(`[fitlogo]`).forEach(getLogo); document.querySelectorAll(`.fitLogo`).forEach(getLogo); document.querySelectorAll(`.fitlogo`).forEach(getLogo); });sessionStorage.getItem("sessionPages") || sessionStorage.setItem("sessionPages", "[]"); BMCWeb.scripts.analyticsPing = function() { setTimeout(BMCWeb.scripts.analyticsPing, 5000); var pages = JSON.parse(sessionStorage.getItem("sessionPages")) || []; var item = { url: window.location.href, view: BMCWeb.view.id, start: BMCWeb.view.start, end: new Date().getTime(), pathname: window.location.pathname, title: document.title }; pages[0]?.url === item.url && pages[0]?.view === item.view ? pages[0] = item : pages.unshift(item); sessionStorage.setItem("sessionPages", JSON.stringify(pages)); }; BMCWeb.scripts.analyticsPing(); window.addEventListener("popstate", BMCWeb.scripts.analyticsPing); window.addEventListener("mousemove", BMCWeb.scripts.analyticsPing); window.addEventListener("focus", BMCWeb.scripts.analyticsPing); window.addEventListener("blur", BMCWeb.scripts.analyticsPing); window.addEventListener("scroll", BMCWeb.scripts.analyticsPing); window.addEventListener("resize", BMCWeb.scripts.analyticsPing); BMCWeb.scripts.logAnalytics = function() { var isWebSocket = false; try { isWebSocket = "WebSocket" in window; } catch (error) {}; var data = { url: window.location.href, site: BMCWeb.site.id, time: new Date().getTime(), timeOffset: new Date().getTimezoneOffset(), isWebSocket, device: { platform: navigator.platform, documentSize: [document.documentElement?.scrollWidth, document.documentElement?.scrollHeight], languages: navigator.languages, referer: document.referrer || document.referer, user: localStorage.getItem("10ba3ee3") ? JSON.parse(localStorage.getItem("10ba3ee3")).id : null }, session: BMCWeb.scripts.getSession(), pages: JSON.parse(sessionStorage.getItem("sessionPages")) || [] }; navigator.sendBeacon(`https://api.bmcweb.co.nz/analytics/log`, JSON.stringify(data)); }; BMCWeb.scripts.logAnalytics(); window.addEventListener("beforeunload", BMCWeb.scripts.logAnalytics);