1(function () { 2 'use strict'; 3 4 var bodyLockClass = 'ew-mobile-apps-popup-body-lock'; 5 6 function forEach(nodes, callback) { 7 Array.prototype.forEach.call(nodes, callback); 8 } 9 10 function findClosest(element, selector) { 11 while (element && element !== document) { 12 if (matches(element, selector)) { 13 return element; 14 } 15 16 element = element.parentNode; 17 } 18 19 return null; 20 } 21 22 function matches(element, selector) { 23 var matcher = element.matches || element.msMatchesSelector || element.webkitMatchesSelector; 24 25 if (!matcher) { 26 return false; 27 } 28 29 return matcher.call(element, selector); 30 } 31 32 function toggleBodyLock() { 33 var hasOpenedPopup = false; 34 35 forEach(document.querySelectorAll('.ew-mobile-apps-popup'), function (popup) { 36 if (!popup.hidden) { 37 hasOpenedPopup = true; 38 } 39 }); 40 41 if (hasOpenedPopup) { 42 document.body.classList.add(bodyLockClass); 43 return; 44 } 45 46 document.body.classList.remove(bodyLockClass); 47 } 48 49 function openPopup(popup) { 50 if (!popup) { 51 return; 52 } 53 54 popup.hidden = false; 55 popup.setAttribute('aria-hidden', 'false'); 56 toggleBodyLock(); 57 } 58 59 function closePopup(popup) { 60 if (!popup) { 61 return; 62 } 63 64 popup.hidden = true; 65 popup.setAttribute('aria-hidden', 'true'); 66 toggleBodyLock(); 67 } 68 69 document.addEventListener('click', function (event) { 70 var trigger = findClosest(event.target, '[data-mobile-apps-popup-open]'); 71 72 if (!trigger) { 73 return; 74 } 75 76 var targetSelector = trigger.getAttribute('data-mobile-apps-popup-open'); 77 var popup = document.querySelector(targetSelector); 78 79 event.preventDefault(); 80 openPopup(popup); 81 }); 82 83 document.addEventListener('click', function (event) { 84 var closeButton = findClosest(event.target, '[data-mobile-apps-popup-close]'); 85 86 if (!closeButton) { 87 return; 88 } 89 90 var popup = findClosest(closeButton, '.ew-mobile-apps-popup'); 91 92 event.preventDefault(); 93 closePopup(popup); 94 }); 95 96 document.addEventListener('keydown', function (event) { 97 if (event.key !== 'Escape' && event.keyCode !== 27) { 98 return; 99 } 100 101 forEach(document.querySelectorAll('.ew-mobile-apps-popup'), function (popup) { 102 if (popup.hidden) { 103 return; 104 } 105 106 closePopup(popup); 107 }); 108 }); 109 110 document.addEventListener('DOMContentLoaded', function () { 111 var isHidden = sessionStorage.getItem('ew-mobile-apps-popup') 112 113 if (isHidden) { 114 return; 115 } 116 117 var popup = document.getElementById('ew-mobile-apps-popup'); 118 119 openPopup(popup); 120 121 sessionStorage.setItem('ew-mobile-apps-popup', 'true') 122 }); 123 124})();
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.