{"version":3,"file":"bcn-main.js","mappings":"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","sources":["webpack://bcn-storybook/webpack/runtime/chunk loaded","webpack://bcn-storybook/./src/02-atoms/BackgroundShapes/Js/BackgroundShapes.js","webpack://bcn-storybook/./src/01-base/Modal/Js/Modal.js","webpack://bcn-storybook/./src/02-atoms/ImageWithZoom/Js/ImageWithZoom.js","webpack://bcn-storybook/./src/02-atoms/Video/Js/YoutubeVideo.js","webpack://bcn-storybook/./src/02-atoms/Video/Js/VimeoVideo.js","webpack://bcn-storybook/./src/02-atoms/Video/Js/Video.js","webpack://bcn-storybook/./src/02-atoms/AnimatedHeadings/Js/AnimatedHeadings.js","webpack://bcn-storybook/./src/02-atoms/Forms/FormElement/Js/ShowPassword.js","webpack://bcn-storybook/./src/02-atoms/atoms.js","webpack://bcn-storybook/./src/03-molecules/GlossaryTerm/Js/GlossaryTerm.js","webpack://bcn-storybook/./src/00-tokens/js/helpers/helpers.js","webpack://bcn-storybook/./src/03-molecules/JumpLinks/Js/JumpLinks.js","webpack://bcn-storybook/./src/03-molecules/CardImageGallery/Js/CardExpandedView.js","webpack://bcn-storybook/./src/03-molecules/AlgoliaAutocomplete/Js/AlgoliaAutocomplete.js","webpack://bcn-storybook/./src/03-molecules/FormDonate/Js/FormDonate.js","webpack://bcn-storybook/./src/03-molecules/FundsInMemory/Js/FundsInMemory.js","webpack://bcn-storybook/./src/03-molecules/CardPublicationCard/Js/ToggleVisibility.js","webpack://bcn-storybook/./src/03-molecules/molecules.js","webpack://bcn-storybook/./src/04-organisms/Carousel/Js/Carousel.js","webpack://bcn-storybook/./src/03-molecules/Filter/Js/Filter.js","webpack://bcn-storybook/./src/03-molecules/FilterGroup/Js/FilterGroup.js","webpack://bcn-storybook/./src/04-organisms/HeroLandingPage/Js/HeroLandingPage.js","webpack://bcn-storybook/./src/04-organisms/HeroHomepage/Js/HeroHomepage.js","webpack://bcn-storybook/./src/04-organisms/ImageGallery/Js/ImageGallery.js","webpack://bcn-storybook/./src/04-organisms/LegacyNavigation/Js/LegacyNavigation.js","webpack://bcn-storybook/./src/04-organisms/PropositionBlock/Js/PropositionBlock.js","webpack://bcn-storybook/./src/04-organisms/Share/Js/Share.js","webpack://bcn-storybook/./src/04-organisms/Header/Js/Header.js","webpack://bcn-storybook/./src/04-organisms/FormBlock/Js/PublicationDownload.js","webpack://bcn-storybook/./src/04-organisms/FormModal/Js/FormModal.js","webpack://bcn-storybook/./src/04-organisms/ListingsAndControlsBlock/Js/ServiceGroups.js","webpack://bcn-storybook/./src/04-organisms/ListingsAndControlsBlock/Js/Services.js","webpack://bcn-storybook/./src/04-organisms/Listings/Js/PublicationFilters.js","webpack://bcn-storybook/./src/03-molecules/FilterChipGroup/Js/FilterChipGroup.js","webpack://bcn-storybook/./src/03-molecules/FilterGroup/Js/FilterGroupListing.js","webpack://bcn-storybook/./src/04-organisms/organisms.js","webpack://bcn-storybook/webpack/bootstrap","webpack://bcn-storybook/webpack/runtime/compat get default export","webpack://bcn-storybook/webpack/runtime/define property getters","webpack://bcn-storybook/webpack/runtime/global","webpack://bcn-storybook/webpack/runtime/hasOwnProperty shorthand","webpack://bcn-storybook/webpack/runtime/jsonp chunk loading","webpack://bcn-storybook/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * BackgroundShapes class.\n */\nexport class BackgroundShapes {\n /**\n * Class constructor.\n *\n * @param {HTMLElement} parentElement\n * The element to bind these actions to.\n */\n constructor(parentElement) {\n console.log('Hello from the BackgroundShapes')\n\n /**\n * The parent element.\n *\n * @type {HTMLElement}\n */\n this.parentElement = parentElement\n\n /**\n * The parallax element element.\n *\n * @type {HTMLElement}\n */\n this.parallaxElementLeft = this.parentElement.querySelector('.a-background-shapes__left')\n\n this.parallaxElementRight = this.parentElement.querySelector('.a-background-shapes__right')\n\n /**\n * The parallax ratio.\n *\n * @type {number}\n */\n this.parallaxRatioLeft = 1.5\n\n this.parallaxRatioRight = 1.3\n\n /**\n * A boolean to indicate if the scroll actions should be throttled.\n *\n * @type {boolean}\n */\n this.scrollThrottle = false\n\n /**\n * A binding of the scroll handler function to facilitate more effect mounting and unmounting\n */\n this.scrollHandler = this.handlerScroll.bind(this)\n\n /**\n * A boolean indicating if the hero element is visible.\n *\n * @type {boolean}\n */\n this.isVisible = false\n\n let options = {\n rootMargin: '0px',\n threshold : 0.2\n }\n\n document.addEventListener('scroll', this.scrollHandler)\n }\n\n\n /**\n * Handle the scroll event.\n *\n * The scrollThrottle boolean is used to make sure that only one\n * event is processed at a time\n */\n handlerScroll() {\n if (!this.scrollThrottle) {\n this.scrollThrottle = true\n window.requestAnimationFrame(this.handlerAnimationFrame.bind(this))\n }\n }\n\n /**\n * Handle the Animation frame callback.\n */\n handlerAnimationFrame() {\n const elementTop = window.scrollY\n\n // if (elementTop <= 0) {\n const parallaxValueLeft = Math.abs(this.parallaxRatioLeft * elementTop)\n const parallaxValueRight = Math.abs(this.parallaxRatioRight * elementTop)\n\n this.parallaxElementLeft.style.transform = `translateY(-${parallaxValueLeft.toFixed(2)}px)`\n this.parallaxElementRight.style.transform = `translateY(-${parallaxValueRight.toFixed(2)}px)`\n // }\n\n this.scrollThrottle = false\n }\n}\n\nexport function backgroundShapesInit() {\n document.querySelectorAll('.a-background-shapes').forEach((element) => {\n new BackgroundShapes(element)\n })\n}\n","/**\n * Modal functionality.\n */\nexport class Modal {\n\n /**\n * Constructor.\n */\n constructor(colour='purple', variant='default', theme='default', ariaLabel='Modal') {\n\n /**\n * The valid colours.\n *\n * @type {string[]}\n */\n this.validColours = ['purple', 'white', 'yellow', 'grey']\n\n /**\n * The modal bg colour.\n *\n * @type {string}\n */\n this.colour = colour\n\n /**\n * The modal variant (default or form)\n *\n * @type {string}\n */\n this.variant = variant\n\n /**\n * The theme\n *\n * @type {string}\n */\n this.theme = theme\n\n /**\n * The title/aria-label\n *\n * @type {string}\n */\n this.ariaLabel = ariaLabel\n\n /**\n * The modal wrapper element.\n *\n * @type {HTMLDivElement}\n */\n this.modal = document.createElement('div')\n\n /**\n * The element that triggered the modal action.\n *\n * @type {HTMLElement}\n */\n this.triggeringElement = null\n\n /**\n * The first focusable element.\n *\n * @type {HTMLElement}\n */\n this.firstFocusableElement = null\n\n /**\n * The last focusable element.\n *\n * @type {HTMLElement}\n */\n this.lastFocusableElement = null\n\n this.colourSet(colour)\n }\n\n /**\n * createFullModal.\n *\n * @param {string} content\n * The modal element.\n * @param {HTMLElement} triggeringElement\n * The element that triggered the modal action.\n * @param {String} colour\n * The modal colour.\n */\n createFullModal(content, triggeringElement) {\n this.triggeringElement = triggeringElement\n this.modal.innerHTML = this.modalCreate()\n const closeButton = this.modal.querySelector('.b-modal__close-btn')\n const contentWrapper = this.modal.querySelector('.b-modal__content')\n\n document.addEventListener('keydown', this.handlerKeyDown.bind(this))\n closeButton.addEventListener('click', this.modalClose.bind(this))\n contentWrapper.innerHTML = content\n document.body.appendChild(this.modal)\n closeButton.focus()\n\n document.body.setAttribute('data-overflow-hidden', 'all')\n\n this.focusableElementsSet()\n }\n\n /**\n * createFullModal.\n *\n * @param {string} content\n * The modal element.\n * @param {HTMLElement} triggeringElement\n * The element that triggered the modal action.\n */\n createMobileOnlyModal(content, triggeringElement) {\n this.triggeringElement = triggeringElement\n this.modal.innerHTML = this.modalCreate()\n const contentWrapper = this.modal.querySelector('.b-modal__content')\n contentWrapper.innerHTML = content\n document.body.appendChild(this.modal)\n\n document.body.setAttribute('data-overflow-hidden', 'mobile')\n\n\n const modalInner = this.modal.querySelector('.b-modal')\n modalInner.setAttribute('data-mobile-only', 'true')\n }\n\n /**\n * Set the modal colour.\n *\n * @param colour\n */\n colourSet(colour) {\n console.log('colourSet', colour)\n\n if (colour) {\n // console.log('1 colourSet', colour)\n if(this.validColours.includes(colour)) {\n // console.log('2 colourSet', colour)\n this.colour = colour\n }\n }\n }\n\n /**\n * Set the first and last focusable elements.\n */\n focusableElementsSet() {\n const focusableElements = this.modal.querySelectorAll('a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type=\"text\"]:not([disabled]), input[type=\"radio\"]:not([disabled]), input[type=\"checkbox\"]:not([disabled]), select:not([disabled])')\n\n this.firstFocusableElement = focusableElements[0];\n this.lastFocusableElement = focusableElements[focusableElements.length - 1];\n }\n\n /**\n * Handle the key down event.\n *\n * @param {KeyboardEvent} event\n * The event that was generated.\n */\n handlerKeyDown = (event) => {\n if (event.code === 'Tab') {\n if (event.shiftKey) {\n if (document.activeElement === this.firstFocusableElement) {\n this.lastFocusableElement.focus()\n event.preventDefault()\n }\n }\n else {\n if (document.activeElement === this.lastFocusableElement) {\n this.firstFocusableElement.focus()\n event.preventDefault()\n }\n }\n }\n\n if (event.code === 'Escape') {\n this.modalClose()\n }\n }\n\n /**\n * Close the modal.\n */\n modalClose = () => {\n document.body.setAttribute('data-overflow-hidden', 'none')\n this.modal.remove()\n this.triggeringElement?.focus()\n document.removeEventListener('keydown', this.handlerKeyDown.bind(this))\n }\n\n /**\n * Create the modal.\n *\n * @return {string}\n */\n modalCreate() {\n let markup = ''\n if (this.variant === 'default') {\n markup = `
`\n } else {\n markup = `
\n
\n
`\n }\n\n return markup\n }\n}\n","import Zoomist from 'zoomist'\nimport {Modal} from \"../../../01-base/Modal/Js/Modal\"\n\n/**\n * ImageWithZoom class.\n */\nclass ImageWithZoom {\n constructor(element) {\n this.expandButton = element.querySelector('.a-image-with-zoom__button-image-expand')\n this.modalTitle = this.expandButton.dataset.modalTitle ? this.expandButton.dataset.modalTitle + ' - expanded image with zoom controls': 'Expanded image with zoom controls'\n this.modalContent = element.querySelector('.a-image-with-zoom__modal-content')\n this.expandButton.addEventListener('click', this.handleModalExpand.bind(this))\n }\n\n /**\n * Handle the modal expand event.\n */\n handleModalExpand() {\n\n const modal = new Modal('grey', 'default', 'default', this.modalTitle)\n modal.createFullModal(this.modalContent.innerHTML, this.expandButton)\n const zoomistElement = modal.modal.querySelector('.a-image-with-zoom__zoom-image')\n\n if(zoomistElement) {\n this.zoomist = new Zoomist(zoomistElement, {\n maxRatio: 2,\n height : '100%',\n slider : false,\n zoomer : {\n inEl : modal.modal.querySelector('.a-image-with-zoom__zoom-in'),\n outEl: modal.modal.querySelector('.a-image-with-zoom__zoom-out'),\n disableOnBounds: false\n }\n })\n\n }\n }\n}\n\n/**\n * ImageWithZoom init function.\n */\nexport function imageWithZoomInit() {\n const imageExpandObjects = document.querySelectorAll('.a-image-with-zoom')\n\n imageExpandObjects.forEach((imageExpandElement) => {\n new ImageWithZoom(imageExpandElement)\n })\n}\n","/**\n * YoutubePlayer class.\n */\nexport class YoutubePlayer {\n\n /**\n * Class constructor.\n *\n * @param {HTMLElement} videoElement\n * The element to bind these actions to.\n */\n constructor(videoElement) {\n console.log('Hello from the YoutubePlayer', videoElement)\n\n /**\n * The parent wrapper element.\n *\n * @type {Element}\n */\n this.parentElement = videoElement.closest('.a-video')\n\n /**\n * The poster thumbnail.\n *\n * @type {Element}\n */\n this.poster = this.parentElement.querySelector('.a-video__poster')\n\n /**\n * The video element.\n *\n * @type {HTMLElement}\n */\n this.videoElement = videoElement\n\n /**\n * The YouTube video ID.\n *\n * @type {string}\n */\n this.videoId = videoElement.getAttribute('data-video-id')\n\n /**\n * A boolean indicating if the video has a poster thumbnail.\n *\n * @type {boolean}\n */\n this.hasPoster = this.poster !== null\n\n /**\n * The YouTube video player.\n *\n * @type {null}\n */\n this.player = null\n\n /**\n * An optional IntersectionObserver instance.\n *\n * @type {IntersectionObserver}\n */\n this.observer = null\n\n /**\n * An attribute to handle the debouncing of the YT player state change.\n *\n * @type {null}\n */\n this.stateDebounce = null\n\n\n if (this.hasPoster) {\n this.parentElement.setAttribute('data-has-poster', 'true')\n this.poster.addEventListener('click', this.handlePosterClick.bind(this))\n }\n else {\n let options = {\n rootMargin: '0px',\n threshold : 0.2\n }\n this.observer = new IntersectionObserver(this.videoIsVisible.bind(this), options)\n this.observer.observe(this.parentElement)\n }\n\n this.registerEvents()\n }\n\n /**\n * Dispatch the broadcast event.\n *\n * This is used to pause any other videos that are playing on the page.\n *\n * @param {int} eventData\n * The player state.\n */\n dispatchBroadcastEvent = eventData => {\n const broadcastEvent = new Event('videoPlayerStateChange')\n broadcastEvent.playerState = eventData\n broadcastEvent.playerVideoId = this.videoId\n document.body.dispatchEvent(broadcastEvent)\n }\n\n /**\n * Handle the global player state change event.\n *\n * @param {Event} event\n * A triggered `videoPlayerStateChange` event.\n */\n handleGlobalVideoPlayerStateChange = (event) => {\n if (event.playerVideoId !== this.videoId && this.player) {\n if (this.player.getPlayerState() === YT.PlayerState.PLAYING) {\n this.player.pauseVideo()\n }\n }\n }\n\n /**\n * Handle the poster click event.\n */\n handlePosterClick() {\n if (!this.player) {\n this.playerCreate(1)\n }\n else {\n this.player.playVideo()\n }\n }\n\n /**\n * Callback for the intersection observer visibility change,.\n *\n * @param {IntersectionObserverEntry[]} entries\n * The entries provide.\n */\n videoIsVisible(entries) {\n if (entries[0].isIntersecting) {\n this.playerCreate(0)\n this.observer.unobserve(this.parentElement)\n }\n }\n\n /**\n * Create the YT player object.\n *\n * @param {int} autoPlay\n * An integer indicating whether the player should start playing once created.\n */\n playerCreate(autoPlay) {\n this.player = new YT.Player(this.videoElement, {\n videoId : this.videoId,\n width : '100%',\n height : '100%',\n playerVars: {\n autoplay : autoPlay,\n disablekb : 0,\n fs : 0,\n controls : 1,\n modestbranding: 0,\n playsinline : 0,\n enablejsapi : 1,\n origin : '*',\n rel: 0,\n },\n events: {\n 'onReady' : this.playerReady.bind(this),\n 'onStateChange': this.playerStateChange.bind(this),\n }\n })\n }\n\n /**\n * Handle the player ready.\n */\n playerReady() {\n this.parentElement.setAttribute('data-player-ready', 'true')\n }\n\n /**\n * Handle the player state change.\n *\n * @param {{data: int}} event\n * The triggered event.\n */\n playerStateChange(event) {\n if (this.stateDebounce) {\n clearTimeout(this.stateDebounce)\n }\n\n this.stateDebounce = setTimeout(() => {\n if (event.data === YT.PlayerState.PLAYING) {\n this.parentElement.setAttribute('data-is-playing', 'true')\n this.dispatchBroadcastEvent(event.data)\n }\n else if (event.data === YT.PlayerState.PAUSED || event.data === YT.PlayerState.ENDED) {\n this.parentElement.setAttribute('data-is-playing', 'false')\n }\n\n this.stateDebounce = null\n }, 250)\n }\n\n /**\n * Register the required event listeners\n */\n registerEvents() {\n document.body.addEventListener('videoPlayerStateChange', this.handleGlobalVideoPlayerStateChange.bind(this))\n }\n}\n","/**\n * VimeoVideo class.\n */\nexport class VimeoVideo {\n\n /**\n * Class constructor.\n *\n * @param {HTMLElement} videoElement\n * The element to bind these actions to.\n */\n constructor(videoElement) {\n console.log('Hello from the Vimeo', videoElement)\n\n /**\n * The parent wrapper element.\n *\n * @type {Element}\n */\n this.parentElement = videoElement.closest('.a-video')\n\n /**\n * The poster thumbnail.\n *\n * @type {Element}\n */\n this.poster = this.parentElement.querySelector('.a-video__poster')\n\n /**\n * The video element.\n *\n * @type {HTMLElement}\n */\n this.videoElement = videoElement\n\n /**\n * The YouTube video ID.\n *\n * @type {string}\n */\n this.videoId = videoElement.getAttribute('data-video-id')\n\n /**\n * A boolean indicating if the video has a poster thumbnail.\n *\n * @type {boolean}\n */\n this.hasPoster = this.poster !== null\n\n /**\n * The YouTube video player.\n *\n * @type {null}\n */\n this.player = null\n\n /**\n * An optional IntersectionObserver instance.\n *\n * @type {IntersectionObserver}\n */\n this.observer = null\n\n /**\n * An attribute to handle the debouncing of the YT player state change.\n *\n * @type {null}\n */\n this.stateDebounce = null\n\n\n if (this.hasPoster) {\n this.parentElement.setAttribute('data-has-poster', 'true')\n this.poster.addEventListener('click', this.handlePosterClick.bind(this))\n }\n else {\n let options = {\n rootMargin: '0px',\n threshold : 0.2\n }\n this.observer = new IntersectionObserver(this.videoIsVisible.bind(this), options)\n this.observer.observe(this.parentElement)\n }\n\n this.registerEvents()\n }\n\n /**\n * Dispatch the broadcast event.\n *\n * This is used to pause any other videos that are playing on the page.\n *\n * @param {Event} eventData\n * The player state.\n */\n dispatchBroadcastEvent = eventData => {\n const broadcastEvent = new Event('videoPlayerStateChange')\n broadcastEvent.playerState = eventData\n broadcastEvent.playerVideoId = this.videoId\n document.body.dispatchEvent(broadcastEvent)\n }\n\n /**\n * Handle the global player state change event.\n *\n * @param {Event} event\n * A triggered `videoPlayerStateChange` event.\n */\n handleGlobalVideoPlayerStateChange = (event) => {\n if (event.playerVideoId !== this.videoId && this.player) {\n this.player.pause()\n }\n }\n\n /**\n * Handle the poster click event.\n */\n handlePosterClick() {\n console.log(\"Click\")\n if (!this.player) {\n this.playerCreate(1)\n }\n else {\n this.player.play()\n }\n }\n\n /**\n * Callback for the intersection observer visibility change,.\n *\n * @param {IntersectionObserverEntry[]} entries\n * The entries provide.\n */\n videoIsVisible(entries) {\n if (entries[0].isIntersecting) {\n this.playerCreate(0)\n this.observer.unobserve(this.parentElement)\n }\n }\n\n /**\n * Create the YT player object.\n *\n * @param {int} autoPlay\n * An integer indicating whether the player should start playing once created.\n */\n playerCreate(autoPlay) {\n this.player = new Vimeo.Player(this.videoElement, {\n id : this.videoId,\n responsive: true\n })\n this.player.on('play', this.playerPlay.bind(this))\n this.player.on('ended', this.playerEnded.bind(this))\n\n if (autoPlay) {\n this.player.play()\n }\n }\n\n /**\n * Handle the player state change.\n *\n * @param {Event} event\n * The triggered event.\n */\n playerPlay(event) {\n this.parentElement.setAttribute('data-is-playing', 'true')\n this.dispatchBroadcastEvent(event)\n }\n\n /**\n * Handle the player state change.\n *\n * @param {{data: int}} event\n * The triggered event.\n */\n playerEnded(event) {\n this.parentElement.setAttribute('data-is-playing', 'false')\n }\n\n /**\n * Register the required event listeners\n */\n registerEvents() {\n document.body.addEventListener('videoPlayerStateChange', this.handleGlobalVideoPlayerStateChange.bind(this))\n }\n}\n","import { YoutubePlayer } from \"./YoutubeVideo\";\nimport { VimeoVideo } from \"./VimeoVideo\";\n\n// Define the selectors\nconst youtubeVideoSelector = '.a-video__video[data-video-provider=\"youtube\"]';\nconst vimeoVideoSelector = '.a-video__video[data-video-provider=\"vimeo\"]';\n\n// Bind the onYouTubeIframeAPIReady callback function\n// to the window\nwindow.onYouTubeIframeAPIReady = () => initYoutubeVideos();\n\n// Initialise YouTube video objects on the page.\nconst initYoutubeVideos = () => {\n document.querySelectorAll(youtubeVideoSelector)\n .forEach((videoElement) => new YoutubePlayer(videoElement));\n};\n\n// Initialise initVimeoVideos video objects on the page.\nconst initVimeoVideos = () => {\n document.querySelectorAll(vimeoVideoSelector)\n .forEach((videoElement) => new VimeoVideo(videoElement));\n};\n\nconst loadVideoScripts = (callback) => {\n const scripts = [\n { \n selector: youtubeVideoSelector, \n src: 'https://www.youtube.com/iframe_api',\n init: () => {\n if ((typeof YT !== \"undefined\") && YT && YT.Player) {\n initYoutubeVideos();\n callback();\n }\n }\n },\n { \n selector: vimeoVideoSelector, \n src: 'https://player.vimeo.com/api/player.js',\n init: initVimeoVideos\n }\n ];\n\n scripts.forEach(script => {\n if (document.querySelector(script.selector)) {\n const tag = document.createElement('script');\n tag.src = script.src;\n document.getElementsByTagName('script')[0].parentNode.insertBefore(tag, null);\n \n tag.onload = script.init;\n }\n });\n};\n\nconst applyConsentCovers = () => {\n document.querySelectorAll(`${youtubeVideoSelector}, ${vimeoVideoSelector}`)\n .forEach(selector => {\n const newEl = document.createElement('div');\n newEl.classList.add('a-video__consent');\n newEl.innerHTML = '';\n \n newEl.addEventListener('click', () => {\n if (window.OneTrust) {\n window.OneTrust.ToggleInfoDisplay();\n }\n });\n \n newEl.setAttribute('data-original-video', selector.outerHTML);\n selector.parentNode.replaceChild(newEl, selector);\n });\n};\n\nconst removeConsentCovers = () => {\n document.querySelectorAll('.a-video__consent')\n .forEach(cover => {\n const originalVideo = cover.getAttribute('data-original-video');\n if (originalVideo) {\n const newVideo = document.createElement('div');\n newVideo.innerHTML = originalVideo;\n cover.parentNode.replaceChild(newVideo.firstElementChild, cover);\n }\n });\n};\n\nexport async function videoPlayerInit() {\n // Get OptanonActiveGroups from window\n const getOptanonActiveGroups = async () => {\n while(!window.hasOwnProperty('OptanonActiveGroups'))\n await new Promise(resolve => setTimeout(resolve, 100));\n return window.OptanonActiveGroups;\n };\n// Get OneTrust from window\n const oneTrust = await new Promise(resolve => {\n const checkOneTrust = () => {\n if (window.OneTrust) resolve(window.OneTrust);\n else setTimeout(checkOneTrust, 100);\n };\n checkOneTrust();\n });\n\n const optanonActiveGroups = await getOptanonActiveGroups();\n\n // Initial state\n if (optanonActiveGroups.includes('C0004')) {\n // Consent is already given, load videos\n loadVideoScripts(() => {});\n } else {\n // Consent is not given, apply consent covers\n applyConsentCovers();\n }\n\n // On consent change\n oneTrust.OnConsentChanged(async () => {\n const updatedGroups = await getOptanonActiveGroups();\n \n if (updatedGroups.includes('C0004')) {\n removeConsentCovers();\n loadVideoScripts(() => {});\n } else {\n applyConsentCovers();\n }\n });\n}","/**\n * AnimatedHeading class.\n * Only applies to mass participation sites currently\n * If activated, the arrow gets drawn in on scroll\n */\nexport class AnimatedHeading {\n /**\n *\n * @param {HTMLElement} element\n */\n constructor(element) {\n\n this.element = element\n\n this.element.setAttribute(\"data-js-enabled\", \"true\")\n\n /**\n * A boolean indicating if the heading element is visible.\n *\n * @type {boolean}\n */\n this.isVisible = false\n\n let options = {\n threshold : 1.0\n }\n\n this.observer = new IntersectionObserver(this.headingIsVisible.bind(this), options)\n this.observer.observe(this.element)\n\n\n }\n\n /**\n * Callback for the intersection observer visibility change.\n *\n * @param {IntersectionObserverEntry[]} entries\n * The entries provide.\n */\n headingIsVisible(entries) {\n this.isVisible = entries[0].isIntersecting\n\n if (this.isVisible) {\n this.element.classList.add('animation-active')\n }\n else {\n this.element.classList.remove('animation-active')\n }\n }\n\n \n}\n\nexport function animatedHeadingInit() {\n const animatedHeadings = document.querySelectorAll(\"[data-animated-heading]\")\n\n animatedHeadings.forEach(heading => {\n new AnimatedHeading(heading)\n })\n}\n","/**\n * ShowPassword class.\n */\nexport class ShowPassword {\n /**\n * Class constructor.\n *\n * @param {HTMLElement} parentElement\n * The element to bind these actions to.\n */\n constructor(parentElement) {\n // console.log('Hello from the Show password class')\n\n /**\n * The parent element.\n *\n * @type {HTMLElement}\n */\n this.parentElement = parentElement\n\n this.parentElement.setAttribute('data-js-enabled', 'true')\n\n /**\n * The show/hide password toggle.\n *\n * @type {HTMLElement}\n */\n this.toggle = this.parentElement.querySelector('[data-toggle-password]')\n\n\n this.registerEvents()\n }\n\n /**\n * Toggle between input type=text to show password and type=password to hide.\n */\n toggleInputType() {\n\n const passwordInput = this.parentElement.querySelector('.a-form-input--password')\n const screenReaderText = this.parentElement.querySelector('[data-screen-reader-text]')\n\n if(passwordInput.getAttribute('type') === 'password') {\n passwordInput.setAttribute('type', 'text')\n screenReaderText.textContent = 'Your password is shown'\n } else {\n passwordInput.setAttribute('type', 'password')\n screenReaderText.textContent = 'Your password is hidden'\n }\n\n }\n\n registerEvents() {\n this.toggle.addEventListener('change', this.toggleInputType.bind(this))\n }\n}\n\nexport function showPasswordInit() {\n document.querySelectorAll('.a-form-element--show-password').forEach((element) => {\n new ShowPassword(element)\n })\n}\n","import {backgroundShapesInit} from \"./BackgroundShapes/Js/BackgroundShapes\"\nimport {imageWithZoomInit} from \"./ImageWithZoom/Js/ImageWithZoom\"\nimport {videoPlayerInit} from \"./Video/Js/Video\"\nimport {animatedHeadingInit} from \"./AnimatedHeadings/Js/AnimatedHeadings\"\nimport { showPasswordInit } from \"./Forms/FormElement/Js/ShowPassword\"\n\n\nconst atomsInit = () => {\n animatedHeadingInit()\n backgroundShapesInit()\n imageWithZoomInit()\n videoPlayerInit()\n showPasswordInit()\n}\n\nif (\n document.readyState === \"complete\" ||\n (document.readyState !== \"loading\" && !document.documentElement.doScroll)\n) {\n atomsInit()\n} else {\n document.addEventListener(\"DOMContentLoaded\", atomsInit);\n}\n","import {Modal} from \"../../../01-base/Modal/Js/Modal\"\nimport { debounce } from \"../../../00-tokens/js/helpers/helpers\"\n\nconst focusableElements = 'a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type=\"text\"]:not([disabled]), input[type=\"radio\"]:not([disabled]), input[type=\"checkbox\"]:not([disabled]), select:not([disabled])'\n\n/**\n *\n */\nexport class GlossaryTermLink {\n\n /**\n * Class constructor.\n *\n * @param {HTMLElement} glossaryLink\n * The element to bind these actions to.\n */\n constructor(glossaryLink) {\n\n /**\n * The glossary term.\n *\n * @type {string}\n */\n this.glossaryTerm = glossaryLink.getAttribute('data-term')\n\n /**\n * The glossary link.\n *\n * @type {HTMLElement}\n */\n this.link = glossaryLink\n\n /**\n * The modal element.\n *\n * @type {Modal}\n */\n this.modal = new Modal()\n\n /**\n * Localised version of the managePopUpFocus callback to facilitate dynamic removal\n * of the event listener\n *\n * @type {Function}\n */\n this.localManageFocus = this.popUpManageFocus.bind(this)\n\n /**\n * Localised version of the popUpHide callback to facilitate dynamic removal\n * of the event listener\n *\n * @type {Function}\n */\n this.localPopUpHide = this.popUpHide.bind(this)\n\n /**\n * The pop up element.\n *\n * @type {HTMLElement}\n */\n this.popUp = document.querySelector(`.m-glossary-term[data-glossary-term=\"${this.glossaryTerm}\"]`)\n\n /**\n * The pop up close button.\n *\n * @type {Element}\n */\n this.popUpCloseButton = this.popUp.querySelector('.m-glossary-term__modal-close button')\n\n this.registerEvents()\n }\n\n /**\n * Handle when the viewport size changes\n *\n */\n handlerViewportResize() {\n if (this.popUp.getAttribute(\"data-modal-visible\") === \"true\") {\n this.positionPopup()\n }\n }\n\n /**\n * Get the focusable elements within the PopUp.\n *\n * @return {NodeListOf}\n */\n popUpFocusableElementsGet() {\n return this.popUp.querySelectorAll(focusableElements)\n }\n\n /**\n * Close the popup / glossary term\n *\n */\n popUpHide () {\n if(this.popUp) {\n this.popUp.setAttribute('data-modal-visible', 'false')\n this.popUp.removeAttribute('style')\n }\n\n this.modal.modalClose()\n document.removeEventListener('keydown', this.localManageFocus)\n this.popUpCloseButton.removeEventListener('click', this.localPopUpHide)\n this.link.focus()\n }\n\n /**\n * Handle the keyboard focus of the pop up.\n *\n * @param {KeyboardEvent} event\n * The event that was generated.\n */\n popUpManageFocus = (event) => {\n const focusableElements = this.popUpFocusableElementsGet()\n const firstFocusableElement = focusableElements[0] // get first\n const lastFocusableElement = focusableElements[focusableElements.length - 1] // get last\n\n if (event.shiftKey) { // if shift key pressed for shift + tab combination\n if (document.activeElement === firstFocusableElement) {\n lastFocusableElement.focus()\n event.preventDefault();\n }\n } else { // if tab key is pressed\n\n if (document.activeElement === lastFocusableElement) { // if focused has reached to last focusable element then focus first focusable element after pressing tab\n firstFocusableElement.focus()\n event.preventDefault()\n }\n }\n\n if (event.key === 'Escape') {\n this.localPopUpHide()\n }\n }\n\n /**\n * Open the popup / glossary term\n *\n */\n popUpShow = () => {\n this.popUpsCloseAll()\n this.popUp.setAttribute('data-modal-visible', 'true')\n document.addEventListener('keydown', this.localManageFocus)\n this.popUpCloseButton.addEventListener('click', this.localPopUpHide)\n this.positionPopup()\n\n this.popUpFocusableElementsGet()[0].focus()\n }\n\n /**\n * Open the position the popup on the page\n *\n */\n positionPopup() {\n const linkBoundingRect = this.link.getBoundingClientRect()\n const popupBoundingRect = this.popUp.getBoundingClientRect()\n const padding = 16\n\n let top = linkBoundingRect.y + window.scrollY\n let left = linkBoundingRect.x\n let bottom = null\n\n if ((linkBoundingRect.y + popupBoundingRect.height) > window.innerHeight) {\n const bottomOverspill = (linkBoundingRect.y + popupBoundingRect.height) - window.innerHeight\n top -= bottomOverspill + padding\n\n if (top < 0) {\n top = 0\n bottom = 0\n }\n }\n\n if ((linkBoundingRect.x + popupBoundingRect.width) > window.innerWidth) {\n const rightOverspill = (linkBoundingRect.x + popupBoundingRect.width) - window.innerWidth\n left -= rightOverspill + padding\n }\n\n this.modal.createMobileOnlyModal('', this.link)\n this.popUp.style.left = `${left}px`\n this.popUp.style.top = `${top}px`\n\n if (bottom !== null) {\n this.popUp.style.bottom = `${bottom}px`\n }\n }\n\n /**\n * Close all popups\n */\n popUpsCloseAll() {\n document.querySelectorAll('.m-glossary-term').forEach(popUp => {\n popUp.setAttribute('data-modal-visible', 'false')\n })\n }\n\n\n /**\n * Register events\n */\n registerEvents() {\n this.link.addEventListener('click', this.popUpShow.bind(this))\n window.addEventListener('resize', debounce(this.handlerViewportResize.bind(this), 250))\n }\n\n}\n\nexport function glossaryTermsInit() {\n const glossaryTermLinkObjects = document.querySelectorAll('button[data-term]')\n\n glossaryTermLinkObjects.forEach((glossaryLink) => {\n new GlossaryTermLink(glossaryLink)\n })\n}\n\n","/**\n * Helper function to keep user focus on a modal and set focus to first focusable element.\n *\n * @param modal - the modal element\n * @param focusableElements - list of selectors for focusable elements within the modal eg 'button, [href]'\n */\n\nexport const manageModalFocus = (modal, focusableElements) => {\n if (modal) {\n const firstFocusableElement = modal.querySelectorAll(focusableElements)[0] // get first\n const focusableContent = modal.querySelectorAll(focusableElements)\n const lastFocusableElement = focusableContent[focusableContent.length - 1] // get last\n\n document.addEventListener('keydown', function (e) {\n let isTabPressed = e.key === 'Tab';\n if (!isTabPressed) {\n return;\n }\n\n if (e.shiftKey) { // if shift key pressed for shift + tab combination\n if (document.activeElement === firstFocusableElement) {\n lastFocusableElement.focus(); // add focus for the last focusable element\n e.preventDefault();\n }\n } else { // if tab key is pressed\n if (document.activeElement === lastFocusableElement) { // if focused has reached to last focusable element then focus first focusable element after pressing tab\n\n firstFocusableElement.focus(); // add focus for the first focusable element\n e.preventDefault();\n }\n }\n });\n\n firstFocusableElement.focus();\n }\n}\n\n/**\n * Debounce function for use with keydown and scroll listeners\n *\n */\n\n// Originally inspired by David Walsh (https://davidwalsh.name/javascript-debounce-function)\n\n// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// `wait` milliseconds.\nexport const debounce = (func, wait) => {\n let timeout;\n\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n};\n","/**\n * JumpLinks class.\n */\nclass JumpLinks {\n\n constructor(jumpLinksElement) {\n // console.log('Hello from the JumpLinks element')\n\n this.anchors = document.body.querySelectorAll('.a-anchor-point h2')\n this.element = jumpLinksElement\n this.bounds = jumpLinksElement.getBoundingClientRect()\n this.elementFixableRegion = jumpLinksElement.querySelector('.m-jump-links__fixable-region')\n this.elementMarker = jumpLinksElement.querySelector('.m-jump-links__marker')\n this.parentElement = document.body.querySelector('[data-jumplink-container]')\n this.toggleButton = jumpLinksElement.querySelector('.m-jump-links__collapse-toggle')\n this.offset = 18\n this.linkObserver = null\n\n this.resizeDebounce = null\n this.scrollThrottle = false\n this.isFixed = false\n this.isSingleColumn = window.getComputedStyle(this.elementMarker).display === 'none'\n\n\n this.registerListeners()\n this.buildLinks()\n this.handlerResize()\n this.registerObserver()\n\n\n }\n\n registerObserver() {\n if (this.linkObserver) {\n this.linkObserver.disconnect()\n }\n\n this.linkObserver = new IntersectionObserver(this.handlerLinkObserverEvent.bind(this), {\n rootMargin: `0px 0px -${window.innerHeight * 0.70}px 0px`\n })\n\n document.body.querySelectorAll('.a-anchor-point h2').forEach( link => {\n this.linkObserver.observe(link)\n })\n }\n\n handlerLinkObserverEvent(entries) {\n const entry = entries[0]\n if (entry.isIntersecting) {\n this.element.querySelectorAll('a').forEach(link => {\n if (entry.target.id === link.getAttribute('href').replace('#', '')) {\n link.setAttribute('data-active', 'true')\n this.toggleButton.innerHTML = link.innerHTML\n }\n else {\n link.removeAttribute('data-active')\n }\n })\n }\n else {\n if (entry.boundingClientRect.bottom > entry.rootBounds.bottom) {\n this.anchors.forEach((anchor, index) => {\n if (anchor.id === entry.target.id) {\n const previousIndex = index -1\n\n if (previousIndex >= 0) {\n const element = this.anchors[previousIndex]\n\n this.element.querySelectorAll('a').forEach(link => {\n if (element.id === link.getAttribute('href').replace('#', '')) {\n link.setAttribute('data-active', 'true')\n this.toggleButton.innerHTML = link.innerHTML\n }\n else {\n link.removeAttribute('data-active')\n }\n })\n }\n }\n })\n }\n }\n }\n\n buildLinks() {\n const list = document.createElement('ul')\n\n document.body.querySelectorAll('.a-anchor-point h2').forEach((anchorPoint, index) => {\n const link = document.createElement('a')\n link.setAttribute('href', `#${anchorPoint.getAttribute('id')}`)\n link.innerHTML = `${anchorPoint.getAttribute('data-label')}`\n\n if (index === 0) {\n link.setAttribute('data-active', 'true')\n }\n\n link.addEventListener(\"click\", this.handleLinkClicked.bind(this))\n\n const item = document.createElement('li')\n item.appendChild(link)\n list.appendChild(item)\n })\n\n this.element.querySelector('.m-jump-links__links').append(list)\n }\n\n handleLinkClicked(event) {\n this.element.querySelectorAll('.m-jump-links__links a').forEach((anchor) => {\n anchor.setAttribute('data-active', 'false')\n })\n\n event.target.setAttribute('data-active', 'true')\n this.toggleButton.innerHTML = event.target.innerHTML\n }\n\n\n handlerAnimationFrame() {\n this.element.setAttribute('data-collapsed', 'true')\n\n let threshold\n\n if (this.isSingleColumn) {\n threshold = (this.element.getBoundingClientRect().top - this.offset) + (this.bounds.height * 0.75)\n }\n else {\n threshold = (this.element.getBoundingClientRect().top - this.offset)\n }\n\n if (threshold <= 0) {\n if (!this.isFixed) {\n this.isFixed = true\n this.element.setAttribute('data-fixed', 'true')\n }\n }\n else {\n if (this.isFixed) {\n this.isFixed = false\n this.element.setAttribute('data-fixed', 'false')\n }\n }\n\n if (this.parentElement) {\n const parentBounds = this.parentElement.getBoundingClientRect()\n const elementOffsetHeight = this.bounds.height + this.offset\n\n if (elementOffsetHeight > parentBounds.bottom) {\n const diff = parentBounds.bottom <= 0 ? elementOffsetHeight : elementOffsetHeight - parentBounds.bottom\n this.elementFixableRegion.style.transform = `translateY(-${diff.toFixed(2)}px)`\n }\n else {\n this.elementFixableRegion.style.transform = ``\n }\n }\n\n\n this.scrollThrottle = false\n }\n\n /**\n * Handle the viewport resize\n */\n handlerResize() {\n if (this.resizeDebounce) {\n clearTimeout(this.resizeDebounce)\n }\n\n this.resizeDebounce = setTimeout(() => {\n this.element.setAttribute('data-fixed', 'false')\n this.element.removeAttribute('style')\n this.elementFixableRegion.removeAttribute('style')\n\n this.isSingleColumn = window.getComputedStyle(this.elementMarker).display === 'none'\n this.bounds = this.elementFixableRegion.getBoundingClientRect()\n this.resizeDebounce = null\n this.isFixed = false\n\n\n if (this.isSingleColumn) {\n this.element.style.height = `${this.bounds.height}px`\n }\n\n // this.elementFixableRegion.style.height = `${this.bounds.height}px`\n // this.elementFixableRegion.style.height = '60px'\n this.elementFixableRegion.style.width = `${this.bounds.width}px`\n\n this.registerObserver()\n\n window.requestAnimationFrame(this.handlerAnimationFrame.bind(this))\n }, 20)\n }\n\n handlerScroll() {\n if (!this.scrollThrottle) {\n this.scrollThrottle = true\n window.requestAnimationFrame(this.handlerAnimationFrame.bind(this))\n }\n }\n\n /**\n * Handle the toggle action.\n */\n handlerToggleOpen() {\n console.log('this is the handler toggle open function')\n const nextState = this.element.getAttribute('data-collapsed') === 'true' ? 'false' : 'true'\n console.log(nextState)\n this.element.setAttribute('data-collapsed', nextState)\n }\n\n /**\n * Register the required listeners.\n */\n registerListeners() {\n this.toggleButton.addEventListener('click', this.handlerToggleOpen.bind(this))\n window.addEventListener('resize', this.handlerResize.bind(this))\n window.addEventListener('scroll', this.handlerScroll.bind(this))\n }\n}\n\n\nexport function jumpLinksInit() {\n const jumpLinksElement = document.querySelector('.m-jump-links')\n\n if (jumpLinksElement) {\n new JumpLinks(jumpLinksElement);\n }\n\n}\n","import { Modal } from '../../../01-base/Modal/Js/Modal'\n\n/**\n * Card download expanded view class.\n */\nclass CardDownloadExpandedView {\n constructor(element) {\n this.expandButton = element.querySelector('[data-modal-card-expand-trigger]')\n this.modalTitle = this.expandButton.dataset.modalTitle ? `${this.expandButton.dataset.modalTitle} - related images` : 'Related images'\n this.modalContent = element.querySelector('[data-modal-card-expand-content]')\n this.expandButton.addEventListener('click', this.handleModalExpand.bind(this))\n\n this.imagesList = Array.from(element.querySelectorAll('[data-modal-gallery-image] > picture'))\n\n this.imagesList = this.imagesList.map(image => {\n const container = {}\n container.picture = image\n container.caption = image.parentElement.dataset.caption ? image.parentElement.dataset.caption : ''\n return container\n })\n\n this.perPage = 1;\n this.page = 1;\n this.totalPages = this.imagesList.length\n\n this.nextButton\n this.previousButton\n this.modal\n this.handleResize = this.handleResize.bind(this)\n }\n\n /**\n * Handle the modal expand event.\n */\n handleModalExpand() {\n // create modal\n const modal = new Modal('grey', 'default', 'default', this.modalTitle)\n modal.createFullModal(this.modalContent.innerHTML, this.expandButton)\n\n this.modal = modal.modal\n\n // Set up Next button\n this.nextButton = this.modal.querySelector('[data-pagination-next]')\n\n if (this.nextButton) {\n this.nextButton.addEventListener('click', this.handleNextClick.bind(this))\n }\n\n // Set up Previous button\n this.previousButton = this.modal.querySelector('[data-pagination-previous]')\n\n if (this.previousButton) {\n this.previousButton.addEventListener('click', this.handlePreviousClick.bind(this))\n }\n\n // Set to first page\n this.page = 1\n if (this.previousButton) {\n this.previousButton.classList.add('inactive')\n }\n\n // Show the images\n this.showImages()\n\n // Listen for window resize events\n window.addEventListener('resize', this.handleResize)\n }\n\n /**\n * Handle window resize event.\n */\n handleResize() {\n const isMobile = window.innerWidth <= 768;\n this.updatePagination(isMobile);\n }\n\n /**\n * Update pagination based on screen size.\n */\n updatePagination(isMobile) {\n if (this.modal) {\n this.indicesHTML = isMobile ? this.renderIndicesMobile() : this.renderIndicesDesktop();\n this.indicesContainer = this.modal.querySelector('[data-pagination-indices-desktop]');\n this.indicesContainer.innerHTML = this.indicesHTML;\n\n // Re-attach click events for pagination\n const pageNumbers = this.modal.querySelectorAll('[data-index]:not([data-index=\"...\"])')\n pageNumbers.forEach(item => item.addEventListener('click', (e) => {\n e.preventDefault()\n this.page = parseInt(e.target.dataset.index)\n this.showImages()\n this.handleButtonPresentation()\n }));\n }\n }\n\n // Load images\n showImages() {\n const gallery = this.modal.querySelector('[data-card-image-gallery-paginated]')\n // remove current image(s)\n while (gallery.firstChild) {\n gallery.removeChild(gallery.firstChild)\n }\n\n // replace with selected image(s)\n const offset = (this.page - 1) * this.perPage;\n\n for (let i = offset; i < offset + this.perPage; i++) {\n if (this.imagesList[i]) {\n const template = document.createElement('div')\n const caption = document.createElement('figcaption')\n caption.textContent = this.imagesList[i].caption\n template.classList.add('template')\n template.appendChild(this.imagesList[i].picture)\n template.appendChild(caption)\n gallery.appendChild(template)\n }\n }\n\n // Animate images\n const galleryItems = this.modal.querySelectorAll('.template')\n for (let i = 0; i < galleryItems.length; i++) {\n const onAnimateItemIn = animateItemIn(i);\n setTimeout(onAnimateItemIn, i * 100);\n }\n\n function animateItemIn(i) {\n const item = galleryItems[i];\n return function () {\n item.classList.add('animate');\n }\n }\n\n this.createPagination()\n }\n\n /**\n * Create/update pagination numbers\n */\n createPagination() {\n const paginationContainer = this.modal\n this.visibleIndices = 2\n\n const isMobile = window.innerWidth <= 768;\n\n // Set up paging numbers\n this.indicesHTML = isMobile ? this.renderIndicesMobile() : this.renderIndicesDesktop()\n this.indicesContainer = paginationContainer.querySelector('[data-pagination-indices-desktop]')\n this.indicesContainer.innerHTML = this.indicesHTML\n\n // Set up paging indices\n const pageNumbers = this.modal.querySelectorAll('[data-index]:not([data-index=\"...\"])')\n pageNumbers.forEach(item => item.addEventListener('click', (e) => {\n e.preventDefault()\n this.page = parseInt(e.target.dataset.index)\n this.showImages()\n this.handleButtonPresentation()\n }))\n }\n\n /**\n * Handle the next click\n */\n handleNextClick(e) {\n e.preventDefault()\n if (this.page < this.totalPages) {\n this.page++;\n this.showImages()\n }\n this.handleButtonPresentation()\n }\n\n /**\n * Handle the previous click\n */\n handlePreviousClick(e) {\n e.preventDefault()\n if (this.page === 1) {\n this.page = 1;\n } else {\n this.page--;\n this.showImages()\n }\n this.handleButtonPresentation()\n }\n\n /**\n * Hide/show Next/previous buttons\n */\n handleButtonPresentation() {\n if (this.nextButton) {\n // Disable next button on last page\n if (this.page === this.totalPages) {\n this.nextButton.classList.add('inactive')\n } else {\n this.nextButton.classList.remove('inactive')\n }\n }\n\n if (this.previousButton) {\n // Disable previous button on first page\n if (parseInt(this.page) === 1) {\n this.previousButton.classList.add('inactive')\n } else {\n this.previousButton.classList.remove('inactive')\n }\n }\n }\n\n /**\n * renderIndices.\n *\n * @return {string}\n * The html for the numbered page indices for desktop\n */\n renderIndicesDesktop() {\n const indices = this.createIndices()\n return `\n ${indices.map((item) => `\n
  • \n ${item === this.page || item === '...' ? `\n ${item}\n ` : `\n ${item}\n `}\n
  • \n `).join('')}\n `\n }\n\n /**\n * renderIndicesMobile.\n *\n * @return {string}\n * The html for the numbered page indices for mobile\n */\n renderIndicesMobile() {\n const indices = this.createIndicesMobile()\n return `\n ${indices.map((item) => `\n
  • \n ${item === this.page || item === '...' ? `\n ${item}\n ` : `\n ${item}\n `}\n
  • \n `).join('')}\n `\n }\n\n /**\n * createIndicesMobile function to create the page number array for mobile view.\n *\n * @return {array}\n * The range of page numbers including ellipses\n */\n createIndicesMobile() {\n const range = [];\n\n if (this.totalPages <= 3) {\n // If less than or equal to 3 pages, show all\n for (let i = 1; i <= this.totalPages; i++) {\n range.push(i);\n }\n } else {\n // For more than 3 pages, show the first, current, and last\n if (this.page <= 2) {\n range.push(1, 2, '...', this.totalPages);\n } else if (this.page >= this.totalPages - 1) {\n range.push(1, '...', this.totalPages - 1, this.totalPages);\n } else {\n range.push(1, '...', this.page, '...', this.totalPages);\n }\n }\n\n return range;\n }\n\n /**\n * createIndices function to create the page number array including ellipses for desktop.\n *\n * @return {array}\n * The range of page numbers including ellipses\n */\n createIndices() {\n const left = this.page - this.visibleIndices\n const right = this.page + this.visibleIndices + 1\n const range = []\n const rangeWithDots = []\n let j = 0\n\n for (let i = 1; i <= this.totalPages; i++) {\n if (i == 1 || i == this.totalPages || i >= left && i < right) {\n range.push(i);\n }\n }\n\n for (let i of range) {\n if (j) {\n if (i - j === 2) {\n rangeWithDots.push(j + 1);\n } else if (i - j !== 1) {\n rangeWithDots.push('...');\n }\n }\n rangeWithDots.push(i);\n j = i;\n }\n\n return rangeWithDots;\n }\n}\n\n/**\n * Card download expanded view init function.\n */\nexport function cardExpandedViewInit() {\n const imageExpandObjects = document.querySelectorAll('[data-modal-card-expand-instance]')\n if (imageExpandObjects) {\n imageExpandObjects.forEach((imageExpandElement) => {\n new CardDownloadExpandedView(imageExpandElement)\n })\n }\n}\n","import algoliasearch from 'algoliasearch/lite'\nimport { autocomplete, getAlgoliaResults } from '@algolia/autocomplete-js'\nimport { createQuerySuggestionsPlugin } from '@algolia/autocomplete-plugin-query-suggestions';\nimport { createLocalStorageRecentSearchesPlugin } from '@algolia/autocomplete-plugin-recent-searches';\n\nimport '@algolia/autocomplete-theme-classic'\n\n/**\n * AlgoliaAutoComplete class.\n * The parameters, including API key, app ID and index name\n * should be specified in a global variable object called\n * algoliaParams (specified in preview-head.html for storybook)\n */\nexport class AlgoliaAutoComplete {\n /**\n *\n * @param {HTMLElement} element\n */\n constructor(element) {\n\n this.wrapper = element\n\n this.wrapper.setAttribute('data-js-enabled', 'true')\n\n /**\n * App ID from Algolia search\n *\n * @type {String}\n */\n this.appId = window.algoliaParams.appId\n\n /**\n * Api key from Algolia search\n *\n * @type {String}\n */\n this.apiKey = window.algoliaParams.apiKey\n\n /**\n * CMS index name from Algolia search\n *\n * @type {String}\n */\n this.indexName = window.algoliaParams.indexName\n\n /**\n * Id associated with the container for the autocomplete.\n *\n * @type {String}\n */\n this.id = element.children[0].getAttribute('id')\n\n /**\n * The submit path to display a full set of results\n *\n * @type {String}\n */\n this.path = element.getAttribute('data-action')\n\n /**\n * The name of the query string to use.\n *\n * @type {String}\n */\n this.queryName = element.getAttribute('data-query-name')\n\n /**\n * The name of the forum query string to use.\n *\n * @type {String}\n */\n this.forumBaseUrl = element.getAttribute('data-forum-url')\n\n this.initializeAutoComplete()\n }\n\n initializeAutoComplete() {\n this.wrapper.querySelector('.m-algolia-autocomplete__container').innerHTML = ''\n\n const searchIndex = this.indexName\n const searchClient = algoliasearch(\n this.appId,\n this.apiKey\n );\n\n const recentSearchesPlugin = createLocalStorageRecentSearchesPlugin({\n key: 'RECENT_SEARCH',\n limit: 5,\n });\n\n const querySuggestionsPlugin = createQuerySuggestionsPlugin({\n searchClient,\n indexName: this.indexName + '_query_suggestions',\n getSearchParams({ state }) {\n return { hitsPerPage: state.query ? 5 : 10 };\n },\n });\n\n const predefinedItems = [\n {\n label: 'Forum',\n url: this.forumBaseUrl,\n }\n ];\n\n const predefinedItemsPlugin = {\n getSources() {\n return [\n {\n sourceId: 'predefinedItemsPlugin',\n getItems({ query }) {\n if (!query) {\n return predefinedItems;\n }\n return predefinedItems.filter((item) =>\n item.label.toLowerCase().includes(query.toLowerCase())\n );\n },\n getItemUrl({ item }) {\n return item.url;\n },\n templates: {\n header({ items, html }) {\n if (items.length === 0) {\n return null;\n }\n return html`Links\n
    `;\n },\n item({ item, html }) {\n return html`\n
    \n \n \n \n \n \n
    \n
    \n
    ${item.label}
    \n
    \n
    `;\n },\n },\n },\n ];\n },\n };\n\n this.autoComplete = autocomplete({\n container: `#${this.id}`,\n translations: {\n submitButtonTitle: \"Search website and forum\"\n },\n plugins: [querySuggestionsPlugin, recentSearchesPlugin, predefinedItemsPlugin],\n id: this.id,\n placeholder: 'Search',\n detachedMediaQuery: 'none',\n initialState: { \n query: new URL(window.location).searchParams.get('searchTerm'),\n },\n onSubmit: (state, event, context) => {\n window.location.href = `${this.path}?${this.queryName}=${encodeURI(state.state.query)}`\n },\n onStateChange: (state) => {\n // console.log(\"onStateChange\", this.id, state.state.isOpen, state)\n },\n getSources: (params) => {\n return [\n {\n sourceId: 'hits',\n getItems: () => {\n return getAlgoliaResults({\n searchClient: searchClient,\n queries: [\n {\n indexName: searchIndex,\n query: params.query,\n params: {\n attributesToHighlight: 'name',\n hitsPerPage : 5,\n snippetEllipsisText : '…',\n filters: 'data.noIndex:false AND NOT url:#'\n },\n }\n ],\n transformResponse: (response) => {\n response.hits.push({\n id: 0,\n \"name\": \"See all results\",\n \"createDate\": \"24/04/2023 09:19:58\",\n \"updateDate\": \"24/04/2023 09:19:58\",\n \"url\": `${this.path}?${this.queryName}=${params.query}`,\n \"objectID\": \"see-all\",\n \"_snippetResult\": {\n \"name\": {\n \"value\": \"See all results >>\",\n \"matchLevel\": \"full\"\n },\n \"data\": {\n \"seoDescription\": {\n \"value\": \"Intro\",\n \"matchLevel\": \"none\"\n }\n }\n },\n \"_highlightResult\": {\n \"name\": {\n \"value\": \"See all results >>\",\n \"matchLevel\": \"full\",\n \"fullyHighlighted\": false,\n \"matchedWords\": [\n \"hell\"\n ]\n }\n },\n \"__autocomplete_indexName\": this.indexName\n })\n\n return response.hits\n }\n })\n },\n\n templates: {\n header({ items, html }) {\n if (items.length === 0) {\n return null;\n }\n return html`Website results\n
    `;\n },\n item({ item, components, html }) {\n return html`\n
    \n
    \n
    \n ${components.Highlight({ hit: item, attribute: 'name' })}\n
    \n
    \n ${item.data && item.data.secDescription != null && components.Snippet({ hit: item.data, attribute: 'seoDescription' })}\n
    \n
    \n
    `\n }\n },\n getItemUrl: ({ item }) => {\n return item.url\n }\n },\n {\n sourceId: 'forum',\n getItems: () => {\n return getAlgoliaResults({\n searchClient: searchClient,\n queries: [\n {\n indexName: 'discourse-posts',\n query: params.query,\n params: {\n attributesToHighlight: 'name',\n hitsPerPage : 5,\n snippetEllipsisText : '…'\n }\n }\n ],\n transformResponse: (response) => {\n response.hits.push({\n id: 0,\n \"name\": \"See all forum results\",\n \"createDate\": \"24/04/2023 09:19:58\",\n \"updateDate\": \"24/04/2023 09:19:58\",\n \"url\": `${this.forumBaseUrl}/search?q=${params.query}`,\n \"objectID\": \"see-all\",\n \"_snippetResult\": {\n \"name\": {\n \"value\": \"See all forum results >>\",\n \"matchLevel\": \"full\"\n },\n \"data\": {\n \"seoDescription\": {\n \"value\": \"Intro\",\n \"matchLevel\": \"none\"\n }\n }\n },\n \"_highlightResult\": {\n \"name\": {\n \"value\": \"See all forum results >>\",\n \"matchLevel\": \"full\",\n \"fullyHighlighted\": false,\n \"matchedWords\": [\n \"hell\"\n ]\n }\n },\n \"__autocomplete_indexName\": \"discourse-posts\"\n })\n return response.hits\n }\n })\n },\n\n templates: {\n header({ items, html }) {\n if (items.length === 0) {\n return null;\n }\n return html`Forum results\n
    `;\n },\n item({ item, components, html }) {\n var url = item.url;\n var title = '';\n if(item.topic != undefined)\n {\n url = item.topic.url;\n title = components.Highlight({ hit: item.topic, attribute: 'title' })\n }else{\n //console.log(item);\n title = components.Highlight({ hit: item, attribute: 'name' })\n }\n return html`\n
    \n
    \n
    \n ${title}\n
    \n
    \n ${item.content != null && components.Snippet({ hit: item, attribute: 'content' })}\n
    \n
    \n
    `\n }\n },\n getItemUrl: ({ item }) => {\n return item.url\n }\n }\n ]\n }\n })\n\n const searchBox = this.wrapper.querySelector(('input'))\n\n if (searchBox) {\n searchBox.addEventListener('blur', () => {\n setTimeout(() => {\n this.autoComplete.setIsOpen(false)\n },300)\n })\n }\n }\n}\n\nexport function autoCompleteInit() {\n const searchBoxes = document.querySelectorAll('.m-algolia-autocomplete')\n\n searchBoxes.forEach(searchBox => {\n new AlgoliaAutoComplete(searchBox)\n })\n}\n","/**\n *\n */\nexport class FormDonate {\n\n /**\n * Class constructor.\n *\n * @param {HTMLElement} form\n * The element to bind these actions to.\n */\n constructor(form) {\n\n /**\n * The donation type options\n *\n * @type {HTMLElement} \n */\n this.form = form\n\n /**\n * The donation type \n *\n * @type {HTMLElement} \n */\n this.donationType = this.form.dataset.donationType\n\n /**\n * The donation type options\n *\n * @type {HTMLElement} \n */\n this.donationTypeOptions = this.form.querySelectorAll('.m-form-donate__switch input')\n\n /**\n * The donation price points\n *\n * @type {HTMLElement} \n */\n\n this.pricePoints = this.form.querySelectorAll('.a-form-radios--donate-prices input')\n\n /**\n * The freeform amount inputs\n *\n * @type {HTMLElement} \n */\n\n this.freeformAmountInputs = this.form.querySelectorAll('.m-form-donate__freeform-amount input')\n\n /**\n * The image / description for each price point\n *\n * @type {HTMLElement} \n */\n\n this.pricePointDetails = this.form.querySelectorAll('.m-form-donate__pricepoint-detail, .m-form-donate__freeform-amount-detail')\n \n this.form.setAttribute('data-js-enabled', 'true')\n\n this.registerEvents()\n }\n\n /**\n * Handle donate type selection\n */\n handleDonationType(e) {\n this.donationType = e.target.dataset.value\n this.form.dataset.donationType = this.donationType\n }\n\n /**\n * Clear freeform amount when price point is clicked\n */\n handlePricePointClick(e) {\n this.clearPricePointDetails()\n const freeFormInput = this.form.querySelector(`[data-freeform-type=\"${this.donationType}-amount\"] input`)\n freeFormInput.value = ''\n const relatedDetail = this.form.querySelector(`[data-price-value=\"${this.donationType}-${e.target.dataset.value}\"`)\n if(relatedDetail) {\n relatedDetail.dataset.active = true\n }\n }\n\n /**\n * Clear freeform amount when price point is clicked\n */\n handleFreeFormAmountClick() {\n const pricePoints = this.form.querySelectorAll(`[data-price-point-type=\"${this.donationType}\"] input`)\n pricePoints.forEach(point => {\n point.checked = false;\n })\n this.clearPricePointDetails()\n const relatedDetail = this.form.querySelector(`[data-price-value=\"${this.donationType}-other\"`)\n if(relatedDetail) {\n relatedDetail.dataset.active = true\n }\n }\n\n /**\n * Clear active image/description when pricepoint or freeform entry is clicked\n */\n clearPricePointDetails() {\n if(this.pricePointDetails) {\n this.pricePointDetails.forEach(detail => {\n if(detail.dataset.priceType === this.donationType) {\n detail.dataset.active = false;\n }\n })\n }\n }\n\n /**\n * Register events\n */\n registerEvents() {\n this.donationTypeOptions.forEach(option => {\n option.addEventListener('click', this.handleDonationType.bind(this))\n })\n this.pricePoints.forEach(point => {\n point.addEventListener('click', this.handlePricePointClick.bind(this))\n })\n this.freeformAmountInputs.forEach(input => {\n input.addEventListener('click', this.handleFreeFormAmountClick.bind(this))\n })\n }\n}\n\nexport function formDonateInit() {\n const formDonateInstances = document.querySelectorAll('.m-form-donate')\n\n formDonateInstances.forEach((form) => {\n new FormDonate(form)\n })\n}\n\n","/**\n *\n */\nexport class FundsInMemory {\n /**\n * Class constructor.\n *\n * @param {HTMLElement} component\n * The element to bind these actions to.\n */\n constructor(component) {\n /**\n * The component\n *\n * @type {HTMLElement}\n */\n this.component = component;\n \n /**\n * API url\n *\n * @type {string}\n */\n this.apiUrl = component.getAttribute('data-api');\n\n // Exit component if API url in unavailable\n if (!this.apiUrl) return;\n\n /**\n * Base url\n *\n * @type {string}\n */\n this.baseUrl = component.getAttribute('data-baseurl');\n\n /**\n * The form\n *\n * @type {HTMLElement}\n */\n this.form = component.querySelector('[data-component=\"SearchFundForm\"]');\n\n /**\n * The search button\n *\n * @type {HTMLElement}\n */\n this.searchButton = component.querySelector(\n '[data-button=\"SearchFundSubmit\"]'\n );\n\n /**\n * The clear button\n *\n * @type {HTMLElement}\n */\n this.clearButton = component.querySelector(\n '[data-button=\"SearchFundClear\"]'\n );\n\n /**\n * The input field\n *\n * @type {HTMLElement}\n */\n this.input = component.querySelector('[data-component=\"SearchFundInput\"]');\n\n /**\n * Add button event listeners\n *\n */\n if (this.searchButton) {\n this.searchButton.addEventListener('click', (e) => this.submitSearch(e));\n }\n\n if (this.clearButton) {\n this.clearButton.addEventListener('click', (e) => this.clearSearch(e));\n }\n\n if (this.input) {\n this.input.addEventListener('input', (e) => { \n if (this.input.value.length < 3) {\n return;\n }\n this.submitSearch(e);\n });\n }\n }\n\n /**\n * Get data from URL using fetch\n */\n async getData(url = '') {\n const response = await fetch(url, {\n method: 'GET',\n });\n return response.json();\n }\n\n /**\n * Submit Search\n */\n submitSearch(e) {\n e.preventDefault();\n\n const url = this.apiUrl + this.input.value;\n \n if (this.input.value !== '') {\n this.component.setAttribute('data-loading', 'true');\n\n this.getData(url).then((data) => {\n this.component.removeAttribute('data-loading');\n\n if (data) {\n this.form.classList.add('funds-in-memory__form--is-open');\n\n const oldDropdown = this.form.querySelector(\n '[data-component=\"SearchFundDropdown\"]'\n );\n if (oldDropdown) {\n oldDropdown.remove();\n }\n\n const dropdown = document.createElement('div');\n dropdown.classList.add('funds-in-memory__dropdown');\n dropdown.setAttribute('data-component', 'SearchFundDropdown');\n\n if (data.groupedResults.length > 0) {\n const results = data.groupedResults[0].results;\n const baseUrl = this.baseUrl;\n if (results) {\n dropdown.innerHTML = `\n ${results\n .map(function (result) {\n return `\n \n `;\n })\n .join('')}\n `;\n }\n } else {\n dropdown.innerHTML = `\n
    \n

    Sorry, we couldn't find a match

    \n
    \n `;\n }\n this.form.appendChild(dropdown);\n }\n });\n }\n }\n\n /**\n * Clear Search\n */\n clearSearch(e) {\n e.preventDefault();\n this.form.classList.remove('funds-in-memory__form--is-open');\n this.input.value = '';\n const dropdown = this.form.querySelector(\n '[data-component=\"SearchFundDropdown\"]'\n );\n dropdown.remove();\n }\n}\n\nexport function fundsInMemoryInit() {\n const fundsInMemoryInstances = document.querySelectorAll(\n '[data-component=\"FundsInMemory\"]'\n );\n\n fundsInMemoryInstances.forEach((form) => {\n new FundsInMemory(form);\n });\n}\n","/**\n * DropdownToggle class.\n * Handles visibility toggling of dropdown options associated with each button.\n * Uses nextElementSibling to maintain simple DOM structure assumptions.\n */\nexport class DropdownToggle {\n /**\n *\n * @param {HTMLElement} button\n */\n constructor(button) {\n this.button = button;\n this.optionsContainer = button.nextElementSibling;\n\n this.button.setAttribute('aria-expanded', 'false');\n\n /**\n * A boolean indicating if the dropdown is visible.\n *\n * @type {boolean}\n */\n this.isVisible = false;\n\n this.button.addEventListener('click', () => this.toggleDropdown());\n }\n\n /**\n * Toggles the visibility of the dropdown options.\n */\n toggleDropdown() {\n this.isVisible = !this.isVisible;\n this.button.setAttribute('aria-expanded', String(this.isVisible));\n this.optionsContainer.hidden = !this.isVisible;\n }\n}\n\n/**\n * Initializes DropdownToggle for all buttons with the class '.m-card-publications-card__download-button'.\n */\nexport function initToggleVisibility() {\n document.querySelectorAll('.m-card-publications-card__download-button').forEach(button => {\n new DropdownToggle(button);\n });\n}\n","import { glossaryTermsInit } from \"./GlossaryTerm/Js/GlossaryTerm\";\nimport { jumpLinksInit } from \"./JumpLinks/Js/JumpLinks\";\nimport { cardExpandedViewInit } from \"./CardImageGallery/Js/CardExpandedView\";\nimport { autoCompleteInit } from \"./AlgoliaAutocomplete/Js/AlgoliaAutocomplete\";\nimport { formDonateInit } from \"./FormDonate/Js/FormDonate\";\nimport { fundsInMemoryInit } from \"./FundsInMemory/Js/FundsInMemory\";\nimport { initToggleVisibility } from './CardPublicationCard/Js/ToggleVisibility';\n\nconst moleculesInit = () => {\n glossaryTermsInit()\n jumpLinksInit() \n cardExpandedViewInit()\n autoCompleteInit()\n formDonateInit()\n fundsInMemoryInit()\n initToggleVisibility();\n}\n\nif (\n document.readyState === \"complete\" ||\n (document.readyState !== \"loading\" && !document.documentElement.doScroll)\n) {\n moleculesInit()\n} else {\n document.addEventListener(\"DOMContentLoaded\", moleculesInit);\n}\n","/**\n * Animation curves.\n */\nMath.easeInOutQuad = (t, b, c, d) => {\n t /= d/2\n if (t < 1) return c/2*t*t + b\n t--\n return -c/2 * (t*(t-2) - 1) + b\n}\n\n\n\n/**\n* Carousel class.\n*/\nexport class Carousel {\n\n /**\n * Class constructor.\n *\n * @param {HTMLElement} parentElement\n * The element to bind these actions to.\n */\n constructor(parentElement) {\n\n /**\n * The parent element.\n *\n * @type {HTMLElement}\n */\n this.parentElement = parentElement\n\n /**\n * Navigation Next item button\n *\n * @type {HTMLElement}\n */\n this.buttonNext = this.parentElement.querySelector('[data-navigation-next]')\n\n /**\n * Navigation Previous item button\n *\n * @type {HTMLElement}\n */\n this.buttonPrevious = this.parentElement.querySelector('[data-navigation-previous]')\n\n /**\n * The guide element.\n * @type {Element}\n */\n this.guideElement = parentElement.querySelector('.o-carousel__guide')\n\n /**\n * A boolean indicating if the carousel has overflow content.\n *\n * @type {boolean}\n */\n this.hasOverflow = false\n\n /**\n * The items element.\n *\n * @type {Element}\n */\n this.itemsElement = parentElement.querySelector('.o-carousel__track')\n\n /**\n * The carousel items/cards.\n *\n * @type {NodeListOf}\n */\n this.items = parentElement.querySelectorAll('.o-carousel__item')\n\n /**\n * The mobile guide element.\n *\n * Used to determine if the carousel has reached the desktop breakpoint\n *\n * @type {Element}\n */\n this.mobileGuideElement = parentElement.querySelector('.o-carousel__mobile-guide')\n\n /**\n * The navigation indices / dots.\n *\n * @type {NodeListOf}\n */\n this.navigationIndices = parentElement.querySelectorAll('[data-navigation-index]')\n\n /**\n * The track element.\n *\n * @type {Element}\n */\n this.trackElement = parentElement.querySelector('.o-carousel__track-inner')\n\n /**\n * The width of the padding being applied to the carousel\n *\n * @type {Number}\n */\n this.padWidth = 0\n\n /**\n * A boolean indicating if the element should animate.\n *\n * @type {boolean}\n */\n this.shouldAnimate = this.parentElement.getAttribute('data-should-animate') === 'true'\n\n /**\n * A property to track the debounce state.\n *\n * @type {null|int}\n */\n this.resizeDebounce = null\n\n /**\n * The scroll throttle element.\n *\n * @type {null|int}\n */\n this.scrollThrottle = null\n\n if (this.items.length) {\n this.registerEvents()\n this.handlerViewportResize()\n }\n }\n\n /**\n * Get the active item for desktop.\n *\n * @return {number}\n */\n activeItemGetForDesktop() {\n const firstItem = this.trackElement.querySelectorAll('.o-carousel__item')[0]\n const desktopThreshold = Math.round(window.innerWidth * 0.5) - (firstItem.getBoundingClientRect().width)\n\n for(let i = 0; i < this.trackElement.querySelectorAll('.o-carousel__item').length; i++) {\n const item = this.trackElement.querySelectorAll('.o-carousel__item')[i]\n\n if (item.getBoundingClientRect().x > desktopThreshold) {\n return i\n }\n }\n\n return this.trackElement.querySelectorAll('.o-carousel__item').length - 1\n }\n\n /**\n * Get the active item for mobile.\n *\n * @return {number}\n */\n activeItemGetForMobile() {\n for(let i = 0; i < this.trackElement.querySelectorAll('.o-carousel__item').length; i++) {\n const item = this.trackElement.querySelectorAll('.o-carousel__item')[i]\n\n if ((item.getBoundingClientRect().x + (item.getBoundingClientRect().width * 0.75)) > 0) {\n return i\n }\n }\n\n return this.trackElement.querySelectorAll('.o-carousel__item').length - 1\n }\n\n /**\n * Check if the element can animate.\n *\n * @return {boolean}\n */\n canAnimate() {\n const guideWidth = this.guideElement.getBoundingClientRect().width\n const trackWidth = this.trackElement.getBoundingClientRect().width\n return this.shouldAnimate && (trackWidth > guideWidth)\n }\n\n /**\n * Clear the item styles.\n */\n clearStyles() {\n this.items.forEach((item, delta) => {\n item.removeAttribute('data-active-item')\n })\n }\n\n /**\n * Check if the carousel has reached the desktop breakpoint.\n */\n isMobile() {\n return window.getComputedStyle(this.mobileGuideElement).display === 'block'\n }\n\n /**\n * Handle the navigation click event.\n *\n * @param {string} direction\n * The direction to move the carousel.\n */\n handleNavigationButtonClick(direction) {\n const cardWidth = this.items[0].getBoundingClientRect().width\n\n let scrollPosition = 0\n\n if (direction === 'left') {\n scrollPosition = cardWidth\n }\n else {\n scrollPosition = -1 * cardWidth\n }\n\n this.scrollTo(this.itemsElement, this.itemsElement.scrollLeft + scrollPosition, 200)\n }\n\n /**\n * Handle the navigation click event.\n *\n * @param {number} itemIndex\n * The item index that was clicked.\n */\n handleNavigationIndexClick(itemIndex) {\n const cardWidth = this.items[0].getBoundingClientRect().width\n const scrollPosition = this.isMobile() ? (itemIndex * cardWidth) : (itemIndex -1) * cardWidth\n\n this.scrollTo(this.itemsElement, scrollPosition, 200)\n this.navigationIndexSetActive(itemIndex)\n this.itemSetActive(itemIndex)\n }\n\n /**\n * Handle the scroll event.\n */\n handlerScroll() {\n if (!this.scrollThrottle) {\n this.scrollThrottle = setTimeout(() => {\n this.scrollThrottle = null\n this.navigationButtonsStateSet()\n\n if (this.hasOverflow) {\n const activeIndex = this.isMobile() ? this.activeItemGetForMobile() : this.activeItemGetForDesktop()\n this.itemSetActive(activeIndex)\n this.navigationIndexSetActive(activeIndex)\n }\n else {\n if (this.trackElement.querySelectorAll('.o-carousel__item').length === 4) {\n this.trackElement.querySelectorAll('.o-carousel__item')[1].setAttribute('data-active-item', 'true')\n }\n else if (this.trackElement.querySelectorAll('.o-carousel__item').length === 5) {\n this.trackElement.querySelectorAll('.o-carousel__item')[1].setAttribute('data-active-item', 'true')\n this.trackElement.querySelectorAll('.o-carousel__item')[2].setAttribute('data-active-item', 'true')\n }\n }\n }, 100)\n }\n }\n\n /**\n * Handle the viewport resize event.\n */\n handlerViewportResize() {\n if (this.resizeDebounce) {\n clearTimeout(this.resizeDebounce)\n }\n\n this.resizeDebounce = setTimeout(() => {\n this.resizeDebounce = null\n this.clearStyles()\n this.padsSet()\n this.navigationSet()\n this.navigationIndexSetActive(0)\n this.navigationButtonsStateSet()\n this.itemsElement.scrollLeft = 0\n\n if (this.canAnimate()) {\n this.parentElement.setAttribute('data-is-animated', 'true')\n }\n else {\n this.parentElement.setAttribute('data-is-animated', 'false')\n }\n\n this.handlerScroll()\n }, 150)\n }\n\n /**\n * Set the navigation state.\n */\n navigationSet() {\n this.hasOverflow = this.itemsElement.scrollWidth > window.innerWidth\n this.parentElement.setAttribute('data-has-overflow', this.hasOverflow ? 'true' : 'false')\n }\n\n /**\n * Set the states for the navigation buttons\n */\n navigationButtonsStateSet() {\n if (this.buttonNext) {\n if ((this.itemsElement.scrollWidth - window.innerWidth) === this.itemsElement.scrollLeft) {\n this.buttonNext.setAttribute('disabled', 'disabled')\n }\n else {\n this.buttonNext.removeAttribute('disabled')\n }\n }\n\n if (this.buttonPrevious) {\n if (this.itemsElement.scrollLeft === 0) {\n this.buttonPrevious.setAttribute('disabled', 'disabled')\n }\n else {\n this.buttonPrevious.removeAttribute('disabled')\n }\n }\n }\n\n /**\n * Set the active navigation index.\n *\n * @param {number} itemIndex\n * The item index to set active.\n */\n itemSetActive(itemIndex) {\n this.trackElement.querySelectorAll('.o-carousel__item').forEach((item, index) => {\n item.setAttribute('data-active-item', index === itemIndex ? 'true' : 'false')\n })\n }\n\n /**\n * Set the active navigation index.\n *\n * @param {number} itemIndex\n * The item index to set active.\n */\n navigationIndexSetActive(itemIndex) {\n this.navigationIndices.forEach((index, i) => {\n index.setAttribute('data-active', i === itemIndex ? 'true' : 'false')\n })\n }\n\n /**\n * Set the padding elements\n */\n padsSet() {\n const guideWidth = this.guideElement.getBoundingClientRect().width\n const trackWidth = this.trackElement.getBoundingClientRect().width\n this.padWidth = (trackWidth - guideWidth) / 2\n\n this.trackElement.querySelectorAll('.o-carousel__pad-item').forEach(item => {\n item.style.width = `${this.padWidth}px`\n item.style.minWidth = `${this.padWidth}px`\n item.style.display = (this.padWidth === 0) ? 'none' : 'block'\n })\n }\n\n registerEvents() {\n window.addEventListener('resize', this.handlerViewportResize.bind(this))\n this.itemsElement.addEventListener('scroll', this.handlerScroll.bind(this))\n\n if(this.buttonPrevious) {\n this.buttonPrevious.addEventListener(\"click\", () => this.handleNavigationButtonClick('right'))\n }\n\n if(this.buttonNext) {\n this.buttonNext.addEventListener(\"click\", () => this.handleNavigationButtonClick('left'))\n }\n\n this.navigationIndices.forEach((index, i) => {\n index.addEventListener('click', this.handleNavigationIndexClick.bind(this, i))\n })\n }\n\n /**\n * Set the scroll track position.\n *\n * @param {HTMLElement} element\n * The element to scroll\n * @param {int} to\n * The position to scroll to.\n * @param {int} duration\n * The length of time the scroll should take.\n */\n scrollTo(element, to, duration) {\n const start = element.scrollLeft\n const change = to - start\n const increment = 20\n let currentTime = 0\n\n const animateScroll = () => {\n currentTime += increment;\n element.scrollLeft = Math.easeInOutQuad(currentTime, start, change, duration)\n\n if(currentTime < duration) {\n setTimeout(animateScroll, increment)\n }\n else {\n this.navigationButtonsStateSet()\n }\n }\n\n animateScroll()\n }\n}\n\nexport function carouselInit() {\n const carouselObjects = document.querySelectorAll('.o-carousel')\n\n carouselObjects.forEach((carouselElement) => {\n new Carousel(carouselElement)\n })\n}\n","export default class Filter {\n constructor(filter, filterGroup = '') {\n this.filter = filter;\n\n this.button = this.filter.querySelector('.m-filter__button')\n this.details = this.filter.querySelector('.m-filter__details')\n this.allDetails = document.querySelectorAll('.m-filter__details')\n this.selectAll = this.filter.querySelector('.m-filter__select-all')\n this.checkboxes = this.filter.querySelectorAll('.a-form-input--checkbox')\n this.radios = this.filter.querySelectorAll('.a-form-input--radio')\n this.clearThisFilterWrapper = this.filter.querySelector('.m-filter__clear-all-wrapper')\n this.clearThisFilter = this.filter.querySelector('.m-filter__clear-all')\n this.submit = this.filter.querySelector('.m-filter__submit')\n this.dropdownHeader = this.filter.querySelector('.m-filter__dropdown-header')\n this.dropdownLabel = this.filter.querySelector('.m-filter__label')\n // Initial value of dropdown\n this.dropdownInitialText = this.dropdownLabel.innerHTML\n\n if (filterGroup) {\n this.filterGroup = filterGroup;\n this.allButtons = this.filterGroup.querySelectorAll('.m-filter__button')\n }\n\n this.setUpJsEnv()\n this.events()\n }\n\n setUpJsEnv() {\n if (this.clearThisFilterWrapper) {\n this.clearThisFilterWrapper.style.display = \"block\";\n }\n }\n\n events() {\n // Hide the dropdowns when another one is opened\n this.button.addEventListener('click', (e) => {\n this.closeOtherDetails();\n })\n\n // Close dropdowns when clicking outside\n document.addEventListener('click', (e) => {\n if (!this.filter.contains(e.target)) {\n this.details.open = false;\n }\n });\n\n // Watch checkboxes and update show/hide button\n this.checkboxes.forEach(checkbox => {\n checkbox.addEventListener('click', () => {\n\n if (checkbox.checked) {\n this.button.setAttribute('data-has-value', 'true')\n } else {\n if (Array.from(this.checkboxes).filter((box) => box.checked).length < 1) {\n this.button.setAttribute('data-has-value', '')\n }\n }\n })\n });\n\n // Watch radios and update data attribute\n if (this.filter.dataset.sort) {\n this.radios.forEach(radio => {\n radio.addEventListener('click', () => {\n if (radio.checked = true) {\n this.button.innerHTML = `Sort by: ${radio.nextSibling.nextSibling.textContent.trim()}`\n }\n })\n })\n } else {\n this.radios.forEach(radio => {\n radio.addEventListener('click', () => {\n if (radio.checked = true) {\n const radioLabel = radio.nextSibling.nextSibling.textContent.trim();\n this.button.setAttribute('data-has-value', 'true');\n \n // Check if this filter has the variant \"secondary\"\n if (this.filter.dataset.variant === \"secondary\") {\n this.dropdownLabel.innerHTML = radioLabel;\n }\n }\n })\n })\n }\n\n // Select all inputs and update show/hide button\n if (this.selectAll) {\n this.selectAll.addEventListener('click', () => {\n // all inputs checked\n this.checkboxes.forEach(checkbox => {\n checkbox.checked = true\n });\n\n this.button.setAttribute('data-has-value', \"true\")\n })\n }\n\n if (this.clearThisFilter) {\n // Clear all this filter's inputs\n this.clearThisFilter.addEventListener('click', () => {\n\n this.checkboxes.forEach(checkbox => {\n checkbox.checked = false\n });\n\n this.radios.forEach(radio => {\n radio.checked = false\n // Reset the dropdown label only for secondary variant\n if (this.filter.dataset.variant === \"secondary\") {\n this.dropdownLabel.innerHTML = this.dropdownInitialText;\n }\n });\n\n this.button.setAttribute('data-has-value', \"\")\n })\n }\n }\n\n // Close other dropdowns\n closeOtherDetails() {\n this.allDetails.forEach(details => {\n if (details !== this.details) {\n details.open = false;\n }\n });\n }\n\n}\n\nexport function filterInit() {\n const filters = document.querySelectorAll('[data-filter]');\n\n filters.forEach((filter) => {\n new Filter(filter)\n })\n}\n","import Filter from '../../Filter/Js/Filter'\n\nexport class FilterGroup {\n constructor(filterGroup) {\n this.filterGroup = filterGroup;\n this.filtersElm = this.filterGroup.querySelectorAll('[data-component=\"Filters\"]')\n this.textboxes = this.filterGroup.querySelectorAll('.a-form-input--text');\n this.allRadios = this.filterGroup.querySelectorAll('.a-form-input--radio');\n this.allCheckboxes = this.filterGroup.querySelectorAll('.a-form-input--checkbox');\n this.allButtons = this.filterGroup.querySelectorAll('.m-filter__button');\n this.clearAllFilters = this.filterGroup.querySelector('.m-filtergroup__clear-all');\n this.appliedFiltersContainer = this.filterGroup.querySelector('.m-filtergroup__applied-filters');\n this.closeThisFilters = this.filterGroup.querySelectorAll('.m-filter__clear-all');\n this.activeFilters = []; // Array to track active filters\n this.events();\n this.setupFilterChipsOnLoad();\n }\n\n initFilters() {\n const filters = this.filterGroup.querySelectorAll('[data-filter]');\n filters.forEach((filter) => {\n this.filters.push(new Filter(filter, this.filterGroup));\n });\n }\n\n\n events() {\n this.clearAllFilters?.addEventListener('click', (e) => {\n this.clearAllValues();\n this.removeAllChips();\n if (typeof this.clearAllFilter === 'function') {\n this.clearAllFilter(e);\n }\n });\n\n const filterElements = [...this.allRadios, ...this.allCheckboxes];\n filterElements.forEach(element => {\n if (!element.closest('[data-sort=\"true\"]') && !element.closest('[data-variant=\"secondary\"]')) {\n element.addEventListener('change', () => {\n this.handleFilterChange(element);\n });\n }\n });\n\n this.closeThisFilters.forEach(button => {\n button.addEventListener('click', (e) => {\n e.preventDefault();\n this.clearFilter(button.closest('.m-filter'));\n if (typeof this.triggerUpdateFilter === 'function') {\n this.triggerUpdateFilter(e, button.closest('.m-filter'));\n }\n });\n });\n }\n\n setupFilterChipsOnLoad() {\n const filterElements = [...this.allRadios, ...this.allCheckboxes];\n filterElements.forEach(element => {\n if (element.checked) {\n if (!this.activeFilters.includes(element) && element) {\n this.activeFilters.push(element);\n }\n }\n });\n\n this.filtersElm.forEach(filterElm => {\n const optionsAvailable = filterElm.querySelectorAll('input.a-form-input');\n if (optionsAvailable.length == 0) {\n filterElm.style.opacity = 0.5;\n filterElm.addEventListener('click', (e) => { e.preventDefault(); });\n }\n })\n\n this.updateChips();\n }\n\n handleFilterChange(filter) {\n if (filter.checked) {\n if (!this.activeFilters.includes(filter) && filter) {\n this.activeFilters.push(filter);\n }\n } else {\n this.activeFilters = this.activeFilters.filter(f => f !== filter);\n }\n this.updateChips();\n }\n\n clearFilter(filterElement) {\n const radios = filterElement.querySelectorAll('.a-form-input--radio');\n const checkboxes = filterElement.querySelectorAll('.a-form-input--checkbox');\n radios.forEach(radio => {\n radio.checked = false;\n this.activeFilters = this.activeFilters.filter(f => f !== radio);\n });\n checkboxes.forEach(checkbox => {\n checkbox.checked = false;\n this.activeFilters = this.activeFilters.filter(f => f !== checkbox);\n });\n this.updateChips();\n this.updateFilterGroupState(filterElement);\n }\n\n updateChips() {\n this.removeAllChips();\n this.activeFilters.forEach(filter => {\n if (filter.checked) {\n this.addChip(filter);\n }\n });\n }\n\n addChip(filter) {\n const chip = document.createElement('button');\n const filterValue = filter.closest('label').querySelector('.a-form-label');\n const filterValueCleaned = filterValue.innerHTML.replace(/(\\s\\(\\d*\\))$/g, \"\") // Removes any facets number from chips (i.e ` (2)`).\n chip.className = 'm-filtergroup__chip';\n chip.textContent = filterValueCleaned;\n chip.setAttribute('aria-label', `Remove '${filterValueCleaned.trim()}' filter`);\n chip.onclick = (e) => {\n filter.checked = false;\n chip.remove();\n this.handleFilterChange(filter);\n this.updateFilterGroupState(filter.closest('.m-filter'));\n if (typeof this.triggerUpdateFilter === 'function') {\n this.triggerUpdateFilter(e, filter);\n }\n };\n this.appliedFiltersContainer.appendChild(chip);\n }\n\n updateFilterGroupState(filterElement) {\n const filterContainer = filterElement.closest('.m-filter');\n const isActive = Array.from(filterContainer.querySelectorAll('.a-form-input--radio, .a-form-input--checkbox'))\n .some(input => input.checked);\n const button = filterContainer.querySelector('.m-filter__button');\n button.setAttribute('data-has-value', isActive ? 'true' : '');\n }\n\n removeAllChips() {\n this.appliedFiltersContainer.innerHTML = '';\n }\n\n clearAllValues() {\n this.textboxes.forEach(textbox => textbox.value = '');\n this.allRadios.forEach(radio => radio.checked = false);\n this.allCheckboxes.forEach(checkbox => checkbox.checked = false);\n this.allButtons.forEach(button => {\n button.setAttribute('data-has-value', \"\");\n button.classList.remove('a-btn-filter--open');\n });\n this.activeFilters = [];\n this.updateChips();\n }\n}\n\nexport function filterGroupInit() {\n const filterGroup = document.querySelector('[data-filter-group]');\n const filters = document.querySelectorAll('[data-filter]');\n if (filterGroup) {\n filters.forEach((filter) => {\n new Filter(filter, filterGroup)\n });\n new FilterGroup(filterGroup);\n }\n}\n","/**\n * Carousel class.\n */\nexport class LandingPageHero {\n /**\n * Class constructor.\n *\n * @param {HTMLElement} parentElement\n * The element to bind these actions to.\n */\n constructor(parentElement) {\n // console.log('Hello from the LandingPageHero')\n\n /**\n * The parent element.\n *\n * @type {HTMLElement}\n */\n this.parentElement = parentElement\n\n /**\n * The parallax element element.\n *\n * @type {HTMLElement}\n */\n this.parallaxElement = this.parentElement.querySelector('.o-hero-landing-page__image-inner')\n\n /**\n * The parallax ratio.\n *\n * @type {number}\n */\n this.parallaxRatio = 0.4\n\n /**\n * A boolean to indicate if the scroll actions should be throttled.\n *\n * @type {boolean}\n */\n this.scrollThrottle = false\n\n /**\n * A binding of the scroll handler function to facilitate more effect mounting and unmounting\n */\n this.scrollHandler = this.handlerScroll.bind(this)\n\n /**\n * A boolean indicating if the hero element is visible.\n *\n * @type {boolean}\n */\n this.isVisible = false\n\n let options = {\n rootMargin: '0px',\n threshold : 0.2\n }\n\n this.observer = new IntersectionObserver(this.heroIsVisible.bind(this), options)\n this.observer.observe(this.parentElement)\n }\n\n /**\n * Callback for the intersection observer visibility change.\n *\n * @param {IntersectionObserverEntry[]} entries\n * The entries provide.\n */\n heroIsVisible(entries) {\n this.isVisible = entries[0].isIntersecting\n\n if (this.isVisible) {\n document.addEventListener('scroll', this.scrollHandler, { passive: true })\n }\n else {\n document.removeEventListener('scroll', this.scrollHandler)\n }\n }\n\n /**\n * Handle the scroll event.\n *\n * The scrollThrottle boolean is used to make sure that only one\n * event is processed at a time\n */\n handlerScroll() {\n if (!this.scrollThrottle) {\n this.scrollThrottle = true\n window.requestAnimationFrame(this.handlerAnimationFrame.bind(this))\n }\n }\n\n /**\n * Handle the Animation frame callback.\n */\n handlerAnimationFrame() {\n if (this.isVisible) {\n const elementTop = this.parentElement.getBoundingClientRect().top\n\n if (elementTop <= 0) {\n const parallaxValue = Math.abs(this.parallaxRatio * elementTop)\n this.parallaxElement.style.transform = `translateY(${parallaxValue.toFixed(2)}px)`\n }\n }\n\n this.scrollThrottle = false\n }\n}\n\nexport function landingPageHeroInit() {\n document.querySelectorAll('.o-hero-landing-page').forEach((carouselElement) => {\n new LandingPageHero(carouselElement)\n })\n}\n","/**\n * Carousel class.\n */\nexport class HeroHomepage {\n /**\n * Class constructor.\n *\n * @param {HTMLElement} parentElement\n * The element to bind these actions to.\n */\n constructor(parentElement) {\n console.log('Hello from the HeroHomepage')\n /**\n * The parent element.\n *\n * @type {HTMLElement}\n */\n this.parentElement = parentElement\n\n /**\n * The parallax element element.\n *\n * @type {HTMLElement}\n */\n this.parallaxElement = this.parentElement.querySelector('.o-hero-homepage__image-inner')\n\n /**\n * The parallax ratio.\n *\n * @type {number}\n */\n this.parallaxRatio = 0.4\n\n /**\n * A boolean to indicate if the scroll actions should be throttled.\n *\n * @type {boolean}\n */\n this.scrollThrottle = false\n\n /**\n * A binding of the scroll handler function to facilitate more effect mounting and unmounting\n */\n this.scrollHandler = this.handlerScroll.bind(this)\n\n /**\n * A boolean indicating if the hero element is visible.\n *\n * @type {boolean}\n */\n this.isVisible = false\n\n let options = {\n rootMargin: '0px',\n threshold: 0.2\n }\n\n this.observer = new IntersectionObserver(this.heroIsVisible.bind(this), options)\n this.observer.observe(this.parentElement)\n }\n\n /**\n * Callback for the intersection observer visibility change.\n *\n * @param {IntersectionObserverEntry[]} entries\n * The entries provide.\n */\n heroIsVisible(entries) {\n this.isVisible = entries[0].isIntersecting\n\n if (this.isVisible) {\n document.addEventListener('scroll', this.scrollHandler, { passive: true })\n }\n else {\n document.removeEventListener('scroll', this.scrollHandler)\n }\n }\n\n /**\n * Handle the scroll event.\n *\n * The scrollThrottle boolean is used to make sure that only one\n * event is processed at a time\n */\n handlerScroll() {\n if (!this.scrollThrottle) {\n this.scrollThrottle = true\n window.requestAnimationFrame(this.handlerAnimationFrame.bind(this))\n }\n }\n\n /**\n * Handle the Animation frame callback.\n */\n handlerAnimationFrame() {\n if (this.isVisible) {\n const elementTop = this.parentElement.getBoundingClientRect().top\n\n if (elementTop <= 0) {\n const parallaxValue = Math.abs(this.parallaxRatio * elementTop)\n this.parallaxElement.style.transform = `translateY(${parallaxValue.toFixed(2)}px)`\n }\n }\n\n this.scrollThrottle = false\n }\n}\n\nexport function HeroHomepageInit() {\n document.querySelectorAll('.o-hero-homepage').forEach((carouselElement) => {\n new HeroHomepage(carouselElement)\n })\n}\n","import {Modal} from \"../../../01-base/Modal/Js/Modal\"\n\n/**\n * ImageGallery class.\n */\nclass ImageGallery {\n constructor(element) {\n this.expandButton = element.querySelector('[data-modal-gallery-trigger]')\n this.heading = this.expandButton.dataset.heading\n this.modalContent = element.querySelector('[data-modal-gallery-content')\n this.expandButton.addEventListener('click', this.handleModalExpand.bind(this))\n }\n\n /**\n * Handle the modal expand event.\n */\n handleModalExpand() {\n const modal = new Modal('white', 'default', 'default', this.heading)\n modal.createFullModal(this.modalContent.innerHTML, this.expandButton)\n }\n}\n\n/**\n * ImageGallery init function.\n */\nexport function imageGalleryInit() {\n const imageExpandObjects = document.querySelectorAll('[data-modal-gallery-instance]')\n\n imageExpandObjects.forEach((imageExpandElement) => {\n new ImageGallery(imageExpandElement)\n })\n}\n","/**\n * @fileoverview Legacy navigation functionality.\n * @package BCN\n */\n\n/**\n * LegacyNavigation class. \n */\nexport default class LegacyNavigation {\n /**\n * Class constructor.\n *\n * @param {HTMLElement} element\n * The element to bind these actions to.\n */\n constructor(element) {\n /**\n * The top level menu wrapper.\n *\n * @type {HTMLElement}\n */\n this.parentElement = element;\n this.topLevelMenuItemClass = '.awemenu-item-level-1';\n\n this.addAttributes();\n this.registerListeners();\n }\n\n addAttributes() {\n this.parentElement\n .querySelectorAll(this.topLevelMenuItemClass)\n .forEach((child) => {\n if (child.querySelectorAll('ul').length) {\n child.setAttribute('data-has-children', 'true');\n }\n });\n }\n\n /**\n * Handle the hamburger toggle event.\n */\n handleHamburgerToggle() {\n const currentState = this.parentElement.getAttribute('data-is-open');\n const nextState = currentState === 'open' ? 'closed' : 'open';\n this.parentElement.setAttribute('data-is-open', nextState);\n }\n\n handleTopLevelItemClick(event) {\n event.preventDefault();\n\n const listItem = event.currentTarget.closest('li');\n const currentState = listItem.getAttribute('data-is-open');\n const nextState = currentState === 'open' ? 'closed' : 'open';\n\n if (this.activeTopLevelItem) {\n this.activeTopLevelItem.setAttribute('data-is-open', 'closed');\n }\n\n listItem.setAttribute('data-is-open', nextState);\n\n if (nextState === 'open') {\n this.activeTopLevelItem = listItem;\n }\n }\n\n /**\n * Register the required event listeners.\n */\n registerListeners() {\n this.parentElement\n .querySelectorAll('.m-legacy-menu__hamburger')\n .forEach((element) => {\n element.addEventListener(\n 'click',\n this.handleHamburgerToggle.bind(this)\n );\n });\n\n this.parentElement\n .querySelectorAll(`${this.topLevelMenuItemClass} > a`)\n .forEach((childLink) => {\n if (childLink.parentElement.hasAttribute('data-has-children')) {\n childLink.addEventListener(\n 'click',\n this.handleTopLevelItemClick.bind(this)\n );\n }\n });\n }\n}\n\n/**\n * Initialisation callback\n */\nexport function legacyNavigationInit() {\n const navigation = document.querySelectorAll('.m-legacy-menu');\n\n navigation.forEach((element) => {\n new LegacyNavigation(element);\n });\n}\n","import Splide from '@splidejs/splide'\n\nclass PropositionBlock {\n\n /**\n * @param {HTMLElement} parentElement\n * The parent block element.\n */\n constructor(parentElement) {\n console.log('Hello from the PropositionBlock')\n\n /**\n * The active slide.\n *\n * @type {number}\n */\n this.activeSlide = 0\n\n /**\n * The carousel scroll region.\n *\n * @type {Element}\n */\n this.carousel = parentElement.querySelector('.splide__list')\n\n /**\n * A boolean indicating if the carousel is active.\n *\n * @type {boolean}\n */\n this.carouselActiveState = false\n\n /**\n * The parent element.\n *\n * @type {HTMLElement}\n */\n this.parentElement = parentElement\n\n /**\n * The list of card items.\n *\n * @type {NodeListOf}\n */\n this.cards = this.parentElement.querySelectorAll('li[data-navigation-index]')\n\n /**\n * The header element.\n *\n * @type {Element}\n */\n this.headerElement = this.parentElement.querySelector(`.o-prop-block__header`)\n\n /**\n * The main navigation item.\n *\n * @type {Element}\n */\n this.navElement = this.parentElement.querySelector('.o-prop-block__navigation')\n\n /**\n * The list of navigation items.\n *\n * @type {NodeListOf}\n */\n this.navItems = this.parentElement.querySelectorAll('.splide__slide')\n\n\n /**\n * The IntersectionObserver.\n *\n * @type {IntersectionObserver}\n */\n this.observer = null\n\n /**\n * A property to track the debounce state.\n *\n * @type {null|int}\n */\n this.resizeDebounce = null\n\n /**\n * The carousel scroll region.\n *\n * @type {Element}\n */\n this.splideElement = this.parentElement.querySelector('.splide')\n\n /**\n * The carousel scroll region.\n *\n * @type {Element}\n */\n this.splideTrackElement = this.parentElement.querySelector('.splide__track')\n\n /**\n * An instantiated Slide object.\n *\n * @type {Splide}\n */\n this.splide = null\n\n /**\n * The splide controls.\n *\n * @type {{next: Element, previous: Element}}\n */\n this.splideControls ={\n next : this.parentElement.querySelector('.splide__arrow--next'),\n previous: this.parentElement.querySelector('.splide__arrow--prev'),\n }\n\n this.registerEvents()\n this.splideSetActiveState()\n this.observerMount()\n }\n\n /**\n * Handle any intersection change events.\n *\n * @param {IntersectionObserverEntry[]} entries\n */\n handlerIntersectionEvent(entries) {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n if (entry.boundingClientRect.top < 0) {\n if (entry.boundingClientRect.bottom > 0) {\n this.slideGoTo(parseInt(entry.target.getAttribute('data-navigation-index')))\n }\n }\n }\n else {\n if (entry.rootBounds && entry.boundingClientRect.bottom < entry.rootBounds.top) {\n if (entry.target.nextSibling.nodeType === 1) {\n this.slideGoTo(parseInt(entry.target.nextSibling.getAttribute('data-navigation-index')))\n }\n }\n }\n })\n }\n\n /**\n * Handle the viewport resize event.\n */\n handlerViewportResize() {\n if (this.resizeDebounce) {\n clearTimeout(this.resizeDebounce)\n }\n\n this.resizeDebounce = setTimeout(() => {\n this.resizeDebounce = null\n this.observerMount()\n this.splideSetActiveState()\n }, 150)\n }\n\n /**\n * Handle the button click event.\n *\n * @param event\n */\n handlerButtonClick(event) {\n const target = event.target\n const nextSlide = parseInt(target.parentNode.getAttribute('data-navigation-index'))\n const targetCard = this.parentElement.querySelector(`li[data-navigation-index=\"${nextSlide}\"]`)\n const scrollDepth = targetCard.getBoundingClientRect().top + window.scrollY - this.headerElement.getBoundingClientRect().height + 16\n\n window.scrollTo({\n top : scrollDepth,\n behavior: 'smooth'\n })\n\n this.slideGoTo(nextSlide)\n }\n\n /**\n * Mount IntersectionObserver actions.\n */\n observerMount() {\n if (this.observer) {\n this.observer.disconnect()\n }\n\n const headerHeight = this.headerElement.getBoundingClientRect().height\n\n this.observer = new IntersectionObserver(this.handlerIntersectionEvent.bind(this), {\n rootMargin: `-${headerHeight}px 0px 0px 0px`,\n threshold : 0\n })\n\n this.cards.forEach(card => this.observer.observe(card))\n }\n\n registerEvents() {\n window.addEventListener('resize', this.handlerViewportResize.bind(this))\n\n this.navItems.forEach(navItem => {\n const button = navItem.querySelector('button')\n button.addEventListener('click', this.handlerButtonClick.bind(this))\n })\n }\n\n /**\n * Got to the given index.\n *\n * @param {int} index\n * The index to jump to\n */\n slideGoTo(index) {\n this.activeSlide = index\n\n if (this.splide) {\n this.splide.go(this.activeSlide)\n }\n this.splideSetActiveSlideState()\n }\n\n /**\n * Set the state of the splide controls.\n *\n * @param {int} index\n * The current slide index\n */\n splideControlStateSet(index) {\n this.splideControls.previous.setAttribute('data-active', index > 0 ? 'true' : 'false')\n this.splideControls.next.setAttribute('data-active', index < this.splide.length ? 'true' : 'false')\n }\n\n /**\n * Set the active state of all the slides\n */\n splideSetActiveSlideState() {\n this.navItems.forEach(item => {\n const buttonIsActive = item.getAttribute('data-navigation-index') === this.activeSlide.toString()\n item.setAttribute('data-active', buttonIsActive ? 'true' : 'false')\n })\n }\n\n /**\n * Initialise the splide object and register the required listeners\n */\n splideInit() {\n this.splide = new Splide('.splide', {\n autoWidth : true,\n perMove : 1,\n pagination: false,\n trimSpace : false,\n drag : true,\n padding : { left: '1.2em', right: '1.2em' },\n })\n\n this.splide.mount()\n\n this.splide.on('move', (newIndex) => {\n this.splideControlStateSet(newIndex)\n })\n }\n\n /**\n * Set the splide active state.\n */\n splideSetActiveState() {\n this.carouselActiveState = ((this.carousel.scrollWidth - this.splideTrackElement.offsetWidth) > 0)\n this.parentElement.setAttribute('data-has-carousel', this.carouselActiveState ? 'true' : 'false')\n\n if (this.carouselActiveState) {\n if (this.splide === null) {\n this.splideInit()\n }\n }\n else {\n this.splideUnmount()\n }\n\n this.slideGoTo(this.activeSlide)\n\n if (this.splide) {\n this.splideControlStateSet(this.splide.index)\n }\n }\n\n /**\n * Unmount splide\n */\n splideUnmount () {\n if (this.splide) {\n this.splide.destroy(true)\n this.splide = null\n this.carousel.removeAttribute('style')\n this.splideElement.classList.remove('is-overflow')\n this.splideElement.classList.remove('is-initialized')\n }\n }\n\n}\n\nexport function PropositionBlockNavigationInit() {\n const propositionBlocks = document.querySelectorAll('.o-prop-block')\n\n propositionBlocks.forEach((propositionBlock) => {\n new PropositionBlock(propositionBlock)\n })\n}\n","export class Share {\n\n constructor(share) {\n this.share = share;\n this.url = this.share.getAttribute('data-share-url')\n this.button = this.share.querySelector('button')\n this.init()\n }\n\n init() {\n this.button.addEventListener('click', async () => {\n try {\n await navigator.clipboard?.writeText(this.url)\n this.button.classList.remove('a-btn-secondary__purple')\n this.button.classList.add('a-btn-secondary__purple-with-tick')\n } catch(err) {\n console.log(err)\n }\n })\n }\n}\n\nexport function shareInit() {\n const shares = document.querySelectorAll('[data-share]')\n shares.forEach((share) => {\n new Share(share)\n })\n}\n","/**\n * @fileoverview Header navigation functionality.\n * @package BCN\n */\n\nimport { AlgoliaAutoComplete } from \"../../../03-molecules/AlgoliaAutocomplete/Js/AlgoliaAutocomplete\";\n\n/**\n * HeaderNavigation class.\n */\nexport default class HeaderNavigation {\n /**\n * Class constructor.\n *\n * @param {HTMLElement} element\n * The element to bind these actions to.\n */\n constructor(element) {\n this.actionsElement = element.querySelector(\".o-header__menu-actions\");\n\n /**\n * The top-level menu wrapper.\n *\n * @type {HTMLElement}\n */\n this.rootElement = element;\n\n /**\n * The header overlay\n * \n * @type {HTMLElement}\n */\n this.headerOverlay = document.querySelector('[data-header-overlay]');\n\n /**\n * The close button.\n *\n * @type {HTMLElement}\n */\n this.buttonBack = this.rootElement.querySelector(\".o-header__menu-actions-back\");\n\n /**\n * The close button.\n *\n * @type {HTMLElement}\n */\n this.buttonClose = this.rootElement.querySelector(\".o-header__menu-actions-close\");\n\n /**\n * The hamburger button.\n *\n * @type {HTMLElement}\n */\n this.buttonHamburger = this.rootElement.querySelector(\".o-header__hamburger\");\n\n /**\n * Localized version of the managePopUpFocus callback to facilitate dynamic removal\n * of the event listener.\n *\n * @type {Function}\n */\n this.localManageFocus = this.trapFocus.bind(this);\n\n this.rootElement.setAttribute(\"data-js-enabled\", \"true\");\n\n /**\n * The element that triggered the submenu display.\n *\n * @type {HTMLElement}\n */\n this.triggeringElement = null;\n\n this.registerListeners();\n }\n\n /**\n * Focus the first element of the open submenu.\n *\n * @param {HTMLElement} element\n */\n focusFirstElement(element) {\n const firstElement = element.querySelector('a');\n\n if (firstElement) {\n firstElement.focus();\n }\n }\n\n isMobile() {\n const display = window.getComputedStyle(this.actionsElement, null).getPropertyValue(\"display\");\n return display !== \"none\";\n }\n\n /**\n * Trap the focus in the open menu.\n *\n * @param {KeyboardEvent} event\n */\n trapFocus(event) {\n if (this.triggeringElement) {\n this.trapFocusSubMenu(event);\n } else {\n this.trapFocusRootMenu(event);\n }\n }\n\n /**\n * Trap the focus in the root menu.\n *\n * @param {KeyboardEvent} event\n */\n trapFocusRootMenu(event) {\n const focusableElements = this.rootElement.querySelector('.o-header__menu').querySelectorAll('a, button');\n const lastFocusableElement = focusableElements[focusableElements.length - 1];\n\n if (event.key === \"Tab\") {\n if (event.shiftKey && document.activeElement === this.buttonClose) {\n lastFocusableElement.focus();\n event.preventDefault();\n } else if (document.activeElement === lastFocusableElement) {\n this.buttonClose.focus();\n event.preventDefault();\n }\n }\n\n if (event.key === 'Escape') {\n this.menuHide();\n }\n }\n\n /**\n * Trap the focus in the open submenu.\n *\n * @param {KeyboardEvent} event\n */\n trapFocusSubMenu(event) {\n const focusableElements = this.triggeringElement.parentElement.querySelectorAll('a, button');\n const firstFocusableElement = focusableElements[0];\n const lastFocusableElement = focusableElements[focusableElements.length - 1];\n \n const isMobile = this.isMobile();\n \n const levelOneItems = [...this.rootElement.querySelectorAll('.m-navigation-menu__level-one-item-button, .m-navigation-menu__search-trigger')]; // Include Search button\n const currentIndex = levelOneItems.indexOf(this.triggeringElement);\n \n if (event.key === \"Tab\") {\n if (event.shiftKey) {\n // Handle Shift+Tab (backwards navigation)\n if (document.activeElement === firstFocusableElement) {\n event.preventDefault();\n if (!isMobile) {\n this.subMenuHide();\n if (currentIndex > 0) {\n levelOneItems[currentIndex - 1].focus(); // Move focus to previous Level 1 item\n } else {\n this.buttonClose.focus();\n }\n } else {\n this.buttonBack.focus(); // On mobile, move to Back button\n }\n }\n } else {\n // Handle normal Tab (forward navigation)\n if (document.activeElement === lastFocusableElement) {\n event.preventDefault();\n if (isMobile) {\n this.buttonBack.focus();\n } else {\n this.subMenuHide(); // Close submenu on desktop\n if (currentIndex < levelOneItems.length - 1) {\n levelOneItems[currentIndex + 1].focus(); // Move focus to next Level 1 item\n } else {\n this.buttonClose.focus(); // If last item, move to close button\n }\n }\n }\n }\n }\n \n if (event.key === \"Escape\") {\n this.subMenuHide();\n }\n } \n \n /**\n * Show the submenu.\n *\n * @param {Event} event\n */\n handlerSubMenuToggle(event) {\n if (event.currentTarget.parentElement.getAttribute(\"data-is-open\") === \"false\") {\n this.subMenuShow(event);\n } else {\n this.subMenuHide();\n }\n }\n\n /**\n * Show the submenu.\n *\n * @param {Event} event\n */\n subMenuShow(event) {\n this.subMenuHide();\n \n this.triggeringElement = event.currentTarget;\n this.triggeringElement.setAttribute(\"aria-expanded\", \"true\");\n this.triggeringElement.parentElement.setAttribute(\"data-is-open\", \"true\");\n this.rootElement.setAttribute(\"data-showing-submenu\", \"true\");\n \n document.addEventListener('keydown', this.localManageFocus);\n \n if (this.isMobile()) {\n setTimeout(() => {\n this.focusFirstElement(this.triggeringElement.parentElement);\n }, 200);\n } else {\n this.headerOverlay.setAttribute(\"data-active\", \"true\");\n setTimeout(() => {\n this.triggeringElement.focus();\n }, 0);\n }\n }\n \n /**\n * Hide the submenu.\n */\n subMenuHide() {\n this.rootElement.querySelectorAll(\"[data-is-open=\\\"true\\\"]\").forEach(element => {\n const menuButton = element.querySelector(\".m-navigation-menu__level-one-item-button\");\n const searchTrigger = element.querySelector(\".m-navigation-menu__search-trigger\");\n element.setAttribute(\"data-is-open\", \"false\");\n if (menuButton) {\n menuButton?.setAttribute(\"aria-expanded\",\"false\");\n }\n if (searchTrigger) {\n searchTrigger.setAttribute(\"aria-expanded\",\"false\");\n }\n });\n \n this.rootElement.setAttribute(\"data-showing-submenu\", \"false\");\n this.headerOverlay.setAttribute(\"data-active\", \"false\");\n document.querySelector('body').style.overflow = \"visible\";\n \n if (this.triggeringElement) {\n this.triggeringElement.focus();\n }\n \n this.triggeringElement = null;\n \n document.removeEventListener('keydown', this.localManageFocus);\n }\n \n\n /**\n * Handle the hamburger click event.\n */\n handlerHamburgerClick() {\n if (this.rootElement.getAttribute(\"data-state\") === \"closed\") {\n this.menuShow();\n } else {\n this.menuHide();\n }\n }\n\n menuHide() {\n document.querySelector('body').style.overflow = 'visible';\n\n if (this.isMobile()) {\n this.rootElement.setAttribute(\"data-state\", \"closed\");\n this.buttonHamburger.setAttribute(\"aria-expanded\", \"false\");\n }\n\n this.subMenuHide();\n this.buttonHamburger.focus();\n document.removeEventListener('keydown', this.localManageFocus);\n}\n\nmenuShow() {\n const isMobile = this.isMobile();\n\n if (isMobile) {\n document.querySelector('body').style.overflow = 'hidden';\n this.rootElement.setAttribute(\"data-state\", \"open\");\n this.buttonHamburger.setAttribute(\"aria-expanded\", \"true\");\n }\n\n document.removeEventListener('keydown', this.localManageFocus);\n document.addEventListener('keydown', this.localManageFocus);\n\n if (!isMobile) {\n // On desktop, focus first menu item or search if triggered\n if (this.triggeringElement?.classList.contains('m-navigation-menu__search-trigger')) {\n const searchInput = this.rootElement.querySelector('#header-search-desktop input');\n if (searchInput) {\n setTimeout(() => {\n searchInput.focus();\n }, 200);\n }\n } else {\n this.focusFirstElement(this.rootElement.querySelector('.o-header__menu'));\n }\n }\n}\n /**\n * Register the required event listeners.\n */\n registerListeners() {\n if (this.buttonHamburger) {\n this.buttonHamburger.addEventListener(\"click\", () => {\n this.handlerHamburgerClick();\n });\n }\n \n this.buttonBack?.addEventListener(\"click\", this.subMenuHide.bind(this));\n this.buttonClose?.addEventListener(\"click\", this.menuHide.bind(this));\n this.headerOverlay?.addEventListener(\"click\", this.subMenuHide.bind(this));\n \n this.rootElement.querySelectorAll(\".m-navigation-menu__level-one-item-button, .m-navigation-menu__search-trigger\")\n .forEach(button => {\n button.addEventListener(\"click\", (event) => {\n this.handlerSubMenuToggle(event);\n if (this.isMobile()) {\n this.menuShow();\n }\n });\n });\n } \n}\n\n/**\n * Initialization callback.\n */\nexport function headerNavigationInit() {\n const navigation = document.querySelectorAll('.o-header');\n\n navigation.forEach((element) => {\n if (element.dataset.isReduced === 'false') {\n new HeaderNavigation(element);\n }\n });\n}\n","/**\n * PublicationDownload class.\n */\nexport class PublicationDownload {\n constructor(element) {\n this.element = element\n\n this.languageSelect = element.querySelector('[id^=\"language\"]')\n this.formatSelect = element.querySelector('[id^=\"format\"]')\n this.downloadLink = element.querySelector('.a-download')\n\n this.environment = this.element.dataset.storybook ? 'storybook' : 'not-storybook'\n\n this.registerEvents()\n }\n\n /**\n * Handle the Format select\n */\n\n handleFormatSelect(e) {\n\n const selectedLanguageLink = e.target[e.target.selectedIndex].dataset.download\n console.log(selectedLanguageLink)\n console.log(this.downloadLink)\n\n if(selectedLanguageLink) {\n this.downloadLink.removeAttribute('disabled')\n this.downloadLink.setAttribute('href', selectedLanguageLink)\n } else {\n this.downloadLink.setAttribute('disabled', true)\n }\n }\n\n /**\n * Handle the Language select\n */\n\n async handleLanguageSelect(e) {\n\n let response\n\n if(this.environment !== 'storybook') {\n\n const storeId = this.element.querySelector('#storeId').value;\n\n // Convert selected values into a key value collection\n const attributeValues = Array.from(this.element.querySelectorAll('[data-attribute]')).map(function (el) {\n return {\n key: el.dataset.attribute,\n value: el.value\n }\n });\n\n const filteredAttributes = attributeValues.filter(function (el) {\n return el.value !== \"\";\n });\n\n // Construct the post data to pass to the API controller\n const postData = {\n storeId: storeId,\n publicationNodeId: this.element.dataset.publicationId,\n attributes: filteredAttributes\n }\n\n response = await this.getDataFromApi(postData)\n } else {\n response = await this.emulateDataFromApi()\n }\n\n // when the user selects 'Please select' in the language dropdown, the response will be null\n if(response == null) {\n this.formatSelect.disabled = true\n } else {\n this.formatSelect.disabled = false\n \n\n // Reset each option if there's isn't an available download i.e when switching languages\n Array.from(this.formatSelect.options).map((option) => {\n if(option.value === 'pdf') {\n if(response.data.hasPdf) {\n option.disabled = false\n option.dataset.download = response.data.pdfUrl\n } else {\n option.disabled = true\n option.dataset.download = ''\n }\n }\n else if(option.value === 'epub') {\n if(response.data.hasEpub) {\n option.disabled = false\n option.dataset.download = response.data.epubUrl\n } else {\n option.disabled = true\n option.dataset.download = ''\n }\n }\n else if(option.value === 'audio') {\n if(response.data.hasAudio) {\n option.disabled = false\n option.dataset.download = response.data.audioUrl\n } else {\n option.disabled = true\n option.dataset.download = ''\n }\n }\n else if(option.value === 'kindle') {\n if(response.data.hasKindle) {\n option.disabled = false\n option.dataset.download = response.data.kindleUrl\n } else {\n option.disabled = true\n option.dataset.download = ''\n }\n }\n })\n } \n }\n\n /**\n * In Umbraco call the api to see what downloads are available for selected language\n */\n async getDataFromApi(postData) {\n const url = this.element.dataset.apiUrl\n try {\n const res = await fetch(url,\n {\n method: 'POST',\n headers: {\n 'Accept': 'application/json, text/plain',\n 'Content-Type': 'application/json;charset=UTF-8'\n },\n body: JSON.stringify(postData)\n });\n return await res.json();\n } catch (error) {\n console.log(error);\n }\n }\n\n /**\n * Emulate api call in storybook\n */\n async emulateDataFromApi () {\n return new Promise((resolve, reject) => {\n setTimeout(resolve({\n data:{\n \"productVariantReference\": \"a7cea6e7-1a35-47d6-883e-9db05ac11f6a\",\n \"sku\": \"pub4-english\",\n \"priceFormatted\": \"\\u00A30.00\",\n \"imageUrl\": null,\n \"thumbnailImageUrl\": null,\n \"pdfUrl\": \"https://localhost:44375/media/rq3jb1x4/cmsimport-manual.pdf\",\n \"hasPdf\": true,\n \"epubUrl\": \"https://localhost:44375/media/fnboyzxp/every-layout.epub\",\n \"hasEpub\": true,\n \"kindleUrl\": null,\n \"hasKindle\": false,\n \"audioUrl\": null,\n \"hasAudio\": false,\n \"hasDownloads\": true\n }\n }), Math.random() * 1000)\n })\n }\n\n /**\n * Register the events.\n */\n registerEvents() {\n if(this.languageSelect && this.formatSelect) {\n this.formatSelect.setAttribute('disabled', true)\n }\n this.languageSelect?.addEventListener('change', this.handleLanguageSelect.bind(this))\n this.formatSelect?.addEventListener('change', this.handleFormatSelect.bind(this))\n }\n}\n","import {Modal} from \"../../../01-base/Modal/Js/Modal\"\nimport {PublicationDownload} from \"../../../04-organisms/FormBlock/Js/PublicationDownload\"\n\n/**\n * Form modal class.\n */\nclass FormModal {\n constructor(element) {\n this.expandButtons = element.querySelectorAll('[data-form-modal-trigger]')\n this.expandButtons.forEach((button) => {\n const targetFormId = button.dataset.targetFormId\n const modalContent = element.querySelector(`[data-form-modal-content][data-form-id=\"${targetFormId}\"]`)\n button.addEventListener('click', this.handleModalExpand.bind(this, modalContent, button))\n })\n }\n\n /**\n * Handle the modal expand event.\n */\n handleModalExpand(modalContent, trigger) {\n const modal = new Modal('opaque', 'form', 'default', 'Select the download format')\n modal.createFullModal(modalContent.innerHTML, trigger)\n\n // if modal contains publication form, enable javascript to handle interactions\n const publicationForm = modal.modal.querySelector('[data-publication-id]')\n if(publicationForm) {\n new PublicationDownload(publicationForm)\n }\n\n }\n}\n\n/**\n * FormModal init function.\n */\nexport function formModalInit() {\n const formModalInstances = document.querySelectorAll('[data-form-modal-instance]')\n\n formModalInstances.forEach((formModalInstance) => {\n new FormModal(formModalInstance)\n })\n}\n","/**\n * Carousel class.\n */\nexport class ServiceGroups {\n static ERROR_RATE_LIMIT = 'Rate Limited';\n\n /**\n * Class constructor.\n *\n * @param {HTMLElement} component\n * The element to bind these actions to.\n */\n constructor(component) {\n /**\n * The parent element.\n *\n * @type {HTMLElement}\n */\n this.component = component;\n\n /**\n * Service filters\n *\n * @type {object}\n */\n this.filters = this.component.querySelector(\n '[data-component=\"ServiceFilters\"]'\n );\n\n /**\n * Array of submit buttons\n *\n * @type {Array}\n */\n this.submitButtons = [\n ...this.filters.querySelectorAll('[data-component=\"FilterSubmitButton\"]'),\n ];\n\n /**\n * The clear button\n *\n * @type {HTMLElement}\n */\n this.clearButton = this.filters.querySelector(\n '[data-component=\"FilterClearButton\"]'\n );\n\n /**\n * The number of results\n *\n * @type {HTMLElement}\n */\n this.totalResults = this.filters.querySelector(\n '[data-component=\"FilterTotalResults\"]'\n );\n\n /**\n * The listing element\n *\n * @type {HTMLElement}\n */\n this.listing = this.component.querySelector(\n '[data-component=\"ServiceListing\"]'\n );\n\n /**\n * The actions element\n *\n * @type {HTMLElement}\n */\n this.actions = document.querySelector('[data-component=\"ServiceActions\"]');\n\n /**\n * The pagination element\n *\n * @type {HTMLElement}\n */\n this.pagination = this.component.querySelector(\n '[data-component=\"ServiceListingPagination\"]'\n );\n\n /**\n * Add event listeners\n *\n */\n this.submitButtons.forEach((button) =>\n button.addEventListener('click', (e) => this.submit(e))\n );\n\n if (this.clearButton) {\n this.clearButton.addEventListener('click', (e) => this.clear(e));\n }\n\n this.locationElm = this.filters.querySelector('[data-component=\"FilterTextInput\"][name=\"location\"]');\n this.radiusElm = this.filters.querySelector('[data-component=\"FilterRadio\"][name=\"radius\"]');\n this.dateElm = this.filters.querySelector('[data-component=\"FilterRadio\"][name=\"date\"]');\n\n this.setupFilterBehaviour();\n }\n\n setupFilterBehaviour() {\n this.updateRadiusFilter();\n this.locationElm.addEventListener('change', (e) => {\n this.updateRadiusFilter();\n });\n }\n\n updateRadiusFilter() {\n const location = this.locationElm.value;\n if (location != '' && this.validateLocationFormat(location)) {\n this.radiusElm.style.opacity = 1;\n this.radiusElm.disabled = false;\n } else {\n this.radiusElm.style.opacity = 0.5;\n this.radiusElm.disabled = true;\n }\n }\n\n /**\n * Post data to service endpoints\n */\n async postData(url = '', token, data = {}) {\n const formData = new FormData();\n for (const key in data) {\n formData.append(key, data[key]);\n }\n\n const response = await fetch(url, {\n headers: {\n RequestVerificationToken: token,\n },\n method: 'POST',\n body: formData,\n });\n\n if (response.status === 429) {\n throw Error(ServiceGroups.ERROR_RATE_LIMIT);\n }\n\n return response.json();\n }\n\n /**\n * Get values from checkboxes or radios\n */\n getValues(values) {\n return [...values]\n .filter(function (value) {\n return value.checked;\n })\n .map(function (value) {\n return [value.value];\n });\n }\n\n /**\n * Validates the given location format (to check if it is not empty\n * and doesn't contain any characters other than alphanumeric and space characters).\n */\n validateLocationFormat(location) {\n if (!location.trim()) {\n return false;\n }\n\n return /^[a-zA-Z0-9 ]+$/.test(location);\n }\n\n /**\n * Submit filters search\n *\n */\n submit(e) {\n e.preventDefault();\n\n const el = e.target;\n const form = el.closest('form');\n const token = form.querySelector(\n '[name=\"__RequestVerificationToken\"]'\n ).value;\n const locationInput = form.querySelector(\n '[data-component=\"FilterTextInput\"][name=\"location\"]'\n );\n const location = locationInput.value;\n const locationInputErrorElement = form.querySelector(\n 'span[data-component=\"FilterTextInputError\"]'\n );\n\n // close dropdowns\n const allFiltersDropdowns = form.querySelectorAll(\n '.m-filter__dropdown-wrapper'\n );\n allFiltersDropdowns.forEach((dropdown) => {\n dropdown.classList.add('m-filter__dropdown-wrapper--hidden');\n });\n\n if (location != '') {\n // Validates the Location value format\n if (!this.validateLocationFormat(location)) {\n locationInputErrorElement.style.display = 'block';\n locationInput.classList.add('a-form-input--error');\n return false;\n }\n }\n\n locationInputErrorElement.style.display = 'none';\n locationInput.classList.remove('a-form-input--error');\n\n const radius = form.querySelector('[data-component=\"FilterRadio\"][name=\"radius\"]').value;\n const date = form.querySelector('[data-component=\"FilterRadio\"][name=\"date\"]').value;\n\n const serviceTags = form.querySelector('[name=\"serviceTags\"]').value;\n const noResultsText = form.querySelector('[name=\"noResultsText\"]').value;\n const startText = form.querySelector('[name=\"startText\"]').value;\n const pageId = form.querySelector('[name=\"pageId\"]').value;\n const page = form.querySelector('[name=\"page\"]').value;\n\n const data = {\n location: location,\n radius: radius,\n date: date,\n serviceTags: serviceTags,\n isAjax: true,\n noResultsText: noResultsText,\n startText: startText,\n pageId: pageId,\n page: page,\n };\n\n this.postData(\n '/umbraco/surface/ServiceProductsSurface/FilterServiceProducts/',\n token,\n data\n ).then((data) => {\n if (data) {\n this.actions.style.display = 'flex';\n if (data.html) {\n this.listing.innerHTML = data.html;\n this.totalResults.innerHTML = `${data.totalResults} results`;\n this.pagination.innerHTML = data.paginationHtml;\n this.pagination.style.display = 'block';\n } else {\n this.listing.innerHTML = `

    ${data.noResultsText}`;\n this.totalResults.innerHTML = `0 results`;\n this.actions.style.display = 'flex';\n this.pagination.style.display = 'none';\n }\n if (data.query && data.query.hasValue) {\n const newUrl =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n data.query.value;\n window.history.pushState({ path: newUrl }, '', newUrl);\n } else {\n this.actions.style.display = 'none';\n this.listing.innerHTML = `

    ${data.startText}`;\n }\n }\n this.updateRadiusFilter();\n }).catch((e) => {\n let errorMessage = 'There has been an error please try again later.';\n if (e.message === ServiceGroups.ERROR_RATE_LIMIT) {\n errorMessage = 'Please wait a few minutes before you try again.';\n }\n\n this.listing.innerHTML = `

    ${errorMessage}`;\n this.totalResults.innerHTML = `0 results`;\n this.pagination.style.display = 'none';\n }); \n }\n\n /**\n * Clear filters search\n *\n */\n clear(e) {\n e.preventDefault();\n if (this.submitButtons && this.submitButtons.length > 0) {\n const applyFilterBtn = this.submitButtons[0];\n // reset to default values\n const defaultRadius = this.radiusElm.getAttribute('data-default-value') ?? 20;\n const defaultDateRange = this.dateElm.getAttribute('data-default-value') ?? 'Next 3 months';\n this.locationElm.value = '';\n this.radiusElm.value = defaultRadius;\n this.dateElm.value = defaultDateRange;\n applyFilterBtn.click();\n }\n }\n}\n\nexport function serviceGroupsInit() {\n document\n .querySelectorAll('[data-component=\"ServiceGroups\"]')\n .forEach((component) => {\n new ServiceGroups(component);\n });\n}\n","/**\n * Services class.\n */\nexport class Services {\n /**\n * Class constructor.\n *\n * @param {HTMLElement} component\n * The element to bind these actions to.\n */\n constructor(component) {\n /**\n * The parent element.\n *\n * @type {HTMLElement}\n */\n this.component = component;\n\n /**\n * The listing element\n *\n * @type {HTMLElement}\n */\n this.listing = this.component.querySelector(\n '[data-component=\"ServiceListing\"]'\n );\n\n /**\n * Array of submit buttons\n *\n * @type {Array}\n */\n this.submitButtons = [\n ...this.component.querySelectorAll('[data-component=\"ServiceFilters\"]'),\n ];\n\n /**\n * The landing page Id.\n *\n * @type {string}\n */\n this.id = component.getAttribute('data-id');\n\n /**\n * Selected filters.\n *\n * @type {string}\n */\n this.filters = [];\n\n /**\n * Add event listeners\n *\n */\n this.submitButtons.forEach((button) => {\n button.addEventListener('click', (e) => {\n this.submit(e)\n });\n });\n }\n\n /**\n * Get data from service endpoints\n */\n async getData(url = '', token) {\n const response = await fetch(url, {\n headers: {\n RequestVerificationToken: token,\n },\n method: 'GET',\n });\n return response.json();\n }\n\n /**\n * Get values from checkboxes or radios\n */\n getValues(values) {\n return [...values]\n .filter(function (value) {\n return value.checked;\n })\n .map(function (value) {\n return [value.value];\n });\n }\n\n toggleCheckbox(element)\n {\n element.checked = !element.checked;\n }\n\n /**\n * Submit filters search\n *\n */\n submit(e) {\n const el = e.target;\n const form = el.closest('form');\n const token = form.querySelector(\n '[name=\"__RequestVerificationToken\"]'\n ).value;\n \n const checkboxes = form.querySelectorAll(\n '[data-component=\"ServiceFilters\"]'\n );\n \n this.filters = this.getValues(checkboxes);\n const filterQuery = encodeURIComponent(this.filters.join(\",\"))\n\n this.getData(\n `/umbraco/api/services/get/${this.id}${filterQuery ? `?category=${filterQuery}` : ``}`,\n token,\n ).then((data) => {\n if (data) {\n console.log(data)\n if (data.results && data.results > 0) {\n this.listing.innerHTML = data.html;\n } else {\n this.listing.innerHTML = `

    ${data.error}

    `;\n }\n }\n\n const newUrl =\n `${window.location.protocol}//${window.location.host}${window.location.pathname}${filterQuery ? `?category=${filterQuery}` : ``}`;\n window.history.pushState({ path: newUrl }, '', newUrl);\n });\n }\n}\n\nexport function servicesInit() {\n document\n .querySelectorAll('[data-component=\"Services\"]')\n .forEach((component) => {\n new Services(component);\n });\n}\n","export class PublicationFilters {\n /**\n * Class constructor.\n * @param {HTMLElement} component - The element that this class is attached to.\n */\n constructor(component) {\n this.component = component;\n\n this.listing = document.querySelector(\n '[data-component=\"PublicationsList\"]'\n );\n this.filterForm = component.querySelector(\n '[data-component=\"PublicationFilters\"]'\n );\n this.checkboxes = this.filterForm.querySelectorAll('.a-form-input');\n this.pagination = component.querySelector('[data-component=\"Pagination\"]');\n this.totalResults = component.querySelector(\n '[data-component=\"TotalResults\"]'\n );\n this.tagGroupFilters = component.querySelector(\n '[data-component=\"TagGroupFilters\"]'\n );\n\n this.listingContainer = this.component.querySelector(\n '[data-component=\"ListingContainer\"]'\n );\n\n this.clearFiltersBtn = this.component.querySelector(\n '[data-component=\"ClearFilters\"]'\n );\n\n this.totalizerBlock = this.component.querySelector(\n '.o-listings__top-wrapper'\n );\n\n this.mobileFilterCount = this.component.querySelector(\n '.m-filter-component__mobile-heading'\n );\n this.noResults = this.component.querySelector('.o-listings__no-results');\n\n this.init();\n }\n\n /**\n * Initializes event listeners for the component.\n */\n init() {\n this.checkboxes.forEach((checkbox) => {\n checkbox.addEventListener('change', (e) => this.submitFilters(e));\n });\n\n this.clearFiltersBtn.addEventListener('click', (e) => this.clearFilters(e));\n }\n\n /**\n * Handles the submission of filters, sending data via POST to the server and updating the view.\n * @param {Event} e - The event object.\n */\n async submitFilters(e) {\n try {\n e.preventDefault();\n\n let pageId = this.component.querySelector('#pageId').value;\n let filters = this.getValues(this.checkboxes);\n\n this.updatePublicationData(pageId, 1, filters);\n } catch (error) {\n console.error('Error submitting filters:', error);\n }\n }\n\n /**\n * Clear the applied filters and refresh the publications data\n */\n async clearFilters(e) {\n try {\n e.preventDefault();\n\n let pageId = this.component.querySelector('#pageId').value;\n\n this.checkboxes.forEach((checkbox) => {\n checkbox.checked = false;\n });\n\n this.updatePublicationData(pageId, 1, '');\n } catch (error) {\n console.error('Error submitting filters:', error);\n }\n }\n\n async updatePublicationData(pageId, page, filters) {\n if (filters.length == 0) {\n filters = '';\n this.mobileFilterCount.innerHTML = `Select filters (0)`;\n this.clearFiltersBtn.style.display = 'none';\n } else {\n this.mobileFilterCount.innerHTML = `Select filters (${filters.length})`;\n this.clearFiltersBtn.style.display = 'flex';\n }\n\n try {\n const response = await fetch(\n '/umbraco/api/publications/GetPublicationsCards',\n {\n method: 'POST',\n body: JSON.stringify({\n pageId: `${pageId}`,\n page: `${page}`,\n filter: `${filters}`,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n\n const data = await response.json();\n\n if (data && data.html) {\n this.listing.innerHTML = data.html;\n this.listing.style.display = 'grid';\n this.totalizerBlock.style.display = 'block';\n this.noResults.style.display = 'none';\n } else {\n this.listing.style.display = 'none';\n this.totalizerBlock.style.display = 'none';\n this.noResults.style.display = 'block';\n }\n\n if (data && data.pagination) {\n this.pagination.innerHTML = data.pagination;\n } else {\n this.pagination.innerHTML = '';\n }\n\n if (data && data.results) {\n this.totalResults.innerHTML = `${data.results} ${\n data.results === 1 ? 'result' : 'results'\n }`;\n } else {\n this.totalResults.innerHTML = '0 results';\n }\n\n if (data && data.query) {\n this.updateHistory(data.query);\n }\n } catch (error) {\n console.error('Error submitting filters:', error);\n }\n }\n\n /**\n * Updates browser history based on current filter settings.\n * @param {string} query - The updated query string.\n */\n updateHistory(query) {\n const currentUrl = new URL(window.location);\n const newUrl = `${currentUrl.pathname}${query}`;\n\n window.history.pushState({ path: newUrl }, '', newUrl);\n }\n\n /**\n * Get values from checkboxes\n */\n getValues(values) {\n return [...values]\n .filter(function (value) {\n return value.checked;\n })\n .map(function (value) {\n return [value.getAttribute('data-value')];\n });\n }\n\n /**\n * Retrieves the CSRF token from the form.\n * @returns {string} - The CSRF token value.\n */\n getToken() {\n return this.filterForm.querySelector('[name=\"__RequestVerificationToken\"]')\n .value;\n }\n}\n\n/**\n * Initializes PublicationFilters for each filter component found in the document.\n */\nexport function publicationFiltersInit() {\n document\n .querySelectorAll('[data-component=\"PublicationListing\"]')\n .forEach((component) => {\n new PublicationFilters(component);\n });\n}\n","class FilterChipGroup {\n constructor(component) {\n this.component = component;\n this.filterWrapper = this.component.querySelector('[data-component=filter-wrapper]');\n this.listingContentWrapper = this.component.querySelector('[data-component=listing-content-wrapper]');\n this.loadingSpinner = this.component.querySelector('[data-component=loader-spinner]');\n this.addListenerToFilterOptions();\n }\n\n /**\n * Add event listener after the component are added.\n */\n addListenerToFilterOptions() {\n /**\n * Array of filter input chips.\n *\n * @type {*[]}\n */\n const filters = [\n ...this.component.querySelectorAll(\n '[data-component=\"ServiceFilters\"]'\n )];\n\n const clearFilters = this.component.querySelector('[data-component=clear-filter]');\n\n filters.forEach((input) => {\n if (input) {\n input.addEventListener(\"change\", (e) => this.submit(e))\n }\n })\n\n if (clearFilters) {\n clearFilters.addEventListener(\"click\", (e) => this.clear(e));\n }\n }\n\n /**\n * Post data to service endpoints\n */\n async postData(url = '', token, data = {}) {\n const formData = new FormData();\n for (const key in data) {\n formData.append(key, data[key]);\n }\n\n const response = await fetch(url, {\n headers: {\n RequestVerificationToken: token,\n },\n method: 'POST',\n body: formData,\n });\n return response.json();\n }\n\n /**\n * Get values from checkboxes or radios\n */\n getValues(values) {\n return [...values]\n .filter(function (value) {\n return value.checked;\n })\n .map(function (value) {\n return [value.value];\n });\n }\n\n update(e, categories) {\n e.preventDefault();\n const el = e.target;\n const form = el.closest('form');\n const token = form.querySelector(\n '[name=\"__RequestVerificationToken\"]'\n ).value;\n this.loadingSpinner.style.display = 'block';\n const pageId = form.querySelector('[name=\"pageId\"]').value;\n const uniqueId = form.querySelector('[name=\"uniqueId\"]').value;\n\n const data = {\n isAjax: true,\n category: this.getValues(categories),\n ...(uniqueId ? { uniqueId: uniqueId } : {}),\n ...(pageId ? { pageId: pageId }: {})\n }\n\n this.postData(\n '/umbraco/surface/FilterChipSurface/FilterContent',\n token,\n data\n ).then(res => {\n this.filterWrapper.innerHTML = res.filterHtml;\n this.listingContentWrapper.innerHTML = res.html;\n this.addListenerToFilterOptions();\n\n const newUrl =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n res.query;\n window.history.pushState({ path: newUrl }, '', newUrl);\n\n this.loadingSpinner.style.display = 'none';\n })\n }\n submit(e) {\n e.preventDefault();\n const el = e.target;\n const form = el.closest('form');\n const categories = form.querySelectorAll('[data-component=ServiceFilters][name=category]');\n this.update(e, categories);\n }\n\n clear(e) {\n e.preventDefault();\n this.update(e, '');\n }\n}\n\nexport function FilterChipGroupInit() {\n document.querySelectorAll('[data-component=filter-chips-listing]').forEach(\n (component) => {\n new FilterChipGroup(component);\n }\n )\n}\n","import Filter from \"../../Filter/Js/Filter\";\nimport { FilterGroup } from \"./FilterGroup\";\n\nclass FilterGroupListing {\n constructor(component) {\n this.component = component;\n this.filterWrapper = this.component.querySelector('[data-component=filter-wrapper]');\n this.listingContentWrapper = this.component.querySelector('[data-component=listing-content-wrapper]');\n this.loadingSpinner = this.component.querySelector('[data-component=loader-spinner]');\n\n this.setupNewFilterGroup();\n this.addListenerToFilterOptions();\n }\n\n setupNewFilterGroup() {\n // We still want to support listing pages that hasn't been updated yet so we will extend existing FilterGroup.\n const filterGroupEl = this.component.querySelector('[data-filter-group-ajax]');\n const filtersEl = filterGroupEl.querySelectorAll('[data-filter]');\n if (filterGroupEl) {\n filtersEl.forEach((filter) => {\n new Filter(filter, filterGroupEl)\n });\n\n let triggerUpdateFilter = function(e, filterEl) { this.updateFilter(e, filterEl); }.bind(this);\n FilterGroup.prototype.triggerUpdateFilter = function(e, filterEl) { return triggerUpdateFilter(e, filterEl); };\n\n let clearAllFilterFn = function(e) { this.clearAllFilter(e); }.bind(this);\n FilterGroup.prototype.clearAllFilter = function(e) { return clearAllFilterFn(e); };\n \n let clearGroupFilterFn = function(e) { this.clearGroupFilter(e); }.bind(this);\n FilterGroup.prototype.clearGroupFilter = function(e) { return clearGroupFilterFn(e); };\n\n this.filterGroup = new FilterGroup(filterGroupEl);\n }\n }\n\n getValues(values) {\n return [...values]\n .filter(function (value) {\n return value.checked;\n })\n .map(function (value) {\n return [value.value];\n });\n }\n\n async postData(url = '', token, data = {}) {\n const formData = new FormData();\n for (const key in data) {\n formData.append(key, data[key]);\n }\n\n const response = await fetch(url, {\n headers: {\n RequestVerificationToken: token,\n },\n method: 'POST',\n body: formData,\n });\n return response.json();\n }\n\n // Todo: refactor once we start working on other listing page.\n getFilterOptions(el) {\n const form = el.closest('form');\n const distance = form.querySelectorAll('[data-component=FilterCheckbox][name=distance]');\n const distanceValues = this.getValues(distance);\n const location = form.querySelectorAll('[data-component=FilterCheckbox][name=location]');\n const locationValues = this.getValues(location);\n const eventType = form.querySelectorAll('[data-component=FilterCheckbox][name=eventType]');\n const eventTypeValues = this.getValues(eventType);\n const date = form.querySelectorAll('[data-component=FilterRadio][name=date]');\n const dateValues = this.getValues(date);\n const cancerType = form.querySelectorAll('[data-component=FilterCheckbox][name=cancerType]');\n const cancerTypeValues = this.getValues(cancerType);\n const treatment = form.querySelectorAll('[data-component=FilterCheckbox][name=treatment]');\n const treatmentValues = this.getValues(treatment);\n const experience = form.querySelectorAll('[data-component=FilterCheckbox][name=experience]');\n const experienceValues = this.getValues(experience);\n const roleType = form.querySelectorAll('[data-component=FilterCheckbox][name=roleType]');\n const roleTypeValues = this.getValues(roleType);\n \n return {\n ...(distanceValues.length > 0 ? { distance: distanceValues } : {}),\n ...(locationValues.length > 0 ? { location: locationValues } : {}),\n ...(eventTypeValues.length > 0 ? { eventType: eventTypeValues } : {}),\n ...(dateValues.length > 0 ? { date: dateValues } : {}),\n ...(cancerTypeValues.length > 0 ? { cancerType: cancerTypeValues } : {}),\n ...(treatmentValues.length > 0 ? { treatment: treatmentValues } : {}),\n ...(experienceValues.length > 0 ? { experience: experienceValues } : {}),\n ...(roleTypeValues.length > 0 ? { roleType: roleTypeValues } : {}),\n };\n }\n\n update(el, args) {\n if (this.loadingSpinner) {\n this.loadingSpinner.style.display = 'block';\n }\n const form = el.closest('form');\n const token = form.querySelector(\n '[name=\"__RequestVerificationToken\"]'\n ).value;\n const pageId = form.querySelector('[name=\"pageId\"]').value;\n const uniqueId = form.querySelector('[name=\"uniqueId\"]').value;\n\n const data = {\n isAjax: true,\n pageId: pageId,\n ...(uniqueId ? { uniqueId: uniqueId } : {}),\n ...args,\n }\n this.postData('/umbraco/surface/FilterGroupSurface/FilterContent', token, data).then(res => {\n this.filterWrapper.innerHTML = res.filterHtml;\n this.listingContentWrapper.innerHTML = res.html;\n this.setupNewFilterGroup();\n this.addListenerToFilterOptions();\n this.filterGroup.updateChips();\n const newUrl =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n res.query;\n window.history.pushState({ path: newUrl }, '', newUrl);\n if (this.loadingSpinner) {\n this.loadingSpinner.style.display = 'none';\n }\n })\n }\n\n getFilterOptionElem(el) {\n const filterGroupElem = el.closest('[data-component=\"Filters\"]');\n if (filterGroupElem) {\n const filterGroupName = filterGroupElem.getAttribute('data-group-name');\n if (el.nodeName == \"INPUT\" && (el.getAttribute(\"data-component\") == \"FilterRadio\" || el.getAttribute(\"data-component\") == \"FilterCheckbox\")) {\n return filterGroupName;\n }\n if (el.nodeName == \"BUTTON\" && el.getAttribute('data-is-clear-group')) {\n return filterGroupName;\n }\n }\n return null;\n }\n\n updateFilter(e, el) {\n let filterOptions = this.getFilterOptions(el);\n let triggerElem = e.target;\n\n const lastSelectedFilterName = this.getFilterOptionElem(triggerElem);\n if (lastSelectedFilterName) {\n filterOptions = {\n ...filterOptions,\n lastSelectedFilterName: lastSelectedFilterName\n }\n } else {\n // clear buttons.\n const lastSelectedFilterNameFromEl = this.getFilterOptionElem(el);\n filterOptions = {\n ...filterOptions,\n lastSelectedFilterName: lastSelectedFilterNameFromEl\n }\n }\n \n this.update(el, filterOptions)\n }\n\n // Clear a filter group\n clearGroupFilter(e) {\n e.preventDefault();\n const el = e.target;\n this.updateFilter(e, el);\n }\n\n // Clear all filter\n clearAllFilter(e) {\n e.preventDefault();\n const el = e.target;\n this.update(el, {});\n }\n \n // Single checkbox update\n addListenerToFilterOptions() {\n const filters = [\n ...this.component.querySelectorAll(\n '[data-component=\"Filters\"]'\n )];\n\n filters.forEach((input) => {\n if (input) {\n input.addEventListener(\"change\", (e) => {\n e.preventDefault();\n const el = e.target;\n this.updateFilter(e, el);\n })\n }\n })\n }\n\n}\n\nexport function filterGroupListingInit() {\n document.querySelectorAll('[data-component=filter-groups-listing]').forEach(\n (component) => {\n new FilterGroupListing(component);\n }\n )\n}\n","import { carouselInit } from \"./Carousel/Js/Carousel\";\nimport { filterGroupInit } from \"../03-molecules/FilterGroup/Js/FilterGroup\";\nimport { landingPageHeroInit } from \"./HeroLandingPage/Js/HeroLandingPage\";\nimport { HeroHomepageInit } from \"./HeroHomepage/Js/HeroHomepage\";\nimport { imageGalleryInit } from \"./ImageGallery/Js/ImageGallery\";\nimport { legacyNavigationInit } from \"./LegacyNavigation/Js/LegacyNavigation\";\nimport { PropositionBlockNavigationInit } from \"./PropositionBlock/Js/PropositionBlock\";\nimport { shareInit } from \"./Share/Js/Share\";\nimport { headerNavigationInit } from \"./Header/Js/Header\";\nimport { formModalInit } from \"./FormModal/Js/FormModal\";\nimport { serviceGroupsInit } from \"./ListingsAndControlsBlock/Js/ServiceGroups\";\nimport { servicesInit } from \"./ListingsAndControlsBlock/Js/Services\";\nimport { publicationFiltersInit } from \"./Listings/Js/PublicationFilters\";\nimport { FilterChipGroupInit } from \"../03-molecules/FilterChipGroup/Js/FilterChipGroup\";\nimport { filterGroupListingInit } from \"../03-molecules/FilterGroup/Js/FilterGroupListing\";\n\n\nconst organismsInit = () => {\n carouselInit()\n landingPageHeroInit()\n imageGalleryInit()\n HeroHomepageInit()\n legacyNavigationInit()\n PropositionBlockNavigationInit()\n shareInit()\n filterGroupInit()\n filterGroupListingInit()\n headerNavigationInit()\n formModalInit()\n servicesInit()\n serviceGroupsInit()\n publicationFiltersInit()\n FilterChipGroupInit()\n}\n\nif (\n document.readyState === \"complete\" ||\n (document.readyState !== \"loading\" && !document.documentElement.doScroll)\n) {\n organismsInit()\n} else {\n document.addEventListener(\"DOMContentLoaded\", organismsInit);\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t230: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkbcn_storybook\"] = self[\"webpackChunkbcn_storybook\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [96], function() { return __webpack_require__(9666); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","BackgroundShapes","parentElement","console","log","this","parallaxElementLeft","querySelector","parallaxElementRight","parallaxRatioLeft","parallaxRatioRight","scrollThrottle","scrollHandler","handlerScroll","bind","isVisible","document","addEventListener","window","requestAnimationFrame","handlerAnimationFrame","elementTop","scrollY","parallaxValueLeft","Math","abs","parallaxValueRight","style","transform","toFixed","Modal","colour","variant","theme","ariaLabel","handlerKeyDown","event","code","shiftKey","activeElement","firstFocusableElement","lastFocusableElement","focus","preventDefault","modalClose","body","setAttribute","modal","remove","triggeringElement","removeEventListener","validColours","createElement","colourSet","content","innerHTML","modalCreate","closeButton","contentWrapper","appendChild","focusableElementsSet","includes","focusableElements","querySelectorAll","length","ImageWithZoom","element","expandButton","modalTitle","dataset","modalContent","handleModalExpand","createFullModal","zoomistElement","zoomist","Zoomist","maxRatio","height","slider","zoomer","inEl","outEl","disableOnBounds","YoutubePlayer","videoElement","dispatchBroadcastEvent","eventData","broadcastEvent","Event","playerState","playerVideoId","videoId","dispatchEvent","handleGlobalVideoPlayerStateChange","player","getPlayerState","YT","PlayerState","PLAYING","pauseVideo","closest","poster","getAttribute","hasPoster","observer","stateDebounce","handlePosterClick","IntersectionObserver","videoIsVisible","rootMargin","threshold","observe","registerEvents","playVideo","playerCreate","entries","isIntersecting","unobserve","autoPlay","Player","width","playerVars","autoplay","disablekb","fs","controls","modestbranding","playsinline","enablejsapi","origin","rel","events","playerReady","playerStateChange","clearTimeout","setTimeout","data","PAUSED","ENDED","VimeoVideo","pause","play","Vimeo","id","responsive","on","playerPlay","playerEnded","i","youtubeVideoSelector","vimeoVideoSelector","onYouTubeIframeAPIReady","initYoutubeVideos","forEach","initVimeoVideos","loadVideoScripts","callback","selector","src","init","script","tag","getElementsByTagName","parentNode","insertBefore","onload","applyConsentCovers","newEl","classList","add","OneTrust","ToggleInfoDisplay","outerHTML","replaceChild","getOptanonActiveGroups","hasOwnProperty","Promise","resolve","OptanonActiveGroups","checkOneTrust","oneTrust","OnConsentChanged","cover","originalVideo","newVideo","firstElementChild","AnimatedHeading","headingIsVisible","ShowPassword","toggle","passwordInput","screenReaderText","textContent","toggleInputType","atomsInit","heading","imageExpandElement","videoPlayerInit","readyState","documentElement","doScroll","GlossaryTermLink","glossaryLink","popUpManageFocus","popUpFocusableElementsGet","key","localPopUpHide","popUpShow","popUpsCloseAll","popUp","localManageFocus","popUpCloseButton","positionPopup","glossaryTerm","link","popUpHide","removeAttribute","linkBoundingRect","getBoundingClientRect","popupBoundingRect","top","y","left","x","bottom","innerHeight","innerWidth","createMobileOnlyModal","func","timeout","handlerViewportResize","args","JumpLinks","jumpLinksElement","anchors","bounds","elementFixableRegion","elementMarker","toggleButton","offset","linkObserver","resizeDebounce","isFixed","isSingleColumn","getComputedStyle","display","registerListeners","buildLinks","handlerResize","registerObserver","disconnect","handlerLinkObserverEvent","entry","target","replace","boundingClientRect","rootBounds","anchor","index","previousIndex","list","anchorPoint","handleLinkClicked","item","append","parentBounds","elementOffsetHeight","diff","nextState","handlerToggleOpen","CardDownloadExpandedView","imagesList","Array","from","map","image","container","picture","caption","perPage","page","totalPages","nextButton","previousButton","handleResize","handleNextClick","handlePreviousClick","showImages","isMobile","updatePagination","indicesHTML","renderIndicesMobile","renderIndicesDesktop","indicesContainer","e","parseInt","handleButtonPresentation","gallery","firstChild","removeChild","template","galleryItems","onAnimateItemIn","animateItemIn","createPagination","paginationContainer","visibleIndices","createIndices","join","createIndicesMobile","range","push","right","rangeWithDots","j","AlgoliaAutoComplete","wrapper","appId","algoliaParams","apiKey","indexName","children","path","queryName","forumBaseUrl","initializeAutoComplete","searchIndex","searchClient","algoliasearch","recentSearchesPlugin","createLocalStorageRecentSearchesPlugin","limit","querySuggestionsPlugin","createQuerySuggestionsPlugin","getSearchParams","hitsPerPage","state","query","predefinedItems","label","url","predefinedItemsPlugin","getSources","sourceId","getItems","filter","toLowerCase","getItemUrl","templates","header","items","html","autoComplete","autocomplete","translations","submitButtonTitle","plugins","placeholder","detachedMediaQuery","initialState","URL","location","searchParams","get","onSubmit","context","href","encodeURI","onStateChange","params","getAlgoliaResults","queries","attributesToHighlight","snippetEllipsisText","filters","transformResponse","response","hits","components","Highlight","hit","attribute","secDescription","Snippet","title","undefined","topic","searchBox","setIsOpen","FormDonate","form","donationType","donationTypeOptions","pricePoints","freeformAmountInputs","pricePointDetails","value","clearPricePointDetails","relatedDetail","active","point","checked","detail","priceType","option","handleDonationType","handlePricePointClick","input","handleFreeFormAmountClick","FundsInMemory","component","apiUrl","baseUrl","searchButton","clearButton","submitSearch","clearSearch","fetch","method","json","getData","then","oldDropdown","dropdown","groupedResults","results","result","linkPath","logo","ownerFullName","amount","reuslt","DropdownToggle","button","optionsContainer","nextElementSibling","toggleDropdown","String","hidden","moleculesInit","imageExpandObjects","easeInOutQuad","t","b","c","d","Carousel","buttonNext","buttonPrevious","guideElement","hasOverflow","itemsElement","mobileGuideElement","navigationIndices","trackElement","padWidth","shouldAnimate","firstItem","desktopThreshold","round","guideWidth","trackWidth","delta","direction","scrollPosition","cardWidth","scrollTo","scrollLeft","itemIndex","navigationIndexSetActive","itemSetActive","navigationButtonsStateSet","activeIndex","activeItemGetForMobile","activeItemGetForDesktop","clearStyles","padsSet","navigationSet","canAnimate","scrollWidth","minWidth","handleNavigationButtonClick","handleNavigationIndexClick","to","duration","start","change","currentTime","animateScroll","Filter","filterGroup","details","allDetails","selectAll","checkboxes","radios","clearThisFilterWrapper","clearThisFilter","submit","dropdownHeader","dropdownLabel","dropdownInitialText","allButtons","setUpJsEnv","closeOtherDetails","contains","open","checkbox","box","sort","radio","nextSibling","trim","radioLabel","FilterGroup","filtersElm","textboxes","allRadios","allCheckboxes","clearAllFilters","appliedFiltersContainer","closeThisFilters","activeFilters","setupFilterChipsOnLoad","clearAllValues","removeAllChips","clearAllFilter","handleFilterChange","clearFilter","triggerUpdateFilter","filterElm","opacity","updateChips","f","filterElement","updateFilterGroupState","addChip","chip","filterValueCleaned","className","onclick","filterContainer","isActive","some","textbox","LandingPageHero","parallaxElement","parallaxRatio","heroIsVisible","passive","parallaxValue","HeroHomepage","ImageGallery","LegacyNavigation","topLevelMenuItemClass","addAttributes","child","listItem","currentTarget","activeTopLevelItem","handleHamburgerToggle","childLink","hasAttribute","handleTopLevelItemClick","PropositionBlock","activeSlide","carousel","carouselActiveState","cards","headerElement","navElement","navItems","splideElement","splideTrackElement","splide","splideControls","next","previous","splideSetActiveState","observerMount","slideGoTo","nodeType","nextSlide","scrollDepth","behavior","headerHeight","handlerIntersectionEvent","card","navItem","handlerButtonClick","go","splideSetActiveSlideState","buttonIsActive","toString","Splide","autoWidth","perMove","pagination","trimSpace","drag","padding","mount","newIndex","splideControlStateSet","offsetWidth","splideInit","splideUnmount","destroy","Share","share","navigator","clipboard","writeText","HeaderNavigation","actionsElement","rootElement","headerOverlay","buttonBack","buttonClose","buttonHamburger","trapFocus","firstElement","getPropertyValue","trapFocusSubMenu","trapFocusRootMenu","menuHide","levelOneItems","currentIndex","indexOf","subMenuHide","subMenuShow","focusFirstElement","menuButton","searchTrigger","overflow","menuShow","searchInput","handlerHamburgerClick","handlerSubMenuToggle","PublicationDownload","languageSelect","formatSelect","downloadLink","environment","storybook","selectedLanguageLink","selectedIndex","download","storeId","attributeValues","el","filteredAttributes","postData","publicationNodeId","publicationId","attributes","getDataFromApi","emulateDataFromApi","disabled","options","hasPdf","pdfUrl","hasEpub","epubUrl","hasAudio","audioUrl","hasKindle","kindleUrl","headers","JSON","stringify","res","reject","random","handleLanguageSelect","handleFormatSelect","FormModal","expandButtons","targetFormId","trigger","publicationForm","ServiceGroups","submitButtons","totalResults","listing","actions","clear","locationElm","radiusElm","dateElm","setupFilterBehaviour","updateRadiusFilter","validateLocationFormat","token","formData","FormData","RequestVerificationToken","status","Error","ERROR_RATE_LIMIT","values","test","locationInput","locationInputErrorElement","radius","date","serviceTags","isAjax","noResultsText","startText","pageId","paginationHtml","hasValue","newUrl","protocol","host","pathname","history","pushState","catch","errorMessage","message","applyFilterBtn","defaultRadius","defaultDateRange","click","Services","getValues","filterQuery","encodeURIComponent","error","PublicationFilters","filterForm","tagGroupFilters","listingContainer","clearFiltersBtn","totalizerBlock","mobileFilterCount","noResults","submitFilters","clearFilters","updatePublicationData","updateHistory","FilterChipGroup","filterWrapper","listingContentWrapper","loadingSpinner","addListenerToFilterOptions","categories","uniqueId","category","filterHtml","update","FilterGroupListing","setupNewFilterGroup","filterGroupEl","filtersEl","filterEl","updateFilter","prototype","clearAllFilterFn","clearGroupFilterFn","clearGroupFilter","distance","distanceValues","locationValues","eventType","eventTypeValues","dateValues","cancerType","cancerTypeValues","treatment","treatmentValues","experience","experienceValues","roleType","roleTypeValues","filterGroupElem","filterGroupName","nodeName","filterOptions","getFilterOptions","triggerElem","lastSelectedFilterName","getFilterOptionElem","lastSelectedFilterNameFromEl","organismsInit","carouselElement","propositionBlock","isReduced","formModalInstance","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","splice","r","n","getter","__esModule","a","definition","o","defineProperty","enumerable","g","globalThis","Function","obj","prop","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}