var Base64 = { _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", encode: function(r) { var t, e, a, o, h, n, C, c = "", i = 0; for (r = Base64._utf8_encode(r); i < r.length;) o = (t = r.charCodeAt(i++)) >> 2, h = (3 & t) << 4 | (e = r.charCodeAt(i++)) >> 4, n = (15 & e) << 2 | (a = r.charCodeAt(i++)) >> 6, C = 63 & a, isNaN(e) ? n = C = 64 : isNaN(a) && (C = 64), c = c + this._keyStr.charAt(o) + this._keyStr.charAt(h) + this._keyStr.charAt(n) + this._keyStr.charAt(C); return c }, _utf8_encode: function(r) { r = r.replace(/\r\n/g, "n"); for (var t = "", e = 0; e < r.length; e++) { var a = r.charCodeAt(e); a < 128 ? t += String.fromCharCode(a) : a > 127 && a < 2048 ? (t += String.fromCharCode(a >> 6 | 192), t += String.fromCharCode(63 & a | 128)) : (t += String.fromCharCode(a >> 12 | 224), t += String.fromCharCode(a >> 6 & 63 | 128), t += String.fromCharCode(63 & a | 128)) } return t } }; var isElementLoaded = async selector => { while (document.querySelector(selector) === null) { await new Promise(resolve => requestAnimationFrame(resolve)) } return document.querySelector(selector); }; var params = {}; var sentimentFields = []; if (document.readyState === "complete") { loadFuguScript(); } else { window.addEventListener("load", () => { loadFuguScript(); }); } function loadFuguScript() { const urlParams = new URLSearchParams(window.location.search); params = {}; sentimentFields = []; saveVisitation(); recordFields(); document.querySelectorAll("[type=submit]").forEach((e) => { e.addEventListener('click', () => { saveFields(); }); e.addEventListener('touch', () => { saveFields(); }); e.addEventListener('submit', () => { saveFields(); }); }); document.querySelectorAll('form').forEach((form) => { form.querySelectorAll("a[href^='#']").forEach((button) => { button.addEventListener('click', () => saveFields()); button.addEventListener('touch', () => saveFields()); }); }); var prevOrder = localStorage.getItem("prevorder"); var currentOrder; if (document.querySelector('meta[name=order-id]')) { currentOrder = document.querySelector('meta[name=order-id]').content; } else if (typeof(Shopify) !== 'undefined') { if (Shopify.checkout) currentOrder = Shopify.checkout.order_id; } else if (urlParams.get('internalId')) { currentOrder = urlParams.get('internalId'); } else if (urlParams.get('og')) { isElementLoaded(".c-on-base--inverted.tc").then(selector => { const transactionLine = document.querySelectorAll(".c-on-base--inverted.tc").item(1).innerHTML; const regex = /[A-Z0-9]{32}$/g; const found = transactionLine.match(regex); if (found && found.length > 0) currentOrder = found[0]; if (prevOrder !== null && !prevOrder.includes(currentOrder)) { prevOrder += ',' + currentOrder; } else if (prevOrder === null) { prevOrder = currentOrder; } localStorage.setItem("prevorder", prevOrder); }); } else if (urlParams.get('orderId')) { isElementLoaded("div.container table > tbody > tr:nth-child(1) > td:nth-child(2) > b").then(selector => { const currentOrder = document.querySelector("div.container table > tbody > tr:nth-child(1) > td:nth-child(2) > b").innerHTML; if (prevOrder !== null && !prevOrder.includes(currentOrder)) { prevOrder += ',' + currentOrder; } else if (prevOrder === null) { prevOrder = currentOrder; } localStorage.setItem("prevorder", prevOrder); }); } else { if (document.getElementById('fugu-script')) currentOrder = document.getElementById('fugu-script').getAttribute('data-order-id'); } if (prevOrder !== null && !prevOrder.includes(currentOrder)) { prevOrder += ',' + currentOrder; } else if (prevOrder === null) { prevOrder = currentOrder; } localStorage.setItem("prevorder", prevOrder); } function recordFields() { const inputs = document.querySelectorAll('input'); const textareas = document.querySelectorAll('textarea'); for (const input of inputs) { input.addEventListener('change', (event) => { const inputName = event.target.id || event.target.name || event.target.class; params[inputName] = event.target.value; }); } for (const textarea of textareas) { textarea.addEventListener('change', (event) => { const textareaName = event.target.id || event.target.name || event.target.class; params[textareaName] = event.target.value; if (!sentimentFields.includes(textareaName)) sentimentFields.push(textareaName); }); } } function saveVisitation() { var scriptElement = document.getElementById('FUGU-js'); var shopName = scriptElement.getAttribute('FUGUShop-name'); var location = window.location.href; var file = { "Reason": "Customer Visited Page", "on": shopName, "timestamp": new Date(), location }; var sensors = JSON.parse(scriptElement.getAttribute('FUGUSensor-list')); for (var s = 0; s < sensors.length; s++) { saveEvidenceForSensor(sensors[s].sensorId, file, null, sensors[s].orderField); } } function saveFields() { var scriptElement = document.getElementById('FUGU-js'); var shopName = scriptElement.getAttribute('FUGUShop-name'); var sensors = JSON.parse(scriptElement.getAttribute('FUGUSensor-list')); for (var s = 0; s < sensors.length; s++) { var paramsToRecord = sensors[s].params; var file = { "Reason": "Customer Submission", "on": shopName, "timestamp": new Date(), "params": params }; var sentimentToRecord = ""; for (const sentimentField of sentimentFields) { sentimentToRecord += params[sentimentField] + ". "; } let sentiment = { type: "text", value: sentimentToRecord }; saveEvidenceForSensor(sensors[s].sensorId, file, sentiment, sensors[s].orderField); } } function saveEvidenceForSensor(sensorId, file, sentiment, orderField) { var scriptElement = document.getElementById('FUGU-js'); var Tenant = scriptElement.getAttribute('FUGUTenant-id'); var refValue = localStorage.getItem("prevorder"); var b64file = Base64.encode(JSON.stringify(file)); var body = { "file": b64file, "file_name": "JSON", "type": "d", sentiment }; let saveMethod = ''; const orderKey = file.params ? Object.keys(file.params).find(k => k.includes(orderField)) : undefined; if (refValue !== null && refValue !== '' && refValue !== 'undefined') { body.references = refValue; saveMethod = 'saveEvidenceByReference'; } else if (orderKey) { body.references = file.params[orderKey]; saveMethod = 'saveEvidenceByReference'; } else { body.signature = {}; const emailKey = file.params ? Object.keys(file.params).find(k => k.includes('mail')) : undefined; const phoneKey = file.params ? Object.keys(file.params).find(k => k.includes('phone')) : undefined; if (emailKey) { body.signature.payeremail = file.params[emailKey]; } if (phoneKey) { body.signature.payermobilenumber = file.params[phoneKey]; } if (Object.keys(body.signature).length > 0) { saveMethod = 'saveEvidenceBySignature'; } } if (saveMethod === 'saveEvidenceByReference' || saveMethod === 'saveEvidenceBySignature') { try { var xhr = new XMLHttpRequest(); xhr.open("POST", `https://app.fugu-it.com/sensorapi/${saveMethod}/${Tenant}/${sensorId}`, true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify({ ...body })); } catch (ex) {} } }