/* rwe-lp v7 (BOFU blog support: article_slug + cta_position + page_cluster attribution on posts and landing pages; single-field lead form; dataLayer context for GTM cta_click) - v6 (auto-triggers instant download on mail sent; keeps visible fallback link) - v5 (adds RWE Connect 2026 Agenda to asset-name map) - v4 (multi popup modals: data-modal-target routes .rwe-dl triggers to #id modals) - was v3 (adds scroll-fill for bars + donut) - was v2 (adds scroll-triggered counter animation) - was v1 - RWE Connect 2026: lead attribution (hidden fields) + GA4 generate_lead + instant-download delivery + click/auto pop-up. Hosted as .txt (host WAF blocks .js); loaded via a script tag by src. Versioned filename for cache-busting. */ (function(){ function init(){ var lp=document.querySelector('.rwe-lp')||document.querySelector('.rwe-blog'); if(!lp){ return; } var isBlog=!!(lp.className&&lp.className.indexOf('rwe-blog')>-1); var reduce=window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches; var modal=document.getElementById('rwe-modal'); var popup=document.getElementById('rwe-popup'); var lastFocus=null, triggerAsset='', triggerLabel='', triggerPos=''; var ASSET_NAMES={ "rwe-pipeline-report-2026.pdf":"RWE Pipeline Report 2026", "rwe-delegate-breakdown.pdf":"Delegate Breakdown", "rwe-study-methods-primer.pdf":"RWE Study Methods Primer", "rwe-vendor-landscape-2026.pdf":"RWE Vendor Landscape 2026", "rwe-connect-2026-agenda.pdf":"RWE Connect 2026 Agenda" }; function assetName(u){ if(!u){return "";} var f=(""+u).split("/").pop().split("?")[0]; return ASSET_NAMES[f]||f.replace(/^rwe-/,"").replace(/\.pdf$/,"").replace(/-/g," "); } /* v7: article + cluster identity, derived once per page. */ function articleSlug(){ var a=lp.getAttribute('data-article-slug'); if(a){ return a; } var p=location.pathname.replace(/\/+$/,'').split('/'); return p[p.length-1]||''; } function pageCluster(){ return lp.getAttribute('data-page-cluster')||(isBlog?'blog_bofu':''); } var ARTICLE=articleSlug(), CLUSTER=pageCluster(), LANDING=location.pathname; function loc(el){ if(!el||!el.closest){return "In-Page CTA";} if(el.closest("#rwe-modal")||el.closest("#rwe-popup")){return "Pop-up";} if(el.closest(".rwe-hero")){return "Hero";} var sec=el.closest("section"); if(sec){ var h=sec.querySelector(".rwe-eyebrow")||sec.querySelector("h2"); if(h&&h.textContent&&h.textContent.trim()){return h.textContent.trim().slice(0,80);} } return "In-Page CTA"; } /* v7: cta_position comes from the trigger, falling back to a scroll-depth estimate so an untagged CTA still reports something usable. */ function posOf(trigger){ var p=trigger&&trigger.getAttribute('data-cta-position'); if(p){ return p; } if(!trigger||!trigger.getBoundingClientRect){ return ''; } try{ var top=trigger.getBoundingClientRect().top+window.pageYOffset; var h=document.body.scrollHeight||1; var r=top/h; if(r<0.35){ return 'intro'; } if(r<0.6){ return 'mid_one'; } if(r<0.85){ return 'mid_two'; } return 'close'; }catch(e){ return ''; } } /* v7: nearest heading, used as a cta-name fallback for inline forms that carry no data-cta-label of their own. */ function headingOf(el){ if(!el||!el.closest){ return ""; } var sec=el.closest("section"); if(sec){ var h=sec.querySelector("h2")||sec.querySelector(".rwe-eyebrow"); if(h&&h.textContent){ return h.textContent.trim().slice(0,80); } } return ""; } function attr(trigger,scopeEl){ var url=(trigger&&trigger.getAttribute("data-asset-url"))||lp.getAttribute("data-asset-url")||""; var name=(trigger&&trigger.getAttribute("data-cta-label"))||lp.getAttribute("data-cta-label") ||headingOf(scopeEl||trigger)||""; return { "cta-name":name, "cta-location":loc(scopeEl||trigger), "asset":assetName(url), "submission-type":url?"Instant Download":"Manual Follow-Up", "article-slug":ARTICLE, /* fall back to the element's own scroll position so inline forms (hero and closing) still report a position, not an empty string */ "cta-position":posOf(trigger||scopeEl), "page-cluster":CLUSTER, "landing-page":LANDING }; } function setHidden(form,o){ if(!form){return;} for(var k in o){ var el=form.querySelector('[name="'+k+'"]'); if(el){ el.value=o[k]; } } } function ga(o){ try{ var p={cta_name:o["cta-name"],cta_location:o["cta-location"],asset:o["asset"],submission_type:o["submission-type"], article_slug:o["article-slug"]||ARTICLE,cta_position:o["cta-position"]||'',page_cluster:o["page-cluster"]||CLUSTER, page_name:(document.title||""),page_url:location.pathname}; if(window.gtag){window.gtag("event","generate_lead",p);} if(window.dataLayer){var d={event:"generate_lead"};for(var k in p){d[k]=p[k];}window.dataLayer.push(d);} }catch(e){} } function submitData(e){ var f=(e&&e.target&&e.target.tagName==="FORM")?e.target:((e&&e.target&&e.target.querySelector)?e.target.querySelector("form"):null); /* v7: if a modal trigger is currently active, trust it over DOM traversal. wpcf7mailsent does not always give a target inside the submitting form, and falling through to document.querySelector('form') would attribute the lead to whichever form happens to be first in the DOM. */ var modalOpen=false, mo=document.querySelectorAll('.rwe-modal'), moi; for(moi=0;moi< mo.length;moi++){ if(!mo[moi].hidden){ modalOpen=true; } } if(modalOpen||triggerLabel||triggerPos||triggerAsset){ var u2=triggerAsset||lp.getAttribute("data-asset-url")||""; return {"cta-name":triggerLabel||lp.getAttribute("data-cta-label")||"","cta-location":"Pop-up", "asset":assetName(u2),"submission-type":u2?"Instant Download":"Manual Follow-Up", "article-slug":ARTICLE,"cta-position":triggerPos||'',"page-cluster":CLUSTER,"landing-page":LANDING}; } if(f&&f.closest&&(f.closest("#rwe-modal")||f.closest("#rwe-popup")||f.closest(".rwe-modal"))){ var url=triggerAsset||lp.getAttribute("data-asset-url")||""; return {"cta-name":triggerLabel||lp.getAttribute("data-cta-label")||"","cta-location":"Pop-up","asset":assetName(url), "submission-type":url?"Instant Download":"Manual Follow-Up","article-slug":ARTICLE, "cta-position":triggerPos||'',"page-cluster":CLUSTER,"landing-page":LANDING}; } return attr(null,f); } function setBtn(scope,label){ if(!scope||!label){return;} var b=scope.querySelectorAll('.wpcf7-submit'),i; for(i=0;i< b.length;i++){ if(b[i].tagName==='INPUT'){b[i].value=label;}else{b[i].textContent=label;} } } var pageLabel=lp.getAttribute('data-cta-label'); if(pageLabel){ setBtn(lp,pageLabel); } (function(){ var fs=lp.querySelectorAll("form"),i; for(i=0;i< fs.length;i++){ if(fs[i].closest("#rwe-modal")||fs[i].closest("#rwe-popup")||fs[i].closest(".rwe-modal")){continue;} setHidden(fs[i],attr(null,fs[i])); } })(); var statBox=lp.querySelector('.rwe-stats'); if(statBox){ var nums=statBox.querySelectorAll('[data-target]'); var cAnim=function(el){ var t=parseFloat(el.getAttribute('data-target'))||0, suf=el.getAttribute('data-suffix')||''; if(reduce){ el.textContent=t+suf; return; } var dur=1400,start=null; function step(ts){ if(start===null){start=ts;} var p=Math.min((ts-start)/dur,1); var e=1-Math.pow(1-p,3); el.textContent=Math.round(e*t)+suf; if(p<1){requestAnimationFrame(step);} } requestAnimationFrame(step); }; var ci; if(!reduce){ for(ci=0;ci< nums.length;ci++){ nums[ci].textContent='0'+(nums[ci].getAttribute('data-suffix')||''); } } var ran=false, runStats=function(){ if(ran){return;} ran=true; var j; for(j=0;j< nums.length;j++){ cAnim(nums[j]); } }; if(!reduce && 'IntersectionObserver' in window){ var io=new IntersectionObserver(function(es){ es.forEach(function(en){ if(en.isIntersecting){ runStats(); io.disconnect(); } }); },{threshold:0.3}); io.observe(statBox); } else { runStats(); } } var viz=lp.querySelector('.rwe-viz'); if(viz){ var vbars=viz.querySelectorAll('.rwe-barfill[data-bar]'), varc=viz.querySelector('.rwe-arc'), vi; if(!reduce){ for(vi=0;vi< vbars.length;vi++){ vbars[vi].style.width='0%'; } if(varc){ varc.style.strokeDashoffset=varc.getAttribute('data-c'); } } var vran=false, runViz=function(){ if(vran){return;} vran=true; for(vi=0;vi< vbars.length;vi++){ vbars[vi].style.width=vbars[vi].getAttribute('data-bar')+'%'; } if(varc){ varc.style.strokeDashoffset=varc.getAttribute('data-arc'); } }; if(!reduce && 'IntersectionObserver' in window){ var vio=new IntersectionObserver(function(es){ es.forEach(function(en){ if(en.isIntersecting){ runViz(); vio.disconnect(); } }); },{threshold:0.3}); vio.observe(viz); } else { runViz(); } } function bindModal(m){ if(!m){ return null; } function open(bn){ if(bn){ triggerAsset=bn.getAttribute('data-asset-url')||''; triggerLabel=bn.getAttribute('data-cta-label')||''; triggerPos=posOf(bn); var t=m.querySelector('.rwe-modal-title'); if(t&&bn.getAttribute('data-title')){t.textContent=bn.getAttribute('data-title');} var bl=bn.getAttribute('data-cta-label'); if(bl){setBtn(m,bl);}else if(pageLabel){setBtn(m,pageLabel);} } if(m.querySelector("form")){ setHidden(m.querySelector("form"),attr(bn,bn||m)); } m.hidden=false; document.body.style.overflow='hidden'; var inp=m.querySelector('input'); if(inp){inp.focus();} } function close(){ m.hidden=true; document.body.style.overflow=''; triggerAsset='';triggerLabel='';triggerPos=''; if(lastFocus){lastFocus.focus();} } var closers=m.querySelectorAll('[data-close]'),c; for(c=0;c< closers.length;c++){ closers[c].addEventListener('click',close); } document.addEventListener('keydown',function(e){ if((e.key==='Escape'||e.keyCode===27)&&!m.hidden){close();} }); m.addEventListener('click',function(e){ if(e.target===m){close();} }); return {open:open,close:close}; } var modalApis={}, mlist=document.querySelectorAll('.rwe-modal'), mmi; for(mmi=0;mmi< mlist.length;mmi++){ if(mlist[mmi].id){ modalApis['#'+mlist[mmi].id]=bindModal(mlist[mmi]); } } /* v7: push article/CTA context to the dataLayer BEFORE the modal opens, so GTM's existing cta_click tag can read it via Data Layer Variables. This is a context push, not an event, so it cannot double-count cta_click. */ function pushCtaContext(bn){ try{ if(!window.dataLayer){ return; } window.dataLayer.push({ rwe_article_slug:ARTICLE, rwe_cta_position:posOf(bn), rwe_cta_label:(bn&&bn.getAttribute('data-cta-label'))||'', rwe_page_cluster:CLUSTER }); }catch(e){} } var dls=lp.querySelectorAll('.rwe-dl'),d; for(d=0;d< dls.length;d++){ (function(bn){ var tgt=bn.getAttribute('data-modal-target')||'#rwe-modal'; bn.addEventListener('click',function(ev){ ev.preventDefault(); lastFocus=bn; pushCtaContext(bn); if(modalApis[tgt]){ modalApis[tgt].open(bn); } }); })(dls[d]); } /* v7: plain (non-modal) CTAs still report context on click. */ var plains=lp.querySelectorAll('a.rwe-cta:not(.rwe-dl)'),pi; for(pi=0;pi< plains.length;pi++){ (function(bn){ bn.addEventListener('click',function(){ pushCtaContext(bn); }); })(plains[pi]); } if(popup){ var popApi=bindModal(popup); var KEY='rwe_popup_seen', shown=false; function seen(){ try{ return !!localStorage.getItem(KEY); }catch(e){ return document.cookie.indexOf(KEY+'=1')>-1; } } function mark(){ try{ localStorage.setItem(KEY,String(Date.now())); }catch(e){ document.cookie=KEY+'=1;max-age=604800;path=/'; } } function fire(){ if(shown||seen()){return;} shown=true; mark(); if(popApi){popApi.open(null);} } var isMobile=window.matchMedia&&window.matchMedia('(max-width:768px)').matches; if(isMobile){ setTimeout(fire,40000); window.addEventListener('scroll',function(){ if((window.scrollY+window.innerHeight)/document.body.scrollHeight>0.6){fire();} },{passive:true}); } else { setTimeout(fire,30000); window.addEventListener('scroll',function(){ if((window.scrollY+window.innerHeight)/document.body.scrollHeight>0.5){fire();} },{passive:true}); document.addEventListener('mouseout',function(e){ if(e.clientY<=0){fire();} }); } } function pageAsset(){ return triggerAsset || lp.getAttribute('data-asset-url') || ''; } function onSent(e){ ga(submitData(e)); try{ localStorage.setItem('rwe_popup_seen',String(Date.now())); }catch(x){} var url=pageAsset(); if(url){ var label=triggerLabel||pageLabel||'Download the Report'; try{var _dl=document.createElement('a');_dl.href=url;_dl.setAttribute('download','');_dl.rel='noopener';_dl.style.display='none';document.body.appendChild(_dl);_dl.click();setTimeout(function(){try{document.body.removeChild(_dl);}catch(e){}},1500);}catch(e){try{window.open(url,'_blank');}catch(_){}} var ro=document.querySelectorAll('.wpcf7-response-output'),i; for(i=0;i< ro.length;i++){ ro[i].textContent='Your download is ready. '; var link=document.createElement('a'); link.href=url; link.setAttribute('download',''); link.rel='noopener'; link.textContent=label; link.style.cssText='display:inline-block;margin-top:10px;background:#00bcd4;color:#002a33;font-weight:800;padding:12px 22px;border-radius:3px;text-decoration:none'; ro[i].appendChild(link); } } else { window.location.href='/thank-you/'; } } document.addEventListener('wpcf7mailsent',onSent); if(window.jQuery){ window.jQuery(document).on('wpcf7mailsent',onSent); } } if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded',init); } else { init(); } })();