1/* global $ */ 2 3// Background image sync slider 4$(function() { 5 // Create the fade effect on the image behind the slider 6 var $bgSyncSlider = $('[data-bg-sync]') 7 var $slides = $bgSyncSlider.find('.js_slides').children() 8 9 // Before sliding, create an img element with the current slide image 10 if($bgSyncSlider[0]){ 11 $bgSyncSlider[0].addEventListener('before.lory.slide', function() { 12 $slides.filter('.active') 13 .find('img') 14 .clone() 15 .addClass('bg') 16 .prependTo($bgSyncSlider) 17 }) 18 19 // After sliding, update the slider bg and fade out the previous img element 20 $bgSyncSlider[0].addEventListener('after.lory.slide', function() { 21 var $activeImg = $slides.filter('.active').find('img') 22 $bgSyncSlider.css('background-image', 'url("' + $activeImg.attr('src') + '")') 23 $bgSyncSlider.find('img.bg').fadeOut(500) 24 }) 25 } 26}) 27 28// Site header 2018 29$(function() { 30 var $body = $('body') 31 var $header = $('.site-header-2018') 32 var $navToggle = $header.find('.navtoggle') 33 var $navDrawer = $('.navdrawer-2018') 34 var isNavOpen = false 35 36 function toggleNav() { 37 isNavOpen = !isNavOpen 38 $navToggle.toggleClass('-active') 39 $navDrawer.toggleClass('-active') 40 $body.toggleClass('-nav-visible') 41 } 42 43 $navToggle.on('click', toggleNav) 44 45 // Better accessibility for keyboard users 46 $body.on('keydown', function(event) { 47 if (!(event.key === 'Escape' && isNavOpen)) return 48 toggleNav() 49 $navToggle.focus() 50 }) 51}) 52 53// Site menu 2018 54$(function() { 55 // Make sure only one collapsible is open at a time 56 $('.site-menu-2018 [data-toggle="collapse"]').on('click', function() { 57 $('.site-menu-2018 .collapse.in').collapse('hide'); 58 }); 59}) 60 61// Initialize lory slider 62$(function() { 63 // Init LoryA11y 64 loryA11y.initLory() 65}) 66$(function() { 67 var mediaQuery = window.matchMedia("(max-width: 996px)") 68 69 $('[data-smooth-scroll]').click(function(){ 70 /* Height to dropdown menu for mobile */ 71 var heightMenu = 0 72 if (mediaQuery.matches) heightMenu = 350 73 $('html, body').animate({ 74 scrollTop: $( $(this).attr('href') ).offset().top - heightMenu 75 }, 500); 76 return false; 77 }); 78}) 79// Vimeo videos sound toggle 80$(function() { 81 $toggles = $('[data-toggle-sound]') 82 if (!$toggles.length) return 83 $.getScript('https://player.vimeo.com/api/player.js', function() { 84 $toggles.each(function(i, btn) { 85 var $btn = $(btn) 86 var $icon = $btn.find('.glyphicon') 87 var $target = $($btn.attr('data-toggle-sound')) 88 var player = new Vimeo.Player($target[0]) 89 player.setVolume(0) 90 $btn.on('click', function() { 91 player.getVolume().then(function(vol) { 92 var isMuted = vol === 0; 93 player.setVolume(isMuted ? 1 : 0) 94 $icon 95 .toggleClass('glyphicon-volume-off', !isMuted) 96 .toggleClass('glyphicon-volume-up', isMuted) 97 }) 98 }) 99 }) 100 }) 101}) 102 103$(function() { 104 $('[data-history-safe-iframe-src]').each((i, iframe) => { 105 const src = iframe.dataset.historySafeIframeSrc 106 if (!src || iframe.dataset.historySafeIframeInitialized === 'true') return 107 108 iframe.dataset.historySafeIframeInitialized = 'true' 109 110 try { 111 if (iframe.contentWindow && iframe.contentWindow.location) { 112 iframe.contentWindow.location.replace(src) 113 } else { 114 iframe.src = src 115 } 116 } catch (e) { 117 iframe.src = src 118 } 119 }) 120 121 // Load the YouTube JS API (required later) 122 const $youtubeIframes = $('iframe[src*="youtube.com"], iframe[data-history-safe-iframe-src*="youtube"]') 123 if ($youtubeIframes.length && typeof YT === 'undefined') { 124 $.getScript('https://www.youtube.com/iframe_api') 125 } 126 127 // Toggle autoplay on all iframes inside modals 128 // For YouTube and Vimeo try to use postMessages to avoid reloading 129 // For all other providers (like Facebook) we reload the whole iframe 130 $(document).on('show.bs.modal hide.bs.modal', function(event) { 131 const action = event.type === 'show' ? 'play' : 'pause' 132 $(event.target).find('iframe').each((i, iframe) => { 133 const iframeSrc = iframe.dataset.historySafeIframeSrc || iframe.src 134 let msg 135 if (iframeSrc.search('vimeo') !== -1) { 136 msg = { method: action } 137 } else if (iframeSrc.search('youtube') !== -1) { 138 msg = { event: 'command', func: action + 'Video' } 139 } else { 140 msg = false 141 } 142 if (msg) { // Services that support postMessage 143 iframe.contentWindow.postMessage(JSON.stringify(msg), '*') 144 } else { // Services that DON'T support postMessage
145 const src = iframe.src 146 iframe.src = src // Reload iframe (pause) 147 } 148 }) 149 }) 150}) 151 152// Push events to GTM's dataLayer 153// Elements should define event data in the data-gtm attribute 154$(document).on('click jPlayer_play', '[data-gtm]', function(event) { 155 const eventData = event.target.dataset.gtm 156 if (!eventData) return 157 try { 158 dataLayer.push(JSON.parse(eventData)) 159 } catch(e) { 160 console.error('Failed to push to dataLayer', eventData, e) 161 } 162})
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.