localStorage.getItem("bmcweb_user") || localStorage.setItem("bmcweb_user", JSON.stringify({ id: crypto.randomUUID(), added: new Date().getTime() })); sessionStorage.getItem("bmcweb_session") || sessionStorage.setItem("bmcweb_session", JSON.stringify({ id: crypto.randomUUID(), start: new Date().getTime(), end: new Date().getTime(), pings: [], pages: [], events: [] })); var BMCWeb = { site: {"id":"e1db802e","name":"Euan Orlando","timezone":"Australia/Sydney","hostname":"euanorlando.com","settings":{"runAnalytics":true,"maintenanceMode":false}}, view: { id: crypto.randomUUID(), start: new Date().getTime() }, scripts: {}, details: {}, content: {} }; (function(){ var user = JSON.parse(localStorage.getItem("bmcweb_user")); user.active = new Date().getTime(); user.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; user.offset = new Date().getTimezoneOffset(); localStorage.setItem("bmcweb_user", JSON.stringify(user)); if (!user.global) { var i = new URL(window.location.href).searchParams.get("globalid"); if (/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(i)) { user.global = i; } else { var t = btoa(unescape(encodeURIComponent(JSON.stringify({ from: window.location.href, time: new Date().getTime(), site: BMCWeb.site.id, user: user.id })))); window.location.href = `https://api.bmcweb.co.nz/apps/user/getGlobal?token=${t}`; }; }; if (new URL(window.location.href).searchParams.get("globalid")) { var u = new URL(window.location.href); u.searchParams.delete("globalid"); history.replaceState(null,null,u.href); }; localStorage.setItem("bmcweb_user", JSON.stringify(user)); })(); BMCWeb.scripts.getScrollPercent = function() { const scrollX = window.scrollX || document.documentElement.scrollLeft; const scrollY = window.scrollY || document.documentElement.scrollTop; const docWidth = document.documentElement.scrollWidth - window.innerWidth; const docHeight = document.documentElement.scrollHeight - window.innerHeight; return [(scrollX / docWidth) * 100, (scrollY / docHeight) * 100]; }; BMCWeb.scripts.refresh = function() { setTimeout(BMCWeb.scripts.refresh, 1000); var session = JSON.parse(sessionStorage.getItem("bmcweb_session")); session.end = new Date().getTime(); var ping = { screen: [screen.width, screen.height, screen.availWidth, screen.availHeight], title: document.title, url: window.location.href, hidden: document.hidden, referrer: document.referrer || document.referer, view: BMCWeb.view.id, scroll: BMCWeb.scripts.getScrollPercent(), online: navigator.onLine }; var utcTime = new Date(new Date().getUTCFullYear(), new Date().getUTCMonth(), new Date().getUTCDate(), new Date().getUTCHours(), new Date().getUTCMinutes(), new Date().getUTCSeconds(), new Date().getUTCMilliseconds()).getTime(); if (!session.pages.length || session.pages[0].url !== window.location.href || session.pages[0].view !== BMCWeb.view.id) session.pages.unshift({ id: crypto.randomUUID(), url: window.location.href, title: document.title, view: BMCWeb.view.id, start: utcTime, end: utcTime, metaTags: Array.from(document.querySelectorAll("meta")).map(meta => { var mt = {}; Array.from(meta.attributes).forEach((attr) => mt[attr.name] = attr.value); return mt; }), performance: { load: performance.getEntriesByType("navigation")[0].loadEventEnd, script: 350 } }); if (!session.pings.length || JSON.stringify(session.pings[0].data) !== JSON.stringify(ping)) session.pings.unshift({ id: crypto.randomUUID(), page: session.pages[0].id, time: utcTime, data: ping }); session.pages[0].end = utcTime; sessionStorage.setItem("bmcweb_session", JSON.stringify(session)); }; BMCWeb.scripts.refresh(); BMCWeb.scripts.bulk = function() { navigator.sendBeacon("https://log.api.bmcweb.co.nz/ping", JSON.stringify({ id: crypto.randomUUID(), user: JSON.parse(localStorage.getItem("bmcweb_user")), session: JSON.parse(sessionStorage.getItem("bmcweb_session")), platform: navigator.platform, documentSize: [document.documentElement?.scrollWidth, document.documentElement?.scrollHeight], site: BMCWeb.site, url: window.location.href, languages: navigator.languages, referer: document.referrer || document.referer })); }; BMCWeb.scripts.bulk(); window.addEventListener("beforeunload", BMCWeb.scripts.bulk); 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.importJS = function(src) { var s = document.createElement("script"); s.src = src; document.head.appendChild(s); }; BMCWeb.scripts.importCSS(`https://scripts.bmcweb.co.nz/import?site=${BMCWeb.site.id}&type=style`); var summon = async function(content) { function returnError(message, extra) { extra ? console.error(message, extra) : console.error(message); return { success: false, error: message }; }; function checkUrl(url) { try { new URL(url); return true; } catch (error) { return false; }; }; var validMethods = ["GET","POST","PUT"]; if (!content?.url) { return returnError("Content Error", { message: "Missing Content" }); }; if (!checkUrl(content.url)) return returnError("Invalid URL", { message: `${content.url} is not a valid URL.` }); content.method = (content.method || "GET").toUpperCase(); if (!validMethods.some(m => m === content.method)) return returnError("Invalid Method", { message: `${content.method} is not a valid method.`, fix: `Only ${validMethods.join(", ")} is allowed as a method.` }); var cb = content.callback || content.respond || content.response; var returnMethod = "return"; if (cb && typeof cb === "function") returnMethod = "callback"; function parseItem(json) { try { let result = JSON.parse(json); while (typeof result === "string" && /^[\[\{]/.test(result.trim())) { result = JSON.parse(result); }; return result; } catch { return json; }; }; try { var options = { method: content.method }; if (content.headers && typeof content.headers === "object" && Object.keys(content.headers).length) options.headers = content.headers; var body = content.data || content.body || content.request || content.html; if (body) options.body = JSON.stringify(body); var callTime = new Date().getTime(); var req = await fetch(content.url, options); var conType = req.headers.get("Content-Type"); var data = (conType || "").toLowerCase().includes("application/json") ? await req.json() : await req.text(); if (data) { data = parseItem(data); if (Array.isArray(data)) data = data.map(parseItem); }; var output = { success: req.ok, wallTime: new Date().getTime() - callTime, code: req.status, status: req.statusText, headers: req.headers, url: { original: content.url, returned: req.url } }; if (req.ok) output.data = data; if (content.settings?.dataOnly) output = content.data; if (returnMethod === "return") return output; if (returnMethod !== "return") cb(output); } catch (error) { return returnError("Internal Error", error); }; }; BMCWeb.scripts.analyticsEvent = function(data) { var session = JSON.parse(sessionStorage.getItem("bmcweb_session")); session.events = session.events || []; data = data || {}; if (!Object.keys(data).length) return; var content = { id: crypto.randomUUID(), event: data.eventType || data.EventType || data.event || data.type || data.et || data.action, title: data.title || data.eventTitle || data.text, user: data.user === true, data: data.data || data.content || data.more || data.additional || data.eventData || data.eventContent || data.eventMore || data.info || data.information, page: session.pages[0]?.id, time: new Date().toJSON() }; if (!content.event) return; session.events.push(content); sessionStorage.setItem("bmcweb_session", JSON.stringify(session)); }; document.addEventListener("DOMContentLoaded", function(){ var comp = window["Components"] || window["components"] || window["comps"]; if (comp && Object.keys(comp)?.length) { BMCWeb.components = Object.keys(comp).map((c) => c = { id: c, data: comp[c] }).filter(i => /<\/?[a-z][\s\S]*>/i.test(i.data)); }; if (BMCWeb.components?.length) BMCWeb.components.forEach((elem) => { ["data-component", "component", "data-comp", "site-component"].forEach((key) => { document.querySelectorAll(`[${key}="${elem.id}"]`).forEach((item) => { item.className = elem.id; item.innerHTML = elem.data; }); }); }); document.dispatchEvent(new CustomEvent("complete.componentsLoad")); }); if (new Date().getMinutes() < 10) { fetch("https://api.bmcweb.co.nz/process/auth"); fetch("https://api.bmcweb.co.nz/process/blogs"); fetch("https://api.bmcweb.co.nz/process/months"); fetch("https://api.bmcweb.co.nz/process/notifications"); fetch("https://api.bmcweb.co.nz/process/sites"); };var legalDocs = {"privacy":"https://bmcweb.co.nz/legal?doc=2061d4a4-48b7-4192-a63d-52832087a4a7&source_site=e1db802e-3f9d-4343-9bb2-258eb078de6d"}; BMCWeb.scripts.openLegal = function(key) { if (!legalDocs[key]) return; window.open(legalDocs[key]); };if (window.location.pathname === "/privacy") { window.location.href = "https://bmcweb.co.nz/legal?doc=2061d4a4-48b7-4192-a63d-52832087a4a7&source_site=e1db802e-3f9d-4343-9bb2-258eb078de6d"; };if (window.location.pathname === "/legal/privacy") { window.location.href = "https://bmcweb.co.nz/legal?doc=2061d4a4-48b7-4192-a63d-52832087a4a7&source_site=e1db802e-3f9d-4343-9bb2-258eb078de6d"; }; BMCWeb.scripts.feedback = { show: function() { return new Promise(resolve => { var html = document.createElement("div"); html.setAttribute("style", `position: fixed; top: 0px; left: 0px; z-index: 15; height: 100vh; width: 100vw; background-color: #ffffffbb;`); html.innerHTML = `