1<!DOCTYPE html> 2<!--[if IE 8]> <html lang="en" class="ie8 no-js"> <![endif]--> 3<!--[if IE 9]> <html lang="en" class="ie9 no-js"> <![endif]--> 4<!--[if !IE]><!--> 5<html lang="en"> 6<!--<![endif]--> 7<!-- BEGIN HEAD --> 8 9<head> 10 <meta charset="utf-8" /> 11 <meta name="description" content="Description" /> 12 <meta name="keywords" content="Keywords" /> 13 <title>Browser Extensions</title> 14 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 15 16 <meta name="apple-mobile-web-app-capable" content="yes" /> 17 <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1" /> 18 <link rel="dns-prefetch" href="https://cdnjs.cloudflare.com/"> 19 <link rel="dns-prefetch" href="https://fonts.googleapis.com/"> 20 21 <link href="https://fonts.googleapis.com/css2?family=Overpass:wght@100;200;300;400;600;700&display=swap" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet'" /> 22 23 <link rel="preconnect" href="https://fonts.googleapis.com"> 24 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 25 26 <link href="//fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet'" /> 27 <noscript> 28 <link href="//fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet" type="text/css" media="all"> 29 </noscript> 30 31 <!--sitekit_code--> 32 <!--end_sitekit_code--> 33 34
34<script src="/resources/assets/site/forms/crmco-page.js?cache=1748030516" defer></script>
34 35 36 <link rel="shortcut icon" href="/assets/favicon.png" type="image/png" /> 37 38 <style> 39 /** start overwrite the user agent stylesheet */ 40 * { 41 box-sizing: border-box 42 } 43 44 h1, 45 h2, 46 h3, 47 h4, 48 h5, 49 h6, 50 p, 51 div, 52 img, 53 ul, 54 li, 55 ol { 56 margin-block-start: 0px; 57 margin-block-end: 0px; 58 margin-inline-start: 0px; 59 margin-inline-end: 0px; 60 } 61 62 ul { 63 list-style: none; 64 } 65 .noAnime { 66 animation: unset !important; 67 } 68 /** end overwrite the user agent stylesheet */ 69 * { box-sizing: border-box; } body {margin: 0;}:root{--crm-section-container-max-width:1170px;}.gjs-row{position:relative;display:flex;flex-wrap:wrap;text-align:left;max-width:100%;width:100%;padding:10px;}.cell-1 > .gjs-cell{flex:auto;}.cell-2 > .gjs-cell{flex:1;}.cell-3 > .gjs-cell{flex:1;}.cell-4 > .gjs-cell{flex:1;}.gjs-cell{min-height:75px;position:relative;box-sizing:border-box;}.crm-text i, .crm-text u, .crm-text b, .crm-text strong, .crm-text strike, .crm-text span{display:inline !important;width:auto;}.crm-text .crm-text{display:inline !important;width:auto;}.short-animate{-webkit-transition:.5s ease-in-out;-moz-transition:.5s ease-in-out;-ms-transition:.5s ease-in-out;-o-transition:.5s ease-in-out;transition:.5s ease-in-out;}.lightbox{position:fixed;display:flex;background:rgba(0, 0, 0, 0.2);z-index:501;opacity:0;width:100%;}.lightbox-controls{display:block;position:absolute;overflow:hidden;z-index:502;width:fit-content;}.lightbox:target{top:0%;bottom:0%;opacity:1;}.lightbox:target ~ lightbox-controls{top:0px;}i{text-align:center;height:auto;line-height:inherit;display:flex;justify-content:center;align-items:center;margin:5px;transition-duration:0.3s;transition-property:color, box-shadow, background, border;min-height:1rem;min-width:1rem;}.crm-background-video{height:100%;pointer-events:none;}.crm-background-video > iframe{border:none;width:100%;position:absolute;overflow:hidden;}.crm-bg{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;height:100%;z-index:-1;overflow:hidden;}.crm-bg-color{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;height:100%;}.crm-bg-image{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;height:100%;background-repeat:no-repeat;background-size:cover;}.crm-buttons{display:flex;justify-content:center;font-family:Overpass, sans-serif;padding:5px 0;}.crm-button{font-size:15px;padding:14px 14px 14px 14px;border:2px solid rgba(14, 164, 233, 1);font-weight:700;line-height:1.6;cursor:pointer;border-radius:2px;display:flex;justify-content:space-between;align-items:center;text-decoration:none;transition-duration:0.3s;transition-property:color, box-shadow, background, border;}.video1-wrapper{display:flex;justify-content:center;width:100%;height:auto;padding:0px;}.video1{width:100%;padding:0;display:flex;justify-content:center;align-items:center;background-color:transparent;margin:5px 0px;position:relative;}.video1-inner{width:100%;padding-top:56.25%;}.video1-cover{display:none;overflow:hidden;width:100%;position:absolute;top:0px;height:100% !important;z-index:999;}.cover-image{height:100%;width:100%;object-fit:cover !important;}.cover-image-play{border-radius:50%;bottom:50%;top:50%;width:10%;position:absolute;left:0;right:0;margin:auto;padding:50px;opacity:0.8;}.cover-image-play:hover{opacity:1;cursor:pointer;}.cover-image-play i{position:absolute;left:50%;top:50%;transform:translate(-60%, -70%);}video{width:100%;margin:auto;position:absolute;top:0px;height:100%;}@media (max-width: 19200px){body, h1, h2, h3, h4, h5, h6, p, div, img, ul, li, ol, dl{margin-block-start:0
69px;margin-block-end:0px;margin-inline-start:0px;margin-inline-end:0px;}div.default-color{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:20px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}label{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:20px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}p{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:20px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h1{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:86px;font-weight:900;line-height:normal;letter-spacing:normal;font-style:normal;color:rgba(29, 46, 59, 1);text-decoration:inherit;}h2{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:42px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h3{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:32px;font-weight:600;line-height:normal;letter-spacing:normal;font-style:normal;color:rgba(0, 0, 0, 1);text-decoration:inherit;}h4{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:22px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h5{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:26px;font-weight:500;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:26px;font-weight:500;line-height:1.4;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}.crm-button p{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:24px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:inherit;color:#ffffff;text-decoration:inherit;}.crm-button i{font-size:24px;line-height:normal;letter-spacing:normal;font-style:inherit;color:#ffffff;text-decoration:inherit;}#isp8{width:100%;display:grid;grid-template-columns:100%;}#ikz5{grid-row-gap:10px;grid-column-gap:10px;margin:auto;}#i42o{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#iz5s{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#ie7v{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#i809{display:inline-flex;justify-content:center;align-self:center;transition-duration:0.3s;transition-property:color, box-shadow, background, border;flex-basis:content;width:100%;max-width:100%;text-align:center;}#iu4r{width:100%;display:grid;grid-template-columns:100%;grid-row-gap:10px;}#iowy8{grid-row-gap:10px;grid-column-gap:10px;margin:auto;}#idio3{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;padding:25px 25px 25px 25px;}#iu7qg{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#i0yxo{grid-row-gap:10px;grid-column-gap:10px;margin:auto;}#iaapb{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#in5sg{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#i8bm1{display:inline-flex;justify-content:center;align-self:center;transition-duration:0.3s;transition-property:color, box-shadow, background, border;flex-basis:content;width:100%;max-width:100%;text-align:center;margin:10px 10px 10px 10px;}#ifmow{width:auto;display:inline;}#iv0rv{display:inline-flex;justify-content:flex-start;align-self:flex-start;transition-duration:0.3s;transition-property:color, box-shadow, background, border;flex-basis:content;width:100%;max-width:100%;text-align:left;font-weight:400;margin:10px 10px 10px 10px;}#iv0rv p{font-weight:400;}#i4ypg{background-color:rgba(0, 0, 0, 0.3);justify-content:center;top:-100%;bottom:100%;left:0;right:0;display:flex;}#iq4yy{background-color:white;align-self:center;min-width:5%;max-height:calc(100vh - 60px);height:auto;min-height:60%;flex-direction:column;justify-content:flex-start;align-items:stretch;overflow:hidden;display:flex;width:100%;max-width:85%;position:relative;padding:50px 50px 50px 50px;}#idjtq{top:0;right:0;position:absolute;cursor:pointer;}#ipiri{color:#0dacff;text-decoration:none;text-align:center;font-size:32px;height:auto;display:flex;justify-content:center;align-items:center;margin:5px;transition-duration:0.3s;transition-property:color, box-shadow, background, border;}#iao4x{width:100%;height:100%;flex-direction:inherit;justify-content:inherit;align-items:inherit;display:flex;overflow:auto;position:relative;}#isvvl{height:951px;width:1690.6666666666665px;top:0.0546875px;left:-290.89583333333326px;}#iaqsi{min-height:auto;width:100%;text-align:center;height:auto;position:relative;}#i6mh6{display:flex;justify-content:center;align-items:center;padding:0px;width:100%;flex-basis:content;}#izorh{background-color:#0dacffff;border-color:#0dacffff;border-style:solid;border-width:0px;cursor:pointer;border-radius:2px;display:flex;justify-content:center;align-items:center;margin:10px 10px 10px 10px;width:250px;max-width:100%;height:55px;}#im69g{margin:0px 5px;}#i84ni{width:auto;display:inline;}#i932i{width:auto;display:inline;}#if68u{width:100%;height:100%;overflow:hidden;ft-file-processing:1;ft-video-id:3k26by;}#i2bz3{width:100%;height:auto;min-height:40px;}#iwx9o{z-index:2;}#isvff{width:auto;display:inline;}#ioq7q{display:none;height:auto;}#i3ucf{width:110px;background-color: rgba(14, 164, 233, 0.4);}#i5dno{color:#0dacff;text-decoration:none;text-align:center;font-size:32px;}#i7x45{border:none;position:absolute;top:0;height:100%;width:100%;}}@media (max-width: 768px){.gjs-row{flex-wrap:wrap;}.cell-2 > .gjs-cell{flex:auto;}.cell-3 > .gjs-cell{flex:auto;}.cell-4 > .gjs-cell{flex:auto;}}@media (max-width: 480px){body, h1, h2, h3, h4, h5, h6, p, div, img, ul, li, ol, dl{margin-block-start:0
69px;margin-block-end:0px;margin-inline-start:0px;margin-inline-end:0px;}div.default-color{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:16px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}label{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:16px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}p{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:16px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h1{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:56px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h2{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:42px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:inherit;color:#000000;text-decoration:none;}h3{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:32px;font-weight:600;line-height:normal;letter-spacing:normal;font-style:inherit;color:rgba(0, 0, 0, 1);text-decoration:inherit;}h4{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:26px;font-weight:500;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h5{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:26px;font-weight:500;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:26px;font-weight:500;line-height:1.4;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}.crm-button p{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:12px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}.crm-button i{font-size:12px;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}} </style> 70 71
71<script> 72 var formFbData=""; 73 try{ 74 var fbc = localStorage.getItem("_fbc"); 75 var fbp = localStorage.getItem("_fbp"); 76 formFbData = "fbc=" + fbc; 77 if (fbp) { 78 formFbData = formFbData + "&fbp=" + fbp; 79 } 80 81 }catch(e){ 82 83 } 84 var is_test_server=false; 85 var is_public_calendar=false; 86 </script>
86 87 88 89 <link rel="preload" href="//unpkg.com/[email protected]/dist/formio.full.min.css" id="crmco-formlib-style" as="style" onload="this.onload=null;this.rel='stylesheet'" /> 90 <link rel="preload" href="/resources/assets/site/form-themes/default.min.css" id="crmco-form-theme-default-style" as="style" onload="this.onload=null;this.rel='stylesheet'"> 91 <!--link rel="preload" href="/resources/assets/site/forms/commonlib.js?cache=1748030516" as="script"--> 92 <!--link rel="preload" href="/resources/assets/site/forms/formlib.js?cache=1748030516" as="script"--> 93 <link rel="preload" href="/resources/assets/site/forms/custom-form-component.js?cache=1748030516" as="script"> 94 <link rel="preload" href="/resources/assets/site/forms/crmco-form.js?cache=1748030516" as="script"> 95 96
96<script src="/resources/site/form/supportdata/t1uvdp?v=1748030516" async></script>
96 97 <noscript> 98 <link rel="stylesheet" href="//unpkg.com/[email protected]/dist/formio.full.min.css" id="crmco-formlib-style" /> 99 <link rel="stylesheet" href="/resources/assets/site/form-themes/default.min.css" id="crmco-form-theme-default-style" /> 100 </noscript> 101 <!--script src="/resources/assets/site/forms/commonlib.js?cache=1748030516" id="crmco-commonlib-js" defer></!--script--> 102 <!--script src="/resources/assets/site/forms/formlib.js?cache=1748030516" id="crmco-formlib-js" defer></!--script--> 103
103<script src="/resources/assets/site/forms/custom-form-component.js?cache=1748030516" id="crmco-custom-form-component-js" defer></script>
103 104
104<script src="/resources/assets/site/forms/crmco-form.js?cache=1748030516" id="crmco-form-js" defer></script>
104 105 106 <link rel="preload" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> 107 <link rel="preload" href="//cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'" /> 108 <noscript> 109 <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" /> 110 <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" /> 111 </noscript> 112 113
113<script type="text/javascript"> 114 function randomEventId(prefixLength) { 115 var str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 116 var result = ''; 117 for (var i = prefixLength; i > 0; --i) 118 result += str[Math.floor(Math.random() * str.length)]; 119 return result + '-' + new Date().getTime(); 120 } 121 window.jsVersion = '?cache=1748030516'; 122 window.isDevJs = 0; 123 window.crmcoSt = '962k0c'; 124 window.crmcoPage = 't1uvdp'; 125 window.crmcoSite = 'p7qpe'; 126 /*window.crmcoFacebookEvents = [];*/ 127 window.enableFbTrack = false; 128 window.fbEventId = randomEventId(7); 129 window.loadTime = 5; 130 window.scriptLoaded = false; 131 132 const loadScriptsTimer = setTimeout(triggerScriptLoad, window.loadTime * 1000); 133 const userInteractionEvents = ["mouseover", "keydown", "touchstart", "touchmove", "wheel"]; 134 userInteractionEvents.forEach(function(event) { 135 window.addEventListener(event, triggerScriptLoad, { 136 passive: !0 137 }) 138 }); 139 140 /* 141 */ 142 143 function app_fb() { 144 if (window.scriptLoaded === true) { 145 return; 146 } 147 window.scriptLoaded = true; 148 149 var fbc = null; 150 try{ 151 fbc = window.localStorage.getItem("_fbc"); 152 }catch(e){ 153 console.log("get fbc error",e); 154 } 155 156 if (!fbc || fbc.indexOf("fb.1.7777777777777.AbCdEfGhIjKlMnOpQrStUvWxYz") == -1) { 157 console.log("fire fb"); 158 ! function(f, b, e, v, n, t, s) { 159 if (f.fbq) return; 160 n = f.fbq = function() { 161 n.callMethod ? 162 n.callMethod.apply(n, arguments) : n.queue.push(arguments) 163 }; 164 if (!f._fbq) f._fbq = n; 165 n.push = n; 166 n.loaded = !0; 167 n.version = '2.0'; 168 n.queue = []; 169 t = b.createElement(e); 170 t.async = !0; 171 t.src = v; 172 s = b.getElementsByTagName(e)[0]; 173 s.parentNode.insertBefore(t, s) 174 }(window, document, 'script', '//connect.facebook.net/en_US/fbevents.js'); 175 176 if (typeof window.fireFacebookEventNew == 'function') { 177 console.log("fireFacebookEventNew 1"); 178 window.fireFacebookEventNew(); 179 } else { 180 window.addEventListener("DOMContentLoaded", function() { 181 console.log("fireFacebookEventNew 2") 182 window.fireFacebookEventNew?.(); 183 }) 184 } 185 } 186 187 } 188 189 190 function triggerScriptLoad() { 191 loadScripts(); 192 clearTimeout(loadScriptsTimer); 193 194 userInteractionEvents.forEach(function(event) { 195 window.removeEventListener(event, triggerScriptLoad, { 196 passive: !0 197 }) 198 }) 199 200 } 201 202 function app_inspect() { 203 /*site_interaction_scripts*/ 204 /*end_site_interaction_scripts*/ 205 } 206 207 function loadScripts() { 208 document.querySelectorAll("script[data-type='lazy']").forEach(function(elem) { 209 elem.setAttribute("src", elem.getAttribute("data-src")) 210 }) 211 app_fb(); 212 app_inspect(); 213 } 214 </script>
214 215 216 217 <!--site_header_code--> 218 <meta property="og:image" content="https://www.app.leadbru.com/assets/aws/st_962k0c/site_p7qpe/assets/LeadBru-4_5s7RjGDT_thumb.png"/> <!--end_site_header_code--> 219 </head> 220 221<body class=" "> 222 <!--site_body_start_code--> 223 <!--end_site_body_start_code--> 224 225 <div id="wrapper"><div id="isp8" class="crm-grid-wrapper"><div ColumnGap="10px" RowGap="10px" id="ikz5" class="gjs-row cell-1"><div ColumnGap="10px" RowGap="10px" id="i42o" class="gjs-cell"><div id="i809" class="crm-text"><h2 id="iahq">LeadBru's Browser Extensions</h2></div></div><div ColumnGap="10px" RowGap="10px" id="iz5s" class="gjs-cell"></div><div ColumnGap="10px" RowGap="10px" id="ie7v" class="gjs-cell"></div></div></div><div id="iu4r" class="crm-grid-wrapper"><div ColumnGap="10px" RowGap="10px" id="iowy8" class="gjs-row cell-2"><div ColumnGap="10px" RowGap="10px" id="idio3" class="gjs-cell"><div id="i8bm1" class="crm-text"><p id="it0qi">REDA Browser Extension</p></div><div id="i2bz3">WARNING: Firefox Extension Not Available Yet</div><div id="iv0rv" class="crm-text"><p id="il6w7">A browser extension that allows you to capture property details from Zillow. You can calculate different investment strategies, make notes, create follow-up tasks and reopen the property in Zillow and RentCast. </p></div><div id="i6mh6" class="crm-buttons"><a id="izorh" ft-href="https://chromewebstore.google.com/detail/real-estate-deal-analyzer/dkjlckkpbiebmepehppdjbhdkchjkiek?pli=1" href="https://chromewebstore.google.com/detail/real-estate-deal-analyzer/dkjlckkpbiebmepehppdjbhdkchjkiek?pli=1" class="crm-button"><div id="im69g" class="crm-button-text"><p id="ig2rp">Get It Now!</p></div></a></div><!--popup-i4ypg-start--><div ft-change-transition="top" id="i4ypg" class="popup-wrapper lightbox short-animate"><div ft-show-position="center" ft-icon-position="topRight" ft-auto-popup="No" id="iq4yy" class="popup"><a id="idjtq" class="lightbox-controls"><i id="ipiri" class="fas fa-times"></i></a><div id="iao4x" class="popup-inner"><div class="crmco-form default" input_id="guav00" form_id="ohqsbi" id="iaqsi"><div id="ics9i"><div style="margin:0 auto;text-align:center"><svg selectable="false" class="icon-loading" height="38" width="38" viewBox="0 0 38 38" overflow="visible"><g transform="translate(1 1)" fill="none" fill-rule="evenodd" stroke="#1dcafe" stroke-width="2"><circle stroke-opacity="0.5" cx="18" cy="18" r="18"></circle><path d="M36 18c0-9.94-8.06-18-18-18"><animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="1s" repeatCount="indefinite"></animateTransform></path></g></svg></div></div></div></div></div><div detect-type="popup-wrapper" id="i7yj1" class="crm-bg"><div detect-type="popup-wrapper" id="iuzwd" class="crm-bg-image"></div><div detect-type="popup-wrapper" id="ifpel" class="crm-background-video"><iframe id="isvvl" class="crm-background-youtube"></iframe></div><div detect-type="popup-wrapper" id="iw2x5" class="crm-bg-color"></div></div></div><!--popup-i4ypg-end--></div>
225<div ColumnGap="10px" RowGap="10px" id="iu7qg" class="gjs-cell"><div id="i8t8a" class="video1-wrapper"><div id="if68u" class="video1"><div id="i98r7" class="video1-inner"><div id="ioq7q" class="video1-cover"><img src="" class="cover-image"/><div id="i3ucf" class="cover-image-play"><i id="i5dno" class="fa fa-play"></i></div></div><iframe src="https://iframe.mediadelivery.net/embed/78766/f731befd-f0f1-44dd-a57a-e4922e8a6d38?autoplay=true&muted=true" loading="lazy" allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;" allowfullscreen="true" id="i7x45" class="video1-custom"></iframe></div></div></div></div></div><div ColumnGap="10px" RowGap="10px" id="i0yxo" class="gjs-row cell-2"><div ColumnGap="10px" RowGap="10px" id="iaapb" class="gjs-cell"></div><div ColumnGap="10px" RowGap="10px" id="in5sg" class="gjs-cell"></div></div></div></div>
225<script>var items = document.querySelectorAll('#isp8, #iu4r'); 226 for (var i = 0, len = items.length; i < len; i++) { 227 (function(){ 228 229 /** 230 * This function manages the mouseOver and mouseOut of the element 231 */ 232 const manageMouseOver = (add=true) => { 233 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 234 return; 235 } 236 console.log("manageMouseOver",add); 237 var timer=null; 238 const onmouseenter = () => { 239 if (!timer) { 240 setTimeout(() => { 241 this.classList.remove("noAnime"); 242 console.log("onmouseenter"); 243 }, 50); 244 // if there was no timer and the animation is just run, then add the timer again. 245 timer = setTimeout(() => { 246 console.log("onmouseenter 1"); 247 requestAnimationFrame(() => { 248 console.log("onmouseenter 2"); 249 timer = null; 250 }); 251 }, 100) 252 } 253 } 254 const onmouseleave = () => { 255 requestAnimationFrame(() => { 256 if (!timer && !this.classList.contains("noAnime")) { 257 console.log("onmouseleave"); 258 this.classList.add("noAnime"); 259 timer=null; 260 } 261 }); 262 } 263 if(add){ 264 //this.addEventListener("mouseenter",onmouseenter); 265 //this.addEventListener("mouseleave",onmouseleave); 266 this.onmouseenter = onmouseenter; 267 this.onmouseleave = onmouseleave; 268 }else{ 269 //this.removeEventListener("mouseenter",onmouseenter); 270 //this.removeEventListener("mouseleave",onmouseleave); 271 this.onmouseenter = null; 272 this.onmouseleave = null; 273 } 274 } 275 if(this.getAttribute("on-animate")=="1"){ 276 this.classList.add("noAnime"); 277 if(this.getAttribute("on-entrance-animate")!="1"){ 278 manageMouseOver(true); 279 }else{ 280 manageMouseOver(false); 281 } 282 } 283 284 /** 285 * This function manages the intersection of the element for entracnce animation 286 */ 287 const observeIntersection = () => { 288 // initialize the global timer variable that shall be used at a time. 289 var timer = null; 290 var isInView = false; 291 const iframe = window.frameElement; 292 const iframeRect = iframe?.getBoundingClientRect() || {}; 293 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 294 295 const callback = (entries) => { 296 entries.forEach((entry) => { 297 // Update isInView state 298 isInView = entry.isIntersecting; 299 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 300 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 301 if(entryRatio < animationTrigger){ 302 animationTrigger=entryRatio; 303 } 304 if (entry.isIntersecting) { 305 // Element is entering view 306 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 307 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 308 if (!timer && intersectionRatio >= animationTrigger) { 309 310 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 311 let delay = 0; 312 try{ 313 delay = delayStr?parseFloat(delayStr):0; 314 }catch(e){ 315 delay = 0; 316 } 317 setTimeout(() => { 318 if(this.classList.contains("noAnime")){ 319 if(delay > 0){ 320 setTimeout(() => { 321 this.style.removeProperty('opacity'); 322 }, delay*1000+10); 323 }else{ 324 this.style.removeProperty('opacity'); 325 } 326 this.classList.remove("noAnime"); 327 //console.log("enter",this.getAttribute("id")); 328 } 329 }, 50); 330 // if there was no timer and the animation is just run, then add the timer again. 331 timer = setTimeout(() => { 332 //console.log("enter 1",this.getAttribute("id")); 333 requestAnimationFrame(() => { 334 //console.log("enter 2",this.getAttribute("id")); 335 timer = null; 336 }); 337 }, delay>0?delay*1000+500:500) 338 } 339 } else { 340 // When element leaves viewport 341 if (this.getAttribute("on-animate")=="1") { 342 // Use requestAnimationFrame to check if element is still out of view 343 requestAnimationFrame(() => { 344 if (!isInView && !timer) { 345 this.classList.add("noAnime"); 346 this.style.opacity = '0'; 347 } 348 }); 349 } 350 } 351 }); 352 }; 353 354 const myObserver = new IntersectionObserver(callback, { 355 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 356 }); 357 358 // Set initial opacity and class 359 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 360 this.classList.add("noAnime"); 361 this.style.opacity = '0'; 362 myObserver.observe(this); 363 } 364 } 365 366 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 367 observeIntersection(); 368 } 369 370}.bind(items[i]))(); 371 } 372 var items = document.querySelectorAll('#ikz5, #iowy8, #i0yxo'); 373 for (var i = 0, len = items.length; i < len; i++) { 374 (function(){ 375 376 /** 377 * This function manages the mouseOver and mouseOut of the element 378 */ 379 const manageMouseOver = (add=true) => { 380 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 381 return; 382 } 383 console.log("manageMouseOver",add); 384 var timer=null; 385 const onmouseenter = () => { 386 if (!timer) { 387 setTimeout(() => { 388 this.classList.remove("noAnime"); 389 console.log("onmouseenter"); 390 }, 50); 391 // if there was no timer and the animation is just run, then add the timer again. 392 timer = setTimeout(() => { 393 console.log("onmouseenter 1"); 394 requestAnimationFrame(() => { 395 console.log("onmouseenter 2"); 396 timer = null; 397 }); 398 }, 100) 399 } 400 } 401 const onmouseleave = () => { 402 requestAnimationFrame(() => { 403 if (!timer && !this.classList.contains("noAnime")) { 404 console.log("onmouseleave"); 405 this.classList.add("noAnime"); 406 timer=null; 407 } 408 }); 409 } 410 if(add){ 411 //this.addEventListener("mouseenter",onmouseenter); 412 //this.addEventListener("mouseleave",onmouseleave); 413 this.onmouseenter = onmouseenter; 414 this.onmouseleave = onmouseleave; 415 }else{ 416 //this.removeEventListener("mouseenter",onmouseenter); 417 //this.removeEventListener("mouseleave",onmouseleave); 418 this.onmouseenter = null; 419 this.onmouseleave = null; 420 } 421 } 422 if(this.getAttribute("on-animate")=="1"){ 423 this.classList.add("noAnime"); 424 if(this.getAttribute("on-entrance-animate")!="1"){ 425 manageMouseOver(true); 426 }else{ 427 manageMouseOver(false); 428 } 429 } 430 431 /** 432 * This function manages the intersection of the element for entracnce animation 433 */ 434 const observeIntersection = () => { 435 // initialize the global timer variable that shall be used at a time. 436 var timer = null; 437 var isInView = false;
438 const iframe = window.frameElement; 439 const iframeRect = iframe?.getBoundingClientRect() || {}; 440 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 441 442 const callback = (entries) => { 443 entries.forEach((entry) => { 444 // Update isInView state 445 isInView = entry.isIntersecting; 446 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 447 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 448 if(entryRatio < animationTrigger){ 449 animationTrigger=entryRatio; 450 } 451 if (entry.isIntersecting) { 452 // Element is entering view 453 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 454 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 455 if (!timer && intersectionRatio >= animationTrigger) { 456 457 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 458 let delay = 0; 459 try{ 460 delay = delayStr?parseFloat(delayStr):0; 461 }catch(e){ 462 delay = 0; 463 } 464 setTimeout(() => { 465 if(this.classList.contains("noAnime")){ 466 if(delay > 0){ 467 setTimeout(() => { 468 this.style.removeProperty('opacity'); 469 }, delay*1000+10); 470 }else{ 471 this.style.removeProperty('opacity'); 472 } 473 this.classList.remove("noAnime"); 474 //console.log("enter",this.getAttribute("id")); 475 } 476 }, 50); 477 // if there was no timer and the animation is just run, then add the timer again. 478 timer = setTimeout(() => { 479 //console.log("enter 1",this.getAttribute("id")); 480 requestAnimationFrame(() => { 481 //console.log("enter 2",this.getAttribute("id")); 482 timer = null; 483 }); 484 }, delay>0?delay*1000+500:500) 485 } 486 } else { 487 // When element leaves viewport 488 if (this.getAttribute("on-animate")=="1") { 489 // Use requestAnimationFrame to check if element is still out of view 490 requestAnimationFrame(() => { 491 if (!isInView && !timer) { 492 this.classList.add("noAnime"); 493 this.style.opacity = '0'; 494 } 495 }); 496 } 497 } 498 }); 499 }; 500 501 const myObserver = new IntersectionObserver(callback, { 502 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 503 }); 504 505 // Set initial opacity and class 506 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 507 this.classList.add("noAnime"); 508 this.style.opacity = '0'; 509 myObserver.observe(this); 510 } 511 } 512 513 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 514 observeIntersection(); 515 } 516 517}.bind(items[i]))(); 518 } 519 var items = document.querySelectorAll('#i42o, #iz5s, #ie7v, #idio3, #iu7qg, #iaapb, #in5sg'); 520 for (var i = 0, len = items.length; i < len; i++) { 521 (function(){ 522 523 /** 524 * This function manages the mouseOver and mouseOut of the element 525 */ 526 const manageMouseOver = (add=true) => { 527 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 528 return; 529 } 530 console.log("manageMouseOver",add); 531 var timer=null; 532 const onmouseenter = () => { 533 if (!timer) { 534 setTimeout(() => { 535 this.classList.remove("noAnime"); 536 console.log("onmouseenter"); 537 }, 50); 538 // if there was no timer and the animation is just run, then add the timer again. 539 timer = setTimeout(() => { 540 console.log("onmouseenter 1"); 541 requestAnimationFrame(() => { 542 console.log("onmouseenter 2"); 543 timer = null; 544 }); 545 }, 100) 546 } 547 } 548 const onmouseleave = () => { 549 requestAnimationFrame(() => { 550 if (!timer && !this.classList.contains("noAnime")) { 551 console.log("onmouseleave"); 552 this.classList.add("noAnime"); 553 timer=null; 554 } 555 }); 556 } 557 if(add){ 558 //this.addEventListener("mouseenter",onmouseenter); 559 //this.addEventListener("mouseleave",onmouseleave); 560 this.onmouseenter = onmouseenter; 561 this.onmouseleave = onmouseleave; 562 }else{ 563 //this.removeEventListener("mouseenter",onmouseenter); 564 //this.removeEventListener("mouseleave",onmouseleave); 565 this.onmouseenter = null; 566 this.onmouseleave = null; 567 } 568 } 569 if(this.getAttribute("on-animate")=="1"){ 570 this.classList.add("noAnime"); 571 if(this.getAttribute("on-entrance-animate")!="1"){ 572 manageMouseOver(true); 573 }else{ 574 manageMouseOver(false); 575 } 576 } 577 578 /** 579 * This function manages the intersection of the element for entracnce animation 580 */ 581 const observeIntersection = () => { 582 // initialize the global timer variable that shall be used at a time. 583 var timer = null; 584 var isInView = false;
585 const iframe = window.frameElement; 586 const iframeRect = iframe?.getBoundingClientRect() || {}; 587 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 588 589 const callback = (entries) => { 590 entries.forEach((entry) => { 591 // Update isInView state 592 isInView = entry.isIntersecting; 593 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 594 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 595 if(entryRatio < animationTrigger){ 596 animationTrigger=entryRatio; 597 } 598 if (entry.isIntersecting) { 599 // Element is entering view 600 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 601 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 602 if (!timer && intersectionRatio >= animationTrigger) { 603 604 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 605 let delay = 0; 606 try{ 607 delay = delayStr?parseFloat(delayStr):0; 608 }catch(e){ 609 delay = 0; 610 } 611 setTimeout(() => { 612 if(this.classList.contains("noAnime")){ 613 if(delay > 0){ 614 setTimeout(() => { 615 this.style.removeProperty('opacity'); 616 }, delay*1000+10); 617 }else{ 618 this.style.removeProperty('opacity'); 619 } 620 this.classList.remove("noAnime"); 621 //console.log("enter",this.getAttribute("id")); 622 } 623 }, 50); 624 // if there was no timer and the animation is just run, then add the timer again. 625 timer = setTimeout(() => { 626 //console.log("enter 1",this.getAttribute("id")); 627 requestAnimationFrame(() => { 628 //console.log("enter 2",this.getAttribute("id")); 629 timer = null; 630 }); 631 }, delay>0?delay*1000+500:500) 632 } 633 } else { 634 // When element leaves viewport 635 if (this.getAttribute("on-animate")=="1") { 636 // Use requestAnimationFrame to check if element is still out of view 637 requestAnimationFrame(() => { 638 if (!isInView && !timer) { 639 this.classList.add("noAnime"); 640 this.style.opacity = '0'; 641 } 642 }); 643 } 644 } 645 }); 646 }; 647 648 const myObserver = new IntersectionObserver(callback, { 649 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 650 }); 651 652 // Set initial opacity and class 653 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 654 this.classList.add("noAnime"); 655 this.style.opacity = '0'; 656 myObserver.observe(this); 657 } 658 } 659 660 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 661 observeIntersection(); 662 } 663 664}.bind(items[i]))(); 665 } 666 var items = document.querySelectorAll('#i809, #i8bm1, #iv0rv, #im69g'); 667 for (var i = 0, len = items.length; i < len; i++) { 668 (function(){ 669var t1,G=this,q=(t1=this.childNodes[0])===null||t1===void 0?void 0:t1.parentElement;this.getAttribute("data-design-mode")!=="1"&&this.getAttribute("ft-popup")&&this.addEventListener("click",function(C){console.log("item click",G.getAttribute("extra_params")),G.getAttribute("extra_params")&&history.pushState({extraParams:G.getAttribute("extra_params")},""),function(Z){var Q=Z.target;if(Z.target.getAttribute("ft-popup")?Q=Z.target:q!=null&&q.getAttribute("ft-popup")&&(Q=q),Q.getAttribute("ft-popup")){Z.preventDefault();var j=document.getElementById(Q.getAttribute("ft-popup")),L=j==null?void 0:j.getAttribute("ft-change-transition"),H=j==null?void 0:j.getElementsByClassName("popup")[0];H&&(H.style.display="flex"),j&&(L==="top"||L==="bottom"?(j.style.top="0%",j.style.bottom="0%"):L!=="right"&&L!=="left"||(j.style.left="0%",j.style.right="0%"),setTimeout(function(){j.style.display="flex",j.style.opacity="1"},50))}}(C)}) 670 /** 671 * This function manages the mouseOver and mouseOut of the element 672 */ 673 const manageMouseOver = (add=true) => { 674 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 675 return; 676 } 677 console.log("manageMouseOver",add); 678 var timer=null; 679 const onmouseenter = () => { 680 if (!timer) { 681 setTimeout(() => { 682 this.classList.remove("noAnime"); 683 console.log("onmouseenter"); 684 }, 50); 685 // if there was no timer and the animation is just run, then add the timer again. 686 timer = setTimeout(() => { 687 console.log("onmouseenter 1"); 688 requestAnimationFrame(() => { 689 console.log("onmouseenter 2"); 690 timer = null; 691 }); 692 }, 100) 693 } 694 } 695 const onmouseleave = () => { 696 requestAnimationFrame(() => { 697 if (!timer && !this.classList.contains("noAnime")) { 698 console.log("onmouseleave"); 699 this.classList.add("noAnime"); 700 timer=null; 701 } 702 }); 703 } 704 if(add){ 705 //this.addEventListener("mouseenter",onmouseenter); 706 //this.addEventListener("mouseleave",onmouseleave); 707 this.onmouseenter = onmouseenter; 708 this.onmouseleave = onmouseleave; 709 }else{ 710 //this.removeEventListener("mouseenter",onmouseenter); 711 //this.removeEventListener("mouseleave",onmouseleave); 712 this.onmouseenter = null; 713 this.onmouseleave = null; 714 } 715 } 716 if(this.getAttribute("on-animate")=="1"){ 717 this.classList.add("noAnime"); 718 if(this.getAttribute("on-entrance-animate")!="1"){ 719 manageMouseOver(true); 720 }else{ 721 manageMouseOver(false); 722 } 723 } 724 725 /** 726 * This function manages the intersection of the element for entracnce animation 727 */ 728 const observeIntersection = () => { 729 // initialize the global timer variable that shall be used at a time. 730 var timer = null; 731 var isInView = false;
732 const iframe = window.frameElement; 733 const iframeRect = iframe?.getBoundingClientRect() || {}; 734 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 735 736 const callback = (entries) => { 737 entries.forEach((entry) => { 738 // Update isInView state 739 isInView = entry.isIntersecting; 740 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 741 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 742 if(entryRatio < animationTrigger){ 743 animationTrigger=entryRatio; 744 } 745 if (entry.isIntersecting) { 746 // Element is entering view 747 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 748 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 749 if (!timer && intersectionRatio >= animationTrigger) { 750 751 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 752 let delay = 0; 753 try{ 754 delay = delayStr?parseFloat(delayStr):0; 755 }catch(e){ 756 delay = 0; 757 } 758 setTimeout(() => { 759 if(this.classList.contains("noAnime")){ 760 if(delay > 0){ 761 setTimeout(() => { 762 this.style.removeProperty('opacity'); 763 }, delay*1000+10); 764 }else{ 765 this.style.removeProperty('opacity'); 766 } 767 this.classList.remove("noAnime"); 768 //console.log("enter",this.getAttribute("id")); 769 } 770 }, 50); 771 // if there was no timer and the animation is just run, then add the timer again. 772 timer = setTimeout(() => { 773 //console.log("enter 1",this.getAttribute("id")); 774 requestAnimationFrame(() => { 775 //console.log("enter 2",this.getAttribute("id")); 776 timer = null; 777 }); 778 }, delay>0?delay*1000+500:500) 779 } 780 } else { 781 // When element leaves viewport 782 if (this.getAttribute("on-animate")=="1") { 783 // Use requestAnimationFrame to check if element is still out of view 784 requestAnimationFrame(() => { 785 if (!isInView && !timer) { 786 this.classList.add("noAnime"); 787 this.style.opacity = '0'; 788 } 789 }); 790 } 791 } 792 }); 793 }; 794 795 const myObserver = new IntersectionObserver(callback, { 796 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 797 }); 798 799 // Set initial opacity and class 800 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 801 this.classList.add("noAnime"); 802 this.style.opacity = '0'; 803 myObserver.observe(this); 804 } 805 } 806 807 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 808 observeIntersection(); 809 } 810 811}.bind(items[i]))(); 812 } 813 var items = document.querySelectorAll('#iahq, #it0qi, #il6w7, #ig2rp'); 814 for (var i = 0, len = items.length; i < len; i++) { 815 (function(){ 816 817 /** 818 * This function manages the mouseOver and mouseOut of the element 819 */ 820 const manageMouseOver = (add=true) => { 821 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 822 return; 823 } 824 console.log("manageMouseOver",add); 825 var timer=null; 826 const onmouseenter = () => { 827 if (!timer) { 828 setTimeout(() => { 829 this.classList.remove("noAnime"); 830 console.log("onmouseenter"); 831 }, 50); 832 // if there was no timer and the animation is just run, then add the timer again. 833 timer = setTimeout(() => { 834 console.log("onmouseenter 1"); 835 requestAnimationFrame(() => { 836 console.log("onmouseenter 2"); 837 timer = null; 838 }); 839 }, 100) 840 } 841 } 842 const onmouseleave = () => { 843 requestAnimationFrame(() => { 844 if (!timer && !this.classList.contains("noAnime")) { 845 console.log("onmouseleave"); 846 this.classList.add("noAnime"); 847 timer=null; 848 } 849 }); 850 } 851 if(add){ 852 //this.addEventListener("mouseenter",onmouseenter); 853 //this.addEventListener("mouseleave",onmouseleave); 854 this.onmouseenter = onmouseenter; 855 this.onmouseleave = onmouseleave; 856 }else{ 857 //this.removeEventListener("mouseenter",onmouseenter); 858 //this.removeEventListener("mouseleave",onmouseleave); 859 this.onmouseenter = null; 860 this.onmouseleave = null; 861 } 862 } 863 if(this.getAttribute("on-animate")=="1"){ 864 this.classList.add("noAnime"); 865 if(this.getAttribute("on-entrance-animate")!="1"){ 866 manageMouseOver(true); 867 }else{ 868 manageMouseOver(false); 869 } 870 } 871 872 /** 873 * This function manages the intersection of the element for entracnce animation 874 */ 875 const observeIntersection = () => { 876 // initialize the global timer variable that shall be used at a time. 877 var timer = null; 878 var isInView = false;
879 const iframe = window.frameElement; 880 const iframeRect = iframe?.getBoundingClientRect() || {}; 881 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 882 883 const callback = (entries) => { 884 entries.forEach((entry) => { 885 // Update isInView state 886 isInView = entry.isIntersecting; 887 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 888 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 889 if(entryRatio < animationTrigger){ 890 animationTrigger=entryRatio; 891 } 892 if (entry.isIntersecting) { 893 // Element is entering view 894 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 895 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 896 if (!timer && intersectionRatio >= animationTrigger) { 897 898 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 899 let delay = 0; 900 try{ 901 delay = delayStr?parseFloat(delayStr):0; 902 }catch(e){ 903 delay = 0; 904 } 905 setTimeout(() => { 906 if(this.classList.contains("noAnime")){ 907 if(delay > 0){ 908 setTimeout(() => { 909 this.style.removeProperty('opacity'); 910 }, delay*1000+10); 911 }else{ 912 this.style.removeProperty('opacity'); 913 } 914 this.classList.remove("noAnime"); 915 //console.log("enter",this.getAttribute("id")); 916 } 917 }, 50); 918 // if there was no timer and the animation is just run, then add the timer again. 919 timer = setTimeout(() => { 920 //console.log("enter 1",this.getAttribute("id")); 921 requestAnimationFrame(() => { 922 //console.log("enter 2",this.getAttribute("id")); 923 timer = null; 924 }); 925 }, delay>0?delay*1000+500:500) 926 } 927 } else { 928 // When element leaves viewport 929 if (this.getAttribute("on-animate")=="1") { 930 // Use requestAnimationFrame to check if element is still out of view 931 requestAnimationFrame(() => { 932 if (!isInView && !timer) { 933 this.classList.add("noAnime"); 934 this.style.opacity = '0'; 935 } 936 }); 937 } 938 } 939 }); 940 }; 941 942 const myObserver = new IntersectionObserver(callback, { 943 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 944 }); 945 946 // Set initial opacity and class 947 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 948 this.classList.add("noAnime"); 949 this.style.opacity = '0'; 950 myObserver.observe(this); 951 } 952 } 953 954 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 955 observeIntersection(); 956 } 957 958}.bind(items[i]))(); 959 } 960 var items = document.querySelectorAll('#i2bz3'); 961 for (var i = 0, len = items.length; i < len; i++) { 962 (function(){ 963 964 /** 965 * This function manages the mouseOver and mouseOut of the element 966 */ 967 const manageMouseOver = (add=true) => { 968 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 969 return; 970 } 971 console.log("manageMouseOver",add); 972 var timer=null; 973 const onmouseenter = () => { 974 if (!timer) { 975 setTimeout(() => { 976 this.classList.remove("noAnime"); 977 console.log("onmouseenter"); 978 }, 50); 979 // if there was no timer and the animation is just run, then add the timer again. 980 timer = setTimeout(() => { 981 console.log("onmouseenter 1"); 982 requestAnimationFrame(() => { 983 console.log("onmouseenter 2"); 984 timer = null; 985 }); 986 }, 100) 987 } 988 } 989 const onmouseleave = () => { 990 requestAnimationFrame(() => { 991 if (!timer && !this.classList.contains("noAnime")) { 992 console.log("onmouseleave"); 993 this.classList.add("noAnime"); 994 timer=null; 995 } 996 }); 997 } 998 if(add){ 999 //this.addEventListener("mouseenter",onmouseenter); 1000 //this.addEventListener("mouseleave",onmouseleave); 1001 this.onmouseenter = onmouseenter; 1002 this.onmouseleave = onmouseleave; 1003 }else{ 1004 //this.removeEventListener("mouseenter",onmouseenter); 1005 //this.removeEventListener("mouseleave",onmouseleave); 1006 this.onmouseenter = null; 1007 this.onmouseleave = null; 1008 } 1009 } 1010 if(this.getAttribute("on-animate")=="1"){ 1011 this.classList.add("noAnime"); 1012 if(this.getAttribute("on-entrance-animate")!="1"){ 1013 manageMouseOver(true); 1014 }else{ 1015 manageMouseOver(false); 1016 } 1017 } 1018 1019 /** 1020 * This function manages the intersection of the element for entracnce animation 1021 */ 1022 const observeIntersection = () => { 1023 // initialize the global timer variable that shall be used at a time. 1024 var timer = null; 1025 var isInView = false;
1026 const iframe = window.frameElement; 1027 const iframeRect = iframe?.getBoundingClientRect() || {}; 1028 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 1029 1030 const callback = (entries) => { 1031 entries.forEach((entry) => { 1032 // Update isInView state 1033 isInView = entry.isIntersecting; 1034 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 1035 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 1036 if(entryRatio < animationTrigger){ 1037 animationTrigger=entryRatio; 1038 } 1039 if (entry.isIntersecting) { 1040 // Element is entering view 1041 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 1042 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 1043 if (!timer && intersectionRatio >= animationTrigger) { 1044 1045 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 1046 let delay = 0; 1047 try{ 1048 delay = delayStr?parseFloat(delayStr):0; 1049 }catch(e){ 1050 delay = 0; 1051 } 1052 setTimeout(() => { 1053 if(this.classList.contains("noAnime")){ 1054 if(delay > 0){ 1055 setTimeout(() => { 1056 this.style.removeProperty('opacity'); 1057 }, delay*1000+10); 1058 }else{ 1059 this.style.removeProperty('opacity'); 1060 } 1061 this.classList.remove("noAnime"); 1062 //console.log("enter",this.getAttribute("id")); 1063 } 1064 }, 50); 1065 // if there was no timer and the animation is just run, then add the timer again. 1066 timer = setTimeout(() => { 1067 //console.log("enter 1",this.getAttribute("id")); 1068 requestAnimationFrame(() => { 1069 //console.log("enter 2",this.getAttribute("id")); 1070 timer = null; 1071 }); 1072 }, delay>0?delay*1000+500:500) 1073 } 1074 } else { 1075 // When element leaves viewport 1076 if (this.getAttribute("on-animate")=="1") { 1077 // Use requestAnimationFrame to check if element is still out of view 1078 requestAnimationFrame(() => { 1079 if (!isInView && !timer) { 1080 this.classList.add("noAnime"); 1081 this.style.opacity = '0'; 1082 } 1083 }); 1084 } 1085 } 1086 }); 1087 }; 1088 1089 const myObserver = new IntersectionObserver(callback, { 1090 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 1091 }); 1092 1093 // Set initial opacity and class 1094 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1095 this.classList.add("noAnime"); 1096 this.style.opacity = '0'; 1097 myObserver.observe(this); 1098 } 1099 } 1100 1101 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1102 observeIntersection(); 1103 } 1104 1105}.bind(items[i]))(); 1106 } 1107 var items = document.querySelectorAll('#i6mh6'); 1108 for (var i = 0, len = items.length; i < len; i++) { 1109 (function(){ 1110 1111 /** 1112 * This function manages the mouseOver and mouseOut of the element 1113 */ 1114 const manageMouseOver = (add=true) => { 1115 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 1116 return; 1117 } 1118 console.log("manageMouseOver",add); 1119 var timer=null; 1120 const onmouseenter = () => { 1121 if (!timer) { 1122 setTimeout(() => { 1123 this.classList.remove("noAnime"); 1124 console.log("onmouseenter"); 1125 }, 50); 1126 // if there was no timer and the animation is just run, then add the timer again. 1127 timer = setTimeout(() => { 1128 console.log("onmouseenter 1"); 1129 requestAnimationFrame(() => { 1130 console.log("onmouseenter 2"); 1131 timer = null; 1132 }); 1133 }, 100) 1134 } 1135 } 1136 const onmouseleave = () => { 1137 requestAnimationFrame(() => { 1138 if (!timer && !this.classList.contains("noAnime")) { 1139 console.log("onmouseleave"); 1140 this.classList.add("noAnime"); 1141 timer=null; 1142 } 1143 }); 1144 } 1145 if(add){ 1146 //this.addEventListener("mouseenter",onmouseenter); 1147 //this.addEventListener("mouseleave",onmouseleave); 1148 this.onmouseenter = onmouseenter; 1149 this.onmouseleave = onmouseleave; 1150 }else{ 1151 //this.removeEventListener("mouseenter",onmouseenter); 1152 //this.removeEventListener("mouseleave",onmouseleave); 1153 this.onmouseenter = null; 1154 this.onmouseleave = null; 1155 } 1156 } 1157 if(this.getAttribute("on-animate")=="1"){ 1158 this.classList.add("noAnime"); 1159 if(this.getAttribute("on-entrance-animate")!="1"){ 1160 manageMouseOver(true); 1161 }else{ 1162 manageMouseOver(false); 1163 } 1164 } 1165 1166 /** 1167 * This function manages the intersection of the element for entracnce animation 1168 */ 1169 const observeIntersection = () => { 1170 // initialize the global timer variable that shall be used at a time. 1171 var timer = null; 1172 var isInView = false;
1173 const iframe = window.frameElement; 1174 const iframeRect = iframe?.getBoundingClientRect() || {}; 1175 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 1176 1177 const callback = (entries) => { 1178 entries.forEach((entry) => { 1179 // Update isInView state 1180 isInView = entry.isIntersecting; 1181 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 1182 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 1183 if(entryRatio < animationTrigger){ 1184 animationTrigger=entryRatio; 1185 } 1186 if (entry.isIntersecting) { 1187 // Element is entering view 1188 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 1189 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 1190 if (!timer && intersectionRatio >= animationTrigger) { 1191 1192 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 1193 let delay = 0; 1194 try{ 1195 delay = delayStr?parseFloat(delayStr):0; 1196 }catch(e){ 1197 delay = 0; 1198 } 1199 setTimeout(() => { 1200 if(this.classList.contains("noAnime")){ 1201 if(delay > 0){ 1202 setTimeout(() => { 1203 this.style.removeProperty('opacity'); 1204 }, delay*1000+10); 1205 }else{ 1206 this.style.removeProperty('opacity'); 1207 } 1208 this.classList.remove("noAnime"); 1209 //console.log("enter",this.getAttribute("id")); 1210 } 1211 }, 50); 1212 // if there was no timer and the animation is just run, then add the timer again. 1213 timer = setTimeout(() => { 1214 //console.log("enter 1",this.getAttribute("id")); 1215 requestAnimationFrame(() => { 1216 //console.log("enter 2",this.getAttribute("id")); 1217 timer = null; 1218 }); 1219 }, delay>0?delay*1000+500:500) 1220 } 1221 } else { 1222 // When element leaves viewport 1223 if (this.getAttribute("on-animate")=="1") { 1224 // Use requestAnimationFrame to check if element is still out of view 1225 requestAnimationFrame(() => { 1226 if (!isInView && !timer) { 1227 this.classList.add("noAnime"); 1228 this.style.opacity = '0'; 1229 } 1230 }); 1231 } 1232 } 1233 }); 1234 }; 1235 1236 const myObserver = new IntersectionObserver(callback, { 1237 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 1238 }); 1239 1240 // Set initial opacity and class 1241 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1242 this.classList.add("noAnime"); 1243 this.style.opacity = '0'; 1244 myObserver.observe(this); 1245 } 1246 } 1247 1248 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1249 observeIntersection(); 1250 } 1251 1252}.bind(items[i]))(); 1253 } 1254 var items = document.querySelectorAll('#izorh'); 1255 for (var i = 0, len = items.length; i < len; i++) { 1256 (function(){ 1257var t1,G=this,q=(t1=this.childNodes[0])===null||t1===void 0?void 0:t1.parentElement;this.getAttribute("data-design-mode")!=="1"&&this.getAttribute("ft-popup")&&this.addEventListener("click",function(C){console.log("item click",G.getAttribute("extra_params")),G.getAttribute("extra_params")&&history.pushState({extraParams:G.getAttribute("extra_params")},""),function(Z){var Q=Z.target;if(Z.target.getAttribute("ft-popup")?Q=Z.target:q!=null&&q.getAttribute("ft-popup")&&(Q=q),Q.getAttribute("ft-popup")){Z.preventDefault();var j=document.getElementById(Q.getAttribute("ft-popup")),L=j==null?void 0:j.getAttribute("ft-change-transition"),H=j==null?void 0:j.getElementsByClassName("popup")[0];H&&(H.style.display="flex"),j&&(L==="top"||L==="bottom"?(j.style.top="0%",j.style.bottom="0%"):L!=="right"&&L!=="left"||(j.style.left="0%",j.style.right="0%"),setTimeout(function(){j.style.display="flex",j.style.opacity="1"},50))}}(C)}) 1258 /** 1259 * This function manages the mouseOver and mouseOut of the element 1260 */ 1261 const manageMouseOver = (add=true) => { 1262 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 1263 return; 1264 } 1265 console.log("manageMouseOver",add); 1266 var timer=null; 1267 const onmouseenter = () => { 1268 if (!timer) { 1269 setTimeout(() => { 1270 this.classList.remove("noAnime"); 1271 console.log("onmouseenter"); 1272 }, 50); 1273 // if there was no timer and the animation is just run, then add the timer again. 1274 timer = setTimeout(() => { 1275 console.log("onmouseenter 1"); 1276 requestAnimationFrame(() => { 1277 console.log("onmouseenter 2"); 1278 timer = null; 1279 }); 1280 }, 100) 1281 } 1282 } 1283 const onmouseleave = () => { 1284 requestAnimationFrame(() => { 1285 if (!timer && !this.classList.contains("noAnime")) { 1286 console.log("onmouseleave"); 1287 this.classList.add("noAnime"); 1288 timer=null; 1289 } 1290 }); 1291 } 1292 if(add){ 1293 //this.addEventListener("mouseenter",onmouseenter); 1294 //this.addEventListener("mouseleave",onmouseleave); 1295 this.onmouseenter = onmouseenter; 1296 this.onmouseleave = onmouseleave; 1297 }else{ 1298 //this.removeEventListener("mouseenter",onmouseenter); 1299 //this.removeEventListener("mouseleave",onmouseleave); 1300 this.onmouseenter = null; 1301 this.onmouseleave = null; 1302 } 1303 } 1304 if(this.getAttribute("on-animate")=="1"){ 1305 this.classList.add("noAnime"); 1306 if(this.getAttribute("on-entrance-animate")!="1"){ 1307 manageMouseOver(true); 1308 }else{ 1309 manageMouseOver(false); 1310 } 1311 } 1312 1313 /** 1314 * This function manages the intersection of the element for entracnce animation 1315 */ 1316 const observeIntersection = () => { 1317 // initialize the global timer variable that shall be used at a time. 1318 var timer = null; 1319 var isInView = false;
1320 const iframe = window.frameElement; 1321 const iframeRect = iframe?.getBoundingClientRect() || {}; 1322 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 1323 1324 const callback = (entries) => { 1325 entries.forEach((entry) => { 1326 // Update isInView state 1327 isInView = entry.isIntersecting; 1328 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 1329 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 1330 if(entryRatio < animationTrigger){ 1331 animationTrigger=entryRatio; 1332 } 1333 if (entry.isIntersecting) { 1334 // Element is entering view 1335 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 1336 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 1337 if (!timer && intersectionRatio >= animationTrigger) { 1338 1339 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 1340 let delay = 0; 1341 try{ 1342 delay = delayStr?parseFloat(delayStr):0; 1343 }catch(e){ 1344 delay = 0; 1345 } 1346 setTimeout(() => { 1347 if(this.classList.contains("noAnime")){ 1348 if(delay > 0){ 1349 setTimeout(() => { 1350 this.style.removeProperty('opacity'); 1351 }, delay*1000+10); 1352 }else{ 1353 this.style.removeProperty('opacity'); 1354 } 1355 this.classList.remove("noAnime"); 1356 //console.log("enter",this.getAttribute("id")); 1357 } 1358 }, 50); 1359 // if there was no timer and the animation is just run, then add the timer again. 1360 timer = setTimeout(() => { 1361 //console.log("enter 1",this.getAttribute("id")); 1362 requestAnimationFrame(() => { 1363 //console.log("enter 2",this.getAttribute("id")); 1364 timer = null; 1365 }); 1366 }, delay>0?delay*1000+500:500) 1367 } 1368 } else { 1369 // When element leaves viewport 1370 if (this.getAttribute("on-animate")=="1") { 1371 // Use requestAnimationFrame to check if element is still out of view 1372 requestAnimationFrame(() => { 1373 if (!isInView && !timer) { 1374 this.classList.add("noAnime"); 1375 this.style.opacity = '0'; 1376 } 1377 }); 1378 } 1379 } 1380 }); 1381 }; 1382 1383 const myObserver = new IntersectionObserver(callback, { 1384 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 1385 }); 1386 1387 // Set initial opacity and class 1388 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1389 this.classList.add("noAnime"); 1390 this.style.opacity = '0'; 1391 myObserver.observe(this); 1392 } 1393 } 1394 1395 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1396 observeIntersection(); 1397 } 1398 1399}.bind(items[i]))(); 1400 } 1401 var items = document.querySelectorAll('#i4ypg'); 1402 for (var i = 0, len = items.length; i < len; i++) { 1403 (function(){ 1404var w=this,_=window,F=function(a1){console.log("erappper is",a1);var J=a1==null?void 0:a1.getAttribute("ft-change-transition"),S1=a1==null?void 0:a1.getElementsByClassName("popup")[0];S1&&(S1.style.display="flex"),a1&&(J==="top"||J==="bottom"?(a1.style.top="0%",a1.style.bottom="0%"):J!=="right"&&J!=="left"||(a1.style.left="0%",a1.style.right="0%"),setTimeout(function(){a1.style.display="flex",a1.style.opacity="1"},50))},e1=function(a1,J,S1,I1){var j1="",Y=24*S1*60*60*1e3;if(I1==="day"?Y=24*S1*60*60*1e3:I1==="hour"?Y=60*S1*60*1e3:I1==="minute"&&(Y=60*S1*1e3),S1){var l1=new Date;l1.setTime(l1.getTime()+Y),j1="; expires="+l1.toUTCString()}console.log("i am set cookie"),document.cookie=a1+"="+(J||"")+j1+";; Path=/;"},i1=function(a1){document.cookie=a1+"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;"},I=function(a1){return document.cookie.split("; ").reduce(function(J,S1){var I1=S1.split("=");
1404return I1[0]===a1?decodeURIComponent(I1[1]):J},"")},E=w.getAttribute("exitIntend"),K=w.getAttribute("scrollDepth"),x=w.getAttribute("scrollUnit"),g1=w.getAttribute("duration"),p1=window.location.href.includes("/preview/"),m1=function(a1,J){var S1=w.getAttribute("exitIntend");(S1||S1===0)&&!a1.toElement&&!a1.relatedTarget&&a1.clientY<10&&J&&(I("exitIntentShown"+J.id)||(F(J),e1("exitIntentShown"+J.id,!0,parseFloat(E),g1)))},v1=function(a1){if(w.getAttribute("scrollDepth")!==null){var J=window.scrollY,S1=window.document.documentElement,I1=window.document.body,j1="scrollTop",Y="scrollHeight",l1=(S1[j1]||I1[j1])/((S1[Y]||I1[Y])-S1.clientHeight)*100;x==="%"?Math.floor(l1)!==parseFloat(K)&&Math.ceil(l1)!==parseFloat(K)||I("scrollDepth"+w.id)||(F(w),e1("scrollDepth"+w.id,!0,parseFloat(E),g1)):Math.floor(J)!==parseFloat(K)&&Math.ceil(J)!==parseFloat(K)||I("scrollDepth"+w.id)||(F(w),e1("scrollDepth"+w.id,!0,parseFloat(E),g1))}};p1&&(I("scrollDepth"+w.id)&&i1("scrollDepth"+w.id),I("exitIntentShown"+w.id)&&i1("exitIntentShown"+w.id)),this.getAttribute("data-design-mode")!="1"&&(console.log("wrapper add click event",this.getAttribute("id")),this.addEventListener("click",function(a1){var J,S1,I1;S1=(J=w).querySelector(".popup"),I1=J.getAttribute("ft-change-transition"),setTimeout(function(){I1==="top"?(J.style.top="-100%",J.style.bottom="100%"):I1==="right"?(J.style.left="100%",J.style.right="-100%"):I1==="bottom"?(J.style.top="100%",J.style.bottom="-100%"):I1==="left"&&(J.style.left="-100%",J.style.right="100%"),J.style.opacity="0",console.log("wrapper 2",J,J.style)},50),setTimeout(function(){S1&&(S1.style.display="none")},250)}),E&&!K?setTimeout(function(){window.addEventListener("mouseout",function(a1){return m1(a1,w)},!1)},1e3):K&&!E?(window.removeEventListener("mouseout",function(a1){return m1(a1,w)},!1),_.addEventListener("scroll",v1)):K&&E&&(setTimeout(function(){window.addEventListener("mouseout",function(a1){return m1(a1,w)},!1)},1e3),_.addEventListener("scroll",v1))) 1405 /** 1406 * This function manages the mouseOver and mouseOut of the element 1407 */ 1408 const manageMouseOver = (add=true) => { 1409 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 1410 return; 1411 } 1412 console.log("manageMouseOver",add); 1413 var timer=null; 1414 const onmouseenter = () => { 1415 if (!timer) { 1416 setTimeout(() => { 1417 this.classList.remove("noAnime"); 1418 console.log("onmouseenter"); 1419 }, 50); 1420 // if there was no timer and the animation is just run, then add the timer again. 1421 timer = setTimeout(() => { 1422 console.log("onmouseenter 1"); 1423 requestAnimationFrame(() => { 1424 console.log("onmouseenter 2"); 1425 timer = null; 1426 }); 1427 }, 100) 1428 } 1429 } 1430 const onmouseleave = () => { 1431 requestAnimationFrame(() => { 1432 if (!timer && !this.classList.contains("noAnime")) { 1433 console.log("onmouseleave"); 1434 this.classList.add("noAnime"); 1435 timer=null; 1436 } 1437 }); 1438 } 1439 if(add){ 1440 //this.addEventListener("mouseenter",onmouseenter); 1441 //this.addEventListener("mouseleave",onmouseleave); 1442 this.onmouseenter = onmouseenter; 1443 this.onmouseleave = onmouseleave; 1444 }else{ 1445 //this.removeEventListener("mouseenter",onmouseenter); 1446 //this.removeEventListener("mouseleave",onmouseleave); 1447 this.onmouseenter = null; 1448 this.onmouseleave = null; 1449 } 1450 } 1451 if(this.getAttribute("on-animate")=="1"){ 1452 this.classList.add("noAnime"); 1453 if(this.getAttribute("on-entrance-animate")!="1"){ 1454 manageMouseOver(true); 1455 }else{ 1456 manageMouseOver(false); 1457 } 1458 } 1459 1460 /** 1461 * This function manages the intersection of the element for entracnce animation 1462 */ 1463 const observeIntersection = () => { 1464 // initialize the global timer variable that shall be used at a time. 1465 var timer = null; 1466 var isInView = false; 1467 const iframe = window.frameElement; 1468 const iframeRect = iframe?.getBoundingClientRect() || {}; 1469 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 1470 1471 const callback = (entries) => {
1472 entries.forEach((entry) => { 1473 // Update isInView state 1474 isInView = entry.isIntersecting; 1475 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 1476 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 1477 if(entryRatio < animationTrigger){ 1478 animationTrigger=entryRatio; 1479 } 1480 if (entry.isIntersecting) { 1481 // Element is entering view 1482 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 1483 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 1484 if (!timer && intersectionRatio >= animationTrigger) { 1485 1486 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 1487 let delay = 0; 1488 try{ 1489 delay = delayStr?parseFloat(delayStr):0; 1490 }catch(e){ 1491 delay = 0; 1492 } 1493 setTimeout(() => { 1494 if(this.classList.contains("noAnime")){ 1495 if(delay > 0){ 1496 setTimeout(() => { 1497 this.style.removeProperty('opacity'); 1498 }, delay*1000+10); 1499 }else{ 1500 this.style.removeProperty('opacity'); 1501 } 1502 this.classList.remove("noAnime"); 1503 //console.log("enter",this.getAttribute("id")); 1504 } 1505 }, 50); 1506 // if there was no timer and the animation is just run, then add the timer again. 1507 timer = setTimeout(() => { 1508 //console.log("enter 1",this.getAttribute("id")); 1509 requestAnimationFrame(() => { 1510 //console.log("enter 2",this.getAttribute("id")); 1511 timer = null; 1512 }); 1513 }, delay>0?delay*1000+500:500) 1514 } 1515 } else { 1516 // When element leaves viewport 1517 if (this.getAttribute("on-animate")=="1") { 1518 // Use requestAnimationFrame to check if element is still out of view 1519 requestAnimationFrame(() => { 1520 if (!isInView && !timer) { 1521 this.classList.add("noAnime"); 1522 this.style.opacity = '0'; 1523 } 1524 }); 1525 } 1526 } 1527 }); 1528 }; 1529 1530 const myObserver = new IntersectionObserver(callback, { 1531 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 1532 }); 1533 1534 // Set initial opacity and class 1535 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1536 this.classList.add("noAnime"); 1537 this.style.opacity = '0'; 1538 myObserver.observe(this); 1539 } 1540 } 1541 1542 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1543 observeIntersection(); 1544 } 1545 1546}.bind(items[i]))(); 1547 } 1548 var items = document.querySelectorAll('#iq4yy'); 1549 for (var i = 0, len = items.length; i < len; i++) { 1550 (function(){ 1551var s=this;s.getAttribute("data-design-mode")!="1"&&this.addEventListener("click",function(b){console.log("popup click",b),s==b.target&&(b.preventDefault(),b.stopPropagation()),b.cancelBubble=!0});var d=this,m=d.getAttribute("ft-auto-popup");console.log("autoPopup",m),m=="Yes"&&setTimeout(function(){var b=d.closest(".popup-wrapper");if(b){var k=b==null?void 0:b.getAttribute("ft-change-transition");d&&(d.style.display="flex"),b&&(k==="top"||k==="bottom"?(b.style.top="0%",b.style.bottom="0%"):k!=="right"&&k!=="left"||(b.style.left="0%",b.style.right="0%"),setTimeout(function(){b.style.display="flex",b.style.opacity="1"},50))}},1e3) 1552 /** 1553 * This function manages the mouseOver and mouseOut of the element 1554 */ 1555 const manageMouseOver = (add=true) => { 1556 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 1557 return; 1558 } 1559 console.log("manageMouseOver",add); 1560 var timer=null; 1561 const onmouseenter = () => { 1562 if (!timer) { 1563 setTimeout(() => { 1564 this.classList.remove("noAnime"); 1565 console.log("onmouseenter"); 1566 }, 50); 1567 // if there was no timer and the animation is just run, then add the timer again. 1568 timer = setTimeout(() => { 1569 console.log("onmouseenter 1"); 1570 requestAnimationFrame(() => { 1571 console.log("onmouseenter 2"); 1572 timer = null; 1573 }); 1574 }, 100) 1575 } 1576 } 1577 const onmouseleave = () => { 1578 requestAnimationFrame(() => { 1579 if (!timer && !this.classList.contains("noAnime")) { 1580 console.log("onmouseleave"); 1581 this.classList.add("noAnime"); 1582 timer=null; 1583 } 1584 }); 1585 } 1586 if(add){ 1587 //this.addEventListener("mouseenter",onmouseenter); 1588 //this.addEventListener("mouseleave",onmouseleave); 1589 this.onmouseenter = onmouseenter; 1590 this.onmouseleave = onmouseleave; 1591 }else{ 1592 //this.removeEventListener("mouseenter",onmouseenter); 1593 //this.removeEventListener("mouseleave",onmouseleave); 1594 this.onmouseenter = null; 1595 this.onmouseleave = null; 1596 } 1597 } 1598 if(this.getAttribute("on-animate")=="1"){ 1599 this.classList.add("noAnime"); 1600 if(this.getAttribute("on-entrance-animate")!="1"){ 1601 manageMouseOver(true); 1602 }else{ 1603 manageMouseOver(false); 1604 } 1605 } 1606 1607 /** 1608 * This function manages the intersection of the element for entracnce animation 1609 */ 1610 const observeIntersection = () => { 1611 // initialize the global timer variable that shall be used at a time. 1612 var timer = null; 1613 var isInView = false;
1614 const iframe = window.frameElement; 1615 const iframeRect = iframe?.getBoundingClientRect() || {}; 1616 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 1617 1618 const callback = (entries) => { 1619 entries.forEach((entry) => { 1620 // Update isInView state 1621 isInView = entry.isIntersecting; 1622 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 1623 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 1624 if(entryRatio < animationTrigger){ 1625 animationTrigger=entryRatio; 1626 } 1627 if (entry.isIntersecting) { 1628 // Element is entering view 1629 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 1630 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 1631 if (!timer && intersectionRatio >= animationTrigger) { 1632 1633 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 1634 let delay = 0; 1635 try{ 1636 delay = delayStr?parseFloat(delayStr):0; 1637 }catch(e){ 1638 delay = 0; 1639 } 1640 setTimeout(() => { 1641 if(this.classList.contains("noAnime")){ 1642 if(delay > 0){ 1643 setTimeout(() => { 1644 this.style.removeProperty('opacity'); 1645 }, delay*1000+10); 1646 }else{ 1647 this.style.removeProperty('opacity'); 1648 } 1649 this.classList.remove("noAnime"); 1650 //console.log("enter",this.getAttribute("id")); 1651 } 1652 }, 50); 1653 // if there was no timer and the animation is just run, then add the timer again. 1654 timer = setTimeout(() => { 1655 //console.log("enter 1",this.getAttribute("id")); 1656 requestAnimationFrame(() => { 1657 //console.log("enter 2",this.getAttribute("id")); 1658 timer = null; 1659 }); 1660 }, delay>0?delay*1000+500:500) 1661 } 1662 } else { 1663 // When element leaves viewport 1664 if (this.getAttribute("on-animate")=="1") { 1665 // Use requestAnimationFrame to check if element is still out of view 1666 requestAnimationFrame(() => { 1667 if (!isInView && !timer) { 1668 this.classList.add("noAnime"); 1669 this.style.opacity = '0'; 1670 } 1671 }); 1672 } 1673 } 1674 }); 1675 }; 1676 1677 const myObserver = new IntersectionObserver(callback, { 1678 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 1679 }); 1680 1681 // Set initial opacity and class 1682 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1683 this.classList.add("noAnime"); 1684 this.style.opacity = '0'; 1685 myObserver.observe(this); 1686 } 1687 } 1688 1689 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1690 observeIntersection(); 1691 } 1692 1693}.bind(items[i]))(); 1694 } 1695 var props = {"idjtq":{}}; 1696 var ids = Object.keys(props).map(function(id) { return '#'+id }).join(','); 1697 var els = document.querySelectorAll(ids); 1698 for (var i = 0, len = els.length; i < len; i++) { 1699 var el = els[i]; 1700 (function $y(o){var n=this.parentNode.parentNode,r=n.getElementsByClassName("popup"),a=r.length>0?r[0]:null;this.getAttribute("data-design-mode")!=="1"&&this.addEventListener("click",function(){if(a){var c=n.getAttribute("ft-change-transition");setTimeout(function(){c==="top"?(n.style.top="-100%",n.style.bottom="100%"):c==="right"?(n.style.left="100%",n.style.right="-100%"):c==="bottom"?(n.style.top="100%",n.style.bottom="-100%"):c==="left"&&(n.style.left="-100%",n.style.right="100%"),n.style.opacity="0"},50),setTimeout(function(){a.style.display="none"},250)}}) 1701 /** 1702 * This function manages the mouseOver and mouseOut of the element 1703 */ 1704 const manageMouseOver = (add=true) => { 1705 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 1706 return; 1707 } 1708 console.log("manageMouseOver",add); 1709 var timer=null; 1710 const onmouseenter = () => { 1711 if (!timer) { 1712 setTimeout(() => { 1713 this.classList.remove("noAnime"); 1714 console.log("onmouseenter"); 1715 }, 50); 1716 // if there was no timer and the animation is just run, then add the timer again. 1717 timer = setTimeout(() => { 1718 console.log("onmouseenter 1"); 1719 requestAnimationFrame(() => { 1720 console.log("onmouseenter 2"); 1721 timer = null; 1722 }); 1723 }, 100) 1724 } 1725 } 1726 const onmouseleave = () => { 1727 requestAnimationFrame(() => { 1728 if (!timer && !this.classList.contains("noAnime")) { 1729 console.log("onmouseleave"); 1730 this.classList.add("noAnime"); 1731 timer=null; 1732 } 1733 }); 1734 } 1735 if(add){ 1736 //this.addEventListener("mouseenter",onmouseenter); 1737 //this.addEventListener("mouseleave",onmouseleave); 1738 this.onmouseenter = onmouseenter; 1739 this.onmouseleave = onmouseleave; 1740 }else{ 1741 //this.removeEventListener("mouseenter",onmouseenter); 1742 //this.removeEventListener("mouseleave",onmouseleave); 1743 this.onmouseenter = null; 1744 this.onmouseleave = null; 1745 } 1746 } 1747 if(this.getAttribute("on-animate")=="1"){ 1748 this.classList.add("noAnime"); 1749 if(this.getAttribute("on-entrance-animate")!="1"){ 1750 manageMouseOver(true); 1751 }else{ 1752 manageMouseOver(false); 1753 } 1754 } 1755 1756 /** 1757 * This function manages the intersection of the element for entracnce animation 1758 */ 1759 const observeIntersection = () => { 1760 // initialize the global timer variable that shall be used at a time. 1761 var timer = null; 1762 var isInView = false;
1763 const iframe = window.frameElement; 1764 const iframeRect = iframe?.getBoundingClientRect() || {}; 1765 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 1766 1767 const callback = (entries) => { 1768 entries.forEach((entry) => { 1769 // Update isInView state 1770 isInView = entry.isIntersecting; 1771 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 1772 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 1773 if(entryRatio < animationTrigger){ 1774 animationTrigger=entryRatio; 1775 } 1776 if (entry.isIntersecting) { 1777 // Element is entering view 1778 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 1779 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 1780 if (!timer && intersectionRatio >= animationTrigger) { 1781 1782 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 1783 let delay = 0; 1784 try{ 1785 delay = delayStr?parseFloat(delayStr):0; 1786 }catch(e){ 1787 delay = 0; 1788 } 1789 setTimeout(() => { 1790 if(this.classList.contains("noAnime")){ 1791 if(delay > 0){ 1792 setTimeout(() => { 1793 this.style.removeProperty('opacity'); 1794 }, delay*1000+10); 1795 }else{ 1796 this.style.removeProperty('opacity'); 1797 } 1798 this.classList.remove("noAnime"); 1799 //console.log("enter",this.getAttribute("id")); 1800 } 1801 }, 50); 1802 // if there was no timer and the animation is just run, then add the timer again. 1803 timer = setTimeout(() => { 1804 //console.log("enter 1",this.getAttribute("id")); 1805 requestAnimationFrame(() => { 1806 //console.log("enter 2",this.getAttribute("id")); 1807 timer = null; 1808 }); 1809 }, delay>0?delay*1000+500:500) 1810 } 1811 } else { 1812 // When element leaves viewport 1813 if (this.getAttribute("on-animate")=="1") { 1814 // Use requestAnimationFrame to check if element is still out of view 1815 requestAnimationFrame(() => { 1816 if (!isInView && !timer) { 1817 this.classList.add("noAnime"); 1818 this.style.opacity = '0'; 1819 } 1820 }); 1821 } 1822 } 1823 }); 1824 }; 1825 1826 const myObserver = new IntersectionObserver(callback, { 1827 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 1828 }); 1829 1830 // Set initial opacity and class 1831 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1832 this.classList.add("noAnime"); 1833 this.style.opacity = '0'; 1834 myObserver.observe(this); 1835 } 1836 } 1837 1838 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1839 observeIntersection(); 1840 } 1841}.bind(el))(props[el.id]); 1842 } 1843 var items = document.querySelectorAll('#ipiri, #i5dno'); 1844 for (var i = 0, len = items.length; i < len; i++) { 1845 (function(){ 1846var t1,G=this,q=(t1=this.childNodes[0])===null||t1===void 0?void 0:t1.parentElement;this.getAttribute("data-design-mode")!=="1"&&this.getAttribute("ft-popup")&&this.addEventListener("click",function(C){console.log("item click",G.getAttribute("extra_params")),G.getAttribute("extra_params")&&history.pushState({extraParams:G.getAttribute("extra_params")},""),function(Z){var Q=Z.target;if(Z.target.getAttribute("ft-popup")?Q=Z.target:q!=null&&q.getAttribute("ft-popup")&&(Q=q),Q.getAttribute("ft-popup")){Z.preventDefault();var j=document.getElementById(Q.getAttribute("ft-popup")),L=j==null?void 0:j.getAttribute("ft-change-transition"),H=j==null?void 0:j.getElementsByClassName("popup")[0];H&&(H.style.display="flex"),j&&(L==="top"||L==="bottom"?(j.style.top="0%",j.style.bottom="0%"):L!=="right"&&L!=="left"||(j.style.left="0%",j.style.right="0%"),setTimeout(function(){j.style.display="flex",j.style.opacity="1"},50))}}(C)}) 1847 /** 1848 * This function manages the mouseOver and mouseOut of the element 1849 */ 1850 const manageMouseOver = (add=true) => { 1851 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 1852 return; 1853 } 1854 console.log("manageMouseOver",add); 1855 var timer=null; 1856 const onmouseenter = () => { 1857 if (!timer) { 1858 setTimeout(() => { 1859 this.classList.remove("noAnime"); 1860 console.log("onmouseenter"); 1861 }, 50); 1862 // if there was no timer and the animation is just run, then add the timer again. 1863 timer = setTimeout(() => { 1864 console.log("onmouseenter 1"); 1865 requestAnimationFrame(() => { 1866 console.log("onmouseenter 2"); 1867 timer = null; 1868 }); 1869 }, 100) 1870 } 1871 } 1872 const onmouseleave = () => { 1873 requestAnimationFrame(() => { 1874 if (!timer && !this.classList.contains("noAnime")) { 1875 console.log("onmouseleave"); 1876 this.classList.add("noAnime"); 1877 timer=null; 1878 } 1879 }); 1880 } 1881 if(add){ 1882 //this.addEventListener("mouseenter",onmouseenter); 1883 //this.addEventListener("mouseleave",onmouseleave); 1884 this.onmouseenter = onmouseenter; 1885 this.onmouseleave = onmouseleave; 1886 }else{ 1887 //this.removeEventListener("mouseenter",onmouseenter); 1888 //this.removeEventListener("mouseleave",onmouseleave); 1889 this.onmouseenter = null; 1890 this.onmouseleave = null; 1891 } 1892 } 1893 if(this.getAttribute("on-animate")=="1"){ 1894 this.classList.add("noAnime"); 1895 if(this.getAttribute("on-entrance-animate")!="1"){ 1896 manageMouseOver(true); 1897 }else{ 1898 manageMouseOver(false); 1899 } 1900 } 1901 1902 /** 1903 * This function manages the intersection of the element for entracnce animation 1904 */ 1905 const observeIntersection = () => { 1906 // initialize the global timer variable that shall be used at a time. 1907 var timer = null; 1908 var isInView = false;
1909 const iframe = window.frameElement; 1910 const iframeRect = iframe?.getBoundingClientRect() || {}; 1911 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 1912 1913 const callback = (entries) => { 1914 entries.forEach((entry) => { 1915 // Update isInView state 1916 isInView = entry.isIntersecting; 1917 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 1918 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 1919 if(entryRatio < animationTrigger){ 1920 animationTrigger=entryRatio; 1921 } 1922 if (entry.isIntersecting) { 1923 // Element is entering view 1924 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 1925 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 1926 if (!timer && intersectionRatio >= animationTrigger) { 1927 1928 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 1929 let delay = 0; 1930 try{ 1931 delay = delayStr?parseFloat(delayStr):0; 1932 }catch(e){ 1933 delay = 0; 1934 } 1935 setTimeout(() => { 1936 if(this.classList.contains("noAnime")){ 1937 if(delay > 0){ 1938 setTimeout(() => { 1939 this.style.removeProperty('opacity'); 1940 }, delay*1000+10); 1941 }else{ 1942 this.style.removeProperty('opacity'); 1943 } 1944 this.classList.remove("noAnime"); 1945 //console.log("enter",this.getAttribute("id")); 1946 } 1947 }, 50); 1948 // if there was no timer and the animation is just run, then add the timer again. 1949 timer = setTimeout(() => { 1950 //console.log("enter 1",this.getAttribute("id")); 1951 requestAnimationFrame(() => { 1952 //console.log("enter 2",this.getAttribute("id")); 1953 timer = null; 1954 }); 1955 }, delay>0?delay*1000+500:500) 1956 } 1957 } else { 1958 // When element leaves viewport 1959 if (this.getAttribute("on-animate")=="1") { 1960 // Use requestAnimationFrame to check if element is still out of view 1961 requestAnimationFrame(() => { 1962 if (!isInView && !timer) { 1963 this.classList.add("noAnime"); 1964 this.style.opacity = '0'; 1965 } 1966 }); 1967 } 1968 } 1969 }); 1970 }; 1971 1972 const myObserver = new IntersectionObserver(callback, { 1973 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 1974 }); 1975 1976 // Set initial opacity and class 1977 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1978 this.classList.add("noAnime"); 1979 this.style.opacity = '0'; 1980 myObserver.observe(this); 1981 } 1982 } 1983 1984 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 1985 observeIntersection(); 1986 } 1987 1988}.bind(items[i]))(); 1989 } 1990 var items = document.querySelectorAll('#iao4x'); 1991 for (var i = 0, len = items.length; i < len; i++) { 1992 (function(){ 1993 1994 /** 1995 * This function manages the mouseOver and mouseOut of the element 1996 */ 1997 const manageMouseOver = (add=true) => { 1998 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 1999 return; 2000 } 2001 console.log("manageMouseOver",add); 2002 var timer=null; 2003 const onmouseenter = () => { 2004 if (!timer) { 2005 setTimeout(() => { 2006 this.classList.remove("noAnime"); 2007 console.log("onmouseenter"); 2008 }, 50); 2009 // if there was no timer and the animation is just run, then add the timer again. 2010 timer = setTimeout(() => { 2011 console.log("onmouseenter 1"); 2012 requestAnimationFrame(() => { 2013 console.log("onmouseenter 2"); 2014 timer = null; 2015 }); 2016 }, 100) 2017 } 2018 } 2019 const onmouseleave = () => { 2020 requestAnimationFrame(() => { 2021 if (!timer && !this.classList.contains("noAnime")) { 2022 console.log("onmouseleave"); 2023 this.classList.add("noAnime"); 2024 timer=null; 2025 } 2026 }); 2027 } 2028 if(add){ 2029 //this.addEventListener("mouseenter",onmouseenter); 2030 //this.addEventListener("mouseleave",onmouseleave); 2031 this.onmouseenter = onmouseenter; 2032 this.onmouseleave = onmouseleave; 2033 }else{ 2034 //this.removeEventListener("mouseenter",onmouseenter); 2035 //this.removeEventListener("mouseleave",onmouseleave); 2036 this.onmouseenter = null; 2037 this.onmouseleave = null; 2038 } 2039 } 2040 if(this.getAttribute("on-animate")=="1"){ 2041 this.classList.add("noAnime"); 2042 if(this.getAttribute("on-entrance-animate")!="1"){ 2043 manageMouseOver(true); 2044 }else{ 2045 manageMouseOver(false); 2046 } 2047 } 2048 2049 /** 2050 * This function manages the intersection of the element for entracnce animation 2051 */ 2052 const observeIntersection = () => { 2053 // initialize the global timer variable that shall be used at a time. 2054 var timer = null; 2055 var isInView = false;
2056 const iframe = window.frameElement; 2057 const iframeRect = iframe?.getBoundingClientRect() || {}; 2058 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 2059 2060 const callback = (entries) => { 2061 entries.forEach((entry) => { 2062 // Update isInView state 2063 isInView = entry.isIntersecting; 2064 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 2065 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 2066 if(entryRatio < animationTrigger){ 2067 animationTrigger=entryRatio; 2068 } 2069 if (entry.isIntersecting) { 2070 // Element is entering view 2071 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 2072 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 2073 if (!timer && intersectionRatio >= animationTrigger) { 2074 2075 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 2076 let delay = 0; 2077 try{ 2078 delay = delayStr?parseFloat(delayStr):0; 2079 }catch(e){ 2080 delay = 0; 2081 } 2082 setTimeout(() => { 2083 if(this.classList.contains("noAnime")){ 2084 if(delay > 0){ 2085 setTimeout(() => { 2086 this.style.removeProperty('opacity'); 2087 }, delay*1000+10); 2088 }else{ 2089 this.style.removeProperty('opacity'); 2090 } 2091 this.classList.remove("noAnime"); 2092 //console.log("enter",this.getAttribute("id")); 2093 } 2094 }, 50); 2095 // if there was no timer and the animation is just run, then add the timer again. 2096 timer = setTimeout(() => { 2097 //console.log("enter 1",this.getAttribute("id")); 2098 requestAnimationFrame(() => { 2099 //console.log("enter 2",this.getAttribute("id")); 2100 timer = null; 2101 }); 2102 }, delay>0?delay*1000+500:500) 2103 } 2104 } else { 2105 // When element leaves viewport 2106 if (this.getAttribute("on-animate")=="1") { 2107 // Use requestAnimationFrame to check if element is still out of view 2108 requestAnimationFrame(() => { 2109 if (!isInView && !timer) { 2110 this.classList.add("noAnime"); 2111 this.style.opacity = '0'; 2112 } 2113 }); 2114 } 2115 } 2116 }); 2117 }; 2118 2119 const myObserver = new IntersectionObserver(callback, { 2120 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 2121 }); 2122 2123 // Set initial opacity and class 2124 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2125 this.classList.add("noAnime"); 2126 this.style.opacity = '0'; 2127 myObserver.observe(this); 2128 } 2129 } 2130 2131 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2132 observeIntersection(); 2133 } 2134 2135}.bind(items[i]))(); 2136 } 2137 var props = {"iaqsi":{"input_id":"guav00","form_id":"ohqsbi","jsVersion":"","isDevJs":1}}; 2138 var ids = Object.keys(props).map(function(id) { return '#'+id }).join(','); 2139 var els = document.querySelectorAll(ids); 2140 for (var i = 0, len = els.length; i < len; i++) { 2141 var el = els[i]; 2142 (function(u){var m=u.input_id,l=u.form_id,i=this.id;console.log("form script",i);var h=this,f=window.jsVersion?window.jsVersion:u.jsVersion?u.jsVersion:"",c=window.isDevJs?window.isDevJs:u.isDevJs?u.isDevJs:"";window._crmcoFormInitialized||(window._crmcoFormInitialized={});var k=function(){if(window._crmcoFormInitialized[i]){console.log("Form already initialized for element:",i);return}console.log("initFormLib");var x={inputId:m,formId:l,jsVersion:f,designerMode:h.getAttribute("data-designer-mode")=="1",isDevJs:c,elementId:i};typeof window.initCrmcoEmbedForm=="function"?(console.log("initFormLib 1"),window.initCrmcoEmbedForm(h,x),window._crmcoFormInitialized[i]=!0):typeof initCrmcoEmbedForm!="undefined"&&(console.log("initFormLib 2"),initCrmcoEmbedForm(h,x),window._crmcoFormInitialized[i]=!0)},I=function(){var x=document.createElement("link");x.setAttribute("id","crmco-form-theme-default-style"),x.setAttribute("rel","stylesheet"),x.setAttribute("charset","utf-8"),x.setAttribute("media","all"),x.setAttribute("type","text/css"),x.href="".concat("","/resources/assets/site/form-themes/default.min.css"),document.head.prepend(x);var C=document.createElement("script");C.onload=k,C.onerror=function(){console.error("Failed to load form script, retrying..."),setTimeout(function(){var Y=document.createElement("script");Y.onload=k,Y.async=!1,Y.id="crmco-form-js-retry",Y.src="".concat("","/resources/assets/site/forms/crmco-form.js").concat(f||""),document.head.appendChild(Y)},1e3)},C.async=!1,C.id="crmco-form-js",C.src="".concat("","/resources/assets/site/forms/crmco-form.js").concat(f||""),document.head.appendChild(C)};
2142if(console.log("crmcoFormLoad",typeof initCrmcoEmbedForm=="undefined",typeof window.initCrmcoEmbedForm=="undefined"),typeof initCrmcoEmbedForm=="undefined"&&typeof window.initCrmcoEmbedForm=="undefined"){console.log("crmcoFormLoad 0",document.readyState);var p=document.querySelector('script[src*="cloudflare"]')!==null||document.querySelector('script[src*="cf"]')!==null||document.querySelector('script[src*="cdn-cgi"]')!==null;console.log("Is Cloudflare detected:",p);var L=function d(){console.log("loadForm called"),document.body.contains(h)?I():(console.log("Element not in DOM yet, waiting..."),setTimeout(d,100))};if(document.readyState==="loading"){console.log("crmcoFormLoad 0.1"),L();var y=new MutationObserver(function(d,x){document.body.contains(h)&&(console.log("Element found via MutationObserver"),L(),x.disconnect())});y.observe(document.body,{childList:!0,subtree:!0});var V=["DOMContentLoaded","load"],$=[window,document];V.forEach(function(d){$.forEach(function(x){x.addEventListener(d,function(){console.log("".concat(d," fired on ").concat(x===window?"window":"document")),L()})})});var G=0,ee=50,_=setInterval(function(){G++,document.body.contains(h)?(console.log("Element found via polling"),L(),clearInterval(_)):G>=ee&&(console.log("Max polling attempts reached"),clearInterval(_))},100)}else console.log("crmcoFormLoad 1"),L();setTimeout(function(){typeof initCrmcoEmbedForm=="undefined"&&typeof window.initCrmcoEmbedForm=="undefined"&&(console.log("Fallback: Form not loaded yet, trying again..."),L())},2e3)}else console.log("crmcoFormLoad 3"),k() 2143 /** 2144 * This function manages the mouseOver and mouseOut of the element 2145 */ 2146 const manageMouseOver = (add=true) => { 2147 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 2148 return; 2149 } 2150 console.log("manageMouseOver",add); 2151 var timer=null; 2152 const onmouseenter = () => { 2153 if (!timer) { 2154 setTimeout(() => { 2155 this.classList.remove("noAnime"); 2156 console.log("onmouseenter"); 2157 }, 50); 2158 // if there was no timer and the animation is just run, then add the timer again. 2159 timer = setTimeout(() => { 2160 console.log("onmouseenter 1"); 2161 requestAnimationFrame(() => { 2162 console.log("onmouseenter 2"); 2163 timer = null; 2164 }); 2165 }, 100) 2166 } 2167 } 2168 const onmouseleave = () => { 2169 requestAnimationFrame(() => { 2170 if (!timer && !this.classList.contains("noAnime")) { 2171 console.log("onmouseleave"); 2172 this.classList.add("noAnime"); 2173 timer=null; 2174 } 2175 }); 2176 } 2177 if(add){ 2178 //this.addEventListener("mouseenter",onmouseenter); 2179 //this.addEventListener("mouseleave",onmouseleave); 2180 this.onmouseenter = onmouseenter; 2181 this.onmouseleave = onmouseleave; 2182 }else{ 2183 //this.removeEventListener("mouseenter",onmouseenter); 2184 //this.removeEventListener("mouseleave",onmouseleave); 2185 this.onmouseenter = null; 2186 this.onmouseleave = null; 2187 } 2188 } 2189 if(this.getAttribute("on-animate")=="1"){ 2190 this.classList.add("noAnime"); 2191 if(this.getAttribute("on-entrance-animate")!="1"){ 2192 manageMouseOver(true); 2193 }else{ 2194 manageMouseOver(false); 2195 } 2196 } 2197 2198 /** 2199 * This function manages the intersection of the element for entracnce animation 2200 */ 2201 const observeIntersection = () => { 2202 // initialize the global timer variable that shall be used at a time. 2203 var timer = null; 2204 var isInView = false; 2205 const iframe = window.frameElement; 2206 const iframeRect = iframe?.getBoundingClientRect() || {}; 2207 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 2208 2209 const callback = (entries) => { 2210 entries.forEach((entry) => { 2211 // Update isInView state 2212 isInView = entry.isIntersecting; 2213 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 2214 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 2215 if(entryRatio < animationTrigger){ 2216 animationTrigger=entryRatio; 2217 } 2218 if (entry.isIntersecting) { 2219 // Element is entering view 2220 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 2221 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 2222 if (!timer && intersectionRatio >= animationTrigger) { 2223 2224 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 2225 let delay = 0; 2226 try{
2227 delay = delayStr?parseFloat(delayStr):0; 2228 }catch(e){ 2229 delay = 0; 2230 } 2231 setTimeout(() => { 2232 if(this.classList.contains("noAnime")){ 2233 if(delay > 0){ 2234 setTimeout(() => { 2235 this.style.removeProperty('opacity'); 2236 }, delay*1000+10); 2237 }else{ 2238 this.style.removeProperty('opacity'); 2239 } 2240 this.classList.remove("noAnime"); 2241 //console.log("enter",this.getAttribute("id")); 2242 } 2243 }, 50); 2244 // if there was no timer and the animation is just run, then add the timer again. 2245 timer = setTimeout(() => { 2246 //console.log("enter 1",this.getAttribute("id")); 2247 requestAnimationFrame(() => { 2248 //console.log("enter 2",this.getAttribute("id")); 2249 timer = null; 2250 }); 2251 }, delay>0?delay*1000+500:500) 2252 } 2253 } else { 2254 // When element leaves viewport 2255 if (this.getAttribute("on-animate")=="1") { 2256 // Use requestAnimationFrame to check if element is still out of view 2257 requestAnimationFrame(() => { 2258 if (!isInView && !timer) { 2259 this.classList.add("noAnime"); 2260 this.style.opacity = '0'; 2261 } 2262 }); 2263 } 2264 } 2265 }); 2266 }; 2267 2268 const myObserver = new IntersectionObserver(callback, { 2269 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 2270 }); 2271 2272 // Set initial opacity and class 2273 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2274 this.classList.add("noAnime"); 2275 this.style.opacity = '0'; 2276 myObserver.observe(this); 2277 } 2278 } 2279 2280 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2281 observeIntersection(); 2282 } 2283}.bind(el))(props[el.id]); 2284 } 2285 var items = document.querySelectorAll('#ics9i'); 2286 for (var i = 0, len = items.length; i < len; i++) { 2287 (function(){ 2288 2289 /** 2290 * This function manages the mouseOver and mouseOut of the element 2291 */ 2292 const manageMouseOver = (add=true) => { 2293 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 2294 return; 2295 } 2296 console.log("manageMouseOver",add); 2297 var timer=null; 2298 const onmouseenter = () => { 2299 if (!timer) { 2300 setTimeout(() => { 2301 this.classList.remove("noAnime"); 2302 console.log("onmouseenter"); 2303 }, 50); 2304 // if there was no timer and the animation is just run, then add the timer again. 2305 timer = setTimeout(() => { 2306 console.log("onmouseenter 1"); 2307 requestAnimationFrame(() => { 2308 console.log("onmouseenter 2"); 2309 timer = null; 2310 }); 2311 }, 100) 2312 } 2313 } 2314 const onmouseleave = () => { 2315 requestAnimationFrame(() => { 2316 if (!timer && !this.classList.contains("noAnime")) { 2317 console.log("onmouseleave"); 2318 this.classList.add("noAnime"); 2319 timer=null; 2320 } 2321 }); 2322 } 2323 if(add){ 2324 //this.addEventListener("mouseenter",onmouseenter); 2325 //this.addEventListener("mouseleave",onmouseleave); 2326 this.onmouseenter = onmouseenter; 2327 this.onmouseleave = onmouseleave; 2328 }else{ 2329 //this.removeEventListener("mouseenter",onmouseenter); 2330 //this.removeEventListener("mouseleave",onmouseleave); 2331 this.onmouseenter = null; 2332 this.onmouseleave = null; 2333 } 2334 } 2335 if(this.getAttribute("on-animate")=="1"){ 2336 this.classList.add("noAnime"); 2337 if(this.getAttribute("on-entrance-animate")!="1"){ 2338 manageMouseOver(true); 2339 }else{ 2340 manageMouseOver(false); 2341 } 2342 } 2343 2344 /** 2345 * This function manages the intersection of the element for entracnce animation 2346 */ 2347 const observeIntersection = () => { 2348 // initialize the global timer variable that shall be used at a time. 2349 var timer = null; 2350 var isInView = false;
2351 const iframe = window.frameElement; 2352 const iframeRect = iframe?.getBoundingClientRect() || {}; 2353 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 2354 2355 const callback = (entries) => { 2356 entries.forEach((entry) => { 2357 // Update isInView state 2358 isInView = entry.isIntersecting; 2359 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 2360 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 2361 if(entryRatio < animationTrigger){ 2362 animationTrigger=entryRatio; 2363 } 2364 if (entry.isIntersecting) { 2365 // Element is entering view 2366 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 2367 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 2368 if (!timer && intersectionRatio >= animationTrigger) { 2369 2370 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 2371 let delay = 0; 2372 try{ 2373 delay = delayStr?parseFloat(delayStr):0; 2374 }catch(e){ 2375 delay = 0; 2376 } 2377 setTimeout(() => { 2378 if(this.classList.contains("noAnime")){ 2379 if(delay > 0){ 2380 setTimeout(() => { 2381 this.style.removeProperty('opacity'); 2382 }, delay*1000+10); 2383 }else{ 2384 this.style.removeProperty('opacity'); 2385 } 2386 this.classList.remove("noAnime"); 2387 //console.log("enter",this.getAttribute("id")); 2388 } 2389 }, 50); 2390 // if there was no timer and the animation is just run, then add the timer again. 2391 timer = setTimeout(() => { 2392 //console.log("enter 1",this.getAttribute("id")); 2393 requestAnimationFrame(() => { 2394 //console.log("enter 2",this.getAttribute("id")); 2395 timer = null; 2396 }); 2397 }, delay>0?delay*1000+500:500) 2398 } 2399 } else { 2400 // When element leaves viewport 2401 if (this.getAttribute("on-animate")=="1") { 2402 // Use requestAnimationFrame to check if element is still out of view 2403 requestAnimationFrame(() => { 2404 if (!isInView && !timer) { 2405 this.classList.add("noAnime"); 2406 this.style.opacity = '0'; 2407 } 2408 }); 2409 } 2410 } 2411 }); 2412 }; 2413 2414 const myObserver = new IntersectionObserver(callback, { 2415 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 2416 }); 2417 2418 // Set initial opacity and class 2419 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2420 this.classList.add("noAnime"); 2421 this.style.opacity = '0'; 2422 myObserver.observe(this); 2423 } 2424 } 2425 2426 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2427 observeIntersection(); 2428 } 2429 2430}.bind(items[i]))(); 2431 } 2432 var props = {"i7yj1":{"stylePrefix":"crm-"}}; 2433 var ids = Object.keys(props).map(function(id) { return '#'+id }).join(','); 2434 var els = document.querySelectorAll(ids); 2435 for (var i = 0, len = els.length; i < len; i++) { 2436 var el = els[i]; 2437 (function(b){var k=b.stylePrefix,u1=document.getElementById("".concat(k,"background-style"));if(!u1){var M1=` 2438 .`.concat(k,`bg{ 2439 position: absolute; 2440 top: 0; 2441 left: 0; 2442 bottom:0; 2443 right:0; 2444 width: 100%; 2445 height: 100%; 2446 z-index:-1; 2447 } 2448 .`).concat(k,`bg-color{ 2449 position: absolute; 2450 top: 0; 2451 left: 0; 2452 bottom:0; 2453 right:0; 2454 width: 100%; 2455 height: 100%; 2456 } 2457 .`).concat(k,`bg-image{ 2458 position: absolute; 2459 top: 0; 2460 left: 0; 2461 bottom:0; 2462 right:0; 2463 width: 100%; 2464 height: 100%; 2465 background-repeat: no-repeat; 2466 background-size: cover; 2467 } 2468 .`).concat(k,`bg-video{ 2469 position: absolute; 2470 top: 0; 2471 left: 0; 2472 bottom:0; 2473 right:0; 2474 width: 100%; 2475 height: 100%; 2476 } 2477 `);(u1=document.createElement("style")).id="".concat(k,"background-style"),u1.type="text/css",u
24771.styleSheet?u1.styleSheet.cssText=M1:u1.appendChild(document.createTextNode(M1)),document.head.appendChild(u1)} 2478 /** 2479 * This function manages the mouseOver and mouseOut of the element 2480 */ 2481 const manageMouseOver = (add=true) => { 2482 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 2483 return; 2484 } 2485 console.log("manageMouseOver",add); 2486 var timer=null; 2487 const onmouseenter = () => { 2488 if (!timer) { 2489 setTimeout(() => { 2490 this.classList.remove("noAnime"); 2491 console.log("onmouseenter"); 2492 }, 50); 2493 // if there was no timer and the animation is just run, then add the timer again. 2494 timer = setTimeout(() => { 2495 console.log("onmouseenter 1"); 2496 requestAnimationFrame(() => { 2497 console.log("onmouseenter 2"); 2498 timer = null; 2499 }); 2500 }, 100) 2501 } 2502 } 2503 const onmouseleave = () => { 2504 requestAnimationFrame(() => { 2505 if (!timer && !this.classList.contains("noAnime")) { 2506 console.log("onmouseleave"); 2507 this.classList.add("noAnime"); 2508 timer=null; 2509 } 2510 }); 2511 } 2512 if(add){ 2513 //this.addEventListener("mouseenter",onmouseenter); 2514 //this.addEventListener("mouseleave",onmouseleave); 2515 this.onmouseenter = onmouseenter; 2516 this.onmouseleave = onmouseleave; 2517 }else{ 2518 //this.removeEventListener("mouseenter",onmouseenter); 2519 //this.removeEventListener("mouseleave",onmouseleave); 2520 this.onmouseenter = null; 2521 this.onmouseleave = null; 2522 } 2523 } 2524 if(this.getAttribute("on-animate")=="1"){ 2525 this.classList.add("noAnime"); 2526 if(this.getAttribute("on-entrance-animate")!="1"){ 2527 manageMouseOver(true); 2528 }else{ 2529 manageMouseOver(false); 2530 } 2531 } 2532 2533 /** 2534 * This function manages the intersection of the element for entracnce animation 2535 */ 2536 const observeIntersection = () => { 2537 // initialize the global timer variable that shall be used at a time. 2538 var timer = null; 2539 var isInView = false; 2540 const iframe = window.frameElement; 2541 const iframeRect = iframe?.getBoundingClientRect() || {}; 2542 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 2543 2544 const callback = (entries) => { 2545 entries.forEach((entry) => { 2546 // Update isInView state 2547 isInView = entry.isIntersecting; 2548 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 2549 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 2550 if(entryRatio < animationTrigger){ 2551 animationTrigger=entryRatio; 2552 } 2553 if (entry.isIntersecting) { 2554 // Element is entering view 2555 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 2556 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 2557 if (!timer && intersectionRatio >= animationTrigger) { 2558 2559 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 2560 let delay = 0; 2561 try{ 2562 delay = delayStr?parseFloat(delayStr):0; 2563 }catch(e){ 2564 delay = 0; 2565 } 2566 setTimeout(() => { 2567 if(this.classList.contains("noAnime")){ 2568 if(delay > 0){ 2569 setTimeout(() => { 2570 this.style.removeProperty('opacity'); 2571 }, delay*1000+10); 2572 }else{ 2573 this.style.removeProperty('opacity'); 2574 } 2575 this.classList.remove("noAnime"); 2576 //console.log("enter",this.getAttribute("id")); 2577 } 2578 }, 50); 2579 // if there was no timer and the animation is just run, then add the timer again. 2580 timer = setTimeout(() => { 2581 //console.log("enter 1",this.getAttribute("id")); 2582 requestAnimationFrame(() => { 2583 //console.log("enter 2",this.getAttribute("id")); 2584 timer = null; 2585 }); 2586 }, delay>0?delay*1000+500:500) 2587 } 2588 } else { 2589 // When element leaves viewport 2590 if (this.getAttribute("on-animate")=="1") { 2591 // Use requestAnimationFrame to check if element is still out of view 2592 requestAnimationFrame(() => { 2593 if (!isInView && !timer) { 2594 this.classList.add("noAnime"); 2595 this.style.opacity = '0'; 2596 } 2597 }); 2598 } 2599 } 2600 }); 2601 }; 2602 2603 const myObserver = new IntersectionObserver(callback, { 2604 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 2605 }); 2606 2607 // Set initial opacity and class 2608 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2609 this.classList.add("noAnime"); 2610 this.style.opacity = '0'; 2611 myObserver.observe(this); 2612 } 2613 } 2614 2615 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2616 observeIntersection(); 2617 } 2618}.bind(el))(props[el.id]); 2619 } 2620 var items = document.querySelectorAll('#iuzwd'); 2621 for (var i = 0, len = items.length; i < len; i++) { 2622 (function(){ 2623 2624 /** 2625 * This function manages the mouseOver and mouseOut of the element 2626 */ 2627 const manageMouseOver = (add=true) => { 2628 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 2629 return; 2630 } 2631 console.log("manageMouseOver",add); 2632 var timer=null; 2633 const onmouseenter = () => { 2634 if (!timer) { 2635 setTimeout(() => { 2636 this.classList.remove("noAnime"); 2637 console.log("onmouseenter"); 2638 }, 50); 2639 // if there was no timer and the animation is just run, then add the timer again. 2640 timer = setTimeout(() => { 2641 console.log("onmouseenter 1"); 2642 requestAnimationFrame(() => { 2643 console.log("onmouseenter 2"); 2644 timer = null; 2645 }); 2646 }, 100) 2647 } 2648 } 2649 const onmouseleave = () => { 2650 requestAnimationFrame(() => { 2651 if (!timer && !this.classList.contains("noAnime")) { 2652 console.log("onmouseleave"); 2653 this.classList.add("noAnime"); 2654 timer=null; 2655 } 2656 }); 2657 } 2658 if(add){ 2659 //this.addEventListener("mouseenter",onmouseenter); 2660 //this.addEventListener("mouseleave",onmouseleave); 2661 this.onmouseenter = onmouseenter; 2662 this.onmouseleave = onmouseleave; 2663 }else{ 2664 //this.removeEventListener("mouseenter",onmouseenter); 2665 //this.removeEventListener("mouseleave",onmouseleave); 2666 this.onmouseenter = null; 2667 this.onmouseleave = null; 2668 } 2669 } 2670 if(this.getAttribute("on-animate")=="1"){ 2671 this.classList.add("noAnime"); 2672 if(this.getAttribute("on-entrance-animate")!="1"){ 2673 manageMouseOver(true); 2674 }else{ 2675 manageMouseOver(false); 2676 } 2677 } 2678 2679 /** 2680 * This function manages the intersection of the element for entracnce animation 2681 */ 2682 const observeIntersection = () => { 2683 // initialize the global timer variable that shall be used at a time. 2684 var timer = null; 2685 var isInView = false;
2686 const iframe = window.frameElement; 2687 const iframeRect = iframe?.getBoundingClientRect() || {}; 2688 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 2689 2690 const callback = (entries) => { 2691 entries.forEach((entry) => { 2692 // Update isInView state 2693 isInView = entry.isIntersecting; 2694 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 2695 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 2696 if(entryRatio < animationTrigger){ 2697 animationTrigger=entryRatio; 2698 } 2699 if (entry.isIntersecting) { 2700 // Element is entering view 2701 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 2702 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 2703 if (!timer && intersectionRatio >= animationTrigger) { 2704 2705 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 2706 let delay = 0; 2707 try{ 2708 delay = delayStr?parseFloat(delayStr):0; 2709 }catch(e){ 2710 delay = 0; 2711 } 2712 setTimeout(() => { 2713 if(this.classList.contains("noAnime")){ 2714 if(delay > 0){ 2715 setTimeout(() => { 2716 this.style.removeProperty('opacity'); 2717 }, delay*1000+10); 2718 }else{ 2719 this.style.removeProperty('opacity'); 2720 } 2721 this.classList.remove("noAnime"); 2722 //console.log("enter",this.getAttribute("id")); 2723 } 2724 }, 50); 2725 // if there was no timer and the animation is just run, then add the timer again. 2726 timer = setTimeout(() => { 2727 //console.log("enter 1",this.getAttribute("id")); 2728 requestAnimationFrame(() => { 2729 //console.log("enter 2",this.getAttribute("id")); 2730 timer = null; 2731 }); 2732 }, delay>0?delay*1000+500:500) 2733 } 2734 } else { 2735 // When element leaves viewport 2736 if (this.getAttribute("on-animate")=="1") { 2737 // Use requestAnimationFrame to check if element is still out of view 2738 requestAnimationFrame(() => { 2739 if (!isInView && !timer) { 2740 this.classList.add("noAnime"); 2741 this.style.opacity = '0'; 2742 } 2743 }); 2744 } 2745 } 2746 }); 2747 }; 2748 2749 const myObserver = new IntersectionObserver(callback, { 2750 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 2751 }); 2752 2753 // Set initial opacity and class 2754 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2755 this.classList.add("noAnime"); 2756 this.style.opacity = '0'; 2757 myObserver.observe(this); 2758 } 2759 } 2760 2761 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2762 observeIntersection(); 2763 } 2764 2765}.bind(items[i]))(); 2766 } 2767 var props = {"ifpel":{}}; 2768 var ids = Object.keys(props).map(function(id) { return '#'+id }).join(','); 2769 var els = document.querySelectorAll(ids); 2770 for (var i = 0, len = els.length; i < len; i++) { 2771 var el = els[i]; 2772 (function e9(o){var n=this,r=function(a,c){var l=n.children;if(l&&l[0]){var v=function(){var d=o["ft-video-ratio"],m=16,b=9;if(d){var k=d.split(":");k&&k.length===2&&(m=+k[0],b=+k[1])}var u1=n.offsetWidth,M1=b/m*u1;return n.offsetHeight>M1&&(u1=m/b*(M1=n.offsetHeight)),{height:M1,width:u1}}(),f=v.height,s=v.width;a&&c||(a=n.offsetHeight,c=n.offsetWidth),l[0].style.height=f+"px",l[0].style.width=s+"px",l[0].style.top="".concat(-(f/2-a/2),"px"),l[0].style.left="".concat(-(s/2-c/2),"px")}};this.getAttribute("data-design-mode")!="1"&&(new ResizeObserver(function(a){requestAnimationFrame(function(){var c=a[0];r.bind(n,c.contentRect.height,c.contentRect.width)()})}).observe(this),r()) 2773 /** 2774 * This function manages the mouseOver and mouseOut of the element 2775 */ 2776 const manageMouseOver = (add=true) => { 2777 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 2778 return; 2779 } 2780 console.log("manageMouseOver",add); 2781 var timer=null; 2782 const onmouseenter = () => { 2783 if (!timer) { 2784 setTimeout(() => { 2785 this.classList.remove("noAnime"); 2786 console.log("onmouseenter"); 2787 }, 50); 2788 // if there was no timer and the animation is just run, then add the timer again. 2789 timer = setTimeout(() => { 2790 console.log("onmouseenter 1"); 2791 requestAnimationFrame(() => { 2792 console.log("onmouseenter 2"); 2793 timer = null; 2794 }); 2795 }, 100) 2796 } 2797 } 2798 const onmouseleave = () => { 2799 requestAnimationFrame(() => { 2800 if (!timer && !this.classList.contains("noAnime")) { 2801 console.log("onmouseleave"); 2802 this.classList.add("noAnime"); 2803 timer=null; 2804 } 2805 }); 2806 } 2807 if(add){ 2808 //this.addEventListener("mouseenter",onmouseenter); 2809 //this.addEventListener("mouseleave",onmouseleave); 2810 this.onmouseenter = onmouseenter; 2811 this.onmouseleave = onmouseleave; 2812 }else{ 2813 //this.removeEventListener("mouseenter",onmouseenter); 2814 //this.removeEventListener("mouseleave",onmouseleave); 2815 this.onmouseenter = null; 2816 this.onmouseleave = null; 2817 } 2818 } 2819 if(this.getAttribute("on-animate")=="1"){ 2820 this.classList.add("noAnime"); 2821 if(this.getAttribute("on-entrance-animate")!="1"){ 2822 manageMouseOver(true); 2823 }else{ 2824 manageMouseOver(false); 2825 } 2826 } 2827 2828 /** 2829 * This function manages the intersection of the element for entracnce animation 2830 */ 2831 const observeIntersection = () => { 2832 // initialize the global timer variable that shall be used at a time. 2833 var timer = null; 2834 var isInView = false;
2835 const iframe = window.frameElement; 2836 const iframeRect = iframe?.getBoundingClientRect() || {}; 2837 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 2838 2839 const callback = (entries) => { 2840 entries.forEach((entry) => { 2841 // Update isInView state 2842 isInView = entry.isIntersecting; 2843 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 2844 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 2845 if(entryRatio < animationTrigger){ 2846 animationTrigger=entryRatio; 2847 } 2848 if (entry.isIntersecting) { 2849 // Element is entering view 2850 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 2851 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 2852 if (!timer && intersectionRatio >= animationTrigger) { 2853 2854 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 2855 let delay = 0; 2856 try{ 2857 delay = delayStr?parseFloat(delayStr):0; 2858 }catch(e){ 2859 delay = 0; 2860 } 2861 setTimeout(() => { 2862 if(this.classList.contains("noAnime")){ 2863 if(delay > 0){ 2864 setTimeout(() => { 2865 this.style.removeProperty('opacity'); 2866 }, delay*1000+10); 2867 }else{ 2868 this.style.removeProperty('opacity'); 2869 } 2870 this.classList.remove("noAnime"); 2871 //console.log("enter",this.getAttribute("id")); 2872 } 2873 }, 50); 2874 // if there was no timer and the animation is just run, then add the timer again. 2875 timer = setTimeout(() => { 2876 //console.log("enter 1",this.getAttribute("id")); 2877 requestAnimationFrame(() => { 2878 //console.log("enter 2",this.getAttribute("id")); 2879 timer = null; 2880 }); 2881 }, delay>0?delay*1000+500:500) 2882 } 2883 } else { 2884 // When element leaves viewport 2885 if (this.getAttribute("on-animate")=="1") { 2886 // Use requestAnimationFrame to check if element is still out of view 2887 requestAnimationFrame(() => { 2888 if (!isInView && !timer) { 2889 this.classList.add("noAnime"); 2890 this.style.opacity = '0'; 2891 } 2892 }); 2893 } 2894 } 2895 }); 2896 }; 2897 2898 const myObserver = new IntersectionObserver(callback, { 2899 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 2900 }); 2901 2902 // Set initial opacity and class 2903 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2904 this.classList.add("noAnime"); 2905 this.style.opacity = '0'; 2906 myObserver.observe(this); 2907 } 2908 } 2909 2910 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 2911 observeIntersection(); 2912 } 2913}.bind(el))(props[el.id]); 2914 } 2915 var items = document.querySelectorAll('#isvvl'); 2916 for (var i = 0, len = items.length; i < len; i++) { 2917 (function(){ 2918 2919 /** 2920 * This function manages the mouseOver and mouseOut of the element 2921 */ 2922 const manageMouseOver = (add=true) => { 2923 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 2924 return; 2925 } 2926 console.log("manageMouseOver",add); 2927 var timer=null; 2928 const onmouseenter = () => { 2929 if (!timer) { 2930 setTimeout(() => { 2931 this.classList.remove("noAnime"); 2932 console.log("onmouseenter"); 2933 }, 50); 2934 // if there was no timer and the animation is just run, then add the timer again. 2935 timer = setTimeout(() => { 2936 console.log("onmouseenter 1"); 2937 requestAnimationFrame(() => { 2938 console.log("onmouseenter 2"); 2939 timer = null; 2940 }); 2941 }, 100) 2942 } 2943 } 2944 const onmouseleave = () => { 2945 requestAnimationFrame(() => { 2946 if (!timer && !this.classList.contains("noAnime")) { 2947 console.log("onmouseleave"); 2948 this.classList.add("noAnime"); 2949 timer=null; 2950 } 2951 }); 2952 } 2953 if(add){ 2954 //this.addEventListener("mouseenter",onmouseenter); 2955 //this.addEventListener("mouseleave",onmouseleave); 2956 this.onmouseenter = onmouseenter; 2957 this.onmouseleave = onmouseleave; 2958 }else{ 2959 //this.removeEventListener("mouseenter",onmouseenter); 2960 //this.removeEventListener("mouseleave",onmouseleave); 2961 this.onmouseenter = null; 2962 this.onmouseleave = null; 2963 } 2964 } 2965 if(this.getAttribute("on-animate")=="1"){ 2966 this.classList.add("noAnime"); 2967 if(this.getAttribute("on-entrance-animate")!="1"){ 2968 manageMouseOver(true); 2969 }else{ 2970 manageMouseOver(false); 2971 } 2972 } 2973 2974 /** 2975 * This function manages the intersection of the element for entracnce animation 2976 */ 2977 const observeIntersection = () => { 2978 // initialize the global timer variable that shall be used at a time. 2979 var timer = null; 2980 var isInView = false;
2981 const iframe = window.frameElement; 2982 const iframeRect = iframe?.getBoundingClientRect() || {}; 2983 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 2984 2985 const callback = (entries) => { 2986 entries.forEach((entry) => { 2987 // Update isInView state 2988 isInView = entry.isIntersecting; 2989 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 2990 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 2991 if(entryRatio < animationTrigger){ 2992 animationTrigger=entryRatio; 2993 } 2994 if (entry.isIntersecting) { 2995 // Element is entering view 2996 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 2997 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 2998 if (!timer && intersectionRatio >= animationTrigger) { 2999 3000 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 3001 let delay = 0; 3002 try{ 3003 delay = delayStr?parseFloat(delayStr):0; 3004 }catch(e){ 3005 delay = 0; 3006 } 3007 setTimeout(() => { 3008 if(this.classList.contains("noAnime")){ 3009 if(delay > 0){ 3010 setTimeout(() => { 3011 this.style.removeProperty('opacity'); 3012 }, delay*1000+10); 3013 }else{ 3014 this.style.removeProperty('opacity'); 3015 } 3016 this.classList.remove("noAnime"); 3017 //console.log("enter",this.getAttribute("id")); 3018 } 3019 }, 50); 3020 // if there was no timer and the animation is just run, then add the timer again. 3021 timer = setTimeout(() => { 3022 //console.log("enter 1",this.getAttribute("id")); 3023 requestAnimationFrame(() => { 3024 //console.log("enter 2",this.getAttribute("id")); 3025 timer = null; 3026 }); 3027 }, delay>0?delay*1000+500:500) 3028 } 3029 } else { 3030 // When element leaves viewport 3031 if (this.getAttribute("on-animate")=="1") { 3032 // Use requestAnimationFrame to check if element is still out of view 3033 requestAnimationFrame(() => { 3034 if (!isInView && !timer) { 3035 this.classList.add("noAnime"); 3036 this.style.opacity = '0'; 3037 } 3038 }); 3039 } 3040 } 3041 }); 3042 }; 3043 3044 const myObserver = new IntersectionObserver(callback, { 3045 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 3046 }); 3047 3048 // Set initial opacity and class 3049 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3050 this.classList.add("noAnime"); 3051 this.style.opacity = '0'; 3052 myObserver.observe(this); 3053 } 3054 } 3055 3056 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3057 observeIntersection(); 3058 } 3059 3060}.bind(items[i]))(); 3061 } 3062 var items = document.querySelectorAll('#iw2x5'); 3063 for (var i = 0, len = items.length; i < len; i++) { 3064 (function(){ 3065 3066 /** 3067 * This function manages the mouseOver and mouseOut of the element 3068 */ 3069 const manageMouseOver = (add=true) => { 3070 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 3071 return; 3072 } 3073 console.log("manageMouseOver",add); 3074 var timer=null; 3075 const onmouseenter = () => { 3076 if (!timer) { 3077 setTimeout(() => { 3078 this.classList.remove("noAnime"); 3079 console.log("onmouseenter"); 3080 }, 50); 3081 // if there was no timer and the animation is just run, then add the timer again. 3082 timer = setTimeout(() => { 3083 console.log("onmouseenter 1"); 3084 requestAnimationFrame(() => { 3085 console.log("onmouseenter 2"); 3086 timer = null; 3087 }); 3088 }, 100) 3089 } 3090 } 3091 const onmouseleave = () => { 3092 requestAnimationFrame(() => { 3093 if (!timer && !this.classList.contains("noAnime")) { 3094 console.log("onmouseleave"); 3095 this.classList.add("noAnime"); 3096 timer=null; 3097 } 3098 }); 3099 } 3100 if(add){ 3101 //this.addEventListener("mouseenter",onmouseenter); 3102 //this.addEventListener("mouseleave",onmouseleave); 3103 this.onmouseenter = onmouseenter; 3104 this.onmouseleave = onmouseleave; 3105 }else{ 3106 //this.removeEventListener("mouseenter",onmouseenter); 3107 //this.removeEventListener("mouseleave",onmouseleave); 3108 this.onmouseenter = null; 3109 this.onmouseleave = null; 3110 } 3111 } 3112 if(this.getAttribute("on-animate")=="1"){ 3113 this.classList.add("noAnime"); 3114 if(this.getAttribute("on-entrance-animate")!="1"){ 3115 manageMouseOver(true); 3116 }else{ 3117 manageMouseOver(false); 3118 } 3119 } 3120 3121 /** 3122 * This function manages the intersection of the element for entracnce animation 3123 */ 3124 const observeIntersection = () => { 3125 // initialize the global timer variable that shall be used at a time. 3126 var timer = null; 3127 var isInView = false;
3128 const iframe = window.frameElement; 3129 const iframeRect = iframe?.getBoundingClientRect() || {}; 3130 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 3131 3132 const callback = (entries) => { 3133 entries.forEach((entry) => { 3134 // Update isInView state 3135 isInView = entry.isIntersecting; 3136 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 3137 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 3138 if(entryRatio < animationTrigger){ 3139 animationTrigger=entryRatio; 3140 } 3141 if (entry.isIntersecting) { 3142 // Element is entering view 3143 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 3144 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 3145 if (!timer && intersectionRatio >= animationTrigger) { 3146 3147 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 3148 let delay = 0; 3149 try{ 3150 delay = delayStr?parseFloat(delayStr):0; 3151 }catch(e){ 3152 delay = 0; 3153 } 3154 setTimeout(() => { 3155 if(this.classList.contains("noAnime")){ 3156 if(delay > 0){ 3157 setTimeout(() => { 3158 this.style.removeProperty('opacity'); 3159 }, delay*1000+10); 3160 }else{ 3161 this.style.removeProperty('opacity'); 3162 } 3163 this.classList.remove("noAnime"); 3164 //console.log("enter",this.getAttribute("id")); 3165 } 3166 }, 50); 3167 // if there was no timer and the animation is just run, then add the timer again. 3168 timer = setTimeout(() => { 3169 //console.log("enter 1",this.getAttribute("id")); 3170 requestAnimationFrame(() => { 3171 //console.log("enter 2",this.getAttribute("id")); 3172 timer = null; 3173 }); 3174 }, delay>0?delay*1000+500:500) 3175 } 3176 } else { 3177 // When element leaves viewport 3178 if (this.getAttribute("on-animate")=="1") { 3179 // Use requestAnimationFrame to check if element is still out of view 3180 requestAnimationFrame(() => { 3181 if (!isInView && !timer) { 3182 this.classList.add("noAnime"); 3183 this.style.opacity = '0'; 3184 } 3185 }); 3186 } 3187 } 3188 }); 3189 }; 3190 3191 const myObserver = new IntersectionObserver(callback, { 3192 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 3193 }); 3194 3195 // Set initial opacity and class 3196 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3197 this.classList.add("noAnime"); 3198 this.style.opacity = '0'; 3199 myObserver.observe(this); 3200 } 3201 } 3202 3203 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3204 observeIntersection(); 3205 } 3206 3207}.bind(items[i]))(); 3208 } 3209 var items = document.querySelectorAll('#i8t8a'); 3210 for (var i = 0, len = items.length; i < len; i++) { 3211 (function(){ 3212 3213 /** 3214 * This function manages the mouseOver and mouseOut of the element 3215 */ 3216 const manageMouseOver = (add=true) => { 3217 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 3218 return; 3219 } 3220 console.log("manageMouseOver",add); 3221 var timer=null; 3222 const onmouseenter = () => { 3223 if (!timer) { 3224 setTimeout(() => { 3225 this.classList.remove("noAnime"); 3226 console.log("onmouseenter"); 3227 }, 50); 3228 // if there was no timer and the animation is just run, then add the timer again. 3229 timer = setTimeout(() => { 3230 console.log("onmouseenter 1"); 3231 requestAnimationFrame(() => { 3232 console.log("onmouseenter 2"); 3233 timer = null; 3234 }); 3235 }, 100) 3236 } 3237 } 3238 const onmouseleave = () => { 3239 requestAnimationFrame(() => { 3240 if (!timer && !this.classList.contains("noAnime")) { 3241 console.log("onmouseleave"); 3242 this.classList.add("noAnime"); 3243 timer=null; 3244 } 3245 }); 3246 } 3247 if(add){ 3248 //this.addEventListener("mouseenter",onmouseenter); 3249 //this.addEventListener("mouseleave",onmouseleave); 3250 this.onmouseenter = onmouseenter; 3251 this.onmouseleave = onmouseleave; 3252 }else{ 3253 //this.removeEventListener("mouseenter",onmouseenter); 3254 //this.removeEventListener("mouseleave",onmouseleave); 3255 this.onmouseenter = null; 3256 this.onmouseleave = null; 3257 } 3258 } 3259 if(this.getAttribute("on-animate")=="1"){ 3260 this.classList.add("noAnime"); 3261 if(this.getAttribute("on-entrance-animate")!="1"){ 3262 manageMouseOver(true); 3263 }else{ 3264 manageMouseOver(false); 3265 } 3266 } 3267 3268 /** 3269 * This function manages the intersection of the element for entracnce animation 3270 */ 3271 const observeIntersection = () => { 3272 // initialize the global timer variable that shall be used at a time. 3273 var timer = null; 3274 var isInView = false;
3275 const iframe = window.frameElement; 3276 const iframeRect = iframe?.getBoundingClientRect() || {}; 3277 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 3278 3279 const callback = (entries) => { 3280 entries.forEach((entry) => { 3281 // Update isInView state 3282 isInView = entry.isIntersecting; 3283 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 3284 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 3285 if(entryRatio < animationTrigger){ 3286 animationTrigger=entryRatio; 3287 } 3288 if (entry.isIntersecting) { 3289 // Element is entering view 3290 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 3291 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 3292 if (!timer && intersectionRatio >= animationTrigger) { 3293 3294 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 3295 let delay = 0; 3296 try{ 3297 delay = delayStr?parseFloat(delayStr):0; 3298 }catch(e){ 3299 delay = 0; 3300 } 3301 setTimeout(() => { 3302 if(this.classList.contains("noAnime")){ 3303 if(delay > 0){ 3304 setTimeout(() => { 3305 this.style.removeProperty('opacity'); 3306 }, delay*1000+10); 3307 }else{ 3308 this.style.removeProperty('opacity'); 3309 } 3310 this.classList.remove("noAnime"); 3311 //console.log("enter",this.getAttribute("id")); 3312 } 3313 }, 50); 3314 // if there was no timer and the animation is just run, then add the timer again. 3315 timer = setTimeout(() => { 3316 //console.log("enter 1",this.getAttribute("id")); 3317 requestAnimationFrame(() => { 3318 //console.log("enter 2",this.getAttribute("id")); 3319 timer = null; 3320 }); 3321 }, delay>0?delay*1000+500:500) 3322 } 3323 } else { 3324 // When element leaves viewport 3325 if (this.getAttribute("on-animate")=="1") { 3326 // Use requestAnimationFrame to check if element is still out of view 3327 requestAnimationFrame(() => { 3328 if (!isInView && !timer) { 3329 this.classList.add("noAnime"); 3330 this.style.opacity = '0'; 3331 } 3332 }); 3333 } 3334 } 3335 }); 3336 }; 3337 3338 const myObserver = new IntersectionObserver(callback, { 3339 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 3340 }); 3341 3342 // Set initial opacity and class 3343 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3344 this.classList.add("noAnime"); 3345 this.style.opacity = '0'; 3346 myObserver.observe(this); 3347 } 3348 } 3349 3350 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3351 observeIntersection(); 3352 } 3353 3354}.bind(items[i]))(); 3355 } 3356 var props = {"if68u":{"ft-cover-play-click":true,"ft-cover-image":"","ft-video-link":"https://iframe.mediadelivery.net/embed/78766/f731befd-f0f1-44dd-a57a-e4922e8a6d38","ft-file-processing":"1","ft-video-id":"3k26by","ft-video-controls":true,"ft-video-branding":true,"ft-video-start":0}}; 3357 var ids = Object.keys(props).map(function(id) { return '#'+id }).join(','); 3358 var els = document.querySelectorAll(ids); 3359 for (var i = 0, len = els.length; i < len; i++) { 3360 var el = els[i]; 3361 (function cb(o){var n=this,r=this.children[0].children[0];removeNoMouseClass=function(){n.children&&n.children[0]&&n.children[0].children[1]&&n.children[0].children[1].classList.remove("no-mouse"),n.children&&n.children[0]&&r&&(r.style["z-index"]="99")},removeNoMouseClass() 3362 /** 3363 * This function manages the mouseOver and mouseOut of the element 3364 */ 3365 const manageMouseOver = (add=true) => { 3366 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 3367 return; 3368 } 3369 console.log("manageMouseOver",add); 3370 var timer=null; 3371 const onmouseenter = () => { 3372 if (!timer) { 3373 setTimeout(() => { 3374 this.classList.remove("noAnime"); 3375 console.log("onmouseenter"); 3376 }, 50); 3377 // if there was no timer and the animation is just run, then add the timer again. 3378 timer = setTimeout(() => { 3379 console.log("onmouseenter 1"); 3380 requestAnimationFrame(() => { 3381 console.log("onmouseenter 2"); 3382 timer = null; 3383 }); 3384 }, 100) 3385 } 3386 } 3387 const onmouseleave = () => { 3388 requestAnimationFrame(() => { 3389 if (!timer && !this.classList.contains("noAnime")) { 3390 console.log("onmouseleave"); 3391 this.classList.add("noAnime"); 3392 timer=null; 3393 } 3394 }); 3395 } 3396 if(add){ 3397 //this.addEventListener("mouseenter",onmouseenter); 3398 //this.addEventListener("mouseleave",onmouseleave); 3399 this.onmouseenter = onmouseenter; 3400 this.onmouseleave = onmouseleave; 3401 }else{ 3402 //this.removeEventListener("mouseenter",onmouseenter); 3403 //this.removeEventListener("mouseleave",onmouseleave); 3404 this.onmouseenter = null; 3405 this.onmouseleave = null; 3406 } 3407 } 3408 if(this.getAttribute("on-animate")=="1"){ 3409 this.classList.add("noAnime"); 3410 if(this.getAttribute("on-entrance-animate")!="1"){ 3411 manageMouseOver(true); 3412 }else{ 3413 manageMouseOver(false); 3414 } 3415 } 3416 3417 /** 3418 * This function manages the intersection of the element for entracnce animation 3419 */ 3420 const observeIntersection = () => { 3421 // initialize the global timer variable that shall be used at a time. 3422 var timer = null; 3423 var isInView = false;
3424 const iframe = window.frameElement; 3425 const iframeRect = iframe?.getBoundingClientRect() || {}; 3426 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 3427 3428 const callback = (entries) => { 3429 entries.forEach((entry) => { 3430 // Update isInView state 3431 isInView = entry.isIntersecting; 3432 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 3433 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 3434 if(entryRatio < animationTrigger){ 3435 animationTrigger=entryRatio; 3436 } 3437 if (entry.isIntersecting) { 3438 // Element is entering view 3439 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 3440 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 3441 if (!timer && intersectionRatio >= animationTrigger) { 3442 3443 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 3444 let delay = 0; 3445 try{ 3446 delay = delayStr?parseFloat(delayStr):0; 3447 }catch(e){ 3448 delay = 0; 3449 } 3450 setTimeout(() => { 3451 if(this.classList.contains("noAnime")){ 3452 if(delay > 0){ 3453 setTimeout(() => { 3454 this.style.removeProperty('opacity'); 3455 }, delay*1000+10); 3456 }else{ 3457 this.style.removeProperty('opacity'); 3458 } 3459 this.classList.remove("noAnime"); 3460 //console.log("enter",this.getAttribute("id")); 3461 } 3462 }, 50); 3463 // if there was no timer and the animation is just run, then add the timer again. 3464 timer = setTimeout(() => { 3465 //console.log("enter 1",this.getAttribute("id")); 3466 requestAnimationFrame(() => { 3467 //console.log("enter 2",this.getAttribute("id")); 3468 timer = null; 3469 }); 3470 }, delay>0?delay*1000+500:500) 3471 } 3472 } else { 3473 // When element leaves viewport 3474 if (this.getAttribute("on-animate")=="1") { 3475 // Use requestAnimationFrame to check if element is still out of view 3476 requestAnimationFrame(() => { 3477 if (!isInView && !timer) { 3478 this.classList.add("noAnime"); 3479 this.style.opacity = '0'; 3480 } 3481 }); 3482 } 3483 } 3484 }); 3485 }; 3486 3487 const myObserver = new IntersectionObserver(callback, { 3488 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 3489 }); 3490 3491 // Set initial opacity and class 3492 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3493 this.classList.add("noAnime"); 3494 this.style.opacity = '0'; 3495 myObserver.observe(this); 3496 } 3497 } 3498 3499 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3500 observeIntersection(); 3501 } 3502}.bind(el))(props[el.id]); 3503 } 3504 var items = document.querySelectorAll('#i98r7'); 3505 for (var i = 0, len = items.length; i < len; i++) { 3506 (function(){ 3507 3508 /** 3509 * This function manages the mouseOver and mouseOut of the element 3510 */ 3511 const manageMouseOver = (add=true) => { 3512 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 3513 return; 3514 } 3515 console.log("manageMouseOver",add); 3516 var timer=null; 3517 const onmouseenter = () => { 3518 if (!timer) { 3519 setTimeout(() => { 3520 this.classList.remove("noAnime"); 3521 console.log("onmouseenter"); 3522 }, 50); 3523 // if there was no timer and the animation is just run, then add the timer again. 3524 timer = setTimeout(() => { 3525 console.log("onmouseenter 1"); 3526 requestAnimationFrame(() => { 3527 console.log("onmouseenter 2"); 3528 timer = null; 3529 }); 3530 }, 100) 3531 } 3532 } 3533 const onmouseleave = () => { 3534 requestAnimationFrame(() => { 3535 if (!timer && !this.classList.contains("noAnime")) { 3536 console.log("onmouseleave"); 3537 this.classList.add("noAnime"); 3538 timer=null; 3539 } 3540 }); 3541 } 3542 if(add){ 3543 //this.addEventListener("mouseenter",onmouseenter); 3544 //this.addEventListener("mouseleave",onmouseleave); 3545 this.onmouseenter = onmouseenter; 3546 this.onmouseleave = onmouseleave; 3547 }else{ 3548 //this.removeEventListener("mouseenter",onmouseenter); 3549 //this.removeEventListener("mouseleave",onmouseleave); 3550 this.onmouseenter = null; 3551 this.onmouseleave = null; 3552 } 3553 } 3554 if(this.getAttribute("on-animate")=="1"){ 3555 this.classList.add("noAnime"); 3556 if(this.getAttribute("on-entrance-animate")!="1"){ 3557 manageMouseOver(true); 3558 }else{ 3559 manageMouseOver(false); 3560 } 3561 } 3562 3563 /** 3564 * This function manages the intersection of the element for entracnce animation 3565 */ 3566 const observeIntersection = () => { 3567 // initialize the global timer variable that shall be used at a time. 3568 var timer = null; 3569 var isInView = false;
3570 const iframe = window.frameElement; 3571 const iframeRect = iframe?.getBoundingClientRect() || {}; 3572 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 3573 3574 const callback = (entries) => { 3575 entries.forEach((entry) => { 3576 // Update isInView state 3577 isInView = entry.isIntersecting; 3578 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 3579 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 3580 if(entryRatio < animationTrigger){ 3581 animationTrigger=entryRatio; 3582 } 3583 if (entry.isIntersecting) { 3584 // Element is entering view 3585 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 3586 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 3587 if (!timer && intersectionRatio >= animationTrigger) { 3588 3589 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 3590 let delay = 0; 3591 try{ 3592 delay = delayStr?parseFloat(delayStr):0; 3593 }catch(e){ 3594 delay = 0; 3595 } 3596 setTimeout(() => { 3597 if(this.classList.contains("noAnime")){ 3598 if(delay > 0){ 3599 setTimeout(() => { 3600 this.style.removeProperty('opacity'); 3601 }, delay*1000+10); 3602 }else{ 3603 this.style.removeProperty('opacity'); 3604 } 3605 this.classList.remove("noAnime"); 3606 //console.log("enter",this.getAttribute("id")); 3607 } 3608 }, 50); 3609 // if there was no timer and the animation is just run, then add the timer again. 3610 timer = setTimeout(() => { 3611 //console.log("enter 1",this.getAttribute("id")); 3612 requestAnimationFrame(() => { 3613 //console.log("enter 2",this.getAttribute("id")); 3614 timer = null; 3615 }); 3616 }, delay>0?delay*1000+500:500) 3617 } 3618 } else { 3619 // When element leaves viewport 3620 if (this.getAttribute("on-animate")=="1") { 3621 // Use requestAnimationFrame to check if element is still out of view 3622 requestAnimationFrame(() => { 3623 if (!isInView && !timer) { 3624 this.classList.add("noAnime"); 3625 this.style.opacity = '0'; 3626 } 3627 }); 3628 } 3629 } 3630 }); 3631 }; 3632 3633 const myObserver = new IntersectionObserver(callback, { 3634 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 3635 }); 3636 3637 // Set initial opacity and class 3638 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3639 this.classList.add("noAnime"); 3640 this.style.opacity = '0'; 3641 myObserver.observe(this); 3642 } 3643 } 3644 3645 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3646 observeIntersection(); 3647 } 3648 3649}.bind(items[i]))(); 3650 } 3651 var items = document.querySelectorAll('#ioq7q'); 3652 for (var i = 0, len = items.length; i < len; i++) { 3653 (function(){ 3654var o=this;this.getAttribute("data-design-mode")!="1"&&this.addEventListener("click",function(n){var r=o.parentNode.getElementsByTagName("iframe");if(!(r.length<=0)||(r=o.parentNode.getElementsByTagName("video")),!(r.length<=0)){var a=r[0];o.style.display="none",a.style.display="block",a.setAttribute("src",a.getAttribute("data-src"))}}) 3655 /** 3656 * This function manages the mouseOver and mouseOut of the element 3657 */ 3658 const manageMouseOver = (add=true) => { 3659 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 3660 return; 3661 } 3662 console.log("manageMouseOver",add); 3663 var timer=null; 3664 const onmouseenter = () => { 3665 if (!timer) { 3666 setTimeout(() => { 3667 this.classList.remove("noAnime"); 3668 console.log("onmouseenter"); 3669 }, 50); 3670 // if there was no timer and the animation is just run, then add the timer again. 3671 timer = setTimeout(() => { 3672 console.log("onmouseenter 1"); 3673 requestAnimationFrame(() => { 3674 console.log("onmouseenter 2"); 3675 timer = null; 3676 }); 3677 }, 100) 3678 } 3679 } 3680 const onmouseleave = () => { 3681 requestAnimationFrame(() => { 3682 if (!timer && !this.classList.contains("noAnime")) { 3683 console.log("onmouseleave"); 3684 this.classList.add("noAnime"); 3685 timer=null; 3686 } 3687 }); 3688 } 3689 if(add){ 3690 //this.addEventListener("mouseenter",onmouseenter); 3691 //this.addEventListener("mouseleave",onmouseleave); 3692 this.onmouseenter = onmouseenter; 3693 this.onmouseleave = onmouseleave; 3694 }else{ 3695 //this.removeEventListener("mouseenter",onmouseenter); 3696 //this.removeEventListener("mouseleave",onmouseleave); 3697 this.onmouseenter = null; 3698 this.onmouseleave = null; 3699 } 3700 } 3701 if(this.getAttribute("on-animate")=="1"){ 3702 this.classList.add("noAnime"); 3703 if(this.getAttribute("on-entrance-animate")!="1"){ 3704 manageMouseOver(true); 3705 }else{ 3706 manageMouseOver(false); 3707 } 3708 } 3709 3710 /** 3711 * This function manages the intersection of the element for entracnce animation 3712 */ 3713 const observeIntersection = () => { 3714 // initialize the global timer variable that shall be used at a time. 3715 var timer = null; 3716 var isInView = false;
3717 const iframe = window.frameElement; 3718 const iframeRect = iframe?.getBoundingClientRect() || {}; 3719 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 3720 3721 const callback = (entries) => { 3722 entries.forEach((entry) => { 3723 // Update isInView state 3724 isInView = entry.isIntersecting; 3725 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 3726 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 3727 if(entryRatio < animationTrigger){ 3728 animationTrigger=entryRatio; 3729 } 3730 if (entry.isIntersecting) { 3731 // Element is entering view 3732 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 3733 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 3734 if (!timer && intersectionRatio >= animationTrigger) { 3735 3736 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 3737 let delay = 0; 3738 try{ 3739 delay = delayStr?parseFloat(delayStr):0; 3740 }catch(e){ 3741 delay = 0; 3742 } 3743 setTimeout(() => { 3744 if(this.classList.contains("noAnime")){ 3745 if(delay > 0){ 3746 setTimeout(() => { 3747 this.style.removeProperty('opacity'); 3748 }, delay*1000+10); 3749 }else{ 3750 this.style.removeProperty('opacity'); 3751 } 3752 this.classList.remove("noAnime"); 3753 //console.log("enter",this.getAttribute("id")); 3754 } 3755 }, 50); 3756 // if there was no timer and the animation is just run, then add the timer again. 3757 timer = setTimeout(() => { 3758 //console.log("enter 1",this.getAttribute("id")); 3759 requestAnimationFrame(() => { 3760 //console.log("enter 2",this.getAttribute("id")); 3761 timer = null; 3762 }); 3763 }, delay>0?delay*1000+500:500) 3764 } 3765 } else { 3766 // When element leaves viewport 3767 if (this.getAttribute("on-animate")=="1") { 3768 // Use requestAnimationFrame to check if element is still out of view 3769 requestAnimationFrame(() => { 3770 if (!isInView && !timer) { 3771 this.classList.add("noAnime"); 3772 this.style.opacity = '0'; 3773 } 3774 }); 3775 } 3776 } 3777 }); 3778 }; 3779 3780 const myObserver = new IntersectionObserver(callback, { 3781 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 3782 }); 3783 3784 // Set initial opacity and class 3785 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3786 this.classList.add("noAnime"); 3787 this.style.opacity = '0'; 3788 myObserver.observe(this); 3789 } 3790 } 3791 3792 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3793 observeIntersection(); 3794 } 3795 3796}.bind(items[i]))(); 3797 } 3798 var items = document.querySelectorAll('#i3ucf'); 3799 for (var i = 0, len = items.length; i < len; i++) { 3800 (function(){ 3801 3802 /** 3803 * This function manages the mouseOver and mouseOut of the element 3804 */ 3805 const manageMouseOver = (add=true) => { 3806 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 3807 return; 3808 } 3809 console.log("manageMouseOver",add); 3810 var timer=null; 3811 const onmouseenter = () => { 3812 if (!timer) { 3813 setTimeout(() => { 3814 this.classList.remove("noAnime"); 3815 console.log("onmouseenter"); 3816 }, 50); 3817 // if there was no timer and the animation is just run, then add the timer again. 3818 timer = setTimeout(() => { 3819 console.log("onmouseenter 1"); 3820 requestAnimationFrame(() => { 3821 console.log("onmouseenter 2"); 3822 timer = null; 3823 }); 3824 }, 100) 3825 } 3826 } 3827 const onmouseleave = () => { 3828 requestAnimationFrame(() => { 3829 if (!timer && !this.classList.contains("noAnime")) { 3830 console.log("onmouseleave"); 3831 this.classList.add("noAnime"); 3832 timer=null; 3833 } 3834 }); 3835 } 3836 if(add){ 3837 //this.addEventListener("mouseenter",onmouseenter); 3838 //this.addEventListener("mouseleave",onmouseleave); 3839 this.onmouseenter = onmouseenter; 3840 this.onmouseleave = onmouseleave; 3841 }else{ 3842 //this.removeEventListener("mouseenter",onmouseenter); 3843 //this.removeEventListener("mouseleave",onmouseleave); 3844 this.onmouseenter = null; 3845 this.onmouseleave = null; 3846 } 3847 } 3848 if(this.getAttribute("on-animate")=="1"){ 3849 this.classList.add("noAnime"); 3850 if(this.getAttribute("on-entrance-animate")!="1"){ 3851 manageMouseOver(true); 3852 }else{ 3853 manageMouseOver(false); 3854 } 3855 } 3856 3857 /** 3858 * This function manages the intersection of the element for entracnce animation 3859 */ 3860 const observeIntersection = () => { 3861 // initialize the global timer variable that shall be used at a time. 3862 var timer = null; 3863 var isInView = false;
3864 const iframe = window.frameElement; 3865 const iframeRect = iframe?.getBoundingClientRect() || {}; 3866 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 3867 3868 const callback = (entries) => { 3869 entries.forEach((entry) => { 3870 // Update isInView state 3871 isInView = entry.isIntersecting; 3872 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 3873 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 3874 if(entryRatio < animationTrigger){ 3875 animationTrigger=entryRatio; 3876 } 3877 if (entry.isIntersecting) { 3878 // Element is entering view 3879 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 3880 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 3881 if (!timer && intersectionRatio >= animationTrigger) { 3882 3883 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 3884 let delay = 0; 3885 try{ 3886 delay = delayStr?parseFloat(delayStr):0; 3887 }catch(e){ 3888 delay = 0; 3889 } 3890 setTimeout(() => { 3891 if(this.classList.contains("noAnime")){ 3892 if(delay > 0){ 3893 setTimeout(() => { 3894 this.style.removeProperty('opacity'); 3895 }, delay*1000+10); 3896 }else{ 3897 this.style.removeProperty('opacity'); 3898 } 3899 this.classList.remove("noAnime"); 3900 //console.log("enter",this.getAttribute("id")); 3901 } 3902 }, 50); 3903 // if there was no timer and the animation is just run, then add the timer again. 3904 timer = setTimeout(() => { 3905 //console.log("enter 1",this.getAttribute("id")); 3906 requestAnimationFrame(() => { 3907 //console.log("enter 2",this.getAttribute("id")); 3908 timer = null; 3909 }); 3910 }, delay>0?delay*1000+500:500) 3911 } 3912 } else { 3913 // When element leaves viewport 3914 if (this.getAttribute("on-animate")=="1") { 3915 // Use requestAnimationFrame to check if element is still out of view 3916 requestAnimationFrame(() => { 3917 if (!isInView && !timer) { 3918 this.classList.add("noAnime"); 3919 this.style.opacity = '0'; 3920 } 3921 }); 3922 } 3923 } 3924 }); 3925 }; 3926 3927 const myObserver = new IntersectionObserver(callback, { 3928 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 3929 }); 3930 3931 // Set initial opacity and class 3932 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3933 this.classList.add("noAnime"); 3934 this.style.opacity = '0'; 3935 myObserver.observe(this); 3936 } 3937 } 3938 3939 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 3940 observeIntersection(); 3941 } 3942 3943}.bind(items[i]))(); 3944 } 3945 var items = document.querySelectorAll('#i7x45'); 3946 for (var i = 0, len = items.length; i < len; i++) { 3947 (function(){ 3948 3949 /** 3950 * This function manages the mouseOver and mouseOut of the element 3951 */ 3952 const manageMouseOver = (add=true) => { 3953 if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){ 3954 return; 3955 } 3956 console.log("manageMouseOver",add); 3957 var timer=null; 3958 const onmouseenter = () => { 3959 if (!timer) { 3960 setTimeout(() => { 3961 this.classList.remove("noAnime"); 3962 console.log("onmouseenter"); 3963 }, 50); 3964 // if there was no timer and the animation is just run, then add the timer again. 3965 timer = setTimeout(() => { 3966 console.log("onmouseenter 1"); 3967 requestAnimationFrame(() => { 3968 console.log("onmouseenter 2"); 3969 timer = null; 3970 }); 3971 }, 100) 3972 } 3973 } 3974 const onmouseleave = () => { 3975 requestAnimationFrame(() => { 3976 if (!timer && !this.classList.contains("noAnime")) { 3977 console.log("onmouseleave"); 3978 this.classList.add("noAnime"); 3979 timer=null; 3980 } 3981 }); 3982 } 3983 if(add){ 3984 //this.addEventListener("mouseenter",onmouseenter); 3985 //this.addEventListener("mouseleave",onmouseleave); 3986 this.onmouseenter = onmouseenter; 3987 this.onmouseleave = onmouseleave; 3988 }else{ 3989 //this.removeEventListener("mouseenter",onmouseenter); 3990 //this.removeEventListener("mouseleave",onmouseleave); 3991 this.onmouseenter = null; 3992 this.onmouseleave = null; 3993 } 3994 } 3995 if(this.getAttribute("on-animate")=="1"){ 3996 this.classList.add("noAnime"); 3997 if(this.getAttribute("on-entrance-animate")!="1"){ 3998 manageMouseOver(true); 3999 }else{ 4000 manageMouseOver(false); 4001 } 4002 } 4003 4004 /** 4005 * This function manages the intersection of the element for entracnce animation 4006 */ 4007 const observeIntersection = () => { 4008 // initialize the global timer variable that shall be used at a time. 4009 var timer = null; 4010 var isInView = false;
4011 const iframe = window.frameElement; 4012 const iframeRect = iframe?.getBoundingClientRect() || {}; 4013 const viewportHeight = iframe ? iframeRect.height : window.innerHeight; 4014 4015 const callback = (entries) => { 4016 entries.forEach((entry) => { 4017 // Update isInView state 4018 isInView = entry.isIntersecting; 4019 var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100; 4020 var animationTrigger=Number(this.getAttribute("trigger-ratio")||1); 4021 if(entryRatio < animationTrigger){ 4022 animationTrigger=entryRatio; 4023 } 4024 if (entry.isIntersecting) { 4025 // Element is entering view 4026 let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100; 4027 //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger); 4028 if (!timer && intersectionRatio >= animationTrigger) { 4029 4030 let delayStr=this.getAttribute("animation-delay")?.replace("s","") 4031 let delay = 0; 4032 try{ 4033 delay = delayStr?parseFloat(delayStr):0; 4034 }catch(e){ 4035 delay = 0; 4036 } 4037 setTimeout(() => { 4038 if(this.classList.contains("noAnime")){ 4039 if(delay > 0){ 4040 setTimeout(() => { 4041 this.style.removeProperty('opacity'); 4042 }, delay*1000+10); 4043 }else{ 4044 this.style.removeProperty('opacity'); 4045 } 4046 this.classList.remove("noAnime"); 4047 //console.log("enter",this.getAttribute("id")); 4048 } 4049 }, 50); 4050 // if there was no timer and the animation is just run, then add the timer again. 4051 timer = setTimeout(() => { 4052 //console.log("enter 1",this.getAttribute("id")); 4053 requestAnimationFrame(() => { 4054 //console.log("enter 2",this.getAttribute("id")); 4055 timer = null; 4056 }); 4057 }, delay>0?delay*1000+500:500) 4058 } 4059 } else { 4060 // When element leaves viewport 4061 if (this.getAttribute("on-animate")=="1") { 4062 // Use requestAnimationFrame to check if element is still out of view 4063 requestAnimationFrame(() => { 4064 if (!isInView && !timer) { 4065 this.classList.add("noAnime"); 4066 this.style.opacity = '0'; 4067 } 4068 }); 4069 } 4070 } 4071 }); 4072 }; 4073 4074 const myObserver = new IntersectionObserver(callback, { 4075 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] // Reduced threshold to detect partial visibility 4076 }); 4077 4078 // Set initial opacity and class 4079 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 4080 this.classList.add("noAnime"); 4081 this.style.opacity = '0'; 4082 myObserver.observe(this); 4083 } 4084 } 4085 4086 if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") { 4087 observeIntersection(); 4088 } 4089 4090}.bind(items[i]))(); 4091 }</script>
4091 <!--site_ad_view--> 4092 <!--end_site_ad_view--> 4093 4094
4094<script> 4095 window.onload = function() { 4096 if ('loading' in HTMLImageElement.prototype) { 4097 const images = document.querySelectorAll('img[loading="lazy"]'); 4098 images.forEach(img => { 4099 img.loading = "eager"; 4100 }); 4101 } 4102 4103 } 4104 </script>
4104 4105 4106 <!--site_body_end_code--> 4107 <!--end_site_body_end_code--> 4108 </body> 4109 4110</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.