1var ifso_initialized_modals = []; 2(function( $ ) { 3 ifso_scope.replaceLoadLaterTriggers = function (defer = false) { 4 var _this = this; 5 var toReplace = this.lookForLoadLaterTriggers(defer,false); 6 var triggers_with_events = []; 7 if (toReplace.length > 0) { 8 this.sendAjaxReq('render_ifso_shortcodes', {triggers: toReplace, pageload_referrer: referrer_for_pageload}, function (ret) { //Referrer from if-so public 9 if (ret && ret !== null) { 10 try { 11 var data = JSON.parse(ret); 12 $.each(data, function (tid, tval) { 13 var tagsInDom = typeof(_this.lookForTriggerTags)==='function' ? _this.lookForTriggerTags(tid) : $('IfSoTrigger[tid="' + tid + '"]'); 14 tagsInDom.each(function (i, tag) { 15 if (null !== tag.getAttribute('eventType')) { //If the trigger has an Eventtype setup,add its data to the triggers_with_events array 16 var dataFromShortcode = {}; 17 $.each(tag.attributes, function (i, attr) { 18 if (attr.name !== 'style') { 19 dataFromShortcode[attr.name] = attr.value; 20 } 21 }) 22 dataFromShortcode.element = tag; 23 dataFromShortcode.content = tval; 24 triggers_with_events.push(dataFromShortcode); 25 return; 26 } 27 BaseTriggerCallback(tag,tval); 28 }) 29 }); 30 if (triggers_with_events.length > 0) { 31 ifso_scope.process_triggers_with_events(triggers_with_events); 32 } 33 DispatchTriggersLoaded(); 34 } catch (e) { 35 console.error('Error fetching if-so triggers!'); 36 console.error(e); 37 } 38 } 39 }) 40 } 41 } 42 43 ifso_scope.process_triggers_with_events = function (triggers_with_events) { 44 var callback = function (element, content) { 45 BaseTriggerCallback(element,content); 46 DispatchTriggersLoaded(); 47 }; 48 var _this = this; 49 $.each(triggers_with_events, function (index, trigger) { 50 var eventType = trigger.eventtype; 51 if (typeof (_this.loadTriggerEvents[eventType]) !== 'undefined') { 52 _this.loadTriggerEvents[eventType](trigger, callback); 53 } 54 else{ 55 BaseTriggerCallback(trigger.element,trigger.content); 56 } 57 }); 58 ifso_after_trigger_events_processed(); 59 } 60 61 62 ifso_scope.loadTriggerEvents = { 63 'scroll': function (trigger, callback) { 64 $(document).one('scroll', function () { 65 callback(trigger.element, trigger.content); 66 }); 67 }, 68 69 'click': function (trigger, callback) { 70 if (typeof (trigger.target) !== 'undefined') { 71 $(trigger.target).one('click', function () { 72 callback(trigger.element, trigger.content); 73 }); 74 } 75 }, 76 77 'inactivity': function (trigger, callback) { 78 if (typeof (trigger.time) !== 'undefined') { 79 var timeCounter = 0; 80 81 var clearCounter = function () { 82 timeCounter = 0; 83 }; 84 85 addEventListener('mousemove', clearCounter); 86 addEventListener('keypress', clearCounter); 87 88 var inactivityInterval = setInterval(function () { 89 timeCounter++; 90 if (timeCounter >= trigger.time) { 91 callback(trigger.element, trigger.content); 92 removeEventListener('mousemove', clearCounter); 93 removeEventListener('keypress', clearCounter); 94 clearInterval(inactivityInterval); 95 } 96 }, 1000); 97 } 98 }, 99
100 'exit-intent': function (trigger, callback) { 101 var mouseleaveCB = function (e) { 102 if (e.relatedTarget === null) { 103 if (e.clientY < 0) { 104 setTimeout(function () { 105 callback(trigger.element, trigger.content); 106 document.removeEventListener('mouseout', mouseleaveCB); 107 }, 250); 108 } 109 } 110 }; 111 document.addEventListener('mouseout', mouseleaveCB); 112 }, 113 114 'delay': function(trigger,callback) { 115 if(trigger.delay && !isNaN(parseInt(trigger.delay))){ 116 var delaySec = parseInt(trigger.delay) * 1000; 117 setTimeout(function(){ 118 callback(trigger.element,trigger.content); 119 },delaySec); 120 } 121 else{ 122 callback(trigger.element,trigger.content); 123 } 124 }, 125 126 'youtube' : function(trigger,callback){ 127 if(trigger.target && document.querySelector(trigger.target)!==null){ 128 var eventType = trigger.event ? trigger.event : 'play'; 129 var target_el = document.querySelector(trigger.target).tagName.toLowerCase()==='iframe' ? document.querySelector(trigger.target) : document.querySelector(trigger.target).querySelector('iframe'); 130 if(target_el!==null){ 131 if(typeof(ifso_scope['youtube-trigger-events'])==='undefined') ifso_scope['youtube-trigger-events'] = {}; 132 if(typeof(ifso_scope['youtube-trigger-events'][trigger.target])==='undefined') ifso_scope['youtube-trigger-events'][trigger.target] = {}; 133 if(typeof(ifso_scope['youtube-trigger-events']['callbacks'])==='undefined') ifso_scope['youtube-trigger-events']['callbacks'] = []; 134 ifso_scope['youtube-trigger-events']['callbacks'].push(function(){ 135 if(typeof(ifso_scope['youtube-trigger-events'][trigger.target]['player'])==='undefined'){ 136 ifso_scope['youtube-trigger-events'][trigger.target]['player'] = new YT.Player(target_el); 137 } 138 ifso_scope['youtube-trigger-events'][trigger.target]['player'].addEventListener('onStateChange',function(e){ 139 if(trigger.element.parentElement===null) return; 140 if(eventType==='play'){ 141 if(e.data===YT.PlayerState.PLAYING) 142 callback(trigger.element,trigger.content); 143 } 144 if(eventType==='pause'){ 145 if(e.data===YT.PlayerState.PAUSED) 146 callback(trigger.element,trigger.content); 147 } 148 if(eventType==='time-watched' || eventType==='time-reached'){ 149 var time = trigger.time ? parseInt(trigger.time) : 0; 150 151 if(typeof(ifso_scope['youtube-trigger-events'][trigger.target][eventType])==='undefined') ifso_scope['youtube-trigger-events'][trigger.target][eventType] = {}; 152 if(e.data===YT.PlayerState.PLAYING){ 153 if(eventType==='time-watched') 154 var now = typeof(ifso_scope['youtube-trigger-events'][trigger.target][eventType]['counter'])==='undefined' ? 0 : ifso_scope['youtube-trigger-events'][trigger.target][eventType]['counter']; 155 else 156 var now = parseInt(e.target.getCurrentTime()); 157 ifso_scope['youtube-trigger-events'][trigger.target][eventType]['counter'] = now; 158 ifso_scope['youtube-trigger-events'][trigger.target][eventType]['interval'] = setInterval(function (){ 159 ifso_scope['youtube-trigger-events'][trigger.target][eventType]['counter']++; 160 if(time<=ifso_scope['youtube-trigger-events'][trigger.target][eventType]['counter']){ 161 callback(trigger.element,trigger.content); 162 clearInterval(ifso_scope['youtube-trigger-events'][trigger.target][eventType]['interval']); 163 } 164 },1000); 165 } 166 else 167 clearInterval(ifso_scope['youtube-trigger-events'][trigger.target][eventType]['interval']); 168 } 169 }) 170 }); 171 } 172 } 173 }, 174 175 'custom-event':function(trigger,callback){ 176 if(trigger.eventname){ 177 if(typeof(ifso_scope['custom-event-triggerEvents'])==='undefined') ifso_scope['custom-event-triggerEvents'] = []; 178 ifso_scope['custom-event-triggerEvents'].push(trigger); 179 document.addEventListener(trigger.eventname,function(){callback(trigger.element,trigger.content);}); 180 } 181 } 182 183 }; 184 185 186 187 var ifso_modal_initialized_event = document.createEvent('Event'); 188 ifso_modal_initialized_event.initEvent('ifso_modal_initialized', true, true); 189 190 var modalsCreated = 0; 191 $( document ).ready(function() { 192 InitModals(); 193 if(typeof(ifso_scope.DispatchAjaxContentLoaded)!=='undefined') 194 document.addEventListener("ifso_ajax_content_loaded",InitModals); 195 else 196 document.addEventListener("ifso_ajax_triggers_loaded",InitModals); 197 }); 198 199 function InitModals(){ 200 var tags = $('IfSoModalContent'); 201 tags.each(function(index,el){ 202 if(!el.classList.contains('ready')){ 203 var content = el.innerHTML; 204 var className = (null!==el.getAttribute('classname')) ? el.getAttribute('classname').replace(' ' ,'_') : 'modal-'+modalsCreated++; 205 var closebtn = (null !== el.getAttribute('closebtn')) ? el.getAttribute('closebtn') : false;
206 var openbtn = (null !== el.getAttribute('openbtn')) ? el.getAttribute('openbtn') : false; 207 InitAndOpenModal(content,className,closebtn,openbtn); 208 el.classList.add('ready'); 209 } 210 }); 211 } 212 213 function InitAndOpenModal(content, className, closeWithButton = false,openWithButton = false){ 214 if(content === '' || content === null || content.replaceAll(/\<ifsoTriggerAnalyticsEvent.*\>.*<\/ifsoTriggerAnalyticsEvent\>/gi,'')==='') return false; 215 var lockedModal = (!!closeWithButton); 216 var allowReopen = (!!openWithButton); 217 var dummyEl = document.createElement('div'); 218 dummyEl.innerHTML = content; 219 dummyEl.className = 'ifso_modal_content'; 220 221 var mod = new TinyModal(className,lockedModal); 222 mod.createModal(dummyEl); 223 mod.openModal(); 224 225 if(lockedModal){ 226 if(mod.mainElement.querySelector(closeWithButton)!==null){ 227 mod.mainElement.querySelector(closeWithButton).addEventListener('click',function (){ 228 if(!allowReopen) mod.removeModal(); 229 else mod.closeModal(); 230 }); 231 } 232 } 233 234 if(allowReopen){ 235 var reopenBtn = document.querySelector(openWithButton); 236 if(reopenBtn!==null){ 237 reopenBtn.addEventListener('click',function(){ 238 mod.openModal(); 239 }); 240 } 241 } 242 243 ifso_initialized_modals.push(mod); 244 document.dispatchEvent(ifso_modal_initialized_event); 245 246 return mod; 247 } 248 249 function BaseTriggerCallback(element,content) { 250 if(element.getAttribute('prevent_default_rerender') && element.getAttribute('prevent_default_rerender')==='yes' && element.innerHTML===content) return; 251 if(element.getAttribute('display') && element.getAttribute('display') === 'modal') { 252 var className = (null !== element.getAttribute('classname')) ? element.getAttribute('classname').replace(' ', '_') : 'ifso_trigger_content_modal'; 253 var closebtn = (null !== element.getAttribute('closebtn')) ? element.getAttribute('closebtn') : false; 254 var openbtn = (null !== element.getAttribute('openbtn')) ? element.getAttribute('openbtn') : false; 255 InitAndOpenModal(content, className, closebtn, openbtn); 256 element.outerHTML = ''; 257 } 258 else { 259 element.outerHTML = content; 260 } 261 262 if(typeof(ifso_scope.evalScriptsFromHTML) === 'function') 263 ifso_scope.evalScriptsFromHTML(content); 264 } 265 266 function DispatchTriggersLoaded() { 267 if(typeof(ifso_scope.DispatchTriggersLoaded) === 'function') 268 ifso_scope.DispatchTriggersLoaded(); 269 } 270 271 var redirectOnInteraction = function(el,rdrUrl,numberOfClicks,cname,cval,expires){ 272 if($(el).hasClass('activated')) 273 return; 274 var ifsoJerkAnimations = document.getElementById('ifsoJerkAnimations'); 275 if(ifsoJerkAnimations==null){ 276 var cssText = '@keyframes jerkup{0%{transform:translateY(0);}50%{transform:translateY(-2px);}100%{transform:translateY(0);}}' + 277 '@keyframes jerkdown{0%{transform:translateY(0);}50%{transform:translateY(2px)}100%{transform:translateY(0);}}'; 278 var cssEl = document.createElement('style'); 279 cssEl.innerHTML = cssText; 280 cssEl.id = 'ifsoJerkAnimations'; 281 var head = document.head || document.getElementsByTagName('head')[0]; 282 head.appendChild(cssEl); 283 $(el).addClass('activated'); 284 } 285 this.el = el; 286 this.rdrUrl = rdrUrl; 287 this.clicks = 0; 288 this.targetClicks = numberOfClicks; 289 this.cookieToSet = {'name':cname, 'value':cval, 'expires':expires}; 290 this.realClickHandler = this.clickHandler.bind(this); 291 this.el.addEventListener('click',this.realClickHandler); 292 }; 293 redirectOnInteraction.prototype = { 294 clickHandler : function () { 295 var animationToApply = (this.clicks%2===0) ? 'jerkup' : 'jerkdown'; 296 this.el.style.animation = animationToApply + ' 0.25s 3'; 297 this.clicks++; 298 if(this.clicks>=this.targetClicks){ 299 if(this.cookieToSet.name!=='') 300 this.createCookie(this.cookieToSet.name,this.cookieToSet.value,this.cookieToSet.expires); 301 if(this.rdrUrl!=='') 302 location.href = this.rdrUrl; 303 this.el.removeEventListener('click',this.realClickHandler); 304 } 305 }, 306 createCookie : function(name, value, mins) { 307 var expires; 308 if (mins) { 309 var date = new Date(); 310 date.setTime(date.getTime()+(mins*60*1000)); 311 expires = "; expires="+date.toGMTString(); 312 } 313 else { 314 expires = ""; 315 } 316 document.cookie = name+"="+value+expires+"; path=/"; 317 } 318 } 319 function initInteractionRedirects(){ 320 var els = $('IfsoInteractRdr'); 321 els.each(function (index,el) { 322 var clicks = el.getAttribute('clicks'); 323 var url = el.getAttribute('url'); 324 var cname = el.getAttribute('cname'); 325 var cval = el.getAttribute('cval'); 326 var expires = el.getAttribute('expires'); 327 var n = new redirectOnInteraction(el,url,clicks,cname,cval,expires); 328 }); 329 } 330 331 function isElementInViewport (el) { 332 if (typeof jQuery === "function" && el instanceof jQuery) { 333 el = el[0]; 334 } 335 var rect = el.getBoundingClientRect(); 336 return ( 337 rect.top >= 0 && 338 rect.left >= 0 && 339 rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /* or $(window).height() */ 340 rect.right <= (window.innerWidth || document.documentElement.clientWidth) /* or $(window).width() */ 341 ); 342 } 343 function scanCookieAdders(){ 344 var elements = document.querySelectorAll('.ifso-add-cookie-on-view:not([done])'); 345 elements = Array.prototype.slice.call(elements); 346 if(elements.length<=0) return; 347 for(var i=0;i<elements.length;i++){ 348 if(isElementInViewport(elements[i])){ 349 var cookiename = typeof(elements[i].getAttribute('cookiename'))==='string'? elements[i].getAttribute('cookiename') : 'ifso-viewed-element'; 350 var cookieval = typeof (elements[i].id)==='string' && elements[i].id!=='' ? elements[i].id : '1'; 351 var expiration = typeof (elements[i].getAttribute('expiration'))==='string' ? elements[i].getAttribute('expiration') : 365; 352 expiration = expiration==='session' || isNaN(parseInt(expiration)) ? false : parseInt(expiration); 353 ifso_scope.createCookie(cookiename,cookieval,expiration); 354 elements[i].setAttribute('done','yes'); 355 } 356 } 357 } 358 function enableYoutubeIframesJSApi(){ 359 var iframes = document.querySelectorAll('iframe.ifso-youtube, .ifso-youtube iframe'); 360 iframes = Array.prototype.slice.call(iframes); 361 if(iframes.length<=0) return; 362 for(var i=0;i<iframes.length;i++){ 363 if(iframes[i].getAttribute('ifso-ready')===null){ 364 iframes[i].src = iframes[i].src+'&enablejsapi=1'; 365 iframes[i].setAttribute("ifso-ready",'1'); 366 } 367 368 } 369 } 370 function ifso_after_trigger_events_processed(){ 371 if(typeof(ifso_scope['youtube-trigger-events'])!=='undefined'){ 372 if(!ifso_scope['yt_iframe_api_loaded']){ 373 ifso_scope['yt_iframe_api_loaded'] = true; 374 var imported_script = document.createElement('script'); 375 imported_script.id = 'iframe-api-tag'; 376 imported_script.src = 'https://www.youtube.com/iframe_api'; 377 var firstScriptTag = document.getElementsByTagName('script')[0]; 378 firstScriptTag.parentNode.insertBefore(imported_script, firstScriptTag); 379 } 380 window.onYouTubeIframeAPIReady = () => { 381 var cbks = ifso_scope['youtube-trigger-events']['callbacks']; 382 for(var i=0;i<=cbks.length-1;i++){ 383 if(typeof(ifso_scope['youtube-trigger-events']['callbacks'][i])==='function') 384 ifso_scope['youtube-trigger-events']['callbacks'][i](); 385 } 386 }; 387 } 388 } 389 function init_extra_features(){ 390 enableYoutubeIframesJSApi(); 391 initInteractionRedirects(); 392 scanCookieAdders(); 393 } 394 $( document ).ready(function() { 395 init_extra_features(); 396 if(typeof(ifso_scope.DispatchAjaxContentLoaded)!=='undefined') 397 document.addEventListener("ifso_ajax_content_loaded",init_extra_features); 398 else 399 document.addEventListener("ifso_ajax_triggers_loaded",init_extra_features); 400 document.addEventListener('scroll',scanCookieAdders); 401 }); 402})( jQuery );
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.