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

    Sorry, we couldn't find a match

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

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

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

    ${data.error}

    `;\r\n }\r\n }\r\n\r\n const newUrl =\r\n `${window.location.protocol}//${window.location.host}${window.location.pathname}${filterQuery ? `?category=${filterQuery}` : ``}`;\r\n window.history.pushState({ path: newUrl }, '', newUrl);\r\n });\r\n }\r\n}\r\n\r\nexport function servicesInit() {\r\n document\r\n .querySelectorAll('[data-component=\"Services\"]')\r\n .forEach((component) => {\r\n new Services(component);\r\n });\r\n}\r\n","export class PublicationFilters {\r\n /**\r\n * Class constructor.\r\n * @param {HTMLElement} component - The element that this class is attached to.\r\n */\r\n constructor(component) {\r\n this.component = component;\r\n\r\n this.listing = document.querySelector(\r\n '[data-component=\"PublicationsList\"]'\r\n );\r\n this.filterForm = component.querySelector(\r\n '[data-component=\"PublicationFilters\"]'\r\n );\r\n this.checkboxes = this.filterForm.querySelectorAll('.a-form-input');\r\n this.pagination = component.querySelector('[data-component=\"Pagination\"]');\r\n this.totalResults = component.querySelector(\r\n '[data-component=\"TotalResults\"]'\r\n );\r\n this.tagGroupFilters = component.querySelector(\r\n '[data-component=\"TagGroupFilters\"]'\r\n );\r\n\r\n this.listingContainer = this.component.querySelector(\r\n '[data-component=\"ListingContainer\"]'\r\n );\r\n\r\n this.clearFiltersBtn = this.component.querySelector(\r\n '[data-component=\"ClearFilters\"]'\r\n );\r\n\r\n this.totalizerBlock = this.component.querySelector(\r\n '.o-listings__top-wrapper'\r\n );\r\n\r\n this.mobileFilterCount = this.component.querySelector(\r\n '.m-filter-component__mobile-heading'\r\n );\r\n this.noResults = this.component.querySelector('.o-listings__no-results');\r\n\r\n this.init();\r\n }\r\n\r\n /**\r\n * Initializes event listeners for the component.\r\n */\r\n init() {\r\n this.checkboxes.forEach((checkbox) => {\r\n checkbox.addEventListener('change', (e) => this.submitFilters(e));\r\n });\r\n\r\n this.clearFiltersBtn.addEventListener('click', (e) => this.clearFilters(e));\r\n }\r\n\r\n /**\r\n * Handles the submission of filters, sending data via POST to the server and updating the view.\r\n * @param {Event} e - The event object.\r\n */\r\n async submitFilters(e) {\r\n try {\r\n e.preventDefault();\r\n\r\n let pageId = this.component.querySelector('#pageId').value;\r\n let filters = this.getValues(this.checkboxes);\r\n\r\n this.updatePublicationData(pageId, 1, filters);\r\n } catch (error) {\r\n console.error('Error submitting filters:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Clear the applied filters and refresh the publications data\r\n */\r\n async clearFilters(e) {\r\n try {\r\n e.preventDefault();\r\n\r\n let pageId = this.component.querySelector('#pageId').value;\r\n\r\n this.checkboxes.forEach((checkbox) => {\r\n checkbox.checked = false;\r\n });\r\n\r\n this.updatePublicationData(pageId, 1, '');\r\n } catch (error) {\r\n console.error('Error submitting filters:', error);\r\n }\r\n }\r\n\r\n async updatePublicationData(pageId, page, filters) {\r\n if (filters.length == 0) {\r\n filters = '';\r\n this.mobileFilterCount.innerHTML = `Select filters (0)`;\r\n this.clearFiltersBtn.style.display = 'none';\r\n } else {\r\n this.mobileFilterCount.innerHTML = `Select filters (${filters.length})`;\r\n this.clearFiltersBtn.style.display = 'flex';\r\n }\r\n\r\n try {\r\n const response = await fetch(\r\n '/umbraco/api/publications/GetPublicationsCards',\r\n {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n pageId: `${pageId}`,\r\n page: `${page}`,\r\n filter: `${filters}`,\r\n }),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n }\r\n );\r\n\r\n const data = await response.json();\r\n\r\n if (data && data.html) {\r\n this.listing.innerHTML = data.html;\r\n this.listing.style.display = 'grid';\r\n this.totalizerBlock.style.display = 'block';\r\n this.noResults.style.display = 'none';\r\n } else {\r\n this.listing.style.display = 'none';\r\n this.totalizerBlock.style.display = 'none';\r\n this.noResults.style.display = 'block';\r\n }\r\n\r\n if (data && data.pagination) {\r\n this.pagination.innerHTML = data.pagination;\r\n } else {\r\n this.pagination.innerHTML = '';\r\n }\r\n\r\n if (data && data.results) {\r\n this.totalResults.innerHTML = `${data.results} ${\r\n data.results === 1 ? 'result' : 'results'\r\n }`;\r\n } else {\r\n this.totalResults.innerHTML = '0 results';\r\n }\r\n\r\n if (data && data.query) {\r\n this.updateHistory(data.query);\r\n }\r\n } catch (error) {\r\n console.error('Error submitting filters:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Updates browser history based on current filter settings.\r\n * @param {string} query - The updated query string.\r\n */\r\n updateHistory(query) {\r\n const currentUrl = new URL(window.location);\r\n const newUrl = `${currentUrl.pathname}${query}`;\r\n\r\n window.history.pushState({ path: newUrl }, '', newUrl);\r\n }\r\n\r\n /**\r\n * Get values from checkboxes\r\n */\r\n getValues(values) {\r\n return [...values]\r\n .filter(function (value) {\r\n return value.checked;\r\n })\r\n .map(function (value) {\r\n return [value.getAttribute('data-value')];\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves the CSRF token from the form.\r\n * @returns {string} - The CSRF token value.\r\n */\r\n getToken() {\r\n return this.filterForm.querySelector('[name=\"__RequestVerificationToken\"]')\r\n .value;\r\n }\r\n}\r\n\r\n/**\r\n * Initializes PublicationFilters for each filter component found in the document.\r\n */\r\nexport function publicationFiltersInit() {\r\n document\r\n .querySelectorAll('[data-component=\"PublicationListing\"]')\r\n .forEach((component) => {\r\n new PublicationFilters(component);\r\n });\r\n}\r\n","class FilterChipGroup {\r\n constructor(component) {\r\n this.component = component;\r\n this.filterWrapper = this.component.querySelector('[data-component=filter-wrapper]');\r\n this.listingContentWrapper = this.component.querySelector('[data-component=listing-content-wrapper]');\r\n this.loadingSpinner = this.component.querySelector('[data-component=loader-spinner]');\r\n this.addListenerToFilterOptions();\r\n }\r\n\r\n /**\r\n * Add event listener after the component are added.\r\n */\r\n addListenerToFilterOptions() {\r\n /**\r\n * Array of filter input chips.\r\n *\r\n * @type {*[]}\r\n */\r\n const filters = [\r\n ...this.component.querySelectorAll(\r\n '[data-component=\"ServiceFilters\"]'\r\n )];\r\n\r\n const clearFilters = this.component.querySelector('[data-component=clear-filter]');\r\n\r\n filters.forEach((input) => {\r\n if (input) {\r\n input.addEventListener(\"change\", (e) => this.submit(e))\r\n }\r\n })\r\n\r\n if (clearFilters) {\r\n clearFilters.addEventListener(\"click\", (e) => this.clear(e));\r\n }\r\n }\r\n\r\n /**\r\n * Post data to service endpoints\r\n */\r\n async postData(url = '', token, data = {}) {\r\n const formData = new FormData();\r\n for (const key in data) {\r\n formData.append(key, data[key]);\r\n }\r\n\r\n const response = await fetch(url, {\r\n headers: {\r\n RequestVerificationToken: token,\r\n },\r\n method: 'POST',\r\n body: formData,\r\n });\r\n return response.json();\r\n }\r\n\r\n /**\r\n * Get values from checkboxes or radios\r\n */\r\n getValues(values) {\r\n return [...values]\r\n .filter(function (value) {\r\n return value.checked;\r\n })\r\n .map(function (value) {\r\n return [value.value];\r\n });\r\n }\r\n\r\n update(e, categories) {\r\n e.preventDefault();\r\n const el = e.target;\r\n const form = el.closest('form');\r\n const token = form.querySelector(\r\n '[name=\"__RequestVerificationToken\"]'\r\n ).value;\r\n this.loadingSpinner.style.display = 'block';\r\n const pageId = form.querySelector('[name=\"pageId\"]').value;\r\n const uniqueId = form.querySelector('[name=\"uniqueId\"]').value;\r\n\r\n const data = {\r\n isAjax: true,\r\n category: this.getValues(categories),\r\n ...(uniqueId ? { uniqueId: uniqueId } : {}),\r\n ...(pageId ? { pageId: pageId }: {})\r\n }\r\n\r\n this.postData(\r\n '/umbraco/surface/FilterChipSurface/FilterContent',\r\n token,\r\n data\r\n ).then(res => {\r\n this.filterWrapper.innerHTML = res.filterHtml;\r\n this.listingContentWrapper.innerHTML = res.html;\r\n this.addListenerToFilterOptions();\r\n\r\n const newUrl =\r\n window.location.protocol +\r\n '//' +\r\n window.location.host +\r\n window.location.pathname +\r\n res.query;\r\n window.history.pushState({ path: newUrl }, '', newUrl);\r\n\r\n this.loadingSpinner.style.display = 'none';\r\n })\r\n }\r\n submit(e) {\r\n e.preventDefault();\r\n const el = e.target;\r\n const form = el.closest('form');\r\n const categories = form.querySelectorAll('[data-component=ServiceFilters][name=category]');\r\n this.update(e, categories);\r\n }\r\n\r\n clear(e) {\r\n e.preventDefault();\r\n this.update(e, '');\r\n }\r\n}\r\n\r\nexport function FilterChipGroupInit() {\r\n document.querySelectorAll('[data-component=filter-chips-listing]').forEach(\r\n (component) => {\r\n new FilterChipGroup(component);\r\n }\r\n )\r\n}\r\n","import Filter from \"../../Filter/Js/Filter\";\r\nimport { FilterGroup } from \"./FilterGroup\";\r\n\r\nclass FilterGroupListing {\r\n constructor(component) {\r\n this.component = component;\r\n this.filterWrapper = this.component.querySelector('[data-component=filter-wrapper]');\r\n this.listingContentWrapper = this.component.querySelector('[data-component=listing-content-wrapper]');\r\n this.loadingSpinner = this.component.querySelector('[data-component=loader-spinner]');\r\n\r\n this.setupNewFilterGroup();\r\n this.addListenerToFilterOptions();\r\n }\r\n\r\n setupNewFilterGroup() {\r\n // We still want to support listing pages that hasn't been updated yet so we will extend existing FilterGroup.\r\n const filterGroupEl = this.component.querySelector('[data-filter-group-ajax]');\r\n const filtersEl = filterGroupEl.querySelectorAll('[data-filter]');\r\n if (filterGroupEl) {\r\n filtersEl.forEach((filter) => {\r\n new Filter(filter, filterGroupEl)\r\n });\r\n\r\n let triggerUpdateFilter = function(e, filterEl) { this.updateFilter(e, filterEl); }.bind(this);\r\n FilterGroup.prototype.triggerUpdateFilter = function(e, filterEl) { return triggerUpdateFilter(e, filterEl); };\r\n\r\n let clearAllFilterFn = function(e) { this.clearAllFilter(e); }.bind(this);\r\n FilterGroup.prototype.clearAllFilter = function(e) { return clearAllFilterFn(e); };\r\n \r\n let clearGroupFilterFn = function(e) { this.clearGroupFilter(e); }.bind(this);\r\n FilterGroup.prototype.clearGroupFilter = function(e) { return clearGroupFilterFn(e); };\r\n\r\n this.filterGroup = new FilterGroup(filterGroupEl);\r\n }\r\n }\r\n\r\n getValues(values) {\r\n return [...values]\r\n .filter(function (value) {\r\n return value.checked;\r\n })\r\n .map(function (value) {\r\n return [value.value];\r\n });\r\n }\r\n\r\n async postData(url = '', token, data = {}) {\r\n const formData = new FormData();\r\n for (const key in data) {\r\n formData.append(key, data[key]);\r\n }\r\n\r\n const response = await fetch(url, {\r\n headers: {\r\n RequestVerificationToken: token,\r\n },\r\n method: 'POST',\r\n body: formData,\r\n });\r\n return response.json();\r\n }\r\n\r\n // Todo: refactor once we start working on other listing page.\r\n getFilterOptions(el) {\r\n const form = el.closest('form');\r\n const distance = form.querySelectorAll('[data-component=FilterCheckbox][name=distance]');\r\n const distanceValues = this.getValues(distance);\r\n const location = form.querySelectorAll('[data-component=FilterCheckbox][name=location]');\r\n const locationValues = this.getValues(location);\r\n const eventType = form.querySelectorAll('[data-component=FilterCheckbox][name=eventType]');\r\n const eventTypeValues = this.getValues(eventType);\r\n const date = form.querySelectorAll('[data-component=FilterRadio][name=date]');\r\n const dateValues = this.getValues(date);\r\n const cancerType = form.querySelectorAll('[data-component=FilterCheckbox][name=cancerType]');\r\n const cancerTypeValues = this.getValues(cancerType);\r\n const treatment = form.querySelectorAll('[data-component=FilterCheckbox][name=treatment]');\r\n const treatmentValues = this.getValues(treatment);\r\n const experience = form.querySelectorAll('[data-component=FilterCheckbox][name=experience]');\r\n const experienceValues = this.getValues(experience);\r\n const roleType = form.querySelectorAll('[data-component=FilterCheckbox][name=roleType]');\r\n const roleTypeValues = this.getValues(roleType);\r\n \r\n return {\r\n ...(distanceValues.length > 0 ? { distance: distanceValues } : {}),\r\n ...(locationValues.length > 0 ? { location: locationValues } : {}),\r\n ...(eventTypeValues.length > 0 ? { eventType: eventTypeValues } : {}),\r\n ...(dateValues.length > 0 ? { date: dateValues } : {}),\r\n ...(cancerTypeValues.length > 0 ? { cancerType: cancerTypeValues } : {}),\r\n ...(treatmentValues.length > 0 ? { treatment: treatmentValues } : {}),\r\n ...(experienceValues.length > 0 ? { experience: experienceValues } : {}),\r\n ...(roleTypeValues.length > 0 ? { roleType: roleTypeValues } : {}),\r\n };\r\n }\r\n\r\n update(el, args) {\r\n if (this.loadingSpinner) {\r\n this.loadingSpinner.style.display = 'block';\r\n }\r\n const form = el.closest('form');\r\n const token = form.querySelector(\r\n '[name=\"__RequestVerificationToken\"]'\r\n ).value;\r\n const pageId = form.querySelector('[name=\"pageId\"]').value;\r\n const uniqueId = form.querySelector('[name=\"uniqueId\"]').value;\r\n\r\n const data = {\r\n isAjax: true,\r\n pageId: pageId,\r\n ...(uniqueId ? { uniqueId: uniqueId } : {}),\r\n ...args,\r\n }\r\n this.postData('/umbraco/surface/FilterGroupSurface/FilterContent', token, data).then(res => {\r\n this.filterWrapper.innerHTML = res.filterHtml;\r\n this.listingContentWrapper.innerHTML = res.html;\r\n this.setupNewFilterGroup();\r\n this.addListenerToFilterOptions();\r\n this.filterGroup.updateChips();\r\n const newUrl =\r\n window.location.protocol +\r\n '//' +\r\n window.location.host +\r\n window.location.pathname +\r\n res.query;\r\n window.history.pushState({ path: newUrl }, '', newUrl);\r\n if (this.loadingSpinner) {\r\n this.loadingSpinner.style.display = 'none';\r\n }\r\n })\r\n }\r\n\r\n getFilterOptionElem(el) {\r\n const filterGroupElem = el.closest('[data-component=\"Filters\"]');\r\n if (filterGroupElem) {\r\n const filterGroupName = filterGroupElem.getAttribute('data-group-name');\r\n if (el.nodeName == \"INPUT\" && (el.getAttribute(\"data-component\") == \"FilterRadio\" || el.getAttribute(\"data-component\") == \"FilterCheckbox\")) {\r\n return filterGroupName;\r\n }\r\n if (el.nodeName == \"BUTTON\" && el.getAttribute('data-is-clear-group')) {\r\n return filterGroupName;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n updateFilter(e, el) {\r\n let filterOptions = this.getFilterOptions(el);\r\n let triggerElem = e.target;\r\n\r\n const lastSelectedFilterName = this.getFilterOptionElem(triggerElem);\r\n if (lastSelectedFilterName) {\r\n filterOptions = {\r\n ...filterOptions,\r\n lastSelectedFilterName: lastSelectedFilterName\r\n }\r\n } else {\r\n // clear buttons.\r\n const lastSelectedFilterNameFromEl = this.getFilterOptionElem(el);\r\n filterOptions = {\r\n ...filterOptions,\r\n lastSelectedFilterName: lastSelectedFilterNameFromEl\r\n }\r\n }\r\n \r\n this.update(el, filterOptions)\r\n }\r\n\r\n // Clear a filter group\r\n clearGroupFilter(e) {\r\n e.preventDefault();\r\n const el = e.target;\r\n this.updateFilter(e, el);\r\n }\r\n\r\n // Clear all filter\r\n clearAllFilter(e) {\r\n e.preventDefault();\r\n const el = e.target;\r\n this.update(el, {});\r\n }\r\n \r\n // Single checkbox update\r\n addListenerToFilterOptions() {\r\n const filters = [\r\n ...this.component.querySelectorAll(\r\n '[data-component=\"Filters\"]'\r\n )];\r\n\r\n filters.forEach((input) => {\r\n if (input) {\r\n input.addEventListener(\"change\", (e) => {\r\n e.preventDefault();\r\n const el = e.target;\r\n this.updateFilter(e, el);\r\n })\r\n }\r\n })\r\n }\r\n\r\n}\r\n\r\nexport function filterGroupListingInit() {\r\n document.querySelectorAll('[data-component=filter-groups-listing]').forEach(\r\n (component) => {\r\n new FilterGroupListing(component);\r\n }\r\n )\r\n}\r\n","import { carouselInit } from \"./Carousel/Js/Carousel\";\r\nimport { filterGroupInit } from \"../03-molecules/FilterGroup/Js/FilterGroup\";\r\nimport { landingPageHeroInit } from \"./HeroLandingPage/Js/HeroLandingPage\";\r\nimport { HeroHomepageInit } from \"./HeroHomepage/Js/HeroHomepage\";\r\nimport { imageGalleryInit } from \"./ImageGallery/Js/ImageGallery\";\r\nimport { legacyNavigationInit } from \"./LegacyNavigation/Js/LegacyNavigation\";\r\nimport { PropositionBlockNavigationInit } from \"./PropositionBlock/Js/PropositionBlock\";\r\nimport { shareInit } from \"./Share/Js/Share\";\r\nimport { headerNavigationInit } from \"./Header/Js/Header\";\r\nimport { formModalInit } from \"./FormModal/Js/FormModal\";\r\nimport { serviceGroupsInit } from \"./ListingsAndControlsBlock/Js/ServiceGroups\";\r\nimport { servicesInit } from \"./ListingsAndControlsBlock/Js/Services\";\r\nimport { publicationFiltersInit } from \"./Listings/Js/PublicationFilters\";\r\nimport { FilterChipGroupInit } from \"../03-molecules/FilterChipGroup/Js/FilterChipGroup\";\r\nimport { filterGroupListingInit } from \"../03-molecules/FilterGroup/Js/FilterGroupListing\";\r\n\r\n\r\nconst organismsInit = () => {\r\n carouselInit()\r\n landingPageHeroInit()\r\n imageGalleryInit()\r\n HeroHomepageInit()\r\n legacyNavigationInit()\r\n PropositionBlockNavigationInit()\r\n shareInit()\r\n filterGroupInit()\r\n filterGroupListingInit()\r\n headerNavigationInit()\r\n formModalInit()\r\n servicesInit()\r\n serviceGroupsInit()\r\n publicationFiltersInit()\r\n FilterChipGroupInit()\r\n}\r\n\r\nif (\r\n document.readyState === \"complete\" ||\r\n (document.readyState !== \"loading\" && !document.documentElement.doScroll)\r\n) {\r\n organismsInit()\r\n} else {\r\n document.addEventListener(\"DOMContentLoaded\", organismsInit);\r\n}\r\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","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","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","dataset","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","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","filterValue","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","subMenuShow","subMenuHide","searchInput","focusFirstElement","menuShow","overflow","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","values","test","locationInput","locationInputErrorElement","radius","date","serviceTags","isAjax","noResultsText","startText","pageId","paginationHtml","hasValue","newUrl","protocol","host","pathname","history","pushState","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":""}