if (window.Evergage && window.SalesforceInteractions && window.SalesforceInteractions.mcis) { try { window.SalesforceInteractions.log.warn("Aborting SDK load since the SalesforceInteractions SDK was already found on this page."); } catch(e) {} } else { window.evergageBeaconParseTimeStart = (new Date().getTime()); 'use strict';var Evergage=function(m){function vc(c,d){var a=Object.keys(c);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(c);d&&(b=b.filter(function(a){return Object.getOwnPropertyDescriptor(c,a).enumerable}));a.push.apply(a,b)}return a}function t(c){for(var d=1;darguments.length?c:a):b.value};return ja.apply(this,arguments)}function ya(c,d){var a=Array.isArray(c)?c:void 0;if(!a)a:{var b=null==c?null: "undefined"!=typeof Symbol&&c[Symbol.iterator]||c["@@iterator"];if(null!=b){var e,f,g,h=[],l=!0,I=!1;try{if(f=(b=b.call(c)).next,0===d){if(Object(b)!==b){a=void 0;break a}l=!1}else for(;!(l=(e=f.call(b)).done)&&(h.push(e.value),h.length!==d);l=!0);}catch(qa){I=!0;var k=qa}finally{try{if(!l&&null!=b.return&&(g=b.return(),Object(g)!==g)){a=void 0;break a}}finally{if(I)throw k;}}a=h}else a=void 0}if(!(c=a||yc(c,d)))throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); return c}function nb(c){var d=Array.isArray(c)?ob(c):void 0;d||(d="undefined"!==typeof Symbol&&null!=c[Symbol.iterator]||null!=c["@@iterator"]?Array.from(c):void 0);if(!(c=d||yc(c)))throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");return c}function yc(c,d){if(c){if("string"===typeof c)return ob(c,d);var a=Object.prototype.toString.call(c).slice(8,-1);"Object"===a&&c.constructor&&(a=c.constructor.name); if("Map"===a||"Set"===a)return Array.from(c);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return ob(c,d)}}function ob(c,d){if(null==d||d>c.length)d=c.length;for(var a=0,b=Array(d);ac.indexOf(a)})}function Fe(c,d,a,b,e){e.guid=e.guid||q.guid++;var f=c.___ce=c.___ce||{};f[d]=f[d]||[];f[d].push([a,b,e]);c.addEventListener(d, e)}function xb(c){c=c.split(".");return[c[0],c.slice(1).sort()]}function Qa(c,d,a,b,e){var f=c.___ce=c.___ce||{};if(d)f[d]&&(f[d]=f[d].filter(function(f){var g=ya(f,3);f=g[0];var l=g[1];g=g[2];if(e&&g.guid!==e.guid||!Fc(f,a)||b&&b!==l)return!0;c.removeEventListener(d,g)}));else for(d in f)Qa(c,d,a,b,e)}function Gc(c){return c.multiple&&c.options?V(tb.call(c.options,function(c){return c.selected&&!c.disabled&&!c.parentNode.disabled}),"value"):c.value||""}function Hc(c){if(!F(c))return[];if(Ge.test(c))return[ma(RegExp.$1)]; var d=He.test(c)&&RegExp.$1;d=Ic[d]||Ic["*"];d.innerHTML=c;return q(d.childNodes).detach().get()}function Ie(c,d){c=q(c);c.filter("script").add(c.find("script")).each(function(a,b){if(Je.test(b.type)&&yb.contains(b)){var c=ma("script");c.text=b.textContent.replace(Ke,"");C(Le,function(a,d){b[d]&&(c[d]=b[d])});d.head.insertBefore(c,null);d.head.removeChild(c)}})}function ba(c,d,a,b,e,f,g,h){C(c,function(c,f){C(q(f),function(c,f){C(q(d),function(c,d){var g=a?d:f;d=a?f:d;c=c?g.cloneNode(!0):g;e?d.insertBefore(c, b?d.firstElementChild:null):d.parentNode.insertBefore(c,b?d:d.nextElementSibling);Ie(c,d.ownerDocument)},h)},g)},f);return d}function Jc(c,d){var a=Object.keys(c);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(c);d&&(b=b.filter(function(a){return Object.getOwnPropertyDescriptor(c,a).enumerable}));a.push.apply(a,b)}return a}function z(c){for(var d=1;darguments.length?c:a):b.value};return Sa.apply(this,arguments)}function Mc(c){var d=Array.isArray(c)?Ab(c):void 0;d||(d="undefined"!==typeof Symbol&&null!=c[Symbol.iterator]||null!=c["@@iterator"]?Array.from(c):void 0);if(!(c=d||Nc(c)))throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");return c}function Nc(c, d){if(c){if("string"===typeof c)return Ab(c,d);var a=Object.prototype.toString.call(c).slice(8,-1);"Object"===a&&c.constructor&&(a=c.constructor.name);if("Map"===a||"Set"===a)return Array.from(c);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return Ab(c,d)}}function Ab(c,d){if(null==d||d>c.length)d=c.length;for(var a=0,b=Array(d);a=c.length?{done:!0}:{done:!1,value:c[b++]}},e:function(a){throw a;},f:d}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}var e=!0,f=!1,g;return{s:function(){a=a.call(c)},n:function(){var b=a.next();e=b.done;return b},e:function(a){f=!0;g=a},f:function(){try{e||null==a.return||a.return()}finally{if(f)throw g; }}}}function Oc(c){r.setLoggingLevel(c)}function Pc(){return r.getLoggingLevel()}function Cb(c){var d,a,b,e=[],f=[a=1732584193,b=4023233417,~a,~b,3285377520],g=[],h=unescape(encodeURI(c))+"\u0080",l=h.length;for(g[c=--l/4+2|15]=8*l;~l;)g[l>>2]|=h.charCodeAt(l)<<8*~l--;for(d=l=0;dl;a=[a[4]+(e[l]=16>l?~~g[d+l]:2*h|0>h)+1518500249+[b&I|~b&k,h=341275144+(b^I^k),882459459+(b&I|b&k|I&k),h+1535694389][l++/5>>2]+((h=a[0])<<5|h>>>27),h,b<<30|b>>>2,I,k]){h=e[l-3]^e[l-8]^e[l-14]^e[l-16]; b=a[1];var I=a[2];var k=a[3]}for(l=5;l;)f[--l]+=a[l]}for(h="";40>l;)h+=(f[l>>3]>>4*(7-l++)&15).toString(16);return h}function Qc(){var c=(window.navigator.userAgent||"")+(window.navigator.platform||"")+(new Date).getTime+JSON.stringify({})+Math.random();return Da(c).slice(0,16)}function Rc(c,d,a){return"function"===typeof a?{bind:c,selector:d,callback:a}:null}function Re(){Db=v.onFireException.on(function(c,d){document.dispatchEvent(new CustomEvent(w.OnException,{detail:{error:c,context:d}}))});Eb= v.onEventSend.on(function(c){document.dispatchEvent(new CustomEvent(w.OnBeforeEventSend,{detail:{actionEvent:c},cancelable:!0}))&&document.dispatchEvent(new CustomEvent(w.OnEventSend,{detail:{actionEvent:c}}))});Fb=v.onPageMatchStatusUpdated.on(function(c){document.dispatchEvent(new CustomEvent(w.OnPageMatchStatusUpdated,{detail:{matchStatus:c}}))});Gb=v.onInitSitemap.on(function(c){document.dispatchEvent(new CustomEvent(w.OnInitSitemap,{detail:{sitemapConfig:c}}))})}function W(c){Db&&Db();Eb&&Eb(); Fb&&Fb();Gb&&Gb();document.dispatchEvent(new CustomEvent(w.OnShutDown,{detail:{message:c}}));Hb="shutDown";return!1}function Ta(c,d,a,b){return c.addEventListener?(c.addEventListener(d,a,b),!0):!1}function ca(c,d,a,b){return c.removeEventListener?(c.removeEventListener(d,a,b),!0):!1}function Ib(c){var d=document.createElement("a");d.href=c;return d}function Sc(c){try{return decodeURIComponent(c.replace(/\+/g," "))}catch(d){return null}}function Tc(c){if(c=c.detail&&c.detail.actionEvent)if(c.itemAction&& c.itemAction.includes("View"))Ua();else{var d;if(d=c.interaction)c=c.interaction.name,d=c===oa.ViewCatalogObject||c===oa.ViewCatalogObjectDetail||c===oa.QuickViewCatalogObject||c===Ea.StopQuickViewCatalogObject;d&&Ua()}}function Jb(c){-1!==X&&(Kb(!1,c),clearTimeout(X),X=-1)}function Ua(){if(!p.beaconConfig.doNotTrackPingRequestsForActions){Jb(!0);document.removeEventListener(m.CustomEvents.OnEventSend,Tc);document.addEventListener(m.CustomEvents.OnEventSend,Tc);var c=Date.now();if(-1===G||c-G>=p.beaconConfig.minimumActivityTimeToRegister)G= c;X=setTimeout(function(){Kb(!0)},p.beaconConfig.timeOnPageTimerLengthMillis);r.info("Setting up time on page listeners.");ca(window,"pagehide",Lb);Ta(window,"pagehide",Lb);ca(window,"blur",Mb);Ta(window,"blur",Mb);ca(window,"focus",Nb);Ta(window,"focus",Nb);ca(document,"mousemove keydown scroll click",Fa);Ta(document,"mousemove keydown scroll click",Fa)}}function Kb(c,d){var a=Date.now();-1!==G&&(a-=G,p.beaconConfig.timeOnPageTimerLengthMillisD&&(D=0);c&&(-1!==X&&clearTimeout(X),X=setTimeout(function(){Kb(!0)},p.beaconConfig.timeOnPageTimerLengthMillis))}function Se(c){c={timeOnPageMillis:c};var d=Vc(),a={};if(d&&d.itemAction&&d.catalog)a=d.catalog;else if(d&&d.interaction&& d.interaction.catalogObject){a=d.interaction.catalogObject;var b={},e=a.id,f=a.type,g=xa(a,Ue);e&&f&&(b[a.type]={_id:e});a.relatedCatalogObjects&&(f=g.relatedCatalogObjects,e=f.Category,f=xa(f,Ve),Array.isArray(e)&&(b[a.type].categories=Wc(e)),0!==Object.keys(f).length&&(b[a.type].relatedCatalogObjects=f));a=b}0!==Object.keys(a).length&&(c.catalog=a);d&&d.interaction&&null!=d.interaction.name?c.action=d.interaction.name:d&&null!=d.action&&(c.action=d.action);Xc();c.performance={};d=xa(y,We);for(var h in d)y[h]&& (c.performance[h]=y[h]);return c}function Lb(){Jb()}function Mb(c){try{r.trace("Evergage: window blurred"),Va()}catch(d){x(d,"windowBlurFunction")}}function Nb(c){try{r.trace("Evergage: window focused"),Fa()}catch(d){x(d,"windowFocusFunction")}}function Va(){try{-1!==Y&&(clearTimeout(Y),Y=-1);var c=Date.now(),d=0;-1!==G&&(d=c-G);r.trace("Evergage: timeOnPage before: setUserInactive: ".concat(D));D+=d;r.trace("Evergage: timeOnPage after: setUserInactive: ".concat(D));G=-1}catch(a){x(a,"setUserInactive")}} function Fa(){r.trace("activity registered");try{-1!==Y&&(clearTimeout(Y),Y=-1);var c=Date.now();if(-1===G||c-G>=p.beaconConfig.minimumActivityTimeToRegister)-1!==G&&(r.trace("Evergage: timeOnPage before: activityRegistered: ".concat(D)),D+=c-Math.max(G,-1),r.trace("Evergage: timeOnPage after: activityRegistered: ".concat(D))),G=c}catch(d){x(d,"activityRegistered")}}function Ob(c,d){c="string"===typeof c?Error(c):c;for(var a in d)Object.defineProperty(c,a,{value:d[a],enumerable:!1});return c}function Yc(){try{var c, d=Zc,a=null===(c=d)||void 0===c?void 0:c.nonce;if(!a||""===a){var b;d=document.querySelector('script[src*="evergage.min.js"]')||document.querySelector('script[src*="cdn.evgnet.com"]');a=null===(b=d)||void 0===b?void 0:b.nonce}return a&&""!==a?a:null}catch(e){return r.debug("Error in discoverNonce:",e),null}}function $c(c,d){if("undefined"===typeof d||null===d||""===d)r.debug("No nonce found");else if(c instanceof HTMLScriptElement||c instanceof HTMLStyleElement||c instanceof HTMLLinkElement)c.nonce= d,r.debug("Nonce applied to element",c)}var T=function(c,d){return d={exports:{}},c(d,d.exports),d.exports}(function(c,d){c.exports=function(){function a(){for(var a=0,b={};a/,ye=/^\w+$/,Oa=function(){function c(d){var a=1d?0:1;aarguments.length?this[0]&&this[0][c]:this.each(function(a,e){e[c]=d});for(var a in c)this.prop(a,c[a]);return this}};n.get=function(c){return void 0===c?cd.call(this):this[0>c?c+this.length:c]};n.eq=function(c){return q(this.get(c))};n.first=function(){return this.eq(0)};n.last=function(){return this.eq(-1)};n.filter=function(c){var d=sb(c);return q(tb.call(this,function(a,b){return d.call(a,b,a)}))};var Ae=/\S+/g;n.hasClass=function(c){return!!c&&wb.call(this,function(d){return d.classList.contains(c)})}; n.removeAttr=function(c){var d=Pa(c);return this.each(function(a,b){C(d,function(a,c){b.removeAttribute(c)})})};n.attr=function(c,d){if(c){if(F(c)){if(2>arguments.length){if(!this[0])return;var a=this[0].getAttribute(c);return null===a?void 0:a}return void 0===d?this:null===d?this.removeAttr(c):this.each(function(a,e){e.setAttribute(c,d)})}for(a in c)this.attr(a,c[a]);return this}};n.toggleClass=function(c,d){var a=Pa(c),b=void 0!==d;return this.each(function(c,f){C(a,function(a,c){b?d?f.classList.add(c): f.classList.remove(c):f.classList.toggle(c)})})};n.addClass=function(c){return this.toggleClass(c,!0)};n.removeClass=function(c){return arguments.length?this.toggleClass(c,!1):this.attr("class","")};q.unique=S;n.add=function(c,d){return q(S(this.get().concat(q(c,d).get())))};var ub=/^--/,vb={},De=ad.style,Ce=["webkit","moz","ms"];q.prefixedProp=Bc;var Ee={animationIterationCount:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0}; n.css=function(c,d){if(F(c)){var a=ub.test(c);c=Bc(c,a);if(2>arguments.length)return this[0]&&la(this[0],c,a);if(!c)return this;d=Cc(c,d,a);return this.each(function(b,f){f&&1===f.nodeType&&(a?f.style.setProperty(c,d):f.style[c]=d)})}for(var b in c)this.css(b,c[b]);return this};n.data=function(c,d){if(!c){if(!this[0])return;var a={},b;for(b in this[0].dataset)a[b]=Dc(this[0],b);return a}if(F(c))return 2>arguments.length?this[0]&&Dc(this[0],c):this.each(function(a,b){a=d;try{a=JSON.stringify(a)}catch(g){}b.dataset[za(c)]= a});for(a in c)this.data(a,c[a]);return this};C([!0,!1],function(c,d){C(["Width","Height"],function(a,b){var c="".concat(d?"outer":"inner").concat(b);n[c]=function(e){if(this[0])return rb(this[0])?Aa[c]:this[0]["".concat(d?"offset":"client").concat(b)]+(e&&d?sa(this[0],"margin".concat(a?"Top":"Left"))+sa(this[0],"margin".concat(a?"Bottom":"Right")):0)}})});C(["width","height"],function(c,d){n[d]=function(a){if(!this[0])return void 0===a?void 0:this;if(!arguments.length)return rb(this[0])?this[0][za("outer-".concat(d))]: this[0].getBoundingClientRect()[d]-Ec(this[0],!c);var b=parseInt(a,10);return this.each(function(a,f){f&&1===f.nodeType&&(a=la(f,"boxSizing"),f.style[d]=Cc(d,b+("border-box"===a?Ec(f,!c):0)))})}});var Rb={};n.toggle=function(c){return this.each(function(d,a){if(void 0===c?"none"===la(a,"display"):c){if(a.style.display=a.___cd||"","none"===la(a,"display")){d=a.style;a=a.tagName;if(Rb[a])a=Rb[a];else{var b=ma(a);R.body.insertBefore(b,null);var e=la(b,"display");R.body.removeChild(b);a=Rb[a]="none"!== e?e:"block"}d.display=a}}else a.___cd=la(a,"display"),a.style.display="none"})};n.hide=function(){return this.toggle(!1)};n.show=function(){return this.toggle(!0)};var Sb={focus:"focusin",blur:"focusout"},dd={mouseenter:"mouseover",mouseleave:"mouseout"},cf=/^(mouse|pointer|contextmenu|drag|drop|click|dblclick)/i;n.off=function(c,d,a){var b=this;if(void 0===c)this.each(function(a,b){Qa(b)});else if(F(c))ka(d)&&(a=d,d=""),C(Pa(c),function(c,e){c=xb(dd[e]||Sb[e]||e);c=ya(c,2);var f=c[0],g=c[1];b.each(function(b, c){Qa(c,f,g,d,a)})});else for(var e in c)this.off(e,c[e]);return this};n.on=function(c,d,a,b){var e=this;if(!F(c)){for(var f in c)this.on(f,d,c[f]);return this}ka(d)&&(a=d,d="");C(Pa(c),function(c,f){c=xb(dd[f]||Sb[f]||f);c=ya(c,2);var g=c[0],h=c[1];e.each(function(c,e){c=function Ne(c){if(!c.namespace||Fc(h,c.namespace.split("."))){var f=e;if(d){for(var l=c.target;!qb(l,d);){if(l===e)return;l=l.parentNode;if(!l)return}f=l;c.___cd=!0}c.___cd&&Object.defineProperty(c,"currentTarget",{configurable:!0, get:function(){return f}});l=a.call(f,c,c.data);b&&Qa(e,g,h,d,Ne);!1===l&&(c.preventDefault(),c.stopPropagation())}};c.guid=a.guid=a.guid||q.guid++;Fe(e,g,h,d,c)})});return this};n.one=function(c,d,a){return this.on(c,d,a,!0)};n.ready=function(c){"loading"!==R.readyState?c(q):R.addEventListener("DOMContentLoaded",function(){c(q)});return this};n.trigger=function(c,d){if(F(c)){var a=xb(c),b=ya(a,2);a=b[0];b=b[1];var e=cf.test(a)?"MouseEvents":"HTMLEvents";c=R.createEvent(e);c.initEvent(a,!0,!0);c.namespace= b.join(".")}c.data=d;var f=c.type in Sb;return this.each(function(a,b){if(f&&ka(b[c.type]))b[c.type]();else b.dispatchEvent(c)})};var df=/%20/g,ef=/file|reset|submit|button|image/i,ff=/radio|checkbox/i;n.serialize=function(){var c="";this.each(function(d,a){C(a.elements||[a],function(a,d){d.disabled||!d.name||"FIELDSET"===d.tagName||ef.test(d.type)||ff.test(d.type)&&!d.checked||(a=Gc(d),void 0!==a&&(a=Qb(a)?a:[a],C(a,function(a,b){a=c;b="&".concat(encodeURIComponent(d.name),"=").concat(encodeURIComponent(b).replace(df, "+"));c=a+b})))})});return c.slice(1)};n.val=function(c){return void 0===c?this[0]&&Gc(this[0]):this.each(function(d,a){if("SELECT"===a.tagName){var b=Qb(c)?c:null===c?[]:[c];C(a.options,function(a,c){c.selected=0<=b.indexOf(c.value)})}else a.value=null===c?"":c})};n.clone=function(){return this.map(function(c,d){return d.cloneNode(!0)})};n.detach=function(){return this.each(function(c,d){d.parentNode&&d.parentNode.removeChild(d)})};var He=/^\s*<(\w+)[^>]*>/,Ge=/^\s*<(\w+)\s*\/?>(?:<\/\1>)?\s*$/, Ic={"*":ad,tr:Ye,td:bd,th:bd,thead:Pb,tbody:Pb,tfoot:Pb};q.parseHTML=Hc;n.empty=function(){return this.each(function(c,d){for(;d.firstChild;)d.removeChild(d.firstChild)})};n.html=function(c){return void 0===c?this[0]&&this[0].innerHTML:this.each(function(d,a){a.innerHTML=c})};n.remove=function(){return this.detach().off()};n.text=function(c){return void 0===c?this[0]?this[0].textContent:"":this.each(function(d,a){a.textContent=c})};n.unwrap=function(){this.parent().each(function(c,d){c=q(d);c.replaceWith(c.children())}); return this};n.offset=function(){var c=this[0];if(c)return c=c.getBoundingClientRect(),{top:c.top+Aa.pageYOffset-yb.clientTop,left:c.left+Aa.pageXOffset-yb.clientLeft}};n.offsetParent=function(){return q(this[0]&&this[0].offsetParent)};n.position=function(){var c=this[0];if(c)return{left:c.offsetLeft,top:c.offsetTop}};n.children=function(c){return ra(q(S(V(this,function(c){return c.children}))),c)};n.contents=function(){return q(S(V(this,function(c){return"IFRAME"===c.tagName?[c.contentDocument]: c.childNodes})))};n.find=function(c){return q(S(V(this,function(d){return pb(c,d)})))};var Ke=/^\s*\s*$/g,Je=/^$|^module$|\/(java|ecma)script/i,Le=["type","src","nonce","noModule"];n.after=function(){return ba(arguments,this,!1,!1,!1,!0,!0)};n.append=function(){return ba(arguments,this,!1,!1,!0)};n.appendTo=function(c){return ba(arguments,this,!0,!1,!0)};n.before=function(){return ba(arguments,this,!1,!0)};n.insertAfter=function(c){return ba(arguments,this,!0,!1,!1, !1,!1,!0)};n.insertBefore=function(c){return ba(arguments,this,!0,!0)};n.prepend=function(){return ba(arguments,this,!1,!0,!0,!0,!0)};n.prependTo=function(c){return ba(arguments,this,!0,!0,!0,!1,!1,!0)};n.replaceWith=function(c){return this.before(c).remove()};n.replaceAll=function(c){q(c).replaceWith(this);return this};n.wrapAll=function(c){c=q(c);for(var d=c[0];d.children.length;)d=d.firstElementChild;this.first().before(c);return this.appendTo(d)};n.wrap=function(c){return this.each(function(d, a){var b=q(c)[0];q(a).wrapAll(d?b.cloneNode(!0):b)})};n.wrapInner=function(c){return this.each(function(d,a){d=q(a);a=d.contents();a.length?a.wrapAll(c):d.append(c)})};n.has=function(c){var d=F(c)?function(a,b){return pb(c,b).length}:function(a,b){return b.contains(c)};return this.filter(d)};n.is=function(c){var d=sb(c);return wb.call(this,function(a,b){return d.call(a,b,a)})};n.next=function(c,d){return ra(q(S(V(this,"nextElementSibling",d))),c)};n.nextAll=function(c){return this.next(c,!0)};n.not= function(c){var d=sb(c);return this.filter(function(a,b){return!d.call(b,a,b)})};n.parent=function(c){return ra(q(S(V(this,"parentNode"))),c)};n.index=function(c){var d=c?q(c)[0]:this[0];c=c?this:q(d).parent().children();return Ac.call(c,d)};n.closest=function(c){var d=this.filter(c);if(d.length)return d;var a=this.parent();return a.length?a.closest(c):d};n.parents=function(c){return ra(q(S(V(this,"parentElement",!0))),c)};n.prev=function(c,d){return ra(q(S(V(this,"previousElementSibling",d))),c)}; n.prevAll=function(c){return this.prev(c,!0)};n.siblings=function(c){return ra(q(S(V(this,function(c){return q(c).parent().children().not(c)}))),c)};var Tb=["error","warn","info","debug","trace"],r=new (function(){function c(){var d=0=new Date(a.lastSentTime)}).map(function(a){return a.consent});of(d.consents)};document.addEventListener(w.OnConsentRevoke,function(d){d.detail&&d.detail.revokedConsent&&uf({interaction:{name:ua.MetadataUpdate},consents:[d.detail.revokedConsent.consent]})}); var vd=function(d){return ud(d,sf).catch(function(a){r.error(a.message);v.onFireException.emit(a,"Site-wide JavaScript");return d})},uf=function(d){ud(d,function(){return!0}).then(function(){return r.debug("Consent revoked")},function(a){return v.onFireException.emit(a,"Site-wide JavaScript")})},ud=function(d,a){a:{var b=d,e=u.matchedConfig;try{b=e&&e.onActionEvent?e.onActionEvent(b):b;if("object"===J(b)){d=b;break a}v.onFireException.emit(Error("onActionEvent failed for the ".concat(u.matchedConfig.name, " page config. Must return an object or null.")),"Site-wide Javascript")}catch(f){v.onFireException.emit(Error("onActionEvent failed for the ".concat(u.matchedConfig.name," page config. ").concat(f.message,".")),"Site-wide Javascript")}d=void 0}a:{b=d;try{b=M.global&&M.global.onActionEvent?M.global.onActionEvent(b):b;if("object"===J(b)){d=b;break a}v.onFireException.emit(Error("onActionEvent failed for the global page config. Must return an object or null."),"Site-wide Javascript")}catch(f){v.onFireException.emit(Error("onActionEvent failed for the global page config. ".concat(f.message, ".")),"Site-wide Javascript")}d=void 0}td(d);a&&!a()&&r.debug("No opt-in consents provided. Event will still be dispatched.");r.debug("Sent event: ",d);v.onEventSend.emit(d);return Promise.resolve(d)},vf=function(d){return new Promise(function(a,b){v.onInitSitemap.once(function(){return b("sitemap_reinit")});var e={name:null},f=[];Object.keys(d.interaction).forEach(function(a){var b=wd(d.interaction[a],a).then(function(b){e[a]=b});f.push(b)});Promise.all(f).then(function(){a(e)}).catch(function(a){v.onFireException.emit(Error("Catalog object interaction config was rejected"), "Site-wide Javascript")})})},wd=function(d,a){try{return E=a,"object"===J(d)&&!Array.isArray(d)&&0=e&&(Ia(b),g(!1))}catch(qa){Ia(b),h(qa)}},f);fa[b]=function(){clearInterval(k)}})},unbind:Ia,getBindings:function(){return fa},clearBindings:function(){for(var a in fa)fa.hasOwnProperty(a)&&"function"===typeof fa[a]&&Ia(a)}}};var Hb="shutDown";var va={cookieDomain:null, consents:null},Ed=function(){function a(a,b,f){if(f)for(a=Math.random().toString(36).slice(2);e[a];)a=Math.random().toString(36).slice(2);else a=a||b;return a}function b(b,f){return{pageElementLoaded:function(h,l){if("string"!==typeof l||""===l)l=0"+h,f);e[b]=function(){n&&n.disconnect()}})},pageElementVisible:function(h, l){var k=l||0;if("string"!==typeof h||""===h||"number"!==typeof k||0>k||1"+h,f);e[b]=function(){n.disconnect()}})},pageExit:function(h){h=h||0;if("number"!==typeof h||0>h)throw Error("[pageExit] Invalid arguments"); return new Promise(function(l){function k(a){clearTimeout(p);10>=a.pageY-window.pageYOffset&&(p=0",f);e[b]=function(){n.off("mousemove",k)}})},pageInactive:function(h){function l(a,e){var f=new Promise(function(f){function h(a){a=a||new Event("pageInactive");b&&!e.isSubscribe?g.unbind(b):k.off("mousemove click scroll keyup keydown", l);f(a)}function l(b){clearTimeout(m);m=setTimeout(h.bind(this,b),a)}var k=B(document),m;l();k.on("mousemove click scroll keyup keydown",l)});f.subscribe=function(h){delete f.subscribe;e.isSubscribe=!0;f.then(function(f){f.disconnect=function(){b?g.unbind(b):e.isDisconnected=!0};h(f);!e.isDisconnected&&l(a,e).subscribe(h)});return f};return f}if("number"!==typeof h||0>=h)throw Error("[pageInactive] Invalid arguments");var k={isDisconnected:!1,isSubscribe:!1};b=a(b,"",f);e[b]=function(){k.isDisconnected= !0};return l(h,k)},pageScroll:function(h){if("number"!==typeof h||0>h||1=h&&(l(a),b?g.unbind(b):m.off("scroll",k))}var m=B(document);m.on("scroll",k);b=a(b,"",f);e[b]=function(){m.off("scroll",k)}})}}}var e={},f=b(null,!0),g=function(){return{bind:function(a){a&&e[a]&&(e[a](),delete e[a]);return b(a)},unbind:function(a){if(!a|| "string"!==typeof a||"function"!==typeof e[a])return null;e[a]();delete e[a]},getBindings:function(){return e},clearBindings:function(){for(var a in e)e.hasOwnProperty(a)&&(e[a](),delete e[a])}}}();return Object.assign(f,g)}(),bb=function(){function a(b){var e=this;Ba(this,a);this.clearRateLimiter=function(){e.sentEvents=[]};this.eventWithinLimitTimeRange=function(a,b,e){return e-b.timeg)?(r.info("Event rate limit exceeded. More than ".concat(g," events ")+"sent in ".concat(f,"ms.")),!0):!1};this.checkLimits=function(a,b){return e.checkGlobalLimits(a, b.time)};this.sentEvents=[];this.eventRateLimiterConfig=b}Ca(a,[{key:"resetCounters",value:function(){this.globalCounter=0}},{key:"isTriggerLimitExceeded",value:function(a){var b=Date.now();a=z(z({},a),{},{time:b});this.sentEvents.push(a);this.removeOldEvents(b);this.resetCounters();for(b=this.sentEvents.length-1;0<=b;b--)if(this.checkLimits(b,a))return!0;return!1}}]);return a}(),Ff=function(a){function b(a){Ba(this,b);var f=e.call(this,a);f.getTimeRangeMax=function(){return f.eventRateLimiterConfig.perInteractionTimeRange? Math.max(f.eventRateLimiterConfig.globalTimeRange,f.eventRateLimiterConfig.perInteractionTimeRange):f.eventRateLimiterConfig.globalTimeRange};f.checkInteractionLimits=function(a,b,e){return f.eventRateLimiterConfig.perInteractionLimit&&f.eventRateLimiterConfig.perInteractionTimeRange&&f.eventWithinLimitTimeRange(f.eventRateLimiterConfig.perInteractionTimeRange,f.sentEvents[a],b)&&f.sentEvents[a].name===e&&(f.perEventCounter++,f.perEventCounter>f.eventRateLimiterConfig.perInteractionLimit)?(r.info("Event rate limit exceeded. More than ".concat(f.eventRateLimiterConfig.perInteractionLimit, " events ")+"with interaction name of ".concat(e," sent in ").concat(f.eventRateLimiterConfig.perInteractionTimeRange,"ms.")),!0):!1};f.checkLimits=function(a,b){return f.checkGlobalLimits(a,b.time)||f.checkInteractionLimits(a,b.time,b.name)};return f}Oe(b,a);var e=Qe(b);Ca(b,[{key:"resetCounters",value:function(){Sa(na(b.prototype),"resetCounters",this).call(this);this.perEventCounter=0}},{key:"isTriggerLimitExceeded",value:function(a){return Sa(na(b.prototype),"isTriggerLimitExceeded",this).call(this, a)}}]);return b}(bb),Db,Eb,Fb,Gb,bc=function(){var a=0=a.length)return a;var b=731,e=244;974!=b+e&&(b+=974-(b+e));10f.eventRateLimiterConfig.perExperienceLimit)return r.info("Event rate limit exceeded. More than ".concat(f.eventRateLimiterConfig.perExperienceLimit," events ")+"with experience id of ".concat(e," sent in ").concat(f.eventRateLimiterConfig.perExperienceTimeRange, "ms.")),!0}};f.checkLimits=function(a,b){return f.checkGlobalLimits(a,b.time)||f.checkExperienceLimits(a,b.time)};return f}Ma(b,a);var e=Na(b);ia(b,[{key:"resetCounters",value:function(){ja(Q(b.prototype),"resetCounters",this).call(this);this.experienceRates=new Map}},{key:"isTriggerLimitExceeded",value:function(a){return ja(Q(b.prototype),"isTriggerLimitExceeded",this).call(this,a)}}]);return b}(bb),lc=function(){function a(b){ha(this,a);this.baseURL=b}ia(a,[{key:"send",value:function(a){Tf(a);var b= this.baseURL+"?";var f="";var g=[],h;"string"!==typeof f&&(f="?");for(l in a)if(Rf.call(a,l)){(h=a[l])||null!==h&&void 0!==h&&!isNaN(h)||(h="");var l=encodeURIComponent(l);h=encodeURIComponent(h);null!==l&&null!==h&&g.push(l+"="+h)}a=g.length?f+g.join("&"):"";b+=a;if(navigator&&navigator.sendBeacon)return a=new Blob([],{type:"application/x-www-form-urlencoded"}),navigator.sendBeacon(b,a);a=new XMLHttpRequest;a.open("GET",b,!0);a.send()}}]);return a}(),Uf=function(a){function b(a,g){ha(this,b);a=e.call(this, a);a.eventRateLimiter=g||new bb({globalLimit:p.beaconConfig.errorRateLimiterConfig.globalLimit,globalTimeRange:p.beaconConfig.errorRateLimiterConfig.globalTimeRange});return a}Ma(b,a);var e=Na(b);ia(b,[{key:"send",value:function(a){if(this.eventRateLimiter.isTriggerLimitExceeded())r.warn("Error event rate limiter triggered.");else return ja(Q(b.prototype),"send",this).call(this,a)}}]);return b}(lc),Vf=function(a){function b(a,g){ha(this,b);a=e.call(this,a);a.eventRateLimiter=g||new bb({globalLimit:p.beaconConfig.pingRateLimiterConfig.globalLimit, globalTimeRange:p.beaconConfig.pingRateLimiterConfig.globalTimeRange});return a}Ma(b,a);var e=Na(b);ia(b,[{key:"send",value:function(a){if(this.eventRateLimiter.isTriggerLimitExceeded())r.warn("Ping event rate limiter triggered.");else return ja(Q(b.prototype),"send",this).call(this,a)}}]);return b}(lc),Wf=function(a){function b(a,g){ha(this,b);a=e.call(this,a);a.eventRateLimiter=g||new Sf({globalLimit:p.beaconConfig.campaignStatRateLimiterConfig.globalLimit,globalTimeRange:p.beaconConfig.campaignStatRateLimiterConfig.globalTimeRange, perExperienceLimit:p.beaconConfig.campaignStatRateLimiterConfig.perExperienceLimit,perExperienceTimeRange:p.beaconConfig.campaignStatRateLimiterConfig.perExperienceTimeRange});return a}Ma(b,a);var e=Na(b);ia(b,[{key:"send",value:function(a,e){e=e?e:[];if(this.eventRateLimiter.isTriggerLimitExceeded({experienceIds:e}))r.warn("Campaign Stat event rate limiter triggered.");else return ja(Q(b.prototype),"send",this).call(this,a)}}]);return b}(lc),Tf=function(a){Object.keys(a).forEach(function(b){var e= a[b];if("number"!=typeof e&&"boolean"!==typeof e&&null!=e)if("string"==typeof e){a:switch(b){case "url":case "urlref":e=e.substring(0,3072);break a;case "title":e=e.substring(0,1024);break a;default:e=e.substring(0,1024)}a[b]=e}else"function"==typeof e?delete a[b]:a[b]=JSON.stringify(e)})},eb,fb,gb,Od=!1,Pd=!1,Qd=!1,y={sdkLoadTime:null,sdkParseTime:null,sdkDnsTime:null,pageLoadTime:null,domLoadTime:null,networkTime:null,eventDnsTime:null},Rd=function(){return window.performance.getEntriesByType?window.performance.getEntriesByType("resource").reverse().find(function(a){return 0<= a.name.indexOf("/api2/event/")}):null},Sd=function(){return window.performance.getEntriesByType?window.performance.getEntriesByType("resource").find(function(a){return/\/evergage(Small)?(\.min)?\.js$/.test(a.name)}):null},Td=function(){if(window.performance.getEntriesByType){var a=window.performance.getEntriesByType("navigation");if(a&&0this.status)try{var a=JSON.parse(l.response); e(a)}catch(Me){g(Ob(Me,{status:this.status,statusText:l.statusText}))}else g(Ob("Response was not OK: ".concat(l.responseText),{status:this.status,statusText:l.statusText}))};l.onerror=function(){if(""===l.responseType||"text"===l.responseType){var a=l.responseText||l.statusText;if(a){g(Ob("Response error: ".concat(a),{status:this.status,statusText:l.statusText}));return}}r.debug("An error was sent with no text. This is un-actionable so it is being logged instead of written.")}; if(a.debug&&a.debug.explanations||a.explain)l.withCredentials=!0;if("true"==mc("isReadableEvent"))b.sendPost(l,b.baseURL,f);else try{if(!/^[\x20-\x7E]+$/.test(f))throw Error("GET request payload contains non-ASCII characters, try sending POST request");var k=encodeURIComponent(window.btoa(f)),m=b.baseURL+"?event="+k;if(8192 { if (validateOnTemplateDisplayEndEvent(event)) { const payload = event.detail.payload; const campaignElement = getCampaignElementFromPayload(payload); sendImpression(payload, campaignElement); bindCampaignClickthroughsAndDismissals(campaignElement); } }); const sendImpression = (payload, campaignElement) => { const userGroup = payload.userGroup; const stat = { control: userGroup === CAMPAIGN_STAT_USER_GROUP.CONTROL, experienceId: payload.experience, stat: CAMPAIGN_STAT_TYPE.IMPRESSION }; const itemStats = generateItemStats(campaignElement); if (Object.keys(itemStats).length > 0) { stat.catalog = itemStats; } if (userGroup === CAMPAIGN_STAT_USER_GROUP.CONTROL || (userGroup === CAMPAIGN_STAT_USER_GROUP.TEST && campaignElement.length > 0)) { Evergage.sendStat({campaignStats: [stat]}); } else { Evergage.log.warn("campaignStatsTracking.js", "Experience", payload.experience, "not found in DOM."); } }; const generateItemStats = (campaignElement) => { const catalogStats = {}; const itemNodes = Evergage.cashDom(campaignElement).find("[" + CAMPAIGN_STAT_ATTRIBUTE.ITEM_TYPE + "]"); if (!itemNodes || itemNodes.length === 0) { return catalogStats; } Array.from(itemNodes).forEach(function(itemNode) { const itemId = Evergage.cashDom(itemNode).attr(CAMPAIGN_STAT_ATTRIBUTE.ITEM); const itemType = Evergage.cashDom(itemNode).attr(CAMPAIGN_STAT_ATTRIBUTE.ITEM_TYPE); if (itemId && itemType) { if (!catalogStats[itemType]) { catalogStats[itemType] = []; } if (!catalogStats[itemType].includes(itemId)) { catalogStats[itemType].push(itemId); } } }); return catalogStats; } const buildCampaignSelector = (experienceId) => { return `[${CAMPAIGN_STAT_ATTRIBUTE.EXPERIENCE}='${experienceId}']` } const getCampaignElementFromPayload = (payload) => { const experienceId = payload.experience; const campaignSelector = buildCampaignSelector(experienceId); return Evergage.cashDom(campaignSelector); }; const getCampaignClickthroughAndDismissalElements = (campaignElement) => { const experienceId = Evergage.cashDom(campaignElement).attr(`${CAMPAIGN_STAT_ATTRIBUTE.EXPERIENCE}`); const campaignSelector = buildCampaignSelector(experienceId); return Evergage.cashDom(campaignElement).parent().find(` ${campaignSelector}[${CAMPAIGN_STAT_ATTRIBUTE.CLICKTHROUGH}], ${campaignSelector} a, ${campaignSelector} [${CAMPAIGN_STAT_ATTRIBUTE.CLICKTHROUGH}], ${campaignSelector} [${CAMPAIGN_STAT_ATTRIBUTE.DISMISSAL}] `); }; const sendClickthroughOrDismissal = (e) => { if (Evergage.cashDom(e.target).closest(`[${CAMPAIGN_STAT_ATTRIBUTE.IGNORE_CLICKTHROUGH}]`).length > 0) { return; } const campaignElement = Evergage.cashDom(e.target).closest(`[${CAMPAIGN_STAT_ATTRIBUTE.EXPERIENCE}]`); if (campaignElement.length > 0 && Evergage.cashDom(e.target).closest(` a, [${CAMPAIGN_STAT_ATTRIBUTE.CLICKTHROUGH}], [${CAMPAIGN_STAT_ATTRIBUTE.DISMISSAL}]`).length > 0) { const stat = { control: campaignElement.attr(CAMPAIGN_STAT_ATTRIBUTE.USER_GROUP) === CAMPAIGN_STAT_USER_GROUP.CONTROL, experienceId: campaignElement.attr(CAMPAIGN_STAT_ATTRIBUTE.EXPERIENCE), stat: Evergage.cashDom(e.target).closest(`[${CAMPAIGN_STAT_ATTRIBUTE.CLICKTHROUGH}]`).length > 0 || Evergage.cashDom(e.target).closest("a").length > 0 ? CAMPAIGN_STAT_TYPE.CLICKTHROUGH : CAMPAIGN_STAT_TYPE.DISMISSAL }; if (stat.stat === CAMPAIGN_STAT_TYPE.CLICKTHROUGH) { const itemClickthroughStats = generateItemClickthroughStats(e.target); if (Object.keys(itemClickthroughStats).length > 0) { stat.catalog = itemClickthroughStats; } } Evergage.sendStat({campaignStats: [stat]}); } }; const generateItemClickthroughStats = (target) => { const itemStats = {}; const itemId = Evergage.cashDom(target).closest("[" + CAMPAIGN_STAT_ATTRIBUTE.ITEM + "]").attr(CAMPAIGN_STAT_ATTRIBUTE.ITEM); const itemType = Evergage.cashDom(target).closest("[" + CAMPAIGN_STAT_ATTRIBUTE.ITEM_TYPE + "]").attr(CAMPAIGN_STAT_ATTRIBUTE.ITEM_TYPE); if (itemId && itemType) { itemStats[itemType] = [itemId]; } return itemStats; } const bindCampaignClickthroughsAndDismissals = (campaignElement) => { const elements = getCampaignClickthroughAndDismissalElements(campaignElement); elements.off("click", sendClickthroughOrDismissal); elements.on("click", sendClickthroughOrDismissal); }; const validateOnTemplateDisplayEndEvent = (event) => { if (!event.detail) { Evergage.log.warn("campaignStatsTracking.js", "No detail object found for onTemplateDisplayEndEvent", event); return false; } if (!event.detail.payload) { Evergage.log.warn("campaignStatsTracking.js", "No payload object found for onTemplateDisplayEndEvent", event); return false; } if (!event.detail.payload.campaign) { Evergage.log.warn("campaignStatsTracking.js", "No campaign found in payload object", event.detail); return false; } if (!event.detail.payload.experience) { Evergage.log.warn("campaignStatsTracking.js", "No experience found in payload object", event.detail); return false; } if (!event.detail.payload.userGroup) { Evergage.log.warn("campaignStatsTracking.js", "No user group found in payload object", event.detail); return false; } return true; }; } catch (e) { if (typeof window.Evergage === "object" && typeof window.Evergage.getVersion === "function" && window.Evergage.getVersion() >= 5) { Evergage.sendException(e, "beaconExtension: Campaign Stats Tracking:campaignStatsTracking.js"); } }; try { /** * Personalization Flicker Defense */ Evergage.FlickerDefender = Evergage.FlickerDefender || (() => { const personalizationSectionsSelector = "head > style.evergagePersonalizationSections"; let personalizedSectionsString = ""; let sectionsHaveEverBeenHidden = false; let hasBeenHidden = false; let shouldReshowNow = false; let hiddenSections = {}; const timeoutOptions = { pageMatchTimeout: 1000, redisplayTimeout: Evergage.getConfig().hideContentSectionsMillis || 2500 } const utils = { getGlobalContentZoneSelectors: () => { return ((Evergage.getState().config.global || {}).contentZones || []) .filter((contentZone) => (contentZone || {}).selector) .map((contentZone) => contentZone.selector); }, getPageTypeContentZoneSelectors: () => { const { pageTypes } = Evergage.getState().config; return pageTypes.length < 1 ? [] : pageTypes .map((pageType) => pageType.contentZones || []) .reduce((acc, contentZonesArr) => acc.concat(contentZonesArr), []) .filter((contentZone) => (contentZone || {}).selector) .map((contentZone) => contentZone.selector); }, buildContentZoneSelectors: () => { return [ ...new Set([ ...utils.getGlobalContentZoneSelectors(), ...utils.getPageTypeContentZoneSelectors() ]) ]; }, addToPersonalizedSectionsString: (selector) => { if (typeof selector === "string") { try { document.querySelector(selector); if (personalizedSectionsString !== "") { personalizedSectionsString += ", "; } personalizedSectionsString += selector; } catch (exception) { Evergage.sendException(exception, "hideSectionsInvalidCSSSelector"); } } }, hasBeenReshown: () => { return Evergage.cashDom(personalizationSectionsSelector).length === 0; } }; const actions = { hideSections: () => { if (sectionsHaveEverBeenHidden) return; const selectors = utils.buildContentZoneSelectors(); if (selectors.length === 0) { Evergage.log.debug("Evergage: Issue with malformed request in hideSections."); return; } for (const selector of selectors) { utils.addToPersonalizedSectionsString(selector); } if (!personalizedSectionsString) return; const head = document.head || document.getElementsByTagName("head")[0]; const style = document.createElement("style"); // Apply nonce if available for CSP compliance const sdkNamespace = window.SalesforceInteractions || window.Evergage; const nonce = sdkNamespace?.mcis?.discoverNonce?.() || sdkNamespace?.discoverNonce?.(); if (nonce && typeof nonce === "string") { style.nonce = nonce; } Evergage.cashDom(style) .attr({ type: "text/css", class: "evergagePersonalizationSections" }) .text(`${personalizedSectionsString} { visibility: hidden !important; }`); clearTimeout(window.evergageReshowPersonalizedSectionsTimeout); window.evergageReshowPersonalizedSectionsTimeout = setTimeout(function () { if (utils.hasBeenReshown()) return; shouldReshowNow = true; actions.reshowPersonalizedSectionsNow(); }, timeoutOptions.redisplayTimeout); head.appendChild(style); sectionsHaveEverBeenHidden = true; }, reshowPersonalizedSections: () => { if (utils.hasBeenReshown()) return; try { if (typeof window.requestAnimationFrame === "function") { Evergage.log.info("Evergage: Scheduling for next animation frame redisplay of sections of the page marked for personalization."); window.requestAnimationFrame(actions.reshowPersonalizedSectionsNow); } else { actions.reshowPersonalizedSectionsNow(); } } catch (exception) { Evergage.sendException(exception, "reshowPersonalizedSections"); } }, reshowReadyPersonalizedSections: () => { Evergage.cashDom(personalizationSectionsSelector).text(`${personalizedSectionsString} { visibility: hidden !important }`); Evergage.log.info(`Evergage: Redisplaying the following sections of the page marked for personalization: ${personalizedSectionsString}`); }, reshowAllPersonalizedSections: () => { Evergage.cashDom(personalizationSectionsSelector).remove(); Evergage.log.info("Evergage: Redisplaying outstanding sections of the page marked for personalization."); }, reshowPersonalizedSectionsNow: () => { if (utils.hasBeenReshown()) return; try { if (shouldReshowNow || Object.keys(hiddenSections).length === 0) { actions.reshowAllPersonalizedSections(); } else if (Object.keys(hiddenSections).length > 0) { personalizedSectionsString = ""; for (const contentZone in hiddenSections) { utils.addToPersonalizedSectionsString(hiddenSections[contentZone]); } actions.reshowReadyPersonalizedSections(); } } catch (exception) { Evergage.sendException(exception, "reshowPersonalizedSectionsNow"); } } }; const beaconListeners = { addOnInit: () => { document.addEventListener(Evergage.CustomEvents.OnInit, (domEvent) => { clearTimeout(window.evergagePageMatchTimeout); window.evergagePageMatchTimeout = setTimeout(function () { const { pageType } = (Evergage.getCurrentPage().source || {}); if (utils.hasBeenReshown() || (typeof pageType === "string" && pageType !== "")) return; shouldReshowNow = true; actions.reshowPersonalizedSectionsNow(); }, timeoutOptions.pageMatchTimeout); }); }, addPageMatchStatusUpdated: () => { document.addEventListener(Evergage.CustomEvents.OnPageMatchStatusUpdated, (domEvent) => { if (!hasBeenHidden) { actions.hideSections(); if (Evergage.cashDom(personalizationSectionsSelector).length > 0) { hasBeenHidden = true; } } }); }, addOnEventResponse: () => { document.addEventListener(Evergage.CustomEvents.OnEventResponse, (domEvent) => { const { campaignResponses } = ((domEvent.detail || {}).response || {}); if ((campaignResponses || []).length >= 1) { personalizedSectionsString = ""; for (const campaign of campaignResponses) { const { contentZone } = ((campaign || {}).payload || {}); const contentZoneSelector = Evergage.getContentZoneSelector(((campaign || {}).payload || {}).contentZone); if (typeof contentZoneSelector === "string") { hiddenSections[contentZone] = contentZoneSelector; utils.addToPersonalizedSectionsString(contentZoneSelector); } } if (!personalizedSectionsString) { actions.reshowPersonalizedSections(); return; } Evergage.cashDom(personalizationSectionsSelector).text(`${personalizedSectionsString} { visibility: hidden !important; }`); } else { actions.reshowPersonalizedSections(); } }); }, addOnTemplateDisplayEnd: () => { document.addEventListener(Evergage.CustomEvents.OnTemplateDisplayEnd, (domEvent) => { if (utils.hasBeenReshown()) return; const { contentZone } = ((domEvent.detail || {}).payload || {}); if (typeof contentZone === "string" && hiddenSections[contentZone]) { delete hiddenSections[contentZone]; } actions.reshowPersonalizedSections(); }); }, }; return { setPageMatchTimeout: (millis) => { if (typeof millis === "number" && millis >= 0) { timeoutOptions.pageMatchTimeout = parseInt(millis); } else { Evergage.log.warn("flickerDefender.js", "setPageMatchTimeout: Passed argument must be a number and must be greater than or equal to 0", millis); } }, setRedisplayTimeout: (millis) => { if (typeof millis === "number" && millis >= 0) { timeoutOptions.redisplayTimeout = parseInt(millis); } else { Evergage.log.warn("flickerDefender.js", "setRedisplayTimeout: Passed argument must be a number and must be greater than or equal to 0", millis); } }, init: function() { for (const key in beaconListeners) { beaconListeners[key](); } } }; })(); if (window.SalesforceInteractions && window.SalesforceInteractions.mcis) { window.SalesforceInteractions.mcis.FlickerDefender = Evergage.FlickerDefender; } if (typeof Evergage.FlickerDefender.init === "function" && (window.frameElement || {}).id !== "siteEditorFrame") { Evergage.FlickerDefender.init(); } } catch (e) { if (typeof window.Evergage === "object" && typeof window.Evergage.getVersion === "function" && window.Evergage.getVersion() >= 5) { Evergage.sendException(e, "beaconExtension: Flicker Defender:flickerDefender.js"); } }; try { !function(e,t){for(var n in t)e[n]=t[n]}(window,function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.restrictContentZone=t.executeControl=t.handleCampaignResponses=t.renderTemplate=t.resetTemplate=t.registerTemplate=t.executeBundles=void 0;var a=n(5),l=n(1),c=i(n(2));n(6);var s=new Map,u=new Map,p=new Set,d=function(){return document.getElementsByTagName("html").length>0&&null!=document.getElementsByTagName("html")[0].getAttribute(c.VE_LOADING_ATTRIBUTE)||null!=document.getElementById(c.VE_ACTIVE_ELEMENT_ID)||"true"===localStorage.getItem(c.VE_INDICATOR_FLAG)||document.location.href.includes(c.TEST_TEMPLATE_PARAMETER)},f=function(e){return s.get(e)},h=function(e,t){return[e,t.campaign,t.experience].join(":")};t.executeBundles=function(e){var n,r;if(e){var o=!0,i=(null===(n=window.SalesforceInteractions)||void 0===n?void 0:n.mcis)||window.Evergage,a=null===(r=null==i?void 0:i.discoverNonce)||void 0===r?void 0:r.call(i);e.forEach((function(e){var n,r,c=!1;try{try{var s=document.createElement("script");r="prepareTemplate"+e.id,s.text="function "+r+"(TemplateService) { "+e.bundle+" }",a&&(null==i?void 0:i.applyNonceToElement)&&(i.applyNonceToElement(s,a),c=!0),n=document.head.appendChild(s),window[r]({registerTemplate:t.registerTemplate})}catch(n){if(c)throw n;o=!1,Function("TemplateService",e.bundle)({registerTemplate:t.registerTemplate})}}catch(e){l.dispatchError(e)}finally{n&&n.parentNode.removeChild(n),r&&window[r]&&(window[r]=void 0)}})),o||console.warn("Marketing Cloud Personalization will soon require your Content Security Policy to allow `unsafe-inline`.")}},t.registerTemplate=function(e){var t=new a.Template(e);s.set(e.name,t)},t.resetTemplate=function(e,t){var n=h(e,t),r=u.get(n);if(r)try{r()}catch(e){l.dispatchError(e)}u.delete(n)},t.renderTemplate=function(e,t){if(s.has(e)){var n=f(e).render(t);u.set(h(e,t),n)}},t.handleCampaignResponses=function(e){d()||e.filter((function(e){return"ng"===e.type})).filter((function(e){return!g(e)})).forEach((function(e){switch(e.userGroup){case"Default":m(e);break;case"Control":t.executeControl(e)}}))};var m=function(e){e.templateNames.forEach((function(n){t.renderTemplate(n,e.payload)}))};t.executeControl=function(e){e.templateNames.forEach((function(t){var n=f(t),r=e.payload;if(n.control)try{var o=n.control(r);l.handleTemplateDispatch(o,r)}catch(e){l.dispatchError(e)}}))};var g=function(e){return e.payload.contentZone&&p.has(e.payload.contentZone)};t.restrictContentZone=function(e){e&&p.add(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dispatchError=t.handleTemplateDispatch=t.getQueryParam=void 0,t.getQueryParam=function(e){var t=location.search;e=e.replace(/[[]/,"\\[").replace(/[\]]/,"\\]");var n=new RegExp("[\\?&]"+e+"=([^&#]*)").exec(t);return null===n?"":decodeURIComponent(n[1].replace(/\+/g," "))};var r=function(e){document.dispatchEvent(new CustomEvent(window.Evergage.CustomEvents.OnTemplateDisplayEnd,{detail:{payload:e}})),document.dispatchEvent(new CustomEvent(window.SalesforceInteractions.mcis.CustomEvents.OnTemplateDisplayEnd,{detail:{payload:e}}))};t.handleTemplateDispatch=function(e,t){window.Promise&&"function"==typeof window.Promise.resolve?window.Promise.resolve(e).then((function(){r(t)})):r(t)},t.dispatchError=function(e){document.dispatchEvent(new CustomEvent(window.SalesforceInteractions.CustomEvents.OnException,{detail:{error:new Error(e),context:"Handlebars Template Gear"}}))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VE_ACTIVE_ELEMENT_ID=t.VE_INDICATOR_FLAG=t.VE_LOADING_ATTRIBUTE=t.TEST_TEMPLATE_PARAMETER=t.TEST_TEMPLATE_STORAGE_KEY=void 0,t.TEST_TEMPLATE_STORAGE_KEY="testTemplate",t.TEST_TEMPLATE_PARAMETER="evergageTestTemplate",t.VE_LOADING_ATTRIBUTE="evergagevisualeditorloading",t.VE_INDICATOR_FLAG="evgVE",t.VE_ACTIVE_ELEMENT_ID="evg_ui-visual-editor"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.render=void 0;var r=n(4),o=n(7),i=n(0);function a(){/complete|interactive|loaded/.test(document.readyState)?(r.renderTestTemplate(),o.initPreview()):document.addEventListener("DOMContentLoaded",(function(){r.renderTestTemplate(),o.initPreview()}))}document.addEventListener(window.Evergage.CustomEvents.OnEventResponse,(function(e){i.executeBundles(e.detail.response.compiledCampaignTemplates),i.handleCampaignResponses(e.detail.response.campaignResponses)})),t.render=a,a()},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.renderTestTemplate=void 0;var r=n(0),o=n(1),i=n(2);t.renderTestTemplate=function(){if("true"==o.getQueryParam(i.TEST_TEMPLATE_PARAMETER)){var e=a();addEventListener("storage",(function(t){t.key==i.TEST_TEMPLATE_STORAGE_KEY&&(e&&r.resetTemplate(e.templateName,e.templateConfig),e=a())}))}};var a=function(){var e=localStorage.getItem(i.TEST_TEMPLATE_STORAGE_KEY);if(e)try{var t=JSON.parse(e);return r.executeBundles(t.templates),r.renderTemplate(t.templateName,t.templateConfig),r.restrictContentZone(t.templateConfig.contentZone),t}catch(e){}}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Template=void 0;var o=r(n(8)),i=n(1),a=function(){function e(e){var t=this;if(this.getContentZoneFromMatchedConfig=function(e){var t=window.Evergage.getState().result.matchedConfig;return e.contentZone&&t&&t.contentZones&&0!==t.contentZones.length&&t.contentZones.find((function(t){return t.name===e.contentZone}))||null},this.applyRender=function(e){var n=t.getContentZoneFromMatchedConfig(e);n&&t.executeInsertionForTarget(n,e)},this.replaceContentAtTarget=function(e,t){t.innerHTML=e},this.name=e.name,this.apply=e.apply,this.reset=e.reset,this.control=e.control,e.handlebars)try{this.generateHtml=o.default.template(e.handlebars),o.default.partials[e.name]=o.default.template(e.handlebars)}catch(e){i.dispatchError(e)}else this.generateHtml=function(){}}return e.prototype.render=function(e){try{var t=this.apply(e,this.generateHtml,this.applyRender);return i.handleTemplateDispatch(t,e),this.reset.bind(this,e,this.generateHtml)}catch(e){i.dispatchError(e)}},e.prototype.executeInsertionForTarget=function(e,t){if(this.generateHtml){var n=e.selector;try{var r=document.querySelector(n);if(!r){var o='Could not render template. Content zone "'+e.name+'" defined but the selector "'+n+'" not found on the page.';return void i.dispatchError(o)}var a=this.generateHtml(t);if(!a)return;this.replaceContentAtTarget(a,r)}catch(e){i.dispatchError(e)}}},e}();t.Template=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initPreview=void 0;var r=n(2),o=n(0);t.initPreview=function(){window.Evergage.Render={render:function(e,t,n){var i=JSON.stringify({templateName:e,templateConfig:t,templates:n});window.localStorage.setItem(r.TEST_TEMPLATE_STORAGE_KEY,i),o.resetTemplate(e,t),o.executeBundles(n),o.renderTemplate(e,t)},reset:o.resetTemplate}}},function(e,t,n){"use strict";n.r(t);var r={};n.r(r),n.d(r,"extend",(function(){return u})),n.d(r,"toString",(function(){return p})),n.d(r,"isFunction",(function(){return d})),n.d(r,"isArray",(function(){return f})),n.d(r,"indexOf",(function(){return h})),n.d(r,"escapeExpression",(function(){return m})),n.d(r,"isEmpty",(function(){return g})),n.d(r,"createFrame",(function(){return v})),n.d(r,"blockParams",(function(){return E})),n.d(r,"appendContextPath",(function(){return T}));var o={};n.r(o),n.d(o,"VERSION",(function(){return k})),n.d(o,"COMPILER_REVISION",(function(){return j})),n.d(o,"LAST_COMPATIBLE_COMPILER_REVISION",(function(){return I})),n.d(o,"REVISION_CHANGES",(function(){return L})),n.d(o,"HandlebarsEnvironment",(function(){return R})),n.d(o,"log",(function(){return N})),n.d(o,"createFrame",(function(){return v})),n.d(o,"logger",(function(){return M}));var i={};n.r(i),n.d(i,"checkRevision",(function(){return V})),n.d(i,"template",(function(){return B})),n.d(i,"wrapProgram",(function(){return G})),n.d(i,"resolvePartial",(function(){return Z})),n.d(i,"invokePartial",(function(){return F})),n.d(i,"noop",(function(){return q}));const a={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},l=/[&<>"'`=]/g,c=/[&<>"'`=]/;function s(e){return a[e]}function u(e){for(let t=1;t0?(n.ids&&(n.ids=[n.name]),e.helpers.each(t,n)):r(this);if(n.data&&n.ids){let e=v(n.data);e.contextPath=T(n.data.contextPath,n.name),n={data:e}}return o(t,n)}))}(e),function(e){e.registerHelper("each",(function(e,t){if(!t)throw new b("Must pass iterator to #each");let n,r,o=t.fn,i=t.inverse,a=0,l="";function c(t,i,a){n&&(n.key=t,n.index=i,n.first=0===i,n.last=!!a,r&&(n.contextPath=r+t)),l+=o(e[t],{data:n,blockParams:E([e[t],t],[r+t,null])})}if(t.data&&t.ids&&(r=T(t.data.contextPath,t.ids[0])+"."),d(e)&&(e=e.call(this)),t.data&&(n=v(t.data)),e&&"object"==typeof e)if(f(e))for(let t=e.length;a{void 0!==t&&c(t,a-1),t=e,a++}),void 0!==t&&c(t,a-1,!0)}return 0===a&&(l=i(this)),l}))}(e),function(e){e.registerHelper("helperMissing",(function(){if(1!==arguments.length)throw new b('Missing helper: "'+arguments[arguments.length-1].name+'"')}))}(e),function(e){e.registerHelper("if",(function(e,t){if(2!=arguments.length)throw new b("#if requires exactly one argument");return d(e)&&(e=e.call(this)),!t.hash.includeZero&&!e||g(e)?t.inverse(this):t.fn(this)})),e.registerHelper("unless",(function(t,n){if(2!=arguments.length)throw new b("#unless requires exactly one argument");return e.helpers.if.call(this,t,{fn:n.inverse,inverse:n.fn,hash:n.hash})}))}(e),function(e){e.registerHelper("log",(function(){let t=[void 0],n=arguments[arguments.length-1];for(let e=0;e=0?t:parseInt(e,10)}return e},log:function(e,...t){if(e=C.lookupLevel(e),"undefined"!=typeof console&&C.lookupLevel(C.level)<=e){let n=C.methodMap[e];console[n]||(n="log"),console[n](...t)}}};var M=C;function A(...e){return u(Object.create(null),...e)}const S=Object.create(null);function x(e,t){return void 0!==e.whitelist[t]?!0===e.whitelist[t]:void 0!==e.defaultValue?e.defaultValue:(function(e){!0!==S[e]&&(S[e]=!0,(void 0)("error",`Handlebars: Access has been denied to resolve the property "${e}" because it is not an "own property" of its parent.\nYou can add a runtime option to disable the check or this warning:\nSee https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details`))}(t),!1)}const k="4.7.7",j=8,I=7,L={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0 <4.3.0",8:">= 4.3.0"};function R(e,t,n){this.helpers=e||{},this.partials=t||{},this.decorators=n||{},_(this),O(this)}R.prototype={constructor:R,logger:M,log:M.log,registerHelper:function(e,t){if("[object Object]"===p.call(e)){if(t)throw new b("Arg not supported with multiple helpers");u(this.helpers,e)}else this.helpers[e]=t},unregisterHelper:function(e){delete this.helpers[e]},registerPartial:function(e,t){if("[object Object]"===p.call(e))u(this.partials,e);else{if(void 0===t)throw new b(`Attempting to register a partial called "${e}" as undefined`);this.partials[e]=t}},unregisterPartial:function(e){delete this.partials[e]},registerDecorator:function(e,t){if("[object Object]"===p.call(e)){if(t)throw new b("Arg not supported with multiple decorators");u(this.decorators,e)}else this.decorators[e]=t},unregisterDecorator:function(e){delete this.decorators[e]},resetLoggedPropertyAccesses(){Object.keys(S).forEach(e=>{delete S[e]})}};let N=M.log;function H(e){this.string=e}H.prototype.toString=H.prototype.toHTML=function(){return""+this.string};var D=H;function V(e){const t=e&&e[0]||1;if(!(t>=I&&t<=j)){if(t{let r=e[n];e[n]=function(e,t){const n=t.lookupProperty;return function(e,t){return"function"!=typeof e?e:function(){const n=arguments[arguments.length-1];return arguments[arguments.length-1]=t(n),e.apply(this,arguments)}}(e,e=>u({lookupProperty:n},e))}(r,t)})}(i,r),r.helpers=i,e.usePartial&&(r.partials=r.mergeIfNeeded(o.partials,t.partials)),(e.usePartial||e.useDecorators)&&(r.decorators=u({},t.decorators,o.decorators)),r.hooks={},r.protoAccessControl=function(e){let t=Object.create(null);t.constructor=!1,t.__defineGetter__=!1,t.__defineSetter__=!1,t.__lookupGetter__=!1;let n=Object.create(null);return n.__proto__=!1,{properties:{whitelist:A(n,e.allowedProtoProperties),defaultValue:e.allowProtoPropertiesByDefault},methods:{whitelist:A(t,e.allowedProtoMethods),defaultValue:e.allowProtoMethodsByDefault}}}(o);let a=o.allowCallsToHelperMissing||n;P(r,"helperMissing",a),P(r,"blockHelperMissing",a)}},o._child=function(t,n,o,i){if(e.useBlockParams&&!o)throw new b("must pass block params");if(e.useDepths&&!i)throw new b("must pass parent depths");return G(r,t,e[t],n,0,o,i)},o}function G(e,t,n,r,o,i,a){function l(t,o={}){let l=a;return!a||t==a[0]||t===e.nullContext&&null===a[0]||(l=[t].concat(a)),n(e,t,e.helpers,e.partials,o.data||r,i&&[o.blockParams].concat(i),l)}return(l=U(n,l,e,a,r,i)).program=t,l.depth=a?a.length:0,l.blockParams=o||0,l}function Z(e,t,n){return e?e.call||n.name||(n.name=e,e=n.partials[e]):e="@partial-block"===n.name?n.data["partial-block"]:n.partials[n.name],e}function F(e,t,n){const r=n.data&&n.data["partial-block"];let o;if(n.partial=!0,n.ids&&(n.data.contextPath=n.ids[0]||n.data.contextPath),n.fn&&n.fn!==q){n.data=v(n.data);let e=n.fn;o=n.data["partial-block"]=function(t,n={}){return n.data=v(n.data),n.data["partial-block"]=r,e(t,n)},e.partials&&(n.partials=u({},n.partials,e.partials))}if(void 0===e&&o&&(e=o),void 0===e)throw new b("The partial "+n.name+" could not be found");if(e instanceof Function)return e(t,n)}function q(){return""}function U(e,t,n,r,o,i){if(e.decorator){let a={};u(t=e.decorator(t,a,n,r&&r[0],o,i,r),a)}return t}function Y(){let e=new R;return u(e,o),e.SafeString=D,e.Exception=b,e.Utils=r,e.escapeExpression=m,e.VM=i,e.template=function(t){return B(t,e)},e}let K=Y();K.create=Y,function(e){let t="undefined"!=typeof global?global:window,n=t.Handlebars;e.noConflict=function(){return t.Handlebars===e&&(t.Handlebars=n),e}}(K),K.default=K;t.default=K}])); } catch (e) { if (typeof window.Evergage === "object" && typeof window.Evergage.getVersion === "function" && window.Evergage.getVersion() >= 5) { Evergage.sendException(e, "beaconExtension: Handlebars Templates:index.js"); } }; try { // syncs with @frontend/packages/ui-chrome-extension/src/constants.ts#CUSTOM_EVENT.MESSAGE_FROM_INTERACTION_STUDIO_TOOLS_GEAR var VE_CUSTOM_EVENT_NAME = 'msg_from_interaction_studio_tools_gear'; // syncs with @frontend/packages/ui-chrome-extension/src/constants.ts#EVENT_TYPE.MESSAGE_FROM_INTERACTION_STUDIO_TOOLS_GEAR var TO_LAUNCHER_MESSAGE_TYPE = 'nxve_messageFromInteractionStudioToolsGear'; var TO_LAUNCHER_PAYLOAD_TYPE = 'beaconSDK_domEvent'; function sendMessageToEvergageLauncher(message) { try { document.dispatchEvent( new CustomEvent(VE_CUSTOM_EVENT_NAME, { detail: JSON.stringify(message), }) ); } catch (e) { console.error(e); } } var eventLinkId = null; if (Evergage !== null) { document.addEventListener(Evergage.CustomEvents.OnInit, function ( domEvent ) { sendMessageToEvergageLauncher({ type: TO_LAUNCHER_MESSAGE_TYPE, payload: { type: TO_LAUNCHER_PAYLOAD_TYPE, payload: { name: Evergage.CustomEvents.OnInit, detail: domEvent.detail, }, }, }); }); document.addEventListener(Evergage.CustomEvents.OnEventSend, function ( domEvent ) { eventLinkId = Math.random().toString().slice(2); const { actionEvent } = domEvent.detail || {}; actionEvent._toolsEventLinkId = eventLinkId; if (actionEvent.interaction) { actionEvent.explain = true; } else { actionEvent.debug = Object.assign( (actionEvent.debug || {}), { explanations: true } ); } sendMessageToEvergageLauncher({ type: TO_LAUNCHER_MESSAGE_TYPE, payload: { type: TO_LAUNCHER_PAYLOAD_TYPE, payload: { name: Evergage.CustomEvents.OnEventSend, detail: domEvent.detail, }, }, }); }); document.addEventListener(Evergage.CustomEvents.OnEventResponse, function ( domEvent ) { if (domEvent.detail) { const currentPage = Evergage.getCurrentPage(); const sitemapConfig = Evergage.getState().config; const matchedPageConfig = Evergage.getState().result && Evergage.getState().result.matchedConfig; eventLinkId = null; sendMessageToEvergageLauncher({ type: TO_LAUNCHER_MESSAGE_TYPE, payload: { type: TO_LAUNCHER_PAYLOAD_TYPE, payload: { name: Evergage.CustomEvents.OnEventResponse, detail: { response: domEvent.detail.response, currentPage: currentPage, sitemapConfig: sitemapConfig, matchedPageConfig: matchedPageConfig, }, }, }, }); } }); } } catch (e) { if (typeof window.Evergage === "object" && typeof window.Evergage.getVersion === "function" && window.Evergage.getVersion() >= 5) { Evergage.sendException(e, "beaconExtension: System Tools:interactionStudioTools.js"); } }; try { Evergage.Surveys = Evergage.Surveys || (function() { var SURVEY_ACTION = { SUBMIT: "submit", PAGE_NEXT: "pageNext", PAGE_PREV: "pagePrev" }; var SURVEY_EVENT_PARAM = { SURVEY_ACTION: 'surveyAction', SURVEY_ID: 'surveyId', SURVEY_START_TIME: 'surveyStartTime' }; var initialized = false; function isInitialized() { return (initialized || typeof window.Survey === 'object'); } /** * processSurveyResponses * ** recursive ** * @param responses {object} a collection of survey element response values keyed by element.name (question.name) * @param elements {object} a collection of SurveyElements for a given page or panel of a survey * @param addResponseFn {function} invoked for each questionType element that has been processed */ function processSurveyResponses(elements, survey, sender) { try { var shouldHandleElementAsPanel = function(element) { return (element.type === 'panel' && Evergage.cashDom.isArray(element.elements) && element.elements.length !== 0 && !isString(element.questionId)); }; var formatAnswer = function(answer) { var result = (answer) ? answer : null; if (result != null && Evergage.cashDom.isArray(result) || isPlainObject(result)) { result = JSON.stringify(result); } return result; }; var formatQuestionId = function(element, rowId) { var questionId = "survey:" + survey.id + ":" + element.questionId; if (isString(rowId)) { questionId += ":" + rowId; } return questionId; }; var responses = []; for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) { var element = elements[elementIndex]; if (shouldHandleElementAsPanel(element)) { responses = responses.concat(processSurveyResponses(element.elements, survey, sender)); } else { if (element.type === "matrix") { for (var rowIndex = 0; rowIndex < element.rows.length; rowIndex++) { var row = element.rows[rowIndex]; var rowId = element.rowIds[rowIndex]; var allRowsValues = sender.data[element.name] ? sender.data[element.name] : {}; if (allRowsValues[row.value]) { var rowValue = allRowsValues[row.value]; responses.push({ questionId: formatQuestionId(element, rowId), answer: rowValue }); } } } else { var answer = formatAnswer(sender.data[element.name]); if (answer) { responses.push({ questionId: formatQuestionId(element), answer: answer }); } } } } return responses; } catch (e) { Evergage.log.error('Evergage: There was an error when attempting to ' + 'process survey responses: ', e); } } function isPlainObject(obj) { if (typeof obj !== 'object' || obj === null) return false; const proto = Object.getPrototypeOf(obj); return proto === null || proto === Object.prototype; } function isString(property) { return typeof property === 'string' || property instanceof String; } function handleSurveyAction(surveyAction, survey, sender) { try { if (surveyAction === SURVEY_ACTION.PAGE_NEXT) { return; } else { var surveyActionEvent = new SurveyActionEvent(surveyAction, survey.id, new Date().getTime()); Evergage.cashDom.each(survey.config.pages, function(index, page) { surveyActionEvent.addResponses(processSurveyResponses(page.elements, survey, sender)); }); surveyActionEvent.send(); } } catch (e) { Evergage.log.error('Evergage: There was an error when attempting to ' + 'submit survey responses surveyId[' + message.surveyConfig.survey.id + ']: ', e); } } function renderSurvey(survey, renderTarget) { if (typeof survey !== "object" || !renderTarget) return Evergage.log.error("Evergage: renderSurvey arguments are not valid"); return injectSurveyResourcesIntoPage().then(() => { try { if (surveyAlreadyRendered(survey.id, renderTarget)) return; window.Survey.JsonObject.metaData.addProperty("questionbase", "questionId"); window.Survey.JsonObject.metaData.addProperty("questionbase", "rowIds"); var surveyModel = new window.Survey.Model(survey.config); // eslint-disable-next-line new-cap Evergage.cashDom(renderTarget).Survey({ model: surveyModel, onComplete: function(sender) { handleSurveyAction(SURVEY_ACTION.SUBMIT, survey, sender); }, onPartialSend: function(sender) { handleSurveyAction(SURVEY_ACTION.PAGE_NEXT, survey, sender); } }); Evergage.cashDom(renderTarget).attr("data-evg-survey-id", survey.id); } catch (e) { Evergage.log.error('Evergage: There was an error when attempting to render the survey', e); } }); } function injectSurveyResourceIntoPage(type, url) { try { var documentHead = document.head || document.getElementsByTagName('head')[0]; var isStylesheet = (type === 'style'); var surveyResourceElement = document.createElement(isStylesheet ? 'link' : 'script'); surveyResourceElement.setAttribute('type', ((isStylesheet) ? 'text/css' : 'text/javascript')); surveyResourceElement.setAttribute('class', 'evergageSurvey-' + type); surveyResourceElement.setAttribute(((isStylesheet) ? 'href' : 'src'), url); if (isStylesheet) { surveyResourceElement.setAttribute('rel', 'stylesheet'); } documentHead.appendChild(surveyResourceElement); Evergage.log.trace('Evergage: Injected survey resource of type[' + type + '] url[' + url + ']'); } catch (e) { Evergage.log.error('Evergage: There was an error when attempting to inject surveyJS resources into the page: ', e); } } function injectSurveyResourcesIntoPage() { return new Promise(resolve => { if (isInitialized()) { return resolve(); } var SURVEY_JS_CDN_BASE_URL = '//cdn.evergage.com/evergage-content/3pp'; var SURVEY_JS_VERSION = 'surveyjs-1.0.95'; var SURVEY_JS_SCRIPT_NAME = 'survey.cash.min.js'; var SURVEY_JS_STYLESHEET_NAME = 'survey.min.css'; Object.entries({ script: [SURVEY_JS_CDN_BASE_URL, SURVEY_JS_VERSION, SURVEY_JS_SCRIPT_NAME].join('/'), style: [SURVEY_JS_CDN_BASE_URL, SURVEY_JS_VERSION, SURVEY_JS_STYLESHEET_NAME].join('/') }).forEach(function(entry) { const [resourceType, resourceUrl] = entry injectSurveyResourceIntoPage(resourceType, resourceUrl); }); var interval = setInterval(function(){ if (Evergage.cashDom.fn.Survey != null && window.Survey != null) { clearInterval(interval); initialized = true; resolve(); } }, 100); }) } function surveyAlreadyRendered(surveyId, renderTarget) { return Evergage.cashDom(renderTarget).attr("data-evg-survey-id") === surveyId; } function SurveyActionEvent(surveyAction, surveyId, timestamp) { this.params = { source: {}, attributes: {} }; this.params.source[SURVEY_EVENT_PARAM.SURVEY_ACTION] = surveyAction; this.params.source[SURVEY_EVENT_PARAM.SURVEY_ID] = surveyId; this.params.source[SURVEY_EVENT_PARAM.SURVEY_START_TIME] = timestamp; } SurveyActionEvent.prototype.addResponses = function(responses) { for (var i = 0; i < responses.length; i++) { var response = responses[i]; this.addResponse(response.questionId, response.answer); } }; SurveyActionEvent.prototype.addResponse = function(name, value) { Evergage.log.trace('Evergage: Adding response to SurveyActionEvent: ' + JSON.stringify({ name: name, value: value })); this.params.attributes[name] = value; }; SurveyActionEvent.prototype.send = function() { Evergage.log.trace('Evergage: Tracking survey event: ', this.params); Evergage.sendEvent({ action: "Survey " + this.params.source[SURVEY_EVENT_PARAM.SURVEY_ACTION], source: this.params.source, user: { attributes: this.params.attributes } }); }; return { renderSurvey: renderSurvey, injectSurveyResourcesIntoPage: injectSurveyResourcesIntoPage }; })(window); if (window.SalesforceInteractions && window.SalesforceInteractions.mcis) { window.SalesforceInteractions.mcis.Surveys = Evergage.Surveys; } } catch (e) { if (typeof window.Evergage === "object" && typeof window.Evergage.getVersion === "function" && window.Evergage.getVersion() >= 5) { Evergage.sendException(e, "beaconExtension: Surveys:SurveyJS.js"); } }; try { (function () { var VE_LOCAL_STORAGE_KEY = 'evgVE'; var SITEMAP_EDITOR_LOCAL_STORAGE_KEY = 'evgVE-cdp-sitemap-editor'; var SdkNamespace = window.SalesforceInteractions || window.Evergage; function injectEditorLaunchScript(isStandaloneSitemapEditor) { try { // getConfig() is not exposed on the Salesforce/CDP build of the SDK var trackerUrl = typeof SdkNamespace.getConfig === 'function' && SdkNamespace.getConfig().trackerUrl; var baseUrl = !isStandaloneSitemapEditor && trackerUrl ? trackerUrl : 'https://cdn.evergage.com'; var scriptPath = isStandaloneSitemapEditor ? '/evergage-content/sitemap-editor/4.0.2/launch.sitemap-editor.js' : '/visual-editor/launch.js'; var scriptUrl = [baseUrl, scriptPath].join(''); var scriptTag = document.createElement('script'); scriptTag.setAttribute('id', 'salesforceInteractionsLauncherScript'); scriptTag.src = scriptUrl; var nonce = SdkNamespace?.mcis?.discoverNonce?.() || SdkNamespace?.discoverNonce?.(); if (nonce && typeof nonce === 'string') { scriptTag.nonce = nonce; } // Fallback: scan existing DOM elements for a nonce when the SDK is unavailable. // TODO: Consolidate into the SDK's discoverNonce() for a single, scoped lookup. if (!nonce) { var existing = document.querySelectorAll('script[nonce], style[nonce], link[nonce]'); for (var i = 0; i < existing.length; i++) { var n = existing[i].nonce; if (n && n !== '') { nonce = n; break; } } if (nonce) { scriptTag.nonce = nonce; } } if ( document.getElementById('salesforceInteractionsLauncherScript') == null ) { document.head.appendChild(scriptTag); } else { SdkNamespace.log.info('Launch script is already here.'); } } catch (err) { SdkNamespace.log.error( 'Failed to inject Salesforce Interactions Launcher script: ' + err ); } } function getUrlBoolean(name) { name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); var results = regex.exec(location.search); return results === null ? null : results[1] === 'true'; } var visualEditorParam = getUrlBoolean('evergageEditor'); var standaloneEditorParam = getUrlBoolean('salesforceInteractionsSitemapEditor'); var visualEditorEnabledInStorage = function () { return window.localStorage[VE_LOCAL_STORAGE_KEY] === 'true'; }; var standloneSitemapEditorEnabledInStorage = function () { return window.localStorage[SITEMAP_EDITOR_LOCAL_STORAGE_KEY] === 'true'; }; // honor and set local storage based off queryParam if (visualEditorParam !== null) { window.localStorage.setItem(VE_LOCAL_STORAGE_KEY, visualEditorParam); } if (standaloneEditorParam !== null) { window.localStorage.setItem( SITEMAP_EDITOR_LOCAL_STORAGE_KEY, standaloneEditorParam ); } var inSiteEditorFrameContext = window.frameElement && window.frameElement.id === 'siteEditorFrame'; // trigger off of localStorage only // chrome extension reads/sets localStorage more easily than modifying the currentTab URL if ( !visualEditorEnabledInStorage() && !standloneSitemapEditorEnabledInStorage() && !inSiteEditorFrameContext ) { return; } if (window.top === window.self || inSiteEditorFrameContext) { document.addEventListener( SdkNamespace.CustomEvents.OnInit, (event) => { injectEditorLaunchScript( standloneSitemapEditorEnabledInStorage() ); event.preventDefault(); }, { once: true } ); } })(); } catch (e) { if (typeof window.Evergage === "object" && typeof window.Evergage.getVersion === "function" && window.Evergage.getVersion() >= 5) { Evergage.sendException(e, "beaconExtension: Visual Editor:visualEditor.js"); } }; try { var evgr = Evergage.resolvers; /* ========================================================= 1) UTILIDADES BÁSICAS ========================================================= */ // GUID para IDs únicos function generateGuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16); }); } // Title Case para nombres function toTitleCase(str) { return String(str || "") .toLowerCase() .replace(/\b\w/g, (c) => c.toUpperCase()); } // Home route function isHomeRoute() { const path = (window.location.pathname || "/").replace(/\/+$/, "") || "/"; return path === "/"; } // PDP route function isPdpRoute() { return /\/detalle-producto/i.test(window.location.pathname || ""); } // Fallback IMG solo para planes/prepost (NO para productos/equipos) const DEFAULT_PRODUCT_IMAGE_URL = "https://tienda.claro.com.co/static/images/img/logos/logo-claro.png"; /* ========================================================= 1.1) HELPERS DE PAGE TYPES ESPECÍFICOS ========================================================= */ // Nueva ruta exacta: /claro/pasate-de-prepago-a-postpago-claro function isPrepagoToPostpagoClaroRoute() { const path = (window.location.pathname || "").replace(/\/+$/, ""); return /^\/claro\/pasate-de-prepago-a-postpago-claro$/i.test(path); } // FIX: // Evita que Form_WCB compita con Home_Botones_Global en Home // y también evita conflicto con la nueva página específica. function isWcbFormPage() { try { if (isHomeRoute()) return false; if (isPrepagoToPostpagoClaroRoute()) return false; return !!document.querySelector("div.container .shopNavigation"); } catch (e) { return false; } } /* ========================================================= 2) DETECCIÓN PLAN VS EQUIPO (segura) ========================================================= */ // Detecta si es PDP “tipo plan” (no equipo) function isPlanPdp() { try { if (!isPdpRoute()) return false; // Señales de equipo: ampliar por carruseles comunes const hasEquipmentSignals = !!document.querySelector(".productoGaleriaShow, .slick-track img, .slick-slide img"); // CTA “plan-like” const hasPlanCTA = !!document.querySelector( "a.deleteCSS-btn-rojo, a.deleteCSS-btn-rojo.stickyBuy, a.deleteCSS-btn-rojo-newReSimPa, a.deleteCSS-btn-rojo-newReSimPa.stickyBuy" ); // Señales de plan (NO usar “precio ahora” porque aparece en todo) const bodyText = (document.body?.innerText || "").toLowerCase(); const hasPlanSignals = /factura mensual/.test(bodyText) || /mensuales/.test(bodyText) || /datos ilimitados/.test(bodyText) || /postpago/.test(bodyText) || /prepago/.test(bodyText) || /portabilidad/.test(bodyText); // Breadcrumb para evitar falsos positivos (ej: Tecnología/Consolas) const breadcrumbText = ( document.querySelector(".breadcrumDiv, .breadcrumDiv-red-sim-paq, .shopNavigation-red-sim-paq")?.innerText || "" ).toLowerCase(); // Si es tecnología, no es plan if (/tecnolog[ií]a|consolas|videojuegos|televisores|computadores|hogar/i.test(breadcrumbText)) { return false; } // Solo considerarlo plan si parece “servicios móviles” const looksLikeMobileService = /servicios\s*m[oó]viles|prepago|postpago|portabilidad|sim\s*card|paquete/i.test( breadcrumbText ); return !hasEquipmentSignals && looksLikeMobileService && (hasPlanCTA || hasPlanSignals); } catch (e) { return false; } } /* ========================================================= 3) HELPERS PRODUCTO: ID/SKU/NOMBRE/PRECIO (DOM + dataLayer + URL) ========================================================= */ // ID fallback desde URL function getPdpIdFallback() { var parts = (window.location.pathname || "") .split("/") .filter(function (p) { return p; }); return parts.length ? String(parts.pop()).trim() : null; } // Último objeto “producto” del dataLayer function getLastProductFromDataLayer() { try { const dl = window.dataLayer || []; for (let i = dl.length - 1; i >= 0; i--) { const e = dl[i] || {}; const p = e?.ecommerce?.detail?.products?.[0] || e?.ecommerce?.items?.[0] || e?.ecommerce?.cart?.items?.[0] || e?.ecommerce?.checkout?.items?.[0] || null; if (p) return p; } } catch (e) {} return null; } // ID desde dataLayer function getProductIdFromDataLayer() { try { const dl = window.dataLayer || []; for (let i = dl.length - 1; i >= 0; i--) { const e = dl[i] || {}; const p = e?.ecommerce?.detail?.products?.[0] || e?.ecommerce?.items?.[0] || e?.ecommerce?.cart?.items?.[0] || e?.ecommerce?.checkout?.items?.[0] || null; if (!p) continue; const id = p?.id || p?.item_id || p?.sku || null; if (id) return String(id).trim(); } } catch (e) { return null; } return null; } // Nombre desde dataLayer function getProductNameFromDataLayer() { try { const dl = window.dataLayer || []; for (let i = dl.length - 1; i >= 0; i--) { const e = dl[i] || {}; const p = e?.ecommerce?.detail?.products?.[0] || e?.ecommerce?.items?.[0] || e?.ecommerce?.cart?.items?.[0] || e?.ecommerce?.checkout?.items?.[0] || null; if (!p) continue; const name = p?.name || p?.item_name || null; if (name) return String(name).trim(); } } catch (e) {} return null; } // Precio desde dataLayer function getProductPriceFromDataLayer() { try { const dl = window.dataLayer || []; for (let i = dl.length - 1; i >= 0; i--) { const e = dl[i] || {}; const p = e?.ecommerce?.detail?.products?.[0] || e?.ecommerce?.items?.[0] || e?.ecommerce?.cart?.items?.[0] || e?.ecommerce?.checkout?.items?.[0] || null; if (!p) continue; const priceRaw = p?.price ?? p?.item_price ?? null; if (priceRaw === null || priceRaw === undefined) continue; if (typeof priceRaw === "number") { if (Number.isFinite(priceRaw)) return priceRaw; continue; } const clean = String(priceRaw).replace(/[^\d.]/g, ""); const n = clean ? Number(clean) : null; if (Number.isFinite(n)) return n; } } catch (e) {} return null; } // SKU desde DOM (equipos antiguos) function getProductSkuFromDom() { try { if (window.SalesforceInteractions && SalesforceInteractions.cashDom) { var skuAttr = SalesforceInteractions.cashDom(".productoGaleriaShow").attr("data-sku"); if (skuAttr && String(skuAttr).trim() !== "") return String(skuAttr).trim(); } } catch (e) {} var el = document.querySelector(".productoGaleriaShow"); return el && el.getAttribute("data-sku") ? el.getAttribute("data-sku").trim() : null; } // ID y SKU consistentes function getBestProductId() { return getProductIdFromDataLayer() || getProductSkuFromDom() || getPdpIdFallback() || ""; } function getBestProductSku() { return getProductSkuFromDom() || getProductIdFromDataLayer() || getPdpIdFallback() || ""; } /* ========================================================= 4) BRAND (dataLayer + fallback) ========================================================= */ function normalizeBrand(b) { const s = String(b || "").trim(); if (!s) return null; return s.toLowerCase(); } function getProductBrandFromDataLayer() { try { const dl = window.dataLayer || []; for (let i = dl.length - 1; i >= 0; i--) { const e = dl[i] || {}; const p = e?.ecommerce?.detail?.products?.[0] || e?.ecommerce?.items?.[0] || e?.ecommerce?.cart?.items?.[0] || e?.ecommerce?.checkout?.items?.[0] || null; if (p) { const brand = p.item_brand || p.brand || p.manufacturer || null; if (brand) return normalizeBrand(brand); } } } catch (e) {} return null; } function getBestProductBrand() { return getProductBrandFromDataLayer() || null; } /* ========================================================= 5) IMÁGENES (corrección anti-logo + mejor selección) ========================================================= */ // Normaliza URL function normalizeUrl(u) { if (!u) return null; let url = String(u).trim(); if (!url) return null; if (url.startsWith("//")) url = window.location.protocol + url; if (!url.startsWith("http")) { url = window.location.origin + (url.startsWith("/") ? "" : "/") + url; } return url; } // Bloquea placeholders, logos, seller-logos, whatsapp, etc. function isBadImageUrl(url) { if (!url) return true; const u = String(url); // no-image if (/\/imagenes\/v9\/assets\/no-image\.jpg(?=($|\?|#))/i.test(u)) return true; if (/\/v9\/assets\/no-image\.jpg(?=($|\?|#))/i.test(u)) return true; if (/no-image\.jpg(?=($|\?|#))/i.test(u)) return true; // Insider defaults if (/image\.useinsider\.com\/default\/action-builder\//i.test(u)) return true; if (/web-image\.useinsider\.com\/.*defaultImageLibrary\//i.test(u)) return true; if (/useinsider\.com\/.*defaultImageLibrary\//i.test(u)) return true; // seller logos (marketplace) if (/\/imagenes\/claroshop\/sellers\/logos\//i.test(u)) return true; if (/\/claroshop\/sellers\/logos\//i.test(u)) return true; if (/\/sellers\/logos\//i.test(u)) return true; // Logos / whatsapp / decorativos return ( /WhatsApp_M\.webp/i.test(u) || /imagenes\/marketing\/Sales_Force/i.test(u) || /logo-claro\.png/i.test(u) || /\/static\/images\/img\/logos\//i.test(u) || /\/imagenes\/v9\/assets\/linea_nueva\//i.test(u) || /\/v9\/assets\/linea_nueva\//i.test(u) || /whatsapp/i.test(u) ); } // Fuerza .jpg (si aplica) function forceJpgUrl(url) { const s = String(url || "").trim(); if (!s) return null; return s.replace(/\.(webp|png|jpeg|jpg)(?=($|\?|#))/i, ".jpg"); } /** * - NO permite DEFAULT_PRODUCT_IMAGE_URL como “imagen real” * - Si no es una imagen válida => null */ function normalizeProductImageUrl(raw) { const url = normalizeUrl(raw); if (!url) return null; if (isBadImageUrl(url)) return null; const forced = forceJpgUrl(url); if (!forced) return null; const pathOnly = forced.split("?")[0].split("#")[0]; if (!/\.jpg$/i.test(pathOnly)) return null; return forced; } // Extrae background-image function getBackgroundImageUrlFromElement(el) { try { if (!el) return null; const bg = window.getComputedStyle(el).backgroundImage || ""; const match = bg.match(/url\((['"]?)(.*?)\1\)/i); return match && match[2] ? match[2] : null; } catch (e) { return null; } } // Imagen desde dataLayer function getProductImageFromDataLayer() { try { const dl = window.dataLayer || []; for (let i = dl.length - 1; i >= 0; i--) { const e = dl[i] || {}; const p = e?.ecommerce?.detail?.products?.[0] || e?.ecommerce?.items?.[0] || e?.ecommerce?.cart?.items?.[0] || e?.ecommerce?.checkout?.items?.[0] || null; if (!p) continue; const img = p.image || p.image_url || p.item_image || p.imageUrl || null; const normalized = normalizeProductImageUrl(img); if (normalized) return normalized; } } catch (e) { return null; } return null; } /** * Mejor imagen PDP: * - Preferir dataLayer * - Si no, escoger por tamaño (y preferir /646x1000/) * - Nunca aceptar logo / seller logos */ function getBestPdpImageUrl() { try { const dlImg = getProductImageFromDataLayer(); if (dlImg) return dlImg; const scope = document.querySelector(".container.containerdetalleProducto") || document.querySelector(".productoGaleriaShow"); if (!scope) return null; const candidates = []; const seen = new Set(); function scoreUrl(u) { let score = 0; if (/\/646x1000\//i.test(u)) score += 1000000000; if (/\/catalogo\//i.test(u)) score += 1000000; if (/\/70x110\//i.test(u)) score -= 500000; return score; } function pushCandidate(url, el) { if (!url) return; if (seen.has(url)) return; seen.add(url); if (String(url) === DEFAULT_PRODUCT_IMAGE_URL) return; let w = 0, h = 0; try { w = el?.naturalWidth || el?.clientWidth || el?.width || 0; h = el?.naturalHeight || el?.clientHeight || el?.height || 0; } catch (e) {} const area = Number(w) * Number(h); const s = (Number.isFinite(area) ? area : 0) + scoreUrl(url); candidates.push({ url, score: s }); } scope.querySelectorAll("picture source[srcset]").forEach((s) => { const srcset = s.getAttribute("srcset") || ""; const first = srcset.split(",")[0]?.trim()?.split(" ")[0]; const forced = normalizeProductImageUrl(first); if (forced) pushCandidate(forced, s); }); scope.querySelectorAll("img, .slick-slide img, .slick-track img, .productoGaleriaShow img").forEach((img) => { if (!img) return; if (img.closest(".whatsapp") || img.closest("[class*='whatsapp']")) return; const raw = img.getAttribute("data-src") || img.getAttribute("data-lazy") || img.getAttribute("src") || img.currentSrc || ""; const forced = normalizeProductImageUrl(raw); if (forced) pushCandidate(forced, img); }); // background-image solo en planes if (isPlanPdp()) { scope.querySelectorAll("*").forEach((el) => { const bgRaw = getBackgroundImageUrlFromElement(el); const forced = normalizeProductImageUrl(bgRaw); if (forced) pushCandidate(forced, el); }); } if (!candidates.length) return null; candidates.sort((a, b) => (b.score || 0) - (a.score || 0)); return candidates[0]?.url || null; } catch (e) { return null; } } /** * Imagen final para tracking: * - Si hay imagen real => usarla * - Si NO hay imagen real y ES plan => logo (fallback) * - Si NO hay imagen real y NO es plan => null */ function getPdpImageForTracking() { const realImg = normalizeProductImageUrl(getBestPdpImageUrl()); if (realImg) return realImg; if (isPlanPdp()) return DEFAULT_PRODUCT_IMAGE_URL; return null; } /* ========================================================= 6) HELPERS PDP FLEXIBLES (incluye prepago sim/paquete) ========================================================= */ // Nombre flexible function getPdpNameFlexible() { try { const el = document.querySelector(".productTitle"); const t = el?.textContent?.trim(); if (t) return t; } catch (e) {} try { const el = document.querySelector(".productoName--desktop-red-sim-paq h1") || document.querySelector(".productoName--mobile-red-sim-paq h1"); const t = el?.textContent?.trim(); if (t) return t; } catch (e) {} try { const el = document.querySelector(".container.containerdetalleProducto h1") || document.querySelector("h1"); const t = el?.textContent?.trim(); if (t) return t; } catch (e) {} return getProductNameFromDataLayer() || ""; } // Precio flexible function getPdpPriceFlexible() { try { const pEl = document.querySelector(".priceNowFP") || document.querySelector(".deleteCSS-priceNowFP") || document.querySelector(".deleteCSS-priceNowFPRedSinPaq") || document.querySelector(".card__main-sim-paquete-price-red"); const txt = pEl ? pEl.textContent.trim() : ""; const clean = txt.replace(/[^\d]/g, ""); if (clean) return parseFloat(clean); } catch (e) {} const dlPrice = getProductPriceFromDataLayer(); if (dlPrice !== null) return dlPrice; try { const scope = document.querySelector(".container.containerdetalleProducto") || document.body; const text = (scope.innerText || "").replace(/\s+/g, " "); const m = text.match(/\$\s*([\d\.\,]+)/); if (m && m[1]) { const num = m[1].replace(/[^\d]/g, ""); if (num) return parseFloat(num); } } catch (e) {} return null; } // Detecta variante prepago sim/paquete function isPrepagoSimPaqPdp() { try { if (!isPdpRoute()) return false; return !!document.querySelector( ".breadcrumDiv-red-sim-paq, .productoGaleriaNewReSimPaq, .deleteCSS-btn-rojo-newReSimPa" ); } catch (e) { return false; } } // Cantidad seleccionada (si existe) function getPdpSelectedQuantity() { try { const inputs = document.querySelectorAll(".selectQuantitySelector input[type='text'], .quantity input[type='text']"); for (const input of inputs) { const n = Number(String(input?.value || "").replace(/[^\d]/g, "")); if (Number.isFinite(n) && n > 0) return n; } } catch (e) {} return 1; } // Breadcrumb -> categorías function splitBreadcrumbPathToCategories(text) { try { return String(text || "") .split("/") .map((s) => s.trim()) .filter(Boolean) .map((s) => s.toUpperCase()); } catch (e) { return []; } } // Categorías flexibles function getPdpCategoriesFlexible() { try { const specialCrumbLink = document.querySelector(".breadcrumDiv-red-sim-paq .shopNavigation-red-sim-paq a:nth-of-type(2)") || document.querySelector(".breadcrumDiv-red-sim-paq a:nth-of-type(2)"); if (specialCrumbLink) { const raw = (specialCrumbLink.textContent || "").trim(); const parsed = splitBreadcrumbPathToCategories(raw); if (parsed.length) return parsed; } const links = document.querySelectorAll(".breadcrumDiv a"); if (links && links.length > 1) { const raw = (links[1]?.textContent || "").trim(); const parsed = splitBreadcrumbPathToCategories(raw); if (parsed.length) return parsed; if (raw) return [raw.toUpperCase()]; } if (isPrepagoSimPaqPdp()) return ["SERVICIOS MÓVILES", "PREPAGO"]; } catch (e) {} return []; } // Descripción flexible function getPdpDescriptionFlexible() { try { const p1 = document.querySelector(".paragraph-product-6"); const t1 = p1?.textContent?.trim(); if (t1) return t1; const p2 = document.querySelector(".content-cardsInfo-Re-Sim-Pa-1 p"); const t2 = p2?.textContent?.trim(); if (t2) return t2; const p3 = document.querySelector(".product-info__wrapper p"); const t3 = p3?.textContent?.trim(); if (t3) return t3; } catch (e) {} return ""; } // Brand flexible (fallback claro en sim/paquete) function getPdpBrandFlexible() { const dlBrand = getBestProductBrand(); if (dlBrand) return dlBrand; if (isPrepagoSimPaqPdp()) return "claro"; return null; } /* ========================================================= 7) HELPERS PRE/POST (/datos-personales-prepost) ========================================================= */ function isDatosPersonalesPrepostRoute() { const path = (window.location.pathname || "").replace(/\/+$/, ""); return /\/datos-personales-prepost$/i.test(path); } function parseCopAmount(raw) { if (raw === null || raw === undefined) return null; const clean = String(raw).replace(/[^\d]/g, ""); if (!clean) return null; const n = Number(clean); return Number.isFinite(n) ? n : null; } function slugifyStableId(raw) { return String(raw || "") .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") .toLowerCase() .replace(/[^a-z0-9]+/g, "-") .replace(/^-+|-+$/g, ""); } // Lee plan del resumen pre/post function getPrepostSummaryPlanFromDom() { try { if (!isDatosPersonalesPrepostRoute()) return null; const root = document.querySelector(".box-resumen-compra-preapost"); if (!root) return null; let productRow = root.querySelector(".purchaseSummary_header + .purchaseSummary_product") || null; if (!productRow) { const rows = Array.from(root.querySelectorAll(".purchaseSummary_product")); productRow = rows.find((row) => { const labels = row.querySelectorAll("label"); if (labels.length < 2) return false; const txt = (labels[0]?.textContent || "").trim(); return !!txt; }) || null; } if (!productRow) return null; const labels = productRow.querySelectorAll("label"); const descriptionRaw = (labels[0]?.textContent || "").trim(); const linePriceRaw = (labels[1]?.textContent || "").trim(); if (!descriptionRaw) return null; const totalRaw = root.querySelector(".purchaseSummary_product-total dd")?.textContent || root.querySelector(".box-rc-header-preapost .txt-res-acord")?.textContent || ""; const taxesRaw = root.querySelector(".tbody-detalle-compra dl.purchaseSummary_product dd")?.textContent || ""; const linePrice = parseCopAmount(linePriceRaw); const totalPrice = parseCopAmount(totalRaw); const taxes = parseCopAmount(taxesRaw); let planType = null; const typeMatch = descriptionRaw.match(/\bPlan\s+(Postpago|Prepago)\b/i); if (typeMatch && typeMatch[1]) { planType = String(typeMatch[1]).toLowerCase(); } const cleanName = descriptionRaw.replace(/^Plan\s+(Postpago|Prepago)\s*-\s*/i, "").trim(); const stableBase = slugifyStableId(descriptionRaw) || "plan-prepost"; const catalogId = "prepost-" + stableBase; const categories = ["SERVICIOS MÓVILES"]; if (planType) categories.push(planType.toUpperCase()); return { id: catalogId, sku: catalogId, name: descriptionRaw, cleanName: cleanName || descriptionRaw, price: totalPrice !== null ? totalPrice : linePrice, taxes: taxes, url: window.location.href, imageUrl: DEFAULT_PRODUCT_IMAGE_URL, description: "Plan capturado desde resumen Pre/Post", categories: categories, brand: "claro", planType: planType || null, }; } catch (e) { return null; } } /* ========================================================= 8) INIT + IDENTIDAD + CACHES ========================================================= */ SalesforceInteractions.init({ cookieDomain: "tienda.claro.com.co", consents: [ { purpose: SalesforceInteractions.mcis.ConsentPurpose.Personalization, provider: "Claro Consent Manager", status: SalesforceInteractions.ConsentStatus.OptIn, }, ], }).then(() => { // Identidad guardada let loggedInEmail = localStorage.getItem("loggedInEmail") || ""; let loggedInName = localStorage.getItem("loggedInName") || ""; let loggedInTelefono = localStorage.getItem("loggedInTelefono") || ""; let loggedInDepartment = localStorage.getItem("loggedInDepartment") || ""; let loggedInCity = localStorage.getItem("loggedInCity") || ""; let loggedInPaymentMethod = localStorage.getItem("loggedInPaymentMethod") || ""; let lastPurchaseStatus = localStorage.getItem("lastPurchaseStatus") || ""; // Cache PDP let __pdpCatalogCache = { id: null, sku: null, name: null, price: null, url: null, imageUrl: null, description: null, categories: null, brand: null, }; function ensureEvgModalRoot() { if (document.getElementById("evg-modal-root")) return; if (!document.body) { requestAnimationFrame(ensureEvgModalRoot); return; } const root = document.createElement("div"); root.id = "evg-modal-root"; document.body.appendChild(root); } ensureEvgModalRoot(); function getStablePdpCatalog() { const idNow = getBestProductId() || null; let nameNow = ""; try { nameNow = getPdpNameFlexible() || ""; } catch (e) {} let priceNow = null; try { priceNow = getPdpPriceFlexible(); } catch (e) {} const imageUrlNow = getPdpImageForTracking(); let descNow = ""; try { descNow = getPdpDescriptionFlexible() || ""; } catch (e) {} let categoriesNow = []; try { categoriesNow = getPdpCategoriesFlexible(); } catch (e) { categoriesNow = []; } const brandNow = getPdpBrandFlexible(); const imageOkForCache = isPlanPdp() ? imageUrlNow === DEFAULT_PRODUCT_IMAGE_URL || !!normalizeProductImageUrl(imageUrlNow) : true; const looksValid = !!idNow && !!nameNow && priceNow !== null && imageOkForCache; if (looksValid) { __pdpCatalogCache = { id: idNow, sku: getBestProductSku() || "", name: nameNow, price: priceNow, url: window.location.href, imageUrl: imageUrlNow, description: descNow, categories: categoriesNow, brand: brandNow, }; } const currentOrCachedImage = normalizeProductImageUrl(imageUrlNow || __pdpCatalogCache.imageUrl || null) || (isPlanPdp() ? DEFAULT_PRODUCT_IMAGE_URL : null); return { id: (idNow || __pdpCatalogCache.id || "").trim(), sku: (getBestProductSku() || __pdpCatalogCache.sku || "").trim(), name: (nameNow || __pdpCatalogCache.name || "").trim(), price: priceNow !== null ? priceNow : __pdpCatalogCache.price, url: window.location.href || __pdpCatalogCache.url || "", imageUrl: currentOrCachedImage || null, description: descNow || __pdpCatalogCache.description || "", categories: (Array.isArray(categoriesNow) && categoriesNow.length ? categoriesNow : __pdpCatalogCache.categories) || [], brand: brandNow || __pdpCatalogCache.brand || null, }; } /* ========================================================= 9) ABANDONO CARRITO ========================================================= */ const CART_ABANDON_KEY = "cartLastData"; const CART_ABANDON_TIME = "cartLastTime"; const CART_ABANDON_STATE = "cartAbandonState"; const ABANDON_DELAY_VALUE = 5; const ABANDON_DELAY_UNIT = "minutes"; let abandonTimeoutId = null; function getDelayMs(value, unit) { return unit === "hours" ? value * 60 * 60 * 1000 : value * 60 * 1000; } function getElapsed(timeRaw, unit) { const diffMs = Date.now() - parseInt(timeRaw, 10); return unit === "hours" ? diffMs / (1000 * 60 * 60) : diffMs / (1000 * 60); } function saveCartData(data) { try { localStorage.setItem(CART_ABANDON_KEY, JSON.stringify(data)); localStorage.setItem(CART_ABANDON_TIME, String(Date.now())); localStorage.removeItem(CART_ABANDON_STATE); if (abandonTimeoutId) clearTimeout(abandonTimeoutId); abandonTimeoutId = setTimeout(checkCartAbandonment, getDelayMs(ABANDON_DELAY_VALUE, ABANDON_DELAY_UNIT)); } catch (e) { console.error("Error guardando carrito:", e); } } function clearCartData() { localStorage.removeItem(CART_ABANDON_KEY); localStorage.removeItem(CART_ABANDON_TIME); localStorage.removeItem(CART_ABANDON_STATE); if (abandonTimeoutId) clearTimeout(abandonTimeoutId); abandonTimeoutId = null; } function checkCartAbandonment() { try { const dataRaw = localStorage.getItem(CART_ABANDON_KEY); const timeRaw = localStorage.getItem(CART_ABANDON_TIME); if (!dataRaw || !timeRaw) return; const elapsed = getElapsed(timeRaw, ABANDON_DELAY_UNIT); if (elapsed < ABANDON_DELAY_VALUE) return; const data = JSON.parse(dataRaw); if (data) { const normalized = normalizeProductImageUrl(data.lastAddedProductImage); data.lastAddedProductImage = normalized || (data.lastAddedProductImage === DEFAULT_PRODUCT_IMAGE_URL ? DEFAULT_PRODUCT_IMAGE_URL : null); } const stateRaw = localStorage.getItem(CART_ABANDON_STATE); let state = stateRaw ? JSON.parse(stateRaw) : {}; if (abandonTimeoutId) clearTimeout(abandonTimeoutId); abandonTimeoutId = null; if (!state.sentFirstTrigger) { const eventIdUnique = "CA-" + generateGuid(); localStorage.setItem("lastSFRecordId", eventIdUnique); const currentEmail = localStorage.getItem("loggedInEmail") || ""; const currentName = localStorage.getItem("loggedInName") || ""; const currentTelefono = localStorage.getItem("loggedInTelefono") || ""; const currentDept = localStorage.getItem("loggedInDepartment") || ""; const currentCity = localStorage.getItem("loggedInCity") || ""; const cupoCredito = localStorage.getItem("cupoCredito"); const eventAttributes = { ...data, emailAddress: currentEmail || "", SFRecordId: eventIdUnique, PersonContactId: eventIdUnique, }; if (!eventAttributes.lastAddedProductImage) delete eventAttributes.lastAddedProductImage; const userAttrs = { emailAddress: currentEmail || null, fullName: currentName || null, telefono: currentTelefono || null, department: currentDept || null, city: currentCity || null, lastAddedProductName: data.lastAddedProductName || null, lastAddedProductPrice: data.lastAddedProductPrice || null, cupoCredito: cupoCredito || null, SFRecordId: eventIdUnique, PersonContactId: eventIdUnique, }; if (data.lastAddedProductImage) userAttrs.lastAddedProductImage = data.lastAddedProductImage; if (data.lastAddedProductQuantity !== undefined && data.lastAddedProductQuantity !== null) { userAttrs.lastAddedProductQuantity = data.lastAddedProductQuantity; } SalesforceInteractions.sendEvent({ interaction: { name: "Cart Abandoned" }, attributes: eventAttributes, user: currentEmail ? { id: currentEmail, identities: { emailAddress: currentEmail }, attributes: userAttrs, } : undefined, }); state.sentFirstTrigger = true; localStorage.setItem(CART_ABANDON_STATE, JSON.stringify(state)); clearCartData(); } else { clearCartData(); } } catch (e) { console.error("Error abandono:", e); } } (function restoreAbandonTimer() { const timeRaw = localStorage.getItem(CART_ABANDON_TIME); if (!timeRaw) return; const MAX_ABANDON_WINDOW_MS = 72 * 60 * 60 * 1000; const currentTime = Date.now(); const startTime = parseInt(timeRaw, 10); if (currentTime - startTime > MAX_ABANDON_WINDOW_MS) { clearCartData(); return; } const stateRaw = localStorage.getItem(CART_ABANDON_STATE); const state = stateRaw ? JSON.parse(stateRaw) : {}; if (state.sentFirstTrigger) { clearCartData(); return; } const elapsed = getElapsed(timeRaw, ABANDON_DELAY_UNIT); if (elapsed >= ABANDON_DELAY_VALUE) { setTimeout(checkCartAbandonment, 50); } else { const remaining = getDelayMs(ABANDON_DELAY_VALUE, ABANDON_DELAY_UNIT) - (currentTime - startTime); if (abandonTimeoutId) clearTimeout(abandonTimeoutId); abandonTimeoutId = setTimeout(checkCartAbandonment, remaining); } })(); /* ========================================================= 10) ADD TO CART ========================================================= */ function sendStandardAddToCart({ sku, name, price, imageUrl, categories, brand, quantity }) { try { if (!sku) return; const safeImg = normalizeProductImageUrl(imageUrl) || (isPlanPdp() ? DEFAULT_PRODUCT_IMAGE_URL : null); const lineItemAttrs = { name: name || "", categories: Array.isArray(categories) ? categories : [], }; if (safeImg) lineItemAttrs.imageUrl = safeImg; const b = normalizeBrand(brand); if (b) lineItemAttrs.brand = b; const userAttrs = { lastAddedProductName: name || null, lastAddedProductPrice: typeof price === "number" ? price : null, }; if (safeImg) userAttrs.lastAddedProductImage = safeImg; SalesforceInteractions.sendEvent({ interaction: { name: SalesforceInteractions.CartInteractionName.AddToCart, lineItem: { catalogObjectType: "Product", catalogObjectId: String(sku).trim(), quantity: Number.isFinite(Number(quantity)) && Number(quantity) > 0 ? Number(quantity) : 1, price: typeof price === "number" ? price : null, currency: "COP", attributes: lineItemAttrs, }, }, user: { attributes: userAttrs }, }); } catch (e) { console.error("Error AddToCart:", e); } } /* ========================================================= 11) REPLACECART (/cart) ========================================================= */ let cartReplaceState = { url: null, sent: false }; function getCartLineItemsFromDataLayer() { try { const dl = window.dataLayer || []; for (let i = dl.length - 1; i >= 0; i--) { const e = dl[i]; const items = e?.ecommerce?.items || e?.ecommerce?.cart?.items || e?.ecommerce?.checkout?.items || null; if (Array.isArray(items) && items.length) { return items .map((it) => { const id = (it.item_id || it.id || it.sku || "").toString().trim(); const qty = Number(it.quantity || 1); const priceRaw = it.price ?? it.item_price ?? null; const priceNum = typeof priceRaw === "number" ? priceRaw : priceRaw ? Number(String(priceRaw).replace(/[^\d.]/g, "")) : null; if (!id || !qty) return null; const brand = normalizeBrand(it.item_brand || it.brand || it.manufacturer || null); return { catalogObjectType: "Product", catalogObjectId: id, quantity: qty, price: Number.isFinite(priceNum) ? priceNum : null, currency: it.currency || "COP", attributes: { name: it.item_name || it.name || "", categories: it.item_category ? [String(it.item_category).toUpperCase()] : [], ...(brand ? { brand } : {}), }, }; }) .filter(Boolean); } } } catch (e) {} return []; } function scheduleReplaceCartSync() { try { const url = window.location.href; if (cartReplaceState.url === url && cartReplaceState.sent) return; cartReplaceState = { url, sent: false }; SalesforceInteractions.DisplayUtils.pageElementLoaded(".wrapper.cart-wrapper.cart-minHeigh") .then(() => { setTimeout(() => { if (cartReplaceState.sent) return; const lineItems = getCartLineItemsFromDataLayer(); if (!Array.isArray(lineItems) || lineItems.length === 0) return; cartReplaceState.sent = true; SalesforceInteractions.sendEvent({ interaction: { name: SalesforceInteractions.CartInteractionName.ReplaceCart, lineItems, }, }); }, 800); }) .catch(() => {}); } catch (e) { console.error("Error ReplaceCart:", e); } } /* ========================================================= 12) PDP VIEW ========================================================= */ const PDP_VIEW_DELAY_MS = 7000; const PDP_VIEW_RETRY_MS = 800; const PDP_VIEW_MAX_RETRIES = 6; let pdpViewTimeoutId = null; let pdpViewState = { url: null, sent: false, tries: 0 }; function getPdpContentZonesSnapshot() { const zones = []; try { if (document.querySelector("#home_hero_banner")) zones.push("Home"); } catch (e) {} try { if (document.querySelector("#__next")) zones.push("Home_Botones"); } catch (e) {} try { if (document.querySelector("div.container .shopNavigation")) zones.push("Form_WCB"); } catch (e) {} try { if (document.querySelector(".container.containerdetalleProducto")) zones.push("PDP_Main"); } catch (e) {} try { if (document.querySelector("#detalles")) zones.push("PDP_Detalles"); } catch (e) {} try { if (document.querySelector(".containerprimary")) zones.push("Prepago_a_Postpago_Claro_Main"); } catch (e) {} return zones; } function capturePdpSnapshot() { const stable = getStablePdpCatalog(); const name = stable.name ? toTitleCase(stable.name) : ""; const relatedCatalogObjects = { Category: stable.categories || [] }; const b = normalizeBrand(stable.brand); if (b) relatedCatalogObjects.Brand = [b]; return { id: stable.id || "", sku: stable.sku || "", name, url: stable.url || window.location.href, imageUrl: stable.imageUrl || (isPlanPdp() ? DEFAULT_PRODUCT_IMAGE_URL : null), price: typeof stable.price === "number" ? stable.price : null, description: stable.description || "", categories: stable.categories || [], brand: b || null, relatedCatalogObjects, }; } function isPdpSnapshotReady(s) { const hasId = !!(s.id && String(s.id).trim().length > 0); const hasName = !!(s.name && s.name.trim().length > 0); const hasPrice = s.price !== null && s.price !== undefined; const imgNormalized = normalizeProductImageUrl(s.imageUrl); const imageOk = isPlanPdp() ? s.imageUrl === DEFAULT_PRODUCT_IMAGE_URL || !!imgNormalized : true; return hasId && hasName && hasPrice && imageOk; } function sendPdpViewEventNow() { const snap = capturePdpSnapshot(); if (!isPdpSnapshotReady(snap)) return; const userBlock = loggedInEmail && String(loggedInEmail).trim() ? { id: loggedInEmail, identities: { customerId: loggedInEmail, emailAddress: loggedInEmail, sfmcContactKey: loggedInEmail, }, attributes: { emailAddress: loggedInEmail, fullName: loggedInName || undefined, telefono: loggedInTelefono || undefined, department: loggedInDepartment || undefined, city: loggedInCity || undefined, }, } : undefined; const safeImg = normalizeProductImageUrl(snap.imageUrl) || (isPlanPdp() ? DEFAULT_PRODUCT_IMAGE_URL : null); const productAttrs = { name: snap.name || "", sku: snap.sku || "", url: snap.url, price: snap.price !== undefined ? snap.price : null, description: snap.description || "", categories: snap.categories || [], }; if (safeImg) productAttrs.imageUrl = safeImg; if (snap.brand) productAttrs.brand = snap.brand; const relatedCatalogObjects = snap.relatedCatalogObjects || {}; if (snap.brand) relatedCatalogObjects.Brand = [snap.brand]; SalesforceInteractions.sendEvent({ source: { pageType: "product_detail", url: window.location.href, contentZones: getPdpContentZonesSnapshot(), }, interaction: { name: SalesforceInteractions.CatalogObjectInteractionName.ViewCatalogObject, catalogObject: { type: "Product", id: snap.id, attributes: productAttrs, relatedCatalogObjects, }, }, user: userBlock, }); } function attemptSendDelayedPdpView(urlAtSchedule) { if (window.location.href !== urlAtSchedule) return; if (!/\/detalle-producto/i.test(window.location.pathname || "")) return; if (pdpViewState.sent) return; const snap = capturePdpSnapshot(); const ready = isPdpSnapshotReady(snap); if (!ready && pdpViewState.tries < PDP_VIEW_MAX_RETRIES) { pdpViewState.tries += 1; pdpViewTimeoutId = setTimeout(() => attemptSendDelayedPdpView(urlAtSchedule), PDP_VIEW_RETRY_MS); return; } if (!ready) return; pdpViewState.sent = true; pdpViewTimeoutId = null; sendPdpViewEventNow(); } function scheduleDelayedPdpViewEvent() { try { const currentUrl = window.location.href; if (pdpViewState.url === currentUrl && (pdpViewState.sent || pdpViewTimeoutId)) return; if (pdpViewTimeoutId) clearTimeout(pdpViewTimeoutId); pdpViewState = { url: currentUrl, sent: false, tries: 0 }; pdpViewTimeoutId = setTimeout(() => attemptSendDelayedPdpView(currentUrl), PDP_VIEW_DELAY_MS); } catch (e) {} } /* ========================================================= 13) PRE/POST ========================================================= */ let __prepostPlanCache = { id: null, sku: null, name: null, price: null, url: null, imageUrl: DEFAULT_PRODUCT_IMAGE_URL, description: null, categories: null, brand: "claro", taxes: null, planType: null, }; let prepostPlanViewState = { fingerprint: null, sent: false }; function getStablePrepostPlanCatalog() { const current = getPrepostSummaryPlanFromDom(); const ok = !!current && !!current.id && !!current.name && current.price !== null && current.price !== undefined; if (ok) { __prepostPlanCache = { id: current.id, sku: current.sku || current.id, name: current.name, price: current.price, url: current.url || window.location.href, imageUrl: current.imageUrl || DEFAULT_PRODUCT_IMAGE_URL, description: current.description || "Plan capturado desde resumen Pre/Post", categories: Array.isArray(current.categories) ? current.categories : [], brand: current.brand || "claro", taxes: current.taxes ?? null, planType: current.planType || null, }; } return { id: (current?.id || __prepostPlanCache.id || "").trim(), sku: (current?.sku || __prepostPlanCache.sku || "").trim(), name: (current?.name || __prepostPlanCache.name || "").trim(), price: current?.price !== null && current?.price !== undefined ? current.price : __prepostPlanCache.price ?? null, url: current?.url || __prepostPlanCache.url || window.location.href, imageUrl: DEFAULT_PRODUCT_IMAGE_URL, description: current?.description || __prepostPlanCache.description || "Plan capturado desde resumen Pre/Post", categories: (Array.isArray(current?.categories) && current.categories.length ? current.categories : __prepostPlanCache.categories) || [], brand: current?.brand || __prepostPlanCache.brand || "claro", taxes: current?.taxes ?? __prepostPlanCache.taxes ?? null, planType: current?.planType || __prepostPlanCache.planType || null, }; } function sendPrepostPlanViewEventOnce() { try { if (!isDatosPersonalesPrepostRoute()) return; const plan = getStablePrepostPlanCatalog(); if (!plan.id || !plan.name || plan.price === null || plan.price === undefined) return; const fingerprint = [window.location.pathname, plan.id, String(plan.price)].join("|"); if (prepostPlanViewState.sent && prepostPlanViewState.fingerprint === fingerprint) return; prepostPlanViewState = { fingerprint, sent: true }; const userBlock = loggedInEmail && String(loggedInEmail).trim() ? { id: loggedInEmail, identities: { customerId: loggedInEmail, emailAddress: loggedInEmail, sfmcContactKey: loggedInEmail, }, attributes: { emailAddress: loggedInEmail, fullName: loggedInName || undefined, telefono: loggedInTelefono || undefined, department: loggedInDepartment || undefined, city: loggedInCity || undefined, }, } : undefined; const relatedCatalogObjects = { Category: Array.isArray(plan.categories) ? plan.categories : [], Brand: [String(plan.brand || "claro").toLowerCase()], }; SalesforceInteractions.sendEvent({ source: { pageType: "datos_personales_prepost", url: window.location.href, contentZones: ["Datos_Prepost", "Datos_Prepost_Resumen"], }, interaction: { name: SalesforceInteractions.CatalogObjectInteractionName.ViewCatalogObject, catalogObject: { type: "Product", id: plan.id, attributes: { name: toTitleCase(plan.name), sku: plan.sku || plan.id, url: plan.url || window.location.href, price: plan.price, imageUrl: plan.imageUrl || DEFAULT_PRODUCT_IMAGE_URL, description: plan.description || "", categories: Array.isArray(plan.categories) ? plan.categories : [], brand: String(plan.brand || "claro").toLowerCase(), ...(plan.planType ? { planType: plan.planType } : {}), ...(plan.taxes !== null && plan.taxes !== undefined ? { taxes: plan.taxes } : {}), }, relatedCatalogObjects, }, }, user: userBlock, }); } catch (e) { console.error("Error prepost view:", e); } } function schedulePrepostPlanViewEvent() { try { if (!isDatosPersonalesPrepostRoute()) return; SalesforceInteractions.DisplayUtils.pageElementLoaded(".box-resumen-compra-preapost") .then(() => { setTimeout(() => { sendPrepostPlanViewEventOnce(); }, 400); }) .catch(() => {}); } catch (e) { console.error("Error schedule prepost:", e); } } /* ========================================================= 14) SITEMAP CONFIG ========================================================= */ const sitemapConfig = { global: { contentZones: [ { name: "Home", selector: "#home_hero_banner" }, { name: "Home_Botones", selector: "#__next" }, { name: "Home_Banner_Slider", selector: ".newSHome-slider-container .slick-slider" }, { name: "Home_Banner_Slider_Track", selector: ".newSHome-slider-container .slick-track" }, { name: "Home_Banner_Slider_Indicators", selector: ".newSHome-slider-container .bar-indicators--sliderH" }, { name: "Landing_Modal_Root", selector: "#evg-modal-root" }, { name: "PDP_Main", selector: ".container.containerdetalleProducto" }, { name: "PDP_Detalles", selector: "#detalles" }, ], listeners: [ SalesforceInteractions.listener( "click", "button.loginRed__button-submit, button.loginRed__button-submit *", () => { const email = String( (SalesforceInteractions.cashDom && SalesforceInteractions.cashDom("#loginUser").val()) || document.querySelector("#loginUser")?.value || document.querySelector("input[type='email']")?.value || "" ) .trim() .toLowerCase(); if (!email) return; localStorage.setItem("loggedInEmail", email); loggedInEmail = email; setTimeout(() => { SalesforceInteractions.sendEvent({ interaction: { name: "Login" }, user: { id: email, identities: { emailAddress: email, customerId: email, sfmcContactKey: email }, attributes: { emailAddress: email }, }, }); }, 50); } ), ], onActionEvent: (event) => { const currentEmail = localStorage.getItem("loggedInEmail"); const currentName = localStorage.getItem("loggedInName"); const currentTelefono = localStorage.getItem("loggedInTelefono"); const currentDept = localStorage.getItem("loggedInDepartment"); const currentCity = localStorage.getItem("loggedInCity"); const currentPayment = localStorage.getItem("loggedInPaymentMethod"); const currentPurchaseStatus = localStorage.getItem("lastPurchaseStatus"); const lastSFRecordId = localStorage.getItem("lastSFRecordId") || "CA-" + generateGuid(); if (currentEmail) { event.user = event.user || {}; event.user.id = currentEmail; event.user.identities = { customerId: currentEmail, emailAddress: currentEmail, sfmcContactKey: currentEmail, }; event.user.attributes = { ...(event.user.attributes || {}), emailAddress: currentEmail, fullName: currentName || undefined, telefono: currentTelefono || undefined, department: currentDept || undefined, city: currentCity || undefined, lastPaymentMethod: currentPayment || undefined, lastPurchaseStatus: currentPurchaseStatus || undefined, SFRecordId: lastSFRecordId, PersonContactId: lastSFRecordId, }; } return event; }, }, pageTypes: [ { name: "Cart", isMatch: () => { const match = /\/cart/.test(window.location.pathname || ""); if (match) scheduleReplaceCartSync(); return match; }, interaction: { name: "ViewPopupCart" }, contentZones: [{ name: "Cart_Popup", selector: ".wrapper.cart-wrapper.cart-minHeigh" }], }, { name: "Portacion_Status", isMatch: () => { const p = window.location.pathname || ""; return /\/(prepago|postpago|claro)\/consulta-el-estado-de-tu-porta/i.test(p); }, interaction: { name: "View Portacion Status" }, }, { name: "Portabilidad_Prepago_Cambiate", isMatch: function () { const p = (window.location.pathname || "").replace(/\/+$/, ""); if (!/^\/prepago\/cambiate-con-tu-mismo-numero(\/.*)?$/i.test(p)) return false; return SalesforceInteractions.DisplayUtils.pageElementLoaded( "div.container__linea-pasos-thankyou-rediseño-Pre" ) .then(() => true) .catch(() => false); }, interaction: { name: "View Portabilidad Prepago" }, contentZones: [{ name: "Prepago_a_Postpago", selector: "div.container__linea-pasos-thankyou-rediseño-Pre" }], }, { name: "Portabilidad_Postpago_Cambiate", isMatch: function () { const p = (window.location.pathname || "").replace(/\/+$/, ""); if (!/^\/postpago\/cambiate-con-tu-mismo-numero(\/.*)?$/i.test(p)) return false; return SalesforceInteractions.DisplayUtils.pageElementLoaded("div.linea-porta-pasos-redisign") .then(() => true) .catch(() => false); }, interaction: { name: "View Portabilidad Postpago" }, contentZones: [{ name: "Postpago_a_Postpago", selector: "div.linea-porta-pasos-redisign" }], }, // NUEVO PAGE TYPE { name: "Prepago_a_Postpago_Claro", isMatch: function () { if (!isPrepagoToPostpagoClaroRoute()) return false; return SalesforceInteractions.DisplayUtils.pageElementLoaded(".containerprimary") .then(() => true) .catch(() => false); }, interaction: { name: "View Prepago a Postpago Claro" }, contentZones: [ { name: "Prepago_a_Postpago_Claro_Main", selector: ".containerprimary", }, ], }, { name: "product_detail", isMatch: function () { const path = window.location.pathname || ""; if (!/\/detalle-producto/i.test(path)) return false; scheduleDelayedPdpViewEvent(); return true; }, catalog: { Product: { _id: () => getStablePdpCatalog().id, sku: () => getStablePdpCatalog().sku, name: () => getStablePdpCatalog().name, price: () => getStablePdpCatalog().price, url: () => getStablePdpCatalog().url, imageUrl: () => getStablePdpCatalog().imageUrl || undefined, description: () => getStablePdpCatalog().description, categories: () => getStablePdpCatalog().categories, brand: () => getStablePdpCatalog().brand || undefined, }, }, interaction: { name: "View PDP" }, listeners: [ SalesforceInteractions.listener( "click", [ ".cta a.btn-rojo", ".cta a.btn-rojo *", "a.deleteCSS-btn-rojo", "a.deleteCSS-btn-rojo *", "a.deleteCSS-btn-rojo.stickyBuy", "a.deleteCSS-btn-rojo.stickyBuy *", "a.deleteCSS-btn-rojo-newReSimPa", "a.deleteCSS-btn-rojo-newReSimPa *", "a.deleteCSS-btn-rojo-newReSimPa.stickyBuy", "a.deleteCSS-btn-rojo-newReSimPa.stickyBuy *", ].join(", "), () => { const stable = getStablePdpCatalog(); const sku = (stable.sku || stable.id || "").trim(); if (!sku) return; const name = stable.name ? toTitleCase(stable.name) : ""; const price = typeof stable.price === "number" ? stable.price : null; const imageUrl = stable.imageUrl || (isPlanPdp() ? DEFAULT_PRODUCT_IMAGE_URL : null); const categories = Array.isArray(stable.categories) ? stable.categories : []; const brand = stable.brand || getBestProductBrand(); const quantity = getPdpSelectedQuantity(); saveCartData({ lastAddedProductName: name, lastAddedProductPrice: price, lastAddedProductImage: imageUrl || null, lastAddedProductQuantity: quantity || 1, }); sendStandardAddToCart({ sku, name, price, imageUrl, categories, brand, quantity }); } ), ], }, { name: "delivery", isMatch: () => /\/delivery/.test(window.location.href), interaction: { name: "ViewDelivery" }, contentZones: [{ name: "Delivery_Popup", selector: ".flex-cont-main-newDelivery" }], listeners: [ SalesforceInteractions.listener("click", "button.btn-rojo", () => { const fullName = SalesforceInteractions.cashDom(".preliminaryUserInfo h1").text().trim(); const email = SalesforceInteractions.cashDom(".preliminaryUserInfo p").text().trim(); let phone = SalesforceInteractions.cashDom("input#phone").val(); if (phone) { phone = phone.replace(/\D/g, ""); if (phone.length === 10) phone = "57" + phone; else if (phone.length > 10 && !phone.startsWith("57")) phone = "57" + phone.slice(-10); else if (phone.length > 12) phone = "57" + phone.slice(-10); } else { phone = null; } let department = SalesforceInteractions.cashDom('select[name="expedicionDepartment"]').find("option:selected").text().trim(); let city = SalesforceInteractions.cashDom('select[name="city"]').find("option:selected").text().trim(); if (!department || /^seleccion/i.test(department)) department = null; if (!city || /^seleccion/i.test(city)) city = null; if (!department || !city) { const rawAddress = SalesforceInteractions.cashDom(".boxDireccion-newDelivery p").text().trim(); const addressText = rawAddress.replace(/\s+/g, " ").trim(); const hyphenIndex = addressText.lastIndexOf("-"); if (hyphenIndex !== -1) { const left = addressText.slice(0, hyphenIndex).trim(); const right = addressText.slice(hyphenIndex + 1).trim(); const leftParts = left .split(",") .map((s) => s.trim()) .filter(Boolean); const maybeDepartment = leftParts.length >= 2 ? leftParts[leftParts.length - 1] : leftParts[0] || null; if (!department) department = maybeDepartment; if (!city) city = right; } else { const unicodeRegex = /([\p{L}\s,]+)\s*-\s*([\p{L}\s,]+)/u; const match = addressText.match(unicodeRegex); if (match) { if (!department) department = match[1].trim().replace(/,$/, ""); if (!city) city = match[2].trim(); } } } const normalizeText = (str) => { if (!str && str !== "") return str; const s = String(str).trim().replace(/\s+/g, " "); return s.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); }; department = department ? normalizeText(department) : department; city = city ? normalizeText(city) : city; if (department && city && /bogota/i.test(department)) { department = department + " " + city; city = department; } localStorage.setItem("loggedInEmail", email || ""); localStorage.setItem("loggedInName", fullName || ""); localStorage.setItem("loggedInTelefono", phone || ""); localStorage.setItem("loggedInDepartment", department || ""); localStorage.setItem("loggedInCity", city || ""); loggedInEmail = email; loggedInName = fullName; loggedInTelefono = phone; loggedInDepartment = department; loggedInCity = city; SalesforceInteractions.sendEvent({ interaction: { name: "Delivery Info Captured" }, user: { id: email, identities: { customerId: email, emailAddress: email, sfmcContactKey: email }, attributes: { emailAddress: email, fullName, telefono: phone, department, city }, }, }); }), ], }, { name: "paymentMethod", isMatch: () => /\/payments/i.test(window.location.href), interaction: { name: "ViewPaymentMethod" }, contentZones: [{ name: "Payments_Popup", selector: ".flex-cont-main-rediseño" }], listeners: [ SalesforceInteractions.listener("click", ".payment-container-rediseño", (event) => { const paymentMethodId = event.currentTarget.id; const paymentMethodText = SalesforceInteractions.cashDom(event.currentTarget).find(".nameMethodRed div").text().trim(); const paymentMethod = paymentMethodId || paymentMethodText; localStorage.setItem("loggedInPaymentMethod", paymentMethod); loggedInPaymentMethod = paymentMethod; SalesforceInteractions.sendEvent({ interaction: { name: "Payment Method Selected" }, user: { id: loggedInEmail, identities: { customerId: loggedInEmail, emailAddress: loggedInEmail, sfmcContactKey: loggedInEmail, }, attributes: { lastPaymentMethod: paymentMethod }, }, }); }), ], }, { name: "purchase", isMatch: () => { const match = /\/thankyou/i.test(window.location.href); if (match && window.SalesforceInteractions && typeof SalesforceInteractions.sendEvent === "function") { const statusParam = new URLSearchParams(window.location.search).get("status") || ""; let interactionName = "ViewPurchase"; let purchaseStatusValue = "Viewed"; if (/Aprobada/i.test(statusParam)) { interactionName = "Purchase Approved"; purchaseStatusValue = "Purchase Approved"; } else if (/Rechazada/i.test(statusParam)) { interactionName = "Purchase Rejected"; purchaseStatusValue = "Purchase Rejected"; } localStorage.setItem("lastPurchaseStatus", purchaseStatusValue); SalesforceInteractions.sendEvent({ interaction: { name: interactionName }, attributes: { status: statusParam || "desconocido", detectedAt: new Date().toISOString() }, user: typeof loggedInEmail !== "undefined" && loggedInEmail ? { id: loggedInEmail, identities: { customerId: loggedInEmail, emailAddress: loggedInEmail, sfmcContactKey: loggedInEmail, }, attributes: { lastPurchaseStatus: purchaseStatusValue }, } : undefined, }); if (/Aprobada/i.test(statusParam)) clearCartData(); } return match; }, listeners: [], }, { name: "Armatuplay", isMatch: () => /https:\/\/tienda\.claro\.com\.co\/armatuplay/.test(window.location.href), interaction: { name: "ViewArmatuplay" }, contentZones: [ { name: "home_hero", selector: "#home_hero_banner"}, { name: "Opt-in-armatuplay", selector: ".armaTuPlayForm__intro" } ], }, { name: "Datos_Personales_Prepost", isMatch: function () { const match = /https:\/\/tienda\.claro\.com\.co\/datos-personales-prepost/i.test(window.location.href); if (match) schedulePrepostPlanViewEvent(); return match; }, interaction: { name: "View Datos Personales Prepost" }, contentZones: [ { name: "Datos_Prepost", selector: "div.flex-cont-main-preapost" }, { name: "Datos_Prepost_Resumen", selector: ".box-resumen-compra-preapost" }, { name: "PopUp_Prepost", selector: "section.noModal .termsModalRedHo__container.center-modal.ModalPlanRediseno" }, ], catalog: { Product: { _id: () => getStablePrepostPlanCatalog().id, sku: () => getStablePrepostPlanCatalog().sku, name: () => getStablePrepostPlanCatalog().name, price: () => getStablePrepostPlanCatalog().price, url: () => getStablePrepostPlanCatalog().url, imageUrl: () => getStablePrepostPlanCatalog().imageUrl || DEFAULT_PRODUCT_IMAGE_URL, description: () => getStablePrepostPlanCatalog().description, categories: () => getStablePrepostPlanCatalog().categories, brand: () => getStablePrepostPlanCatalog().brand || "claro", }, }, listeners: [ SalesforceInteractions.listener("click", ".vmobil-view-summary, .vmobil-view-summary *, .txt-res-acord, .txt-res-acord *", () => { setTimeout(() => { sendPrepostPlanViewEventOnce(); }, 250); }), ], }, { name: "Form_WCB", isMatch: function () { return isWcbFormPage(); }, interaction: { name: "WCB Form View" }, }, { name: "Form_WCB", isMatch: function () { if (isHomeRoute()) return false; if (isPrepagoToPostpagoClaroRoute()) return false; return SalesforceInteractions.DisplayUtils.pageElementLoaded(".shopNavigation") .then(() => true) .catch(() => false); }, interaction: { name: "WCB Form View" }, contentZones: [ { name: "Form_WCB_Zone", selector: ".shopNavigation" } ] }, { name: "Home_Botones_Global", isMatch: function () { if (!isHomeRoute()) return false; return true; }, interaction: { name: "Home Global View" }, }, ], }; SalesforceInteractions.initSitemap(sitemapConfig); }); /* ========================================================= 15) CUPO CRÉDITO ========================================================= */ (function () { let sent = false; let lastValue = null; let observer = null; function getCupoTotal() { const bloques = document.querySelectorAll(".boxCuposInfo"); for (const bloque of bloques) { const label = bloque.querySelector(".boxCuposInfo_description-text")?.textContent.trim().toLowerCase(); if (label === "cupo total:") { const txt = bloque.querySelector(".boxCuposInfo_amount")?.textContent || ""; const clean = txt.replace(/[^\d]/g, ""); return clean !== "" ? clean : null; } } return null; } function trySend() { const cupo = getCupoTotal(); const email = localStorage.getItem("loggedInEmail"); if (!email || cupo === null) return; if (lastValue === null) { lastValue = cupo; return; } if (cupo === lastValue) return; if (sent) return; sent = true; localStorage.setItem("cupoCredito", cupo); SalesforceInteractions.sendEvent({ interaction: { name: "Update Cupo Credito" }, user: { id: email, identities: { customerId: email, emailAddress: email, sfmcContactKey: email }, attributes: { cupoCredito: cupo }, }, }); observer && observer.disconnect(); } function startObserver() { if (observer) return; observer = new MutationObserver(trySend); observer.observe(document.body, { childList: true, subtree: true, characterData: true }); setTimeout(() => { observer && observer.disconnect(); }, 10000); } document.addEventListener("click", (e) => { if (e.target.closest(".item-icon-link")) { lastValue = null; sent = false; startObserver(); } }); })(); } catch (e) { if (typeof window.Evergage === "object" && typeof window.Evergage.getVersion === "function" && window.Evergage.getVersion() >= 5) { console.error("siteWideJavascriptError" + e); } }; }