1(function() { 2 var settings = window.sfpSettings || {}; 3 var api = window.sfpPlugin || {}; 4 var sdkPromise = null; 5 var sdkLoaded = false; 6 7 function getSetting(value, fallback) { 8 return typeof value === 'undefined' ? fallback : value; 9 } 10 11 function getLocale(container) { 12 if (settings.locale) { 13 return settings.locale; 14 } 15 if (container && container.dataset && container.dataset.sfpLocale) { 16 return container.dataset.sfpLocale; 17 } 18 return 'en_US'; 19 } 20 21 function shouldLoadSdk() { 22 return getSetting(settings.shouldLoad, true) && getSetting(settings.hasConsent, true); 23 } 24 25 function ensureFbRoot() { 26 if (!document.getElementById('fb-root')) { 27 var fbRoot = document.createElement('div'); 28 fbRoot.id = 'fb-root'; 29 document.body.appendChild(fbRoot); 30 } 31 } 32 33 function loadSdk(container) { 34 if (sdkLoaded) { 35 return Promise.resolve(); 36 } 37 if (sdkPromise) { 38 return sdkPromise; 39 } 40 41 sdkPromise = new Promise(function(resolve, reject) { 42 if (!shouldLoadSdk()) { 43 reject(new Error('Facebook SDK blocked by filters.')); 44 return; 45 } 46 47 ensureFbRoot(); 48 49 var js = document.createElement('script'); 50 js.id = 'facebook-jssdk'; 51 js.async = true; 52 js.defer = true; 53 js.src = 'https://connect.facebook.net/' + getLocale(container) + '/sdk.js#xfbml=1&version=v19.0'; 54 js.onload = function() { 55 sdkLoaded = true; 56 resolve(); 57 }; 58 js.onerror = function() { 59 reject(new Error('Facebook SDK failed to load.')); 60 }; 61 62 document.head.appendChild(js); 63 }); 64 65 return sdkPromise; 66 } 67 68 function setPlaceholderState(container, state) { 69 var placeholder = container.querySelector('.sfp-placeholder'); 70 if (!placeholder) { 71 return null; 72 } 73 74 if (!placeholder.dataset.sfpOriginalText) { 75 placeholder.dataset.sfpOriginalText = placeholder.textContent; 76 } 77 78 var clickEnabled = container.dataset.sfpClickToLoad === '1'; 79 80 if (state === 'loading') { 81 placeholder.classList.add('sfp-placeholder--loading'); 82 placeholder.disabled = true; 83 placeholder.removeAttribute('hidden'); 84 placeholder.removeAttribute('aria-hidden'); 85 placeholder.setAttribute('aria-busy', 'true'); 86 placeholder.style.display = ''; 87 placeholder.textContent = ''; 88 placeholder.setAttribute('aria-label', placeholder.dataset.sfpOriginalText || ''); 89 return placeholder; 90 } 91 92 if (state === 'ready') { 93 placeholder.classList.remove('sfp-placeholder--loading'); 94 placeholder.disabled = true; 95 placeholder.setAttribute('hidden', 'hidden'); 96 placeholder.setAttribute('aria-hidden', 'true'); 97 placeholder.removeAttribute('aria-busy'); 98 placeholder.style.display = 'none'; 99 placeholder.textContent = placeholder.dataset.sfpOriginalText || placeholder.textContent; 100 placeholder.removeAttribute('aria-label'); 101 return placeholder; 102 } 103 104 placeholder.classList.remove('sfp-placeholder--loading'); 105 placeholder.disabled = false; 106 placeholder.removeAttribute('hidden'); 107 placeholder.removeAttribute('aria-hidden'); 108 placeholder.removeAttribute('aria-busy'); 109 placeholder.style.display = ''; 110 placeholder.textContent = placeholder.dataset.sfpOriginalText || placeholder.textContent; 111 placeholder.removeAttribute('aria-label'); 112 return placeholder; 113 } 114 115 function buildEmbed(container) { 116 if (!container || container.dataset.sfpLoaded === '1') { 117 return; 118 } 119 120 if (!shouldLoadSdk()) { 121 return; 122 } 123 124 container.dataset.sfpLoaded = '1'; 125 126 var target = container.querySelector('.sfp-embed'); 127 if (!target) { 128 return; 129 } 130 131 var placeholder = setPlaceholderState(container, 'loading'); 132 133 var fbPage = document.createElement('div'); 134 fbPage.className = 'fb-page'; 135 fbPage.setAttribute('data-href', container.dataset.sfpUrl || ''); 136 fbPage.setAttribute('data-width', container.dataset.sfpWidth || ''); 137 fbPage.setAttribute('data-height', container.dataset.sfpHeight || ''); 138 fbPage.setAttribute('data-hide-cover', container.dataset.sfpHideCover || 'false'); 139 fbPage.setAttribute('data-show-facepile', container.dataset.sfpShowFacepile || 'true'); 140 fbPage.setAttribute('data-small-header', container.dataset.sfpSmallHeader || 'false'); 141 fbPage.setAttribute('data-tabs', container.dataset.sfpTabs || ''); 142 143 target.appendChild(fbPage); 144 145 loadSdk(container).then(function() { 146 if (window.FB && window.FB.XFBML && typeof window.FB.XFBML.parse === 'function') { 147 window.FB.XFBML.parse(container, function() { 148 setPlaceholderState(container, 'ready'); 149 }); 150 } else { 151 setPlaceholderState(container, 'ready'); 152 } 153 }).catch(function() { 154 container.dataset.sfpLoaded = '0'; 155 setPlaceholderState(container, 'idle'); 156 if (fbPage && fbPage.parentNode) { 157 fbPage.parentNode.removeChild(fbPage); 158 } 159 }); 160 } 161 162 function isInView(element) { 163 var rect = element.getBoundingClientRect(); 164 return rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.bottom >= 0; 165 } 166
167function setupLazyFallback(containers) { 168 var pending = Array.prototype.slice.call(containers); 169 170 function check() { 171 pending = pending.filter(function(container) { 172 if (container.dataset.sfpLoaded === '1') { 173 return false; 174 } 175 176 if (!isInView(container)) { 177 return true; 178 } 179 180 buildEmbed(container); 181 182 return false; 183 }); 184 185 if (!pending.length) { 186 window.removeEventListener('scroll', check); 187 window.removeEventListener('resize', check); 188 window.removeEventListener('orientationchange', check); 189 } 190 } 191 192 window.addEventListener('scroll', check); 193 window.addEventListener('resize', check); 194 window.addEventListener('orientationchange', check); 195 check(); 196 } 197 198 function initContainers() { 199 var containers = document.querySelectorAll('[data-sfp-embed="1"]'); 200 if (!containers.length) { 201 return; 202 } 203 204 var observer = null; 205 if ('IntersectionObserver' in window) { 206 observer = new IntersectionObserver(function(entries) { 207 entries.forEach(function(entry) { 208 if (!entry.isIntersecting) { 209 return; 210 } 211 212 var container = entry.target; 213 observer.unobserve(container); 214 if (container.dataset.sfpLoaded === '1') { 215 return; 216 } 217 218 if (container.dataset.sfpLazy === '1' && container.dataset.sfpClickToLoad === '0') { 219 buildEmbed(container); 220 } 221 }); 222 }); 223 } 224 225 containers.forEach(function(container) { 226 var placeholder = container.querySelector('.sfp-placeholder'); 227 var clickEnabled = container.dataset.sfpClickToLoad === '1'; 228 var lazyEnabled = container.dataset.sfpLazy === '1'; 229 230 if (placeholder) { 231 placeholder.addEventListener('click', function() { 232 buildEmbed(container); 233 }); 234 235 if (!clickEnabled) { 236 placeholder.classList.add('sfp-placeholder--auto'); 237 } 238 } 239 240 if (lazyEnabled && observer) { 241 observer.observe(container); 242 } 243 244 if (!lazyEnabled && !clickEnabled) { 245 buildEmbed(container); 246 } 247 }); 248 249 if (!observer) { 250 var lazyFallbackTargets = Array.prototype.filter.call(containers, function(container) { 251 return container.dataset.sfpLazy === '1' && container.dataset.sfpClickToLoad === '0'; 252 }); 253 254 if (lazyFallbackTargets.length) { 255 setupLazyFallback(lazyFallbackTargets); 256 } 257 } 258 } 259 260 api.loadEmbed = function(container) { 261 buildEmbed(container); 262 }; 263 264 api.loadAll = function() { 265 var containers = document.querySelectorAll('[data-sfp-embed="1"]'); 266 Array.prototype.forEach.call(containers, function(container) { 267 if (container.dataset.sfpLoaded !== '1') { 268 buildEmbed(container); 269 } 270 }); 271 }; 272 273 window.sfpPlugin = api; 274 275 if (document.readyState === 'loading') { 276 document.addEventListener('DOMContentLoaded', initContainers); 277 } else { 278 initContainers(); 279 } 280})();
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.