"use strict"; window.etag = window.etag || {}; (function (__) { const _ = {}; _.update = () => { Object.entries(_.modules) .forEach((module) => { const [moduleName, moduleObject] = module; moduleObject.update?.(); }); }; _.init = () => { _.modules = {}; _.config = { uuid: "EBA2572F-7504-46A2-804B-A4CFC62D748E", modules: {"core":(data, root) => { const _ = root; const moduleName = "core"; const api = () => { const sessionName = _.utils.sessionName(); const headers = { Accept: "application/json", "Content-Type": "application/json;charset=UTF-8", }; const get = (url, endpoint, data) => { const _session = _.utils.cookies.get(sessionName); const sendData = { location: _.utils.currentURL(), uuid: _session.uuid, session: _session.sessionId, ...data }; const params = new URLSearchParams(sendData).toString(); const options = { method: "GET", headers: headers, }; return fetch(url + endpoint + (params ? "?" : "") + params, options) .then((response) => response); }; const post = (url, endpoint, data) => { const _session = _.utils.cookies.get(sessionName); data["location"] = _.utils.currentURL(); data["uuid"] = _session.uuid; data["session"] = _session.sessionId; data["device"] = _.utils.getDevice(); data["isMobile"] = _.utils.isMobile(); const options = { method: "POST", headers: headers, body: JSON.stringify(data), }; return fetch(url + endpoint, options).then((response) => response); }; return { get: get, post: post, track: { url: (url, data = {}) => { const _session = _.utils.cookies.get(sessionName); data["location"] = _.utils.currentURL(); data["uuid"] = _session.uuid; data["session"] = _session.sessionId; data["url"] = url; return _.config.urls.trackingService + "/link?rd=" + encodeURIComponent(btoa(JSON.stringify(data))); }, interaction: (target, trigger, action, data = {}) => { data["target"] = target; data["trigger"] = trigger; data["action"] = action; _.api.post(_.api.urlTrackingService, "/interaction", data); } }, report: { ping: async () => { const _session = _.utils.cookies.get(sessionName); const result = await _.api.post(_.api.urlReportService, `/ping/${_session.uuid}`, {}); return !!result.uuid; }, }, urlApiCapture: _.config.urls.apiCapture, urlCaptureService: _.config.urls.captureService, urlTrackingService: _.config.urls.trackingService, urlReportService: _.config.urls.reportService, sessionName: sessionName }; }; const utils = { uuid: () => { return _.config.uuid; }, sessionName: () => { return "_etg_" + _.config.uuid.split("-")[0]; }, debug: (msg, ...arg) => { _.config.debugMode && console.log("[ETAG] " + msg, ...arg); }, ping: () => { const session = _.utils.session(_.utils.sessionName()); const lastPing = session.get("lastPing") || 0; const ttl = 1000 * 60 * 60; const send = Date.now() - lastPing > ttl; utils.debug(`%c## Ping ${send}`, "color:#fecc30"); if (send) { session.set("lastPing", Date.now()); _.api.report.ping(); } }, currentURL: (removeParam = true) => { return removeParam ? window.location.href.split("?")[0] ?? window.location.href : window.location.href; }, isMobile: () => { return ((agent) => { return (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(agent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(agent.substring(0, 4))); })(navigator.userAgent || navigator.vendor || window.opera); }, getMobileOS: () => { const isIOS = /iPhone|iPad|iPod/i.test(navigator.userAgent); const isAndroid = /Android/i.test(navigator.userAgent); if (isIOS) return "IOS"; if (isAndroid) return "Android"; return "Other Mobile OS"; }, getDevice: () => { if (utils.isMobile()) return utils.getMobileOS(); return "Desktop"; }, uuidv4: () => { return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (c) => { const b = c; return (b ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (b / 4)))).toString(16); }); }, delay: (ms) => { return new Promise(resolve => setTimeout(resolve, ms)); }, isEmailValid: (email) => { return /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/.test(email); }, normalizeEmail: (email) => { return email.trim().toLowerCase(); }, isEmpty: (value) => { return value == null || !(Object.keys(value) || value.trim()).length; }, session: (sessionName) => { return { set: function (key, value) { const session = this.get(); session[key] = value; localStorage.setItem(sessionName, JSON.stringify(session)); }, get: function (key) { let initValues = {}; if (localStorage.getItem(sessionName)) initValues = JSON.parse(localStorage.getItem(sessionName)); else localStorage.setItem(sessionName, JSON.stringify(initValues)); return key ? initValues[key] : initValues; }, delete: function (key) { const session = this.get(); delete session[key]; localStorage.setItem(sessionName, JSON.stringify(session)); }, }; }, filterValidProducts: (objects, qtdItens = 10) => { const requiredAttributes = ["image", "url", "description", "price", "name"]; return objects.filter((obj) => requiredAttributes.every((attr) => Object.keys(obj).some((key) => key.toLowerCase() === attr.toLowerCase()) && typeof obj[attr] !== "undefined" && obj[attr] !== null && String(obj[attr]).trim() !== "")).slice(0, qtdItens); }, cookies: { set: (name, value, days) => { const date = new Date(); date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000); const expires = "; expires=" + date.toUTCString(); document.cookie = name + "=" + (btoa(JSON.stringify(value)) || "") + (days ? expires : "") + "; path=/; SameSite=None; Secure; domain=" + _.utils.getRootDomain(window.location.href); }, get: (name) => { const pattern = new RegExp(name + "=([^;]+)"); const match = pattern.exec(document.cookie); if (match) return JSON.parse(atob(match[1])); const initValues = { uuid: _.config.uuid, sessionId: _.utils.uuidv4(), }; _.utils.cookies.set(name, initValues, 365); return initValues; }, delete: (name) => { document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC;" + "path=/; Max-Age=-9999; domain=" + _.utils.getRootDomain(window.location.href); } }, getElements: (selector) => { if (!selector || selector.trim() == "") return null; if (selector.indexOf("evaluate:") == 0) { const xpathExpression = selector.substring(9); const result = document.evaluate(xpathExpression, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); let element; const elements = []; while ((element = result.iterateNext())) elements.push(element); return elements; } else if (selector.indexOf("shadow:") == 0) { const partials = selector.substring(7).split("::shadow"); if (!partials.length) return null; let elems = Array.from(document.querySelectorAll(partials[0])); for (let i = 1; partials.length > i; i++) { const partial = partials[i]; let elemsInside = []; for (let j = 0; elems.length > j; j++) { const shadow = elems[j].shadowRoot; if (shadow) { const matchesInShadow = shadow.querySelectorAll(partial); elemsInside = elemsInside.concat([...matchesInShadow]); } } elems = elemsInside; } return elems; } else return Array.from(document.querySelectorAll(selector)); }, getURLParameter: (parameterName) => { const params = new URLSearchParams(window.location.search); return params.get(parameterName); }, isCampaignOnDate: (startDateString, endDateString) => { const today = Date.now(); const startDate = startDateString ? new Date(startDateString).getTime() : Date.now(); const endDate = endDateString ? new Date(endDateString).getTime() : Date.now(); return today >= startDate && endDate >= today; }, isRequiredElementOnPage: (selector) => { const element = document.querySelector(selector); return element; }, applyCampaign: (item, type) => { const isCampaignOnDate = _.utils.isCampaignOnDate(item["startDate"], item["endDate"]); const apply = (!item["includeIfUrlRegex"] || _.utils.matchPageURL(item["includeIfUrlRegex"])) && ((item["active"] && isCampaignOnDate) || (item["preview"] && _.utils.getURLParameter("preview") == type && _.utils.getURLParameter("id") == item["id"])); const isRequiredElementOnPage = !item["includeIfHtmlSelector"] || _.utils.isRequiredElementOnPage(item["includeIfHtmlSelector"]); return !!(apply && isRequiredElementOnPage); }, addUtmToLinks: (content, utm) => { const contentLinks = content.querySelectorAll("a"); contentLinks.forEach((link) => { link.href = _.utils.formatLink(link.href, utm); }); }, addPixelToLinks: (content, pixel) => { const contentLinks = content.querySelectorAll("a"); contentLinks.forEach((link) => { link.href = pixel + link.href; }); }, addTrackToLinks: (content, data = {}) => { const contentLinks = content.querySelectorAll("a"); contentLinks.forEach((link) => { link.href = _.api.track.url(link.href, data); }); }, matchPageURL: (includeUrl) => { const regexp = new RegExp(includeUrl); const pageUrl = window.location.href; return regexp.test(pageUrl); }, formatLink: (link, utm = "") => { return link + (utm ? (link.indexOf("?") == -1 ? "?" : "&") + utm : ""); }, getRootDomain: (urlBase) => { const url = new URL(urlBase); const domain = url.hostname; const elems = domain.split("."); const iMax = elems.length - 1; const elem1 = elems[iMax - 1]; const elem2 = elems[iMax]; const isSecondLevelDomain = iMax >= 2 && 5 >= (elem1 + elem2).length; return ((isSecondLevelDomain ? elems[iMax - 2] + "." : "") + (elem1 ? elem1 + "." : "") + elem2); }, fetchURL: async (url, successCallback, failCallback) => { try { const response = await fetch(url); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const json = await response.json(); successCallback(json); } catch (error) { failCallback(error); } }, }; const init = async () => { _.config.debugMode && console.log("%c" + " _____ __ ______ \n" + " / ___/____ ___ ____ _____/ //_ __/___ ____ \n" + " \\__ \\/ __ `__ \\/ __ `/ ___/ __// / / __ `/ __ `/\n" + " ___/ / / / / / / /_/ / / / /_ / / / /_/ / /_/ / \n" + "/____/_/ /_/ /_/\\__,_/_/ \\__//_/ \\__,_/\\__, / \n" + " /____/ \n" + " By EtagDigital \n" + "\n", "color:#fecc30"); _.utils = utils; _.api = api(); utils.debug("%c" + "###### Initializing module " + moduleName, "color:#fecc30"); utils.ping(); if (data[0].isSPA) { let oldHref = document.location.href; const body = document.querySelector("body"); const observer = new MutationObserver(() => { if (oldHref !== document.location.href) { oldHref = document.location.href; window.etag && window.etag.update(); } }); observer.observe(body, { childList: true, subtree: true }); } }; init(); return { name: moduleName, };},"tag-capture":(data, root) => { const _ = root; const moduleName = "tag-capture"; const debug = (value, ...args) => { _.utils.debug(`%c[${moduleName}] ` + value, "color:#77dd77; padding-top:10px", ...args); }; const captureTypeMap = { LEAD: "lead", CART: "cart", CONVERSION: "conversion", PRODUCT: "product", REGISTER: "register" }; const eventMap = { LOAD: "load", CHANGE: "change", LOAD_CHANGE: "load-change", CLICK: "click" }; const htmlAttributeMap = { VALUE: { value: "value", type: "prop" }, SRC: { value: "src", type: "attr" }, HREF: { value: "href", type: "attr" }, BACKGROUND_IMAGE: { value: "background-image", type: "style" }, INNER_HTML: { value: "innerHTML", type: "prop" }, INNER_TEXT: { value: "innerText", type: "prop" }, META_CONTENT: { value: "content", type: "meta" }, URL: { value: "url", type: "script" }, NONE: { value: "none", type: "none" }, }; const Capture = () => { const itens = []; const add = (item) => { const captureItem = CaptureItem(item); if (captureItem) itens.push(captureItem); }; const capture = () => { for (const item of itens) item.capture(); }; const deactivate = () => { for (const item of itens) item.deactivate(); }; const CaptureItem = (item) => { const captureTypeValid = Object.keys(captureTypeMap).indexOf(item["type"]) > -1; if (!captureTypeValid) return null; const type = captureTypeMap[item["type"]]; const id = item["id"]; let captureOnLoad = true; let lastCaptureInfo = null; let checkinterval; let fields = {}; const itemData = { id: id, type: type, fields: fields }; const dataCapture = () => { const capturedData = { captureId: item.id, info: {} }; let hasCapturedAny = false; for (const [field, value] of Object.entries(fields)) { if (Array.isArray(value)) { const qtyObjects = value[0].elements ? value[0].elements.length : 1; const group = capturedData.info[field] = []; for (let index = qtyObjects - 1; index >= 0; index--) { const groupObject = {}; for (const groupField of value) { const currentValue = groupField.value(index); const value = type == captureTypeMap.LEAD ? (_.utils.isEmailValid(currentValue) ? _.utils.normalizeEmail(currentValue) : "") : currentValue; groupObject[groupField.name] = value.trim(); hasCapturedAny = hasCapturedAny || !_.utils.isEmpty(groupObject[groupField.name]); } group.push(groupObject); } } else { const currentValue = value.value(); capturedData.info[field] = type == captureTypeMap.LEAD ? (_.utils.isEmailValid(currentValue) ? _.utils.normalizeEmail(currentValue) : "") : currentValue; hasCapturedAny = hasCapturedAny || !_.utils.isEmpty(capturedData.info[field]); } } return [hasCapturedAny, capturedData]; }; const checkCapture = () => { const [hasCapturedAny, capturedData] = dataCapture(); if (hasCapturedAny && JSON.stringify(lastCaptureInfo) != JSON.stringify(capturedData.info)) { doDeactivate(); init(); } }; const doCapture = () => { const [hasCapturedAny, capturedData] = dataCapture(); lastCaptureInfo = capturedData.info; debug("###### Captured", hasCapturedAny, capturedData); if (!hasCapturedAny) return null; _.api.post(_.api.urlCaptureService, "/capture/" + type, capturedData); if (type == captureTypeMap.CONVERSION) { _.utils.cookies.delete(_.utils.sessionName()); _.utils.session(_.utils.sessionName()).delete(); } return capturedData; }; const doDeactivate = () => { for (const [field, value] of Object.entries(fields)) if (Array.isArray(value)) { const qtyObjects = value[0].elements ? value[0].elements.length : 1; for (let index = qtyObjects - 1; index >= 0; index--) for (const groupField of value) groupField.deactivate(); } else value.deactivate(); clearInterval(checkinterval); }; const init = () => { fields = {}; for (const field of item["fields"]) { const validEvent = Object.keys(eventMap).indexOf(field["triggerEvent"]) > -1; captureOnLoad = captureOnLoad && validEvent; const capturedField = CaptureField(field, doCapture); if (capturedField.isElement && capturedField.elements.length == 0) { debug(`Field not found: ${capturedField.name}`); } else { if (field.group) { const group = fields[field.group] = fields[field.group] || []; group.push(capturedField); } else { fields[field["name"]] = capturedField; } } } if (captureOnLoad) doCapture(); if (type == "cart") checkinterval = setInterval(checkCapture, 2000); debug(`###### Capturing on${captureOnLoad ? "Load" : "Change"}`, item); }; init(); return { ...itemData, capture: doCapture, deactivate: doDeactivate }; }; const CaptureField = (field, captureFunction) => { const htmlAttributeObj = htmlAttributeMap[field["htmlAttribute"]]; const attribute = htmlAttributeObj.value; const attributeType = htmlAttributeObj.type; const isElement = attributeType != "script"; const elements = isElement ? _.utils.getElements(field["selector"]) : null; const value = (index = 0) => { if (attribute && isElement && elements.length > 0) { const element = elements[index]; if (!element || attribute == "none") return null; else if (attributeType == "attr") if (attribute === "src") return element[attribute]; else if (attribute === "href") return element[attribute]; else return element.getAttribute(attribute); else if (attributeType == "prop") { if (attribute === "innerHTML" || attribute === "innerText") return element[attribute] || null; else if (attribute === "value") return element[attribute] || null; } else if (attribute == "url") return _.utils.currentURL(); else if (attribute == "background-image") { const style = window.getComputedStyle(element, null); const url = style.backgroundImage.match(/"+(.+)"+/); return url ? url[1] : null; } else if (attribute == "content") return element.getAttribute(attribute) || null; } else { if (attribute == "url") return _.utils.currentURL(); } return null; }; let event = eventMap[field["triggerEvent"]]; event = event == eventMap.LOAD_CHANGE ? eventMap.CHANGE : event; if (isElement && event !== "load") { for (const element of elements) element.addEventListener(event, captureFunction); } const deactivate = () => { if (!isElement) return; for (const element of elements) element.removeEventListener(event, captureFunction); }; return { name: field["name"], type: attributeType, isElement: isElement, elements: elements, value: value, deactivate: deactivate }; }; return { add: add, capture: capture, deactivate: deactivate }; }; const capture = Capture(); const init = async (reset = false) => { debug(`${reset ? "Update" : "Initialize"} module`); for (const item of data) { const name = item["name"]; let event = eventMap[item["triggerEvent"]]; debug(`${reset ? "Update" : "Initialize"} item ${name} on ${event}`, item); event = event == eventMap.LOAD_CHANGE ? eventMap.CHANGE : event; if (event != eventMap.LOAD) { const delay = item.delay || 0; await _.utils.delay(delay); const apply = !item["includeIfUrlRegex"] || _.utils.matchPageURL(item["includeIfUrlRegex"]); const el = _.utils.getElements(item["selector"])[0]; if (!apply || !el) continue; el.dataset.item = JSON.stringify(item); el.dataset.reset = JSON.stringify(reset); el.addEventListener(event, initializer); } else initCapture(item, reset); } }; const initializer = (evt) => { const target = evt.currentTarget; const item = JSON.parse(target.dataset.item); const reset = JSON.parse(target.dataset.reset); initCapture(item, reset); }; const initCapture = async (item, reset = false) => { const name = item["name"]; const delay = item.delay || 0; debug(`${reset ? "Update" : "Initialize"} item ${name} in ${delay}ms`, item); await _.utils.delay(delay); const apply = !item["includeIfUrlRegex"] || _.utils.matchPageURL(item["includeIfUrlRegex"]); debug(`#### Capture ${name}`, apply); if (apply) capture.add(item); }; const update = () => { capture.deactivate(); for (const item of data) { let event = eventMap[item["triggerEvent"]]; event = event == eventMap.LOAD_CHANGE ? eventMap.CHANGE : event; if (event != eventMap.LOAD) { const el = _.utils.getElements(item["selector"])[0]; if (el) el.removeEventListener(event, initializer); } } init(true); }; init(); return { name: moduleName, update: update };},"tag-assist":(data, root) => { const _ = root; const moduleName = "tag-assist"; const debug = (value, ...args) => { _.utils.debug(`%c[${moduleName}] ` + value, "color:#84b6f4; padding-top:10px", ...args); }; let productsViewButtonLabel = "Visualizar"; let productsBuyButtonLabel = "Comprar"; const promoButtonLabel = "Continuar comprando"; const filterSearchPlaceholder = "Pesquise no site..."; let PromoButtonType; (function (PromoButtonType) { PromoButtonType["LINK"] = "LINK"; PromoButtonType["CLOSE"] = "CLOSE"; })(PromoButtonType || (PromoButtonType = {})); const TagAssist = () => { const components = { container: { selector: ".etag-assist-container" }, productsListNotFound: { selector: ".etag-products.not-found", removeOnInit: true }, productsListItem: { selector: ".etag-products.product-item", removeOnInit: true }, productsFilter: { selector: ".etag-assist-main-products-filter" }, productView: { selector: ".etag-assist-main-product-view", removeOnInit: true }, filterSearch: { selector: ".etag-assist-main-products-filter-search" }, backButton: { selector: ".etag-go-back-etag-button" }, searchButton: { selector: ".etag-assist-search-etag-button" }, closeSearchButton: { selector: ".etag-assist-search-close" }, inputSeach: { selector: ".etag-assist-search-query" }, productsFilterItem: { selector: ".etag-assist-main-products-filter-item", removeOnInit: true }, products: { selector: ".etag-assist-main-products", removeOnInit: true }, header: { selector: ".etag-assist-main-header" }, headerImage: { selector: ".etag-assist-main-header-logo img" }, contentPromo: { selector: ".etag-assist-main-body-promo" }, ctaButton: { selector: ".cta-etag-button" }, content: { selector: ".etag-assist-main-body", removeOnInit: true }, closeButton: { selector: ".etag-assist-content-close" }, overlay: { selector: ".etag-assist-overlay" }, }; const create = (itemData) => { const closeAssist = (target) => { element.classList.remove("show"); _.api.track.interaction(target, "click", "close", { campaignId: itemData.id, module: moduleName }); }; const openAssist = () => { add(); element.offsetWidth; element.classList.add("show"); }; const clearList = () => { const list = components.productsListItem.parent; while (list.firstChild) list.removeChild(list.lastChild); }; const doSearch = async (value) => { await _.api.get(_.api.urlCaptureService, "/products/" + _.utils.uuid() + "/search", { "q": value, "p": moduleName, sorting: "desc", order: "updatedAt" }) .then((response) => { return response.json(); }).then((data) => { const listProducts = filterObjectsWithAttributes(data); displayData(listProducts); }); }; const viewProduct = (product) => { _.api.track.interaction("view-product", "click", "display", { campaignId: itemData.id, module: moduleName, productId: product.id }); const productView = components.productView.element.cloneNode(true); components.products.element.classList.add("product-view"); for (const prop in product) { const propLower = prop.toLowerCase(); const propValue = product[prop]; const isImage = propLower == "image" && propValue.indexOf("svg") == -1; const tag = productView.querySelector("." + propLower + (isImage ? " img" : "")); if (tag) if (propLower == "url") { let url = propValue; if (itemData["linkUTM"]) url = _.utils.formatLink(url, itemData["linkUTM"]); if (itemData["linkPixelclick"]) url = itemData["linkPixelclick"] + url; tag.setAttribute("href", _.api.track.url(url, { origin: moduleName + "|detail" })); } else if (isImage) tag.setAttribute("src", propValue); else tag.innerHTML = propValue; } components.productView.parent.appendChild(productView); }; const closeProduct = () => { components.products.element.classList.remove("product-view"); components.productView.parent .querySelector(".etag-assist-main-product-view") .remove(); }; const displayData = (listProducts) => { clearList(); const list = components.productsListItem.parent; if (listProducts.length == 0) list.appendChild(components.productsListNotFound.element); else for (const item of listProducts) { const listItem = components.productsListItem.element.cloneNode(true); const view = listItem.querySelector(".view"); const buy = listItem.querySelector(".buy"); view.innerHTML = productsViewButtonLabel; buy.innerHTML = productsBuyButtonLabel; for (const prop in item) { const propLower = prop.toLowerCase(); const propValue = item[prop]; const isImage = propLower == "image" && propValue.indexOf("svg") == -1; const tag = listItem.querySelector("." + propLower + (isImage ? " img" : "")); if (tag) if (propLower == "url") { let url = propValue; if (itemData["linkUTM"]) url = _.utils.formatLink(url, itemData["linkUTM"]); if (itemData["linkPixelclick"]) url = itemData["linkPixelclick"] + url; tag.setAttribute("href", _.api.track.url(url, { origin: moduleName + "|list" })); } else if (isImage) tag.setAttribute("src", propValue); else tag.innerHTML = propValue; } listItem.querySelector(".etag-products-view") .addEventListener("click", () => { viewProduct(item); }); list.appendChild(listItem); } }; const filterObjectsWithAttributes = (objects) => { const requiredAttributes = ["image", "url", "description", "price", "name"]; return objects.filter((obj) => requiredAttributes.every((attr) => Object.keys(obj).some((key) => key.toLowerCase() === attr.toLowerCase()) && typeof obj[attr] !== "undefined" && obj[attr] !== null && String(obj[attr]).trim() !== "")).slice(0, 10); }; const createFilter = (filter, active = false) => { if (!filter?.label) return; debug("Filter: ", filter.label, active); let listProducts = []; const itemParent = components.productsFilterItem.parent; const filterItem = components.productsFilterItem.element.cloneNode(true); filterItem.querySelector(".label").innerHTML = filter.label; itemParent.appendChild(filterItem); filterItem.addEventListener("displayData", () => { itemParent .querySelectorAll("div") .forEach((div) => { div.classList.remove("active"); }); filterItem.classList.add("active"); displayData(listProducts); }); filterItem.addEventListener("click", () => { filterItem.dispatchEvent(new Event("displayData")); }); if (active) filterItem.classList.add("active"); const successCallback = (data) => { listProducts = filterObjectsWithAttributes(data || []); filterItem.querySelector(".qty").innerHTML = "" + listProducts.length; if (active) displayData(listProducts); }; const failCallback = (error) => console.log("Erro:", error); _.utils.fetchURL(filter.url, successCallback, failCallback); }; const dispath = (trigger, action) => { const session = _.utils.session(_.utils.sessionName()); const impressionName = "assistImpressions" + itemData.id; const assistImpressions = session.get(impressionName) || 0; if (itemData["fireInSessionQtty"] > assistImpressions) { openAssist(); session.set(impressionName, assistImpressions + 1); _.api.track.interaction(null, trigger, action, { campaignId: itemData.id, module: moduleName }); } clearDispath(); }; const dispathConfig = { dispatchInactivityInterval: setTimeout(() => { }), dispatchExitIntentInterval: setTimeout(() => { }), engageOffset: 100, engageMaxLimit: 0, desktopInactivityFunction: () => { clearTimeout(dispathConfig.dispatchInactivityInterval); dispathConfig.dispatchInactivityInterval = setTimeout(dispath, itemData["fireDesktopInactivityDelay"], "inactivity", "open"); }, desktopExitIntentFunction: (evt) => { clearTimeout(dispathConfig.dispatchExitIntentInterval); const intentions = { PASSIVE: [50, itemData["fireDesktopExitIntentDelay"]], NEUTRAL: [100, 0], ACTIVE: [150, 0] }; const intention = intentions[itemData["fireDesktopExitIntentAction"]]; if (intention[0] >= evt.y) { dispathConfig.dispatchExitIntentInterval = setTimeout(dispath, intention[1], "exit-intention-" + itemData["fireDesktopExitIntentAction"], "open"); } }, mobileInactivityFunction: () => { clearTimeout(dispathConfig.dispatchInactivityInterval); dispathConfig.dispatchInactivityInterval = setTimeout(dispath, itemData["fireMobileInactivityDelay"], "inactivity", "open"); }, mobileOnLostFocusFunction: () => { clearTimeout(dispathConfig.dispatchExitIntentInterval); dispathConfig.dispatchExitIntentInterval = setTimeout(dispath, itemData["fireMobileOnLostFocusDelay"], "onLostFocus", "open"); }, mobileOnFocusFunction: () => { clearTimeout(dispathConfig.dispatchExitIntentInterval); }, mobileOnScrollFunction: () => { dispathConfig.engageMaxLimit = Math.max(dispathConfig.engageOffset, dispathConfig.engageMaxLimit, window.scrollY); if (dispathConfig.engageMaxLimit > window.scrollY) dispath("onScroll", "open"); } }; const setDispath = () => { if (!_.utils.isMobile()) { if (itemData["fireDesktopExitIntent"]) document.addEventListener("mousemove", dispathConfig.desktopExitIntentFunction); if (itemData["fireDesktopInactivity"]) document.addEventListener("mousemove", dispathConfig.desktopInactivityFunction); } else { if (itemData["fireMobileInactivity"]) document.addEventListener("touchmove", dispathConfig.mobileInactivityFunction); if (itemData["fireMobileOnLostFocus"]) { window.addEventListener("blur", dispathConfig.mobileOnLostFocusFunction); window.addEventListener("focus", dispathConfig.mobileOnFocusFunction); } if (itemData["fireMobileOnScroll"]) document.addEventListener("scroll", dispathConfig.mobileOnScrollFunction); } }; const clearDispath = () => { clearTimeout(dispathConfig.dispatchInactivityInterval); clearTimeout(dispathConfig.dispatchExitIntentInterval); document.removeEventListener("mousemove", dispathConfig.desktopExitIntentFunction); document.removeEventListener("mousemove", dispathConfig.desktopInactivityFunction); document.removeEventListener("touchmove", dispathConfig.mobileInactivityFunction); window.removeEventListener("blur", dispathConfig.mobileOnLostFocusFunction); window.removeEventListener("focus", dispathConfig.mobileOnFocusFunction); document.removeEventListener("scroll", dispathConfig.mobileOnScrollFunction); }; const promoButtonHandlers = { LINK: (promoButton) => promoButton.setAttribute("href", itemData["contentPromoButtonLink"] || "#"), CLOSE: (promoButton) => { if (promoButton.tagName.toLowerCase() === "a") { promoButton = transformAnchorToButton(promoButton); } promoButton.addEventListener("click", (event) => { event.preventDefault(); closeAssist(promoButton.innerText); }); } }; const transformAnchorToButton = (anchor) => { const button = document.createElement("button"); button.innerHTML = anchor.innerHTML; button.className = anchor.className; button.setAttribute("type", "button"); Array.from(anchor.attributes).forEach(attr => { if (attr.name !== "href") { button.setAttribute(attr.name, attr.value); } }); anchor.parentNode?.replaceChild(button, anchor); return button; }; const handlePromoButtonHandlersClick = (promoButton) => { const type = itemData["promoButtonType"]; const handler = promoButtonHandlers[type]; if (handler) handler(promoButton); }; const targetHtmlSelector = itemData["targetHtmlSelector"] || "body"; const targets = _.utils.getElements(targetHtmlSelector); if (targets.length == 0) { debug(`Target element not found: ${targetHtmlSelector}`); return null; } const target = targets[0]; const css = ""; const script = document.createElement("script"); script.type = "text/javascript"; script.append(itemData["customJs"]); const element = document.createElement("div"); const init = () => { element.setAttribute("class", "etag-assist etag-assist" + itemData["id"]); element.innerHTML = css + DEFAULT_TEMPLATE; element.prepend(script); for (const el in components) { const obj = components[el]; obj.element = element.querySelector(obj.selector); obj.parent = obj.element.parentElement; if (obj.removeOnInit) obj.element.remove(); } !itemData["headerDisplay"] && components.header.element.remove(); itemData["headerImage"] && components.headerImage.element.setAttribute("src", itemData["headerImage"]); itemData["closeOnClickOutside"] && components.overlay.element.addEventListener("click", () => { closeAssist("overlay"); }); components.closeButton.element.addEventListener("click", () => { closeAssist("closeButton"); }); if (itemData["contentDisplay"]) { components.content.parent.appendChild(components.content.element); if (itemData["contentPromoContent"]) { const el = components.contentPromo.element; el.querySelector("div").innerHTML = itemData["contentPromoContent"]; const promoButton = components.ctaButton.element; promoButton.innerHTML = itemData["contentPromoButtonLabel"] || promoButtonLabel; handlePromoButtonHandlersClick(promoButton); const links = el.querySelectorAll("a"); for (const link of links) { let url = link.getAttribute("href"); if (itemData["linkUTM"]) url = _.utils.formatLink(url, itemData["linkUTM"]); if (itemData["linkPixelclick"]) url = itemData["linkPixelclick"] + url; link.setAttribute("href", _.api.track.url(url, { origin: moduleName + "|content|" + link.innerText })); link.addEventListener("click", () => { _.api.track.interaction(link.innerHTML, "click", "redirect", { campaignId: itemData["id"], link: link.href, module: moduleName }); }); } } } if (itemData["productsDisplay"]) { components.products.parent.appendChild(components.products.element); productsViewButtonLabel = itemData["productsViewButtonLabel"] || productsViewButtonLabel; productsBuyButtonLabel = itemData["productsBuyButtonLabel"] || productsBuyButtonLabel; const filters = []; const cookie = _.utils.cookies.get(_.api.sessionName); if (itemData["productsFeedDisplay"]) filters.push({ slug: "related", label: itemData["productsFeedLabel"] || "Recomendações", url: _.api.urlCaptureService + "/products/" + cookie.uuid + "?limit=50&sorting=desc&order=updatedAt", }); if (itemData["productsHistoricDisplay"]) filters.push({ slug: "history", label: itemData["productsHistoricLabel"] || "Histórico", url: _.api.urlCaptureService + "/history/" + cookie.sessionId + "?limit=50&sorting=desc&order=updatedAt", }); for (const index in filters) createFilter(filters[index], +index == 0); const filterSearch = components.filterSearch.element; const searchInput = filterSearch.querySelector("input"); searchInput.setAttribute("placeholder", filterSearchPlaceholder); components.searchButton.element.addEventListener("click", () => { filterSearch.classList.add("open"); }); components.closeSearchButton.element.addEventListener("click", () => { filterSearch.classList.remove("open"); searchInput.value = ""; components.productsFilterItem.parent .querySelector(".active") .dispatchEvent(new Event("displayData")); }); searchInput.addEventListener("input", (evt) => { const target = evt.target; const value = target.value; if (value.length > 2) doSearch(value); else clearList(); }); components.backButton.element.addEventListener("click", closeProduct); } setDispath(); }; const add = () => { target.appendChild(element); }; const remove = () => { if (element.parentElement) target.removeChild(element); clearDispath(); }; const update = () => { remove(); setDispath(); }; init(); return { remove: remove, update: update }; }; return { create: create, }; }; const DEFAULT_TEMPLATE = decodeURIComponent("%3Cdiv%20class%3D%22etag-assist-container%22%3E%0A%09%3Cdiv%20class%3D%22etag-assist-content-box%22%3E%0A%09%09%3Cdiv%20class%3D%22etag-assist-content-close%22%3E%3C%2Fdiv%3E%0A%09%09%3Cdiv%20class%3D%22etag-assist-content%22%3E%0A%09%09%09%3Cdiv%20class%3D%22etag-asssist-main%22%3E%0A%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-header%22%3E%0A%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-header-logo%22%3E%0A%09%09%09%09%09%09%3Cimg%20src%3D%22https%3A%2F%2Fs3.amazonaws.com%2Ffiles.etagdigital.com.br%2Fimagens%2Fetag-logo.png%22%20alt%3D%22Logo%22%20%2F%3E%0A%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-body%22%3E%0A%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-body-promo%22%3E%0A%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-body-promo-content%22%3E%0A%09%09%09%09%09%09%09%3Cdiv%20style%3D%22padding%3A%2020px%3B%22%3E%0A%09%09%09%09%09%09%09%09%3Cspan%3EParab%C3%A9ns!%3C%2Fspan%3E%3C%2Fbr%3E%0A%09%09%09%09%09%09%09%09Seu%20%3Cb%20style%3D%22font%3A%20revert%3B%22%3ETagassit%3C%2Fb%3E%20foi%20instalado%20com%20sucesso%20e%20agora%20est%C3%A1%0A%09%09%09%09%09%09%09%09funcionando.%3C%2Fbr%3E%0A%09%09%09%09%09%09%09%09Para%20personalizar%20seu%20conte%C3%BAdo%2C%20acesse%20sua%20%3Ca%0A%09%09%09%09%09%09%09%09%09style%3D%22%20text-decoration%3A%20underline%3B%20color%3A%20blue%3B%22%20href%3D%22%22%3Ep%C3%A1gina%20de%0A%09%09%09%09%09%09%09%09%09administra%C3%A7%C3%A3o%3C%2Fa%3E.%20Aqui%20voc%C3%AA%20pode%20personalizar%20e%20adaptar%20o%20banner%20de%20acordo%20com%20suas%0A%09%09%09%09%09%09%09%09prefer%C3%AAncias.%3C%2Fbr%3E%0A%09%09%09%09%09%09%09%09Se%20precisar%20de%20ajuda%20durante%20o%20processo%20de%20personaliza%C3%A7%C3%A3o%2C%20n%C3%A3o%20hesite%20em%20entrar%20em%0A%09%09%09%09%09%09%09%09contato%20com%20nossa%20equipe%20de%20suporte!%20%3C%2Fbr%3E%0A%09%09%09%09%09%09%09%09Obrigado!%0A%09%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%09%3Ca%20class%3D%22etag-button%20etag-assist-main-body-cta%20cta-etag-button%22%20href%3D%22%23%22%3EComprar%3C%2Fa%3E%0A%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-products%22%3E%0A%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-products-filter%22%3E%0A%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-products-selections%22%3E%0A%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-products-filter-item%22%3E%0A%09%09%09%09%09%09%09%09%3Cbutton%20class%3D%22etag-button%22%3E%3Cspan%20class%3D%22label%22%3EFiltro%3C%2Fspan%3E%3Cspan%0A%09%09%09%09%09%09%09%09%09%09class%3D%22qty%22%3E0%3C%2Fspan%3E%3C%2Fbutton%3E%0A%09%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-products-filter-search%22%3E%0A%09%09%09%09%09%09%09%3Cbutton%20class%3D%22etag-assist-search-etag-button%22%3E%3C%2Fbutton%3E%0A%09%09%09%09%09%09%09%3Cinput%20type%3D%22text%22%20placeholder%3D%22Pesquise...%22%20class%3D%22etag-assist-search-query%22%20%2F%3E%0A%09%09%09%09%09%09%09%3Cbutton%20class%3D%22etag-assist-search-close%22%3E%26times%3B%3C%2Fbutton%3E%0A%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-product-to-view%22%3E%0A%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-products-go-back%22%3E%0A%09%09%09%09%09%09%09%09%3Ca%20class%3D%22etag-go-back-etag-button%22%20href%3D%22javascript%3A%3B%22%3E%0A%09%09%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-ponta%22%3E%3C%2Fdiv%3E%0A%09%09%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-corpo%22%3E%3C%2Fdiv%3E%0A%09%09%09%09%09%09%09%09%09%3Cspan%3E%20Voltar%20%3C%2Fspan%3E%0A%09%09%09%09%09%09%09%09%3C%2Fa%3E%0A%09%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-products-list%22%3E%0A%09%09%09%09%09%09%3Cul%3E%0A%09%09%09%09%09%09%09%3Cli%20class%3D%22etag-products%20not-found%22%3E%0A%09%09%09%09%09%09%09%09%3Cp%3ENenhum%20registro%20foi%20encontrado!%3C%2Fp%3E%0A%09%09%09%09%09%09%09%3C%2Fli%3E%0A%09%09%09%09%09%09%09%3Cli%20class%3D%22etag-products%20product-item%22%3E%0A%09%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-products-img%20image%22%3E%0A%09%09%09%09%09%09%09%09%09%3Cimg%20class%3D%22img-responsive%22%20src%3D%22%22%20%2F%3E%0A%09%09%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-products-description%22%3E%0A%09%09%09%09%09%09%09%09%09%3Ch2%20class%3D%22name%22%3EFiltro%20de%20%C3%81gua%20Externo%20para%20Refrigerador%20Side%20By%20Side%20Electrolux%0A%09%09%09%09%09%09%09%09%09%3C%2Fh2%3E%0A%09%09%09%09%09%09%09%09%09%3Cdiv%20class%3D%22price%22%3ER%24%20129%2C90%3C%2Fdiv%3E%0A%09%09%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-products-selections%22%3E%0A%09%09%09%09%09%09%09%09%09%09%3Ca%20class%3D%22etag-products-view%20etag-button%20view%22%3EVisualizar%3C%2Fa%3E%0A%09%09%09%09%09%09%09%09%09%09%3Ca%20class%3D%22etag-products-buy%20etag-button%20buy%20url%22%20href%3D%22%23%22%3EComprar%3C%2Fa%3E%0A%09%09%09%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%09%09%3C%2Fli%3E%0A%09%09%09%09%09%09%3C%2Ful%3E%0A%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-main-product-view%22%3E%0A%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-product-view%22%3E%0A%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-product-view-image%20image%22%3E%0A%09%09%09%09%09%09%09%09%3Cimg%20src%3D%22https%3A%2F%2Fcdn.etagdigital.com%2Fsite-institucional%2F2023%2F04%2Fsimbolo.png%22%20%2F%3E%0A%09%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-product-view-name%20name%22%3E%3C%2Fdiv%3E%0A%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-product-view-price%20price%22%3E%3C%2Fdiv%3E%0A%09%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-assist-product-view-description%20description%22%3E%3C%2Fdiv%3E%0A%09%09%09%09%09%09%3C%2Fdiv%3E%0A%0A%09%09%09%09%09%09%3Cdiv%20class%3D%22etag-product-action%22%3E%0A%09%09%09%09%09%09%09%3Ca%20class%3D%22etag-button%20url%22%20href%3D%22javascript%3A%3B%22%3EComprar%20agora%3C%2Fa%3E%0A%09%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%09%3C%2Fdiv%3E%0A%09%09%09%3C%2Fdiv%3E%0A%09%09%3C%2Fdiv%3E%0A%09%3C%2Fdiv%3E%0A%09%3Cdiv%20class%3D%22etag-assist-overlay%22%3E%3C%2Fdiv%3E%0A%3C%2Fdiv%3E"); const DEFAULT_STYLE = decodeURIComponent(".etag-assist-container%20%3A%3A-webkit-scrollbar%20%7B%0A%09width%3A%200px%3B%0A%7D%0A%0A.etag-assist%20*%20%7B%0A%09margin%3A%200%3B%0A%09padding%3A%200%3B%0A%09border%3A%200%3B%0A%09font%3A%20inherit%3B%0A%09vertical-align%3A%20baseline%3B%0A%09box-sizing%3A%20border-box%3B%0A%09position%3A%20relative%3B%0A%09background%3A%20none%3B%0A%09color%3A%20var(--content-txt-color)%3B%0A%7D%0A%0A.etag-assist%20%7B%0A%09--content-opacity%3A%200%3B%0A%09--color-default%3A%20%23fecc30%3B%0A%09--bg-color%3A%20%23ffffff%3B%0A%09--color-black%3A%20%23000000%3B%0A%09--shadow%3A%202px%203px%2011px%20%2300000087%3B%0A%09--component-transition%3A%200.4s%20linear%3B%0A%09--content-txt-color%3A%20rgb(49%2C%2049%2C%2049)%3B%0A%09--btn-close-tx-color%3A%20%23e7e7e7%3B%0A%09--btn-close-tx-color-hover%3A%20%23939393%3B%0A%09--btn-close-bg-color%3A%20%23202020%3B%0A%09--btn-close-bg-color-hover%3A%20%23050505%3B%0A%0A%09position%3A%20fixed%3B%0A%09top%3A%200%3B%0A%09right%3A%200%3B%0A%09height%3A%20100%25%3B%0A%09z-index%3A%202147483646%20!important%3B%0A%09transition%3A%200.9s%20cubic-bezier(0.165%2C%200.84%2C%200.44%2C%201)%3B%0A%09font-family%3A%20%22Montserrat%22%2C%20sans-serif%3B%0A%09pointer-events%3A%20none%3B%0A%7D%0A%0A.etag-assist-hide%20%7B%0A%09display%3A%20none%3B%0A%7D%0A%0A.etag-assist-container%20%7B%0A%09height%3A%20100%25%3B%0A%09right%3A%20-105%25%3B%0A%09transition%3A%20right%20var(--component-transition)%3B%0A%7D%0A%0A.etag-assist%20a%20%7B%0A%09text-decoration%3A%20none%3B%0A%7D%0A%0A.etag-assist.show%20%7B%0A%09pointer-events%3A%20auto%3B%0A%7D%0A%0A.etag-assist.show%20%3E%20.etag-assist-container%20%3E%20.etag-assist-overlay%20%7B%0A%09--content-opacity%3A%201%3B%0A%09pointer-events%3A%20auto%3B%0A%7D%0A%0A.etag-assist.show%20%3E%20.etag-assist-container%20%7B%0A%09right%3A%200%3B%0A%7D%0A%0A.etag-assist-container.show%20.etag-assist-content%20%7B%0A%7D%0A%0A.etag-assist-content-box%20%7B%0A%09height%3A%20100%25%3B%0A%09min-width%3A%20390px%3B%0A%09z-index%3A%202%3B%0A%09overflow%3A%20visible%3B%0A%09display%3A%20inline-flex%3B%0A%7D%0A%0A.etag-assist-overlay%20%7B%0A%09position%3A%20fixed%3B%0A%09left%3A%200px%3B%0A%09top%3A%200px%3B%0A%09width%3A%20100%25%3B%0A%09height%3A%20100%25%3B%0A%09background%3A%20%23363636cc%3B%0A%09opacity%3A%20var(--content-opacity)%3B%0A%09z-index%3A%201%3B%0A%09transition%3A%201s%20cubic-bezier(0.165%2C%200.84%2C%200.44%2C%201)%3B%0A%09pointer-events%3A%20none%3B%0A%09backdrop-filter%3A%20blur(2px)%3B%0A%7D%0A%0A.etag-assist-content%20%7B%0A%09background%3A%20var(--bg-color)%3B%0A%09height%3A%20100%25%3B%0A%09max-width%3A%20350px%3B%0A%09width%3A%20350px%3B%0A%09box-shadow%3A%20var(--shadow)%3B%0A%09overflow-y%3A%20auto%3B%0A%7D%0A%0A.etag-assist-content%20img%20%7B%0A%09transform%3A%20scale(1)%3B%0A%7D%0A%0A.etag-assist-content%20img%3Ahover%20%7B%0A%09transform%3A%20scale(1)%3B%0A%7D%0A%0A.etag-assist-content-close%20%7B%0A%09--component-transition%3A%200.2s%20ease-out%3B%0A%09background-color%3A%20var(--btn-close-bg-color)%3B%0A%09height%3A%2040px%3B%0A%09width%3A%2040px%3B%0A%09border-radius%3A%206px%200px%200px%206px%3B%0A%09cursor%3A%20pointer%3B%0A%09transition%3A%20all%20var(--component-transition)%3B%0A%09-moz-transition%3A%20all%20var(--component-transition)%3B%0A%09-webkit-transition%3A%20all%20var(--component-transition)%3B%0A%09-o-transition%3A%20all%20var(--component-transition)%3B%0A%09-ms-transition%3A%20all%20var(--component-transition)%3B%0A%09box-shadow%3A%20var(--shadow)%3B%0A%7D%0A%0A.etag-assist-content-close%3Ahover%20%7B%0A%09background-color%3A%20var(--btn-close-bg-color-hover)%3B%0A%7D%0A%0A.etag-assist-content-close%3Ahover%3A%3Aafter%2C%0A.etag-assist-content-close%3Ahover%3A%3Abefore%20%7B%0A%09background-color%3A%20var(--btn-close-tx-color-hover)%3B%0A%7D%0A%0A.etag-assist-content-close%3A%3Aafter%2C%0A.etag-assist-content-close%3A%3Abefore%20%7B%0A%09background-color%3A%20var(--btn-close-tx-color)%3B%0A%09position%3A%20absolute%3B%0A%09content%3A%20%22%22%3B%0A%09display%3A%20block%3B%0A%09width%3A%2020px%3B%0A%09height%3A%202px%3B%0A%09border-radius%3A%205px%3B%0A%09margin%3A%20auto%3B%0A%09top%3A%200%3B%0A%09bottom%3A%200%3B%0A%09left%3A%200%3B%0A%09right%3A%200%3B%0A%7D%0A%0A.etag-assist-content-close%3A%3Aafter%20%7B%0A%09transform%3A%20rotate(-45deg)%3B%0A%7D%0A%0A.etag-assist-content-close%3A%3Abefore%20%7B%0A%09transform%3A%20rotate(45deg)%3B%0A%7D%0A%0A.etag-assist-main-header%20%7B%0A%09top%3A%200%3B%0A%09position%3A%20sticky%3B%0A%09z-index%3A%2010%3B%0A%09background%3A%20white%3B%0A%09text-align%3A%20center%3B%0A%7D%0A%0A.etag-assist-main-header-logo%20%7B%0A%09max-width%3A%20100%25%3B%0A%09max-height%3A%20100%25%3B%0A%7D%0A.etag-assist-main-header-logo%20img%20%7B%0A%09object-fit%3A%20contain%3B%0A%09max-width%3A%20100%25%3B%0A%09max-height%3A%20100%25%3B%0A%7D%0A%0A.etag-assist-main-body-content%20%7B%0A%09text-align%3A%20center%3B%0A%09font-size%3A%2012px%3B%0A%09padding%3A%205px%200px%3B%0A%7D%0A%0A.etag-assist-main-body%20%7B%0A%09padding%3A%200px%3B%0A%09text-align%3A%20center%3B%0A%7D%0A%0A.etag-assist-main-body%20img%20%7B%0A%09max-width%3A%20100%25%3B%0A%09max-height%3A%20100%25%3B%0A%09object-fit%3A%20contain%3B%0A%7D%0A%0A.etag-assist-main-body%20.etag-button%20%7B%0A%09background-color%3A%20var(--color-default)%3B%0A%09color%3A%20%23ffffff%3B%0A%09display%3A%20block%3B%0A%09display%3A%20block%3B%0A%09font-weight%3A%20700%3B%0A%09border-radius%3A%204px%3B%0A%09line-height%3A%2014px%3B%0A%09margin%3A%208px%2030px%200%2030px%3B%0A%09padding%3A%2016px%200%3B%0A%09text-align%3A%20center%3B%0A%09text-transform%3A%20uppercase%3B%0A%09cursor%3A%20pointer%3B%0A%7D%0A%0A.etag-assist-main-products-filter%20%7B%0A%09position%3A%20relative%3B%0A%09background%3A%20%23fff%3B%0A%09box-shadow%3A%201px%202px%203px%20%23999%3B%0A%09border-top%3A%201px%20solid%20%23eee%3B%0A%09height%3A%2050px%3B%0A%09margin%3A%200%200%207px%200%3B%0A%09padding%3A%200%2016px%3B%0A%09display%3A%20flex%3B%0A%09overflow%3A%20hidden%3B%0A%7D%0A%0A.etag-filter-fixed%20%7B%0A%09position%3A%20fixed%3B%0A%09top%3A%20100px%3B%0A%09max-width%3A%20350px%3B%0A%09z-index%3A%2050%3B%0A%09width%3A%20100%25%3B%0A%7D%0A%0A.etag-assist-main-products-filter%20.etag-assist-main-products-selections%20%7B%0A%09display%3A%20flex%3B%0A%7D%0A%0A.etag-assist-main-products-filter-search%20%7B%0A%09position%3A%20absolute%3B%0A%09left%3A%2089%25%3B%0A%09display%3A%20flex%3B%0A%09align-items%3A%20center%3B%0A%09background-color%3A%20%23fff%3B%0A%09padding-left%3A%2010px%3B%0A%7D%0A%0A.etag-assist-main-products-filter-search.open%20%7B%0A%09left%3A%200%3B%0A%7D%0A%0A.etag-assist-main-products-filter-search.open%20.etag-assist-search-etag-button%20%7B%0A%09scale%3A%201%3B%0A%7D%0A%0A.etag-assist-main-products-filter-search%20input%20%7B%0A%20%20%20%20outline%3A%200%3B%0A%20%20%20%20border-radius%3A%200%3B%0A%20%20%20%20border%3A%200%3B%0A%20%20%20%20font-size%3A%2012px%3B%0A%20%20%20%20color%3A%20%23999%3B%0A%20%20%20%20border%3A%200%3B%0A%20%20%20%20width%3A%20260px%3B%0A%20%20%20%20height%3A%2030px%3B%0A%20%20%20%20margin%3A%2010px%2010px%3B%0A%20%20%20%20box-shadow%3A%20none%3B%0A%7D%0A%0A.etag-assist-main-products-filter-search%20input%3Afocus%20%7B%20%0A%20%20%20%20box-shadow%3A%20none%3B%0A%7D%0A%0A.etag-assist-main-products-filter%20%3E%20div%20%7B%0A%09white-space%3A%20nowrap%3B%0A%7D%0A%0A.etag-assist-main-products-filter%20.etag-button%20%7B%0A%09color%3A%20var(--color-black)%3B%0A%09display%3A%20inline-block%3B%0A%09font-size%3A%2012px%3B%0A%09line-height%3A%2024px%3B%0A%09margin%3A%2012px%2012px%200%200%3B%0A%0A%09background-color%3A%20transparent%3B%0A%09background-repeat%3A%20no-repeat%3B%0A%09border%3A%20none%3B%0A%09cursor%3A%20pointer%3B%0A%09overflow%3A%20hidden%3B%0A%09outline%3A%20none%3B%0A%7D%0A%0A.etag-assist-main-products-filter%20.etag-button%20%3E%20.qty%20%7B%0A%09background-color%3A%20var(--color-default)%3B%0A%09color%3A%20%23ffffff%3B%0A%09border-radius%3A%2020px%3B%0A%09width%3A%2024px%3B%0A%09line-height%3A%2024px%3B%0A%09text-align%3A%20center%3B%0A%09display%3A%20inline-block%3B%0A%09margin-left%3A%202px%3B%0A%7D%0A%0A.etag-assist-main-product-to-view%20%7B%0A%09display%3A%20none%3B%0A%09align-items%3A%20center%3B%0A%7D%0A%0A.etag-go-back-etag-button%20%7B%0A%09color%3A%20var(--color-black)%3B%0A%09display%3A%20flex%3B%0A%09align-items%3A%20center%3B%0A%7D%0A.etag-go-back-etag-button%20span%20%7B%0A%09margin-left%3A%2010px%3B%0A%09font-size%3A%2012px%3B%0A%7D%0A%0A.etag-go-back-etag-button%20.etag-ponta%20%7B%0A%09width%3A%200%3B%0A%09height%3A%200%3B%0A%09padding%3A%205px%3B%0A%09box-shadow%3A%202px%20-2px%200px%200px%20%23000%20inset%3B%0A%09border%3A%20solid%20transparent%3B%0A%09transform%3A%20rotate(45deg)%3B%0A%09border-radius%3A%203px%3B%0A%7D%0A%0A.etag-go-back-etag-button%20.etag-corpo%20%7B%0A%09width%3A%2014px%3B%0A%09height%3A%202px%3B%0A%09background%3A%20%23000%3B%0A%09position%3A%20absolute%3B%0A%09margin-left%3A%206%25%3B%0A%09border-radius%3A%202px%3B%0A%7D%0A%0A.etag-assist-search-etag-button%3A%3Abefore%20%7B%0A%20%20%20%20content%3A%20%22%22%3B%0A%20%20%20%20box-sizing%3A%20border-box%3B%0A%20%20%20%20position%3A%20relative%3B%0A%20%20%20%20display%3A%20block%3B%0A%20%20%20%20width%3A%2010px%3B%0A%20%20%20%20height%3A%2010px%3B%0A%20%20%20%20border%3A%202px%20solid%3B%0A%20%20%20%20border-radius%3A%20100%25%3B%0A%20%20%20%20margin-left%3A%200px%3B%0A%20%20%20%20margin-top%3A%20-4px%3B%0A%7D%0A%0A.etag-assist-search-etag-button%3A%3Aafter%20%7B%0A%20%20%20%20content%3A%20%22%22%3B%0A%20%20%20%20display%3A%20block%3B%0A%20%20%20%20box-sizing%3A%20border-box%3B%0A%20%20%20%20position%3A%20absolute%3B%0A%20%20%20%20border-radius%3A%200px%3B%0A%20%20%20%20width%3A%202px%3B%0A%20%20%20%20height%3A%207px%3B%0A%20%20%20%20background%3A%20currentColor%3B%0A%20%20%20%20transform%3A%20rotate(-45deg)%3B%0A%20%20%20%20top%3A%2012px%3B%0A%20%20%20%20left%3A%209px%3B%0A%7D%0A%0A.etag-assist-search-etag-button%20%7B%0A%09width%3A%2025px%3B%0A%09height%3A%2025px%3B%0A%09scale%3A%201.2%3B%0A%09cursor%3A%20pointer%3B%0A%09background-color%3A%20%23ffffff00%3B%0A%09color%3A%20var(--color-default)%3B%0A%09border%3A%20none%3B%0A%7D%0A%0A.etag-assist-search-close%20%7B%0A%09cursor%3A%20pointer%3B%0A%09font-size%3A%2030px%3B%0A%09background-color%3A%20%23ffffff00%3B%0A%09color%3A%20var(--color-default)%3B%0A%09border%3A%20none%3B%0A%7D%0A%0A.etag-assist-search-close%3Ahover%20%7B%0A%09color%3A%20red%3B%0A%7D%0A%0A.etag-assist-main-products%20%7B%0A%7D%0A%0A.etag-assist-main-products-list%20%7B%0A%09padding%3A%200px%2010px%3B%0A%7D%0A%0A.etag-assist-main-products-list%20p%20%7B%0A%09font-size%3A%2012px%3B%0A%7D%0A%0A.etag-assist-main-products-list%20li%20%7B%0A%09display%3A%20flex%3B%0A%7D%0A%0A.etag-assist-main-products-list%20h2%20%7B%0A%09font-size%3A%2012px%3B%0A%09color%3A%20%23000000%3B%0A%09padding%3A%200%200%208px%3B%0A%7D%0A%0A.etag-assist-main-products-list%20.price%20%7B%0A%09font-size%3A%2014px%3B%0A%09font-weight%3A%20700%3B%0A%09padding%3A%200%200%208px%3B%0A%7D%0A%0A.etag-assist-main-products-list%20.etag-products%20%7B%0A%09padding-block%3A%2010px%3B%0A%09border-bottom%3A%201px%20solid%20%23eee%3B%0A%7D%0A.etag-assist-main-products-list%20.etag-products-img%20%7B%0A%09display%3A%20flex%3B%0A%09justify-content%3A%20center%3B%0A%09align-items%3A%20center%3B%0A%09width%3A%2030%25%3B%0A%7D%0A.etag-assist-main-products-list%20.etag-products-description%20%7B%0A%09width%3A%2070%25%3B%0A%7D%0A%0A.etag-assist-main-products-list%20img%20%7B%0A%20%20%20%20max-width%3A%20100%25%3B%0A%20%20%20%20height%3A%2090px%3B%0A%20%20%20%20width%3A%20100px%3B%0A%20%20%20%20object-fit%3A%20contain%3B%0A%20%20%20%20padding-right%3A%2010px%3B%0A%7D%0A%0A.etag-assist-main-products-list%20.etag-button%20%7B%0A%09background-color%3A%20var(--color-default)%3B%0A%09color%3A%20%23ffffff%3B%0A%09display%3A%20block%3B%0A%09line-height%3A%2014px%3B%0A%09padding%3A%2010px%200%3B%0A%09text-align%3A%20center%3B%0A%09text-transform%3A%20uppercase%3B%0A%09font-size%3A%2012px%3B%0A%09border%3A%201px%20solid%20var(--color-default)%3B%0A%09cursor%3A%20pointer%3B%0A%7D%0A%0A.etag-assist-main-products-list%20.etag-assist-main-products-selections%20%7B%0A%09display%3A%20flex%3B%0A%7D%0A%0A.etag-assist-main-products-list%20.view%20%7B%0A%09width%3A%2048%25%3B%0A%09color%3A%20var(--color-default)%3B%0A%09background%3A%20%23fff0%3B%0A%7D%0A%0A.etag-assist-main-products-list%20.buy%20%7B%0A%09width%3A%2048%25%3B%0A%09margin-left%3A%205px%3B%0A%7D%0A%0A.etag-assist-main-product-view%20%7B%0A%7D%0A%0A.etag-assist-product-view%20%7B%0A%09padding%3A%2016px%2024px%2082px%3B%0A%7D%0A%0A.etag-assist-product-view-image%20%7B%0A%09display%3A%20flex%3B%0A%09justify-content%3A%20center%3B%0A%09align-items%3A%20center%3B%0A%7D%0A%0A.etag-assist-product-view-image%20img%20%7B%0A%09max-width%3A%20100%25%3B%0A%7D%0A%0A.etag-assist-product-view-name%20%7B%0A%20%20%20%20font-weight%3A%20700%3B%0A%20%20%20%20margin-bottom%3A%2010px%3B%0A%09font-size%3A13px%3B%0A%7D%0A.etag-assist-product-view-price%20%7B%0A%20%20%20%20font-weight%3A%20700%3B%0A%20%20%20%20margin-bottom%3A%2010px%3B%0A%7D%0A%0A.etag-assist-product-view-description%20%7B%0A%09font-size%3A%2012px%3B%0A%09padding-block%3A%2010px%3B%0A%7D%0A%0A.etag-product-action%20%7B%0A%09position%3A%20fixed%3B%0A%09bottom%3A%200%3B%0A%09background%3A%20%23fff%3B%0A%09box-shadow%3A%200%20-2px%203px%20%23999%3B%0A%09width%3A%20100%25%3B%0A%09max-width%3A%20350px%3B%0A%09padding%3A%2010px%3B%0A%09z-index%3A%201001%3B%0A%7D%0A.etag-product-action%20a%20%7B%0A%09background-color%3A%20var(--color-default)%3B%0A%09color%3A%20%23fff%3B%0A%09display%3A%20block%3B%0A%09font-size%3A%2012px%3B%0A%09font-weight%3A%20700%3B%0A%09border-radius%3A%204px%3B%0A%09line-height%3A%2024px%3B%0A%09margin%3A%200%3B%0A%09padding%3A%208px%200%3B%0A%09text-align%3A%20center%3B%0A%09text-transform%3A%20uppercase%3B%0A%7D%0A%0A.etag-assist-main-box-header%20%7B%0A%09height%3A%20100px%3B%0A%09padding%3A%2020px%2030px%3B%0A%09text-align%3A%20center%3B%0A%0A%09-webkit-box-sizing%3A%20border-box%3B%0A%09-moz-box-sizing%3A%20border-box%3B%0A%09box-sizing%3A%20border-box%3B%0A%7D%0A%0A.etag-assist-main-box-header%20%3E%20img%20%7B%0A%09position%3A%20relative%3B%0A%09max-width%3A%20100%25%3B%0A%09max-height%3A%20100%25%3B%0A%7D%0A%0A.etag-assist-main-box-main%20%7B%0A%09padding%3A%200%200%2020px%200%3B%0A%09overflow-x%3A%20hidden%3B%0A%09overflow-y%3A%20scroll%3B%0A%7D%0A%0A.etag-assist-main-box-main%20%3E%20p%20%7B%0A%09color%3A%20var(--color-default)%3B%0A%09text-align%3A%20center%3B%0A%09font-size%3A%2012px%3B%0A%09position%3A%20relative%3B%0A%09padding%3A%200%2030px%2020px%2030px%3B%0A%09margin%3A%200%3B%0A%7D%0A%0A.etag-assist-main-box-main%20%3E%20p%3Aafter%20%7B%0A%09content%3A%20%22%22%3B%0A%09position%3A%20absolute%3B%0A%09bottom%3A%200%3B%0A%09left%3A%2035%25%3B%0A%09height%3A%201px%3B%0A%09width%3A%2030%25%3B%0A%09border-bottom%3A%201px%20solid%20var(--color-default)%3B%0A%09margin-bottom%3A%2010px%3B%0A%7D%0A%0A.etag-assist-main-box-main%20%3E%20img%20%7B%0A%09display%3A%20block%3B%0A%09width%3A%20100%25%3B%0A%09max-width%3A%20340px%3B%0A%09margin%3A%200%20auto%2010px%20auto%3B%0A%7D%0A%0A.etag-assist-content-close%20%3E%20a%20%7B%0A%09display%3A%20block%3B%0A%09width%3A%2040px%3B%0A%09height%3A%2040px%3B%0A%09cursor%3A%20pointer%3B%0A%09opacity%3A%201%3B%0A%7D%0A%0A.etag-assist-content-close%20%3E%20a%3Ahover%20%7B%0A%09opacity%3A%200.6%3B%0A%7D%0A%0A.etag-assist-content-close%20%3E%20a%3Abefore%2C%0A.etag-assist-content-close%20%3E%20a%3Aafter%20%7B%0A%09position%3A%20absolute%3B%0A%09left%3A%2017px%3B%0A%09top%3A%206px%3B%0A%09content%3A%20%22%20%22%3B%0A%09height%3A%2027px%3B%0A%09width%3A%206px%3B%0A%09background-color%3A%20%23fff%3B%0A%09border-radius%3A%204px%3B%0A%7D%0A%0A.etag-assist-content-close%20%3E%20a%3Abefore%20%7B%0A%09transform%3A%20rotate(45deg)%3B%0A%7D%0A%0A.etag-assist-content-close%20%3E%20a%3Aafter%20%7B%0A%09transform%3A%20rotate(-45deg)%3B%0A%7D%0A%0A.etag-assist-content-box-etag-assist-search-etag-button%20%7B%0A%09position%3A%20relative%3B%0A%09display%3A%20inline-block%3B%0A%09background%3A%20%23fff%3B%0A%09border-radius%3A%2030px%3B%0A%09height%3A%206px%3B%0A%09width%3A%206px%3B%0A%09border%3A%202px%20solid%20var(--color-default)%3B%0A%09float%3A%20right%3B%0A%09margin%3A%2018px%200%200%200%20!important%3B%0A%09opacity%3A%201%3B%0A%7D%0A%0A.etag-assist-content-box-etag-assist-search-etag-button%3Aafter%20%7B%0A%09content%3A%20%22%22%3B%0A%09height%3A%202px%3B%0A%09width%3A%205px%3B%0A%09background%3A%20var(--color-default)%3B%0A%09position%3A%20absolute%3B%0A%09top%3A%207px%3B%0A%09left%3A%205px%3B%0A%09-webkit-transform%3A%20rotate(45deg)%3B%0A%09-moz-transform%3A%20rotate(45deg)%3B%0A%09-ms-transform%3A%20rotate(45deg)%3B%0A%09-o-transform%3A%20rotate(45deg)%3B%0A%7D%0A%0A.etag-assist-main-products-filter-item%20%7B%0A%09opacity%3A%200.5%3B%0A%7D%0A%0A.etag-assist-main-products-filter-item.active%20%7B%0A%09opacity%3A%201%3B%0A%7D%0A%0A.etag-assist-main-products.product-view%20.etag-assist-main-products-filter-search%2C%0A.etag-assist-main-products.product-view%20.etag-assist-main-products-selections%2C%0A.etag-assist-main-products.product-view%20.etag-assist-main-products-list%20%7B%0A%09display%3A%20none%3B%0A%7D%0A%0A.etag-assist-main-products.product-view%20.etag-assist-main-product-to-view%20%7B%0A%09display%3A%20block%3B%0A%7D%0A%0A.etag-assist-main-products-go-back%20%7B%0A%09padding%3A%2017px%200%3B%0A%7D%0A%0A%40media%20(max-width%3A%20390px)%20%7B%0A%09.etag-assist-content-box%20%7B%0A%09%09min-width%3A%20340px%3B%0A%09%7D%0A%0A%09.etag-assist-content%20%7B%0A%09%09max-width%3A%20300px%3B%0A%09%09width%3A%20300px%3B%0A%09%7D%0A%0A%09.etag-product-action%20%7B%0A%09%09max-width%3A%20300px%3B%0A%09%7D%0A%0A%09.etag-filter-fixed%20%7B%0A%09%09max-width%3A%20300px%3B%0A%09%7D%0A%0A%09.etag-assist-main-products-filter-search%20input%20%7B%20%0A%09%09width%3A%20220px%3B%20%0A%09%7D%0A%7D"); const tagAssist = TagAssist(); const campaigns = {}; function init() { debug("Initialize module"); data = (data || []).map((ta) => { if (ta.children) ta.children = ta.children.map((tac) => ({ ...tac, contentPromoContent: decodeURIComponent(tac.contentPromoContent), customCss: decodeURIComponent(tac.customCss), customJs: decodeURIComponent(tac.customJs) })); return { ...ta, contentPromoContent: decodeURIComponent(ta.contentPromoContent), customCss: decodeURIComponent(ta.customCss), customJs: decodeURIComponent(ta.customJs) }; }); for (let item of data) { if (item.active && item.children) { const options = item.children.concat([item]); item = options[Math.floor(Math.random() * options.length)]; } const name = item["name"]; const delay = item.delay || 0; debug(`Initializing item ${name} in ${delay}ms`, item); setTimeout(() => { const apply = _.utils.applyCampaign(item, moduleName); debug(`#### Assist ${name}`, "Apply:", apply); if (apply) campaigns[name] = tagAssist.create(item); }, delay); } } function update() { debug("Update module"); for (let item of data) { if (item.active && item.children) { const options = item.children.concat([item]); item = options[Math.floor(Math.random() * options.length)]; for (const opt of options) { campaigns[opt.name]?.remove(); delete campaigns[opt.name]; } } const name = item["name"]; const apply = _.utils.applyCampaign(item, moduleName); const campaign = campaigns[name]; debug(`Updating item ${name}`, item); debug(`#### Assist ${name}`, "Apply:", apply); if (apply) if (campaign) campaign.update(); else campaigns[name] = tagAssist.create(item); else if (campaign) { campaign.remove(); delete campaigns[name]; } } } init(); return { name: moduleName, update: update, };},}, modulesData: JSON.parse("{\"core\":[{\"debug\":false,\"isSPA\":true,\"status\":\"ACTIVE\"}],\"tag-capture\":[{\"id\":148,\"name\":\"Email\",\"delay\":0,\"includeIfUrlRegex\":\".+.com.br\\\\/checkout#\\\\/email(|\\\\/|\\\\?.+$|\\\\/\\\\?.+)$\",\"type\":\"LEAD\",\"triggerEvent\":\"LOAD\",\"selector\":null,\"systemCapture\":false,\"passiveCapture\":true,\"clientId\":51,\"createdAt\":\"2024-04-12T15:23:17.450Z\",\"updatedAt\":\"2024-05-14T14:51:23.170Z\",\"fields\":[{\"id\":389,\"name\":\"lead\",\"group\":\"\",\"selector\":\"#client-pre-email \",\"captureId\":148,\"htmlAttribute\":\"VALUE\",\"triggerEvent\":\"CHANGE\",\"createdAt\":\"2024-04-12T15:23:17.450Z\",\"updatedAt\":\"2024-05-14T14:50:07.462Z\"}]},{\"id\":147,\"name\":\"Carrinho\",\"delay\":3000,\"includeIfUrlRegex\":\".+.com.br\\\\/checkout#\\\\/cart?.+\",\"type\":\"CART\",\"triggerEvent\":\"LOAD\",\"selector\":null,\"systemCapture\":false,\"passiveCapture\":true,\"clientId\":51,\"createdAt\":\"2024-04-12T15:22:54.828Z\",\"updatedAt\":\"2024-05-15T20:12:34.149Z\",\"fields\":[{\"id\":383,\"name\":\"Image\",\"group\":\"cart\",\"selector\":\".cart-items .product-item img\",\"captureId\":147,\"htmlAttribute\":\"SRC\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:22:54.828Z\",\"updatedAt\":\"2024-05-14T14:52:35.453Z\"},{\"id\":387,\"name\":\"UnitPrice\",\"group\":\"cart\",\"selector\":\".cart-items .product-price .new-product-price\",\"captureId\":147,\"htmlAttribute\":\"INNER_TEXT\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:22:54.828Z\",\"updatedAt\":\"2024-05-14T14:52:34.957Z\"},{\"id\":385,\"name\":\"URL\",\"group\":\"cart\",\"selector\":\".cart-items .product-name a:first-child\",\"captureId\":147,\"htmlAttribute\":\"HREF\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:22:54.828Z\",\"updatedAt\":\"2024-05-14T14:52:35.168Z\"},{\"id\":388,\"name\":\"TotalBasket\",\"group\":\"\",\"selector\":\".totalizers tfoot .monetary\",\"captureId\":147,\"htmlAttribute\":\"INNER_TEXT\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:22:54.828Z\",\"updatedAt\":\"2024-05-14T14:52:35.167Z\"},{\"id\":386,\"name\":\"Quantity\",\"group\":\"cart\",\"selector\":\".cart-items .quantity input\",\"captureId\":147,\"htmlAttribute\":\"VALUE\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:22:54.828Z\",\"updatedAt\":\"2024-05-14T14:52:35.447Z\"},{\"id\":384,\"name\":\"Name\",\"group\":\"cart\",\"selector\":\".cart-items span.product-name\",\"captureId\":147,\"htmlAttribute\":\"INNER_TEXT\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:22:54.828Z\",\"updatedAt\":\"2024-05-14T14:52:35.464Z\"}]},{\"id\":146,\"name\":\"Produto\",\"delay\":4000,\"includeIfUrlRegex\":\".+.com.br\\\\/.+\\\\/p(|\\\\/|\\\\?.+$|\\\\/\\\\?.+)$\",\"type\":\"PRODUCT\",\"triggerEvent\":\"LOAD\",\"selector\":null,\"systemCapture\":false,\"passiveCapture\":true,\"clientId\":51,\"createdAt\":\"2024-04-12T15:21:13.602Z\",\"updatedAt\":\"2024-05-15T18:42:01.531Z\",\"fields\":[{\"id\":378,\"name\":\"image\",\"group\":\"product\",\"selector\":\".vtex-store-components-3-x-productImagesGallerySlide--product-images.center-all.swiper-slide-active img\",\"captureId\":146,\"htmlAttribute\":\"SRC\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:21:13.602Z\",\"updatedAt\":\"2024-04-12T15:21:13.602Z\"},{\"id\":379,\"name\":\"url\",\"group\":\"product\",\"selector\":\"\",\"captureId\":146,\"htmlAttribute\":\"URL\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:21:13.602Z\",\"updatedAt\":\"2024-04-12T15:21:13.602Z\"},{\"id\":380,\"name\":\"price\",\"group\":\"product\",\"selector\":\".alliedrecommerce-m3-pdp-components-1-x-productPrices__totalPrice\",\"captureId\":146,\"htmlAttribute\":\"INNER_TEXT\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:21:13.602Z\",\"updatedAt\":\"2024-04-12T15:21:13.602Z\"},{\"id\":381,\"name\":\"name\",\"group\":\"product\",\"selector\":\"main > div > .alliedrecommerce-m3-pdp-components-1-x-productName__label\",\"captureId\":146,\"htmlAttribute\":\"INNER_TEXT\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:21:13.602Z\",\"updatedAt\":\"2024-04-12T15:21:13.602Z\"},{\"id\":382,\"name\":\"description\",\"group\":\"product\",\"selector\":\".alliedrecommerce-m3-pdp-components-1-x-tab__containerItem .alliedrecommerce-m3-pdp-components-1-x-paragraph\",\"captureId\":146,\"htmlAttribute\":\"INNER_HTML\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-04-12T15:21:13.602Z\",\"updatedAt\":\"2024-04-12T15:21:13.602Z\"}]},{\"id\":240,\"name\":\"Conversão\",\"delay\":0,\"includeIfUrlRegex\":\".+.com.br\\\\/checkout\\\\/orderPlaced\\\\/.+\",\"type\":\"CONVERSION\",\"triggerEvent\":\"LOAD\",\"selector\":null,\"systemCapture\":false,\"passiveCapture\":true,\"clientId\":51,\"createdAt\":\"2024-06-12T17:46:28.673Z\",\"updatedAt\":\"2024-06-12T17:48:29.791Z\",\"fields\":[{\"id\":615,\"name\":\"Conversion\",\"group\":\"\",\"selector\":\"\",\"captureId\":240,\"htmlAttribute\":\"URL\",\"triggerEvent\":\"LOAD\",\"createdAt\":\"2024-06-12T17:46:28.673Z\",\"updatedAt\":\"2024-06-12T17:46:28.673Z\"}]}],\"tag-assist\":[{\"id\":99,\"parentId\":null,\"name\":\"Assist-Trocafy-Aniversário\",\"headerDisplay\":false,\"headerImage\":null,\"linkPixelclick\":\"https://www.awin1.com/cread.php?awinmid=51277&awinaffid=745359&clickref=tagassist+aniversario&ued=\",\"linkUTM\":null,\"includeIfUrlRegex\":\".+.com.br\\\\/(?!nossa-loja-fisica|pagamento|entrega|troca-e-devolucao|$|\\\\?.+|seguranca|contato|perguntas-frequentes|confiabilidade|processo-trocafy).+\",\"includeIfHtmlSelector\":null,\"customCss\":\".etag-assist%20%7B%20%0A%20%20%20%20--color-default%3A%20%23FF3B79%3B%20%0A%7D%0A%0A.etag-assist-main-body%20.etag-button%20%7B%0A%20%20%20%20width%3A%20156px%3B%0A%20%20%20%20margin%3A%20auto%3B%0A%20%20%20%20margin-top%3A%20-39px%3B%0A%20%20%20%20height%3A%2036px%3B%0A%20%20%20%20padding%3A%2011px%3B%0A%20%20%20%20bottom%3A%2032px%3B%0A%20%20%20%20color%3A%20white%3B%0A%20%20%20%20font-size%3A%2016px%3B%0A%20%20%20%20text-transform%3A%20none%3B%0A%20%20%20%20font-weight%3A%20bold%3B%0A%20%20%20%20border-radius%3A%2018px%3B%0A%20%20%20%20background%3A%20%23FF3E77%3B%0A%7D%0A.etag-assist-main-products-list%20.etag-products-img%20%7B%20%0A%20%20%20%20width%3A%2030%25%3B%0A%7D%0A.etag-assist-main-products-list%20img%20%7B%0A%20%20%20%20max-width%3A%20100%25%3B%0A%20%20%20%20height%3A%20110px%3B%0A%20%20%20%20width%3A%20100px%3B%0A%20%20%20%20object-fit%3A%20contain%3B%0A%20%20%20%20padding-right%3A%204px%3B%0A%7D%0A.etag-assist-main-products-list%20.etag-products-description%20%7B%0A%20%20%20%20width%3A%2070%25%3B%0A%7D%0A%0A.etag-assist-main-products-list%20.view%20%7B%20%0A%20%20%20%20display%3A%20none%3B%0A%7D%0A.etag-assist-main-products-list%20.buy%20%7B%0A%20%20%20%20width%3A%20100%25%3B%0A%20%20%20%20margin-left%3A%200%3B%20%20%20%0A%20%20%20%20border-radius%3A%204px%3B%0A%7D%0A%40media%20screen%20and%20(max-width%3A%20390px)%20%7B%20%0A.etag-assist-main-body%20.etag-button%20%7B%20%0A%20%20%20%20bottom%3A%2025px%3B%20%0A%7D%0A%7D\",\"customJs\":\"\",\"priority\":1,\"closeOnLostFocus\":false,\"startDate\":null,\"endDate\":null,\"preview\":true,\"active\":true,\"archieved\":false,\"contentDisplay\":true,\"contentPromoContent\":\"%3Cp%3E%3Cimg%20src%3D%22https%3A%2F%2Fcdn.jazz.etagdigital.com%2Fclients%2FEBA2572F-7504-46A2-804B-A4CFC62D748E%2Fimages%2Ftagassist-trocafy-recorte-aniversario.png%22%3E%3C%2Fp%3E\",\"promoButtonType\":\"LINK\",\"contentPromoButtonLink\":\"https%3A%2F%2Fwww.trocafy.com.br%2Fsmartphone\",\"contentPromoButtonLabel\":\"Eu quero!\",\"productsDisplay\":true,\"productsFeedDisplay\":true,\"productsFeedLabel\":\"Recomendações\",\"productsHistoricDisplay\":true,\"productsHistoricLabel\":\"Histórico\",\"productsBuyButtonLabel\":\"COMPRAR\",\"productsViewButtonLabel\":\"VISUALIZAR\",\"initDelay\":0,\"fireInSessionQtty\":1,\"fireDesktopInactivity\":true,\"fireDesktopInactivityDelay\":60000,\"fireDesktopExitIntent\":true,\"fireDesktopExitIntentAction\":\"PASSIVE\",\"fireDesktopExitIntentDelay\":0,\"fireMobileInactivity\":true,\"fireMobileInactivityDelay\":60000,\"fireMobileOnScroll\":false,\"fireMobileOnScrollOffset\":100,\"fireMobileOnLostFocus\":true,\"fireMobileOnLostFocusDelay\":0,\"clientId\":51,\"createdAt\":\"2024-06-13T18:42:54.778Z\",\"updatedAt\":\"2024-06-13T18:53:05.776Z\",\"children\":[]}]}"), debugMode: true, allowedSites: [".*"], urls: { modules: "/dist/modules/", ...JSON.parse("{\"apicapture\":\"https://api.etagdigital.com\",\"captureService\":\"https://capture.etagdigital.com\",\"trackingService\":\"https://tracking.etagdigital.com\",\"reportService\":\"https://report.etagdigital.com\"}") }, }; const modulesData = _.config.modulesData; _.config.debugMode = modulesData.core[0].debug || false; _.config.modulesData = { ...modulesData, ...(modulesData["tag-wid"] && { "tag-wid": modulesData["tag-wid"]?.map((tw) => { const twd = tw; return { ...tw, content: decodeURI(twd.content), customCss: decodeURI(twd.customCss), customJs: decodeURI(twd.customJs), }; }) }), ...(modulesData["tag-assist"] && { "tag-assist": modulesData["tag-assist"]?.map((ta) => { const tad = ta; return { ...ta, contentPromoContent: decodeURI(tad.contentPromoContent), customCss: decodeURI(tad.customCss), customJs: decodeURI(tad.customJs), }; }) }), ...(modulesData["tag-assist-remind"] && { "tag-assist-remind": modulesData["tag-assist-remind"]?.map((tar) => { const tard = tar; return { ...tar, contentContent: decodeURI(tard.content), contentContentSuccess: decodeURI(tard.contentSuccess), contentContentFail: decodeURI(tard.contentFail), customCss: decodeURI(tard.customCss), customJs: decodeURI(tard.customJs), }; }) }), }; Object.entries(_.config.modules) .forEach((module) => { const [moduleName, moduleFunction] = module; _.modules[moduleName] = moduleFunction(modulesData[moduleName], _); }); window.etag = __ = { get debug() { return _.config.debugMode; }, set debug(value) { _.config.debugMode = value; if (value) { __.utils = _.utils; __.modules = _.modules; } else { delete __.utils; delete __.modules; } }, update: _.update }; __.debug = _.config.debugMode; }; __.update || _.init(); }).call(this, window.etag);