{"version":3,"file":"main.min.js","sources":["../../../Frontend/js/utils/onReady.js","../../../Frontend/js/utils/elementProperties.js","../../../Frontend/js/utils/scrollLock.js","../../../Frontend/js/utils/scroll.js","../../../Frontend/js/components/nav.js","../../../Frontend/js/utils/windowResize.js","../../../Frontend/js/utils/lazyImage.js","../../../Frontend/js/utils/animation.js","../../../Frontend/js/components/accordion.js","../../../Frontend/js/utils/helpers.js","../../../Frontend/js/utils/scrollTo.js","../../../Frontend/js/components/video.js","../../../Frontend/js/components/overlay.js","../../../Frontend/js/components/filter.js","../../../Frontend/js/components/tabs.js","../../../node_modules/ev-emitter/ev-emitter.js","../../../node_modules/get-size/get-size.js","../../../node_modules/desandro-matches-selector/matches-selector.js","../../../node_modules/fizzy-ui-utils/utils.js","../../../node_modules/flickity/js/cell.js","../../../node_modules/flickity/js/slide.js","../../../node_modules/flickity/js/animate.js","../../../node_modules/flickity/js/flickity.js","../../../node_modules/unipointer/unipointer.js","../../../node_modules/unidragger/unidragger.js","../../../node_modules/flickity/js/drag.js","../../../node_modules/flickity/js/prev-next-button.js","../../../node_modules/flickity/js/page-dots.js","../../../node_modules/flickity/js/player.js","../../../node_modules/flickity/js/add-remove-cell.js","../../../node_modules/flickity/js/lazyload.js","../../../node_modules/flickity/js/index.js","../../../Frontend/js/components/slider.js","../../../Frontend/js/components/form.js","../../../Frontend/js/components/umbraco-member.js","../../../Frontend/js/utils/elementManipulation.js","../../../node_modules/wa-mediabox/dist/wa-mediabox.min.js","../../../Frontend/js/main.js","../../../Frontend/js/components/profile.js"],"sourcesContent":["/**\r\n * Handler to trigger callbacks once the browser is ready for them.\r\n *\r\n * You can keep adding references using onReady() even after the page is loaded. In that case they will be\r\n * run at once.\r\n *\r\n * @example\r\n * import { onReady } from './utils/events/onReady';\r\n *\r\n * onReady(yourFunctionHere);\r\n *\r\n */\r\n\r\nlet functionReferences = [];\r\n\r\n// Set the initial readyState based on the browser's current state. If the script has been loaded\r\n// asynchronously, the DOM might be ready for us already, in which case there's no reason to delay\r\n// any further processing. The following will evaluate as true if the DOM is ready, or the page is\r\n// complete.\r\nlet readyState = document.readyState === 'interactive' || document.readyState === 'complete';\r\n\r\n// Defines whether or not the window.onReady event has been bound, so we won't do it twice. That\r\n// would just be stupid.\r\nlet readyEventBound = false;\r\n\r\n/**\r\n * Run the given array of callback functions.\r\n *\r\n * @private\r\n * @param {Array} funcArray\r\n */\r\nfunction runFunctionArray(funcArray) {\r\n funcArray.forEach(funcRef => funcRef());\r\n}\r\n\r\n/**\r\n * Empty the callback arrays\r\n *\r\n * @private\r\n */\r\nfunction emptyCallbackArrays() {\r\n // Keep iterating through the function references until there are none left.\r\n while (functionReferences.length) {\r\n // Set up a temporary array that mirrors the list of callbacks, and empty the real one.\r\n const tempArray = functionReferences.slice(0);\r\n functionReferences = [];\r\n\r\n // Run the callbacks. The callbacks themselves may set up more callbacks, which\r\n // is why we keep looping the array until we're done.\r\n runFunctionArray(tempArray);\r\n }\r\n\r\n // At this point we'll assume we're ready for anything!\r\n readyState = true;\r\n}\r\n\r\n/**\r\n * Make sure the \"ready\"-event is set.\r\n *\r\n * @private\r\n */\r\nfunction bindReadyEvent() {\r\n if (!readyEventBound) {\r\n if (document.readyState === 'loading') {\r\n // loading yet, wait for the event\r\n document.addEventListener('DOMContentLoaded', emptyCallbackArrays);\r\n } else {\r\n // DOM is ready!\r\n emptyCallbackArrays();\r\n }\r\n\r\n readyEventBound = true;\r\n }\r\n}\r\n\r\n/**\r\n * Register a function to run when the page is ready.\r\n *\r\n * @param {Function} functionReference - The function you want to run.\r\n */\r\nexport function onReady(functionReference) {\r\n if (typeof functionReference === 'function') {\r\n if (readyState) {\r\n functionReference();\r\n } else {\r\n bindReadyEvent();\r\n\r\n functionReferences.push(functionReference);\r\n }\r\n }\r\n}\r\n","/**\r\n * Utilities for checking properties and states of elements.\r\n */\r\n\r\n/**\r\n * Check if an element is empty.\r\n *\r\n * @param {Node} element - Check if this element is empty.\r\n * @param {boolean} [strict=true] - Set this to **false** to ignore nodes with whitespace.\r\n * @returns {boolean} **True** if the element is empty.\r\n */\r\nexport function elementIsEmpty(element, strict = true) {\r\n return strict ? !element.childNodes.length : !element.innerHTML.trim().length;\r\n}\r\n\r\n/**\r\n * Check if an element is hidden in the DOM with `display: none;`\r\n *\r\n * @param {HTMLElement} element - The element to check.\r\n * @returns {boolean} **True** if element is hidden, otherwise **false**.\r\n */\r\nexport function elementIsHidden(element) {\r\n return element.offsetParent === null;\r\n}\r\n\r\n/**\r\n * Check if an element is in the viewport\r\n * \r\n * @param {HTMLElement} elem - The element to check \r\n */\r\nexport function isVisible(elem) {\r\n return !!elem && !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\r\n}\r\n\r\n/**\r\n * Find out whether or not the given argument is an element that would react somewhat normally to DOM-manipulations.\r\n *\r\n * @param {*} element - The element to check.\r\n * @returns {boolean} `true` if the given argument is an element (or document, or window), and `false` otherwise.\r\n */\r\nexport function isElement(element) {\r\n return element instanceof Element || element instanceof Document || element instanceof Window;\r\n}\r\n\r\n/**\r\n * Return the position of an element\r\n *\r\n * @param {Element|String} element - The HTML element to work with or its ID\r\n * @param {Element|String|Window} [relativeTo=window] - The HTML element to return the position relative to or its ID\r\n * @returns {{top: Number, left: Number}} An object with top and left positions in pixels\r\n *\r\n *\r\n * @example Basic usage:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * const element = document.querySelector('.anElement');\r\n * getElementPosition(element);\r\n *\r\n *\r\n * @example Perform a search for an element with an ID equal to the string, i.e. 'elementId', and get the position of that:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * getElementPosition('elementId');\r\n */\r\nexport function getElementPosition(element, relativeTo = window) {\r\n const useElement = typeof element === 'string' ? document.getElementById(element) : element;\r\n\r\n // Throw error if element wasn't found\r\n if (!useElement) {\r\n throw 'getElementPosition did not find an element.';\r\n }\r\n\r\n const useRelativeTo = typeof relativeTo === 'string' ? document.getElementById(relativeTo) : relativeTo;\r\n\r\n // Throw error if relative element wasn't found\r\n if (!useRelativeTo) {\r\n throw 'getElementPosition did not find an element to show the position relative to.';\r\n }\r\n\r\n if (relativeTo === window) {\r\n // Return position relative to window\r\n const rect = useElement.getBoundingClientRect();\r\n return {\r\n top: rect.top + (window.pageYOffset || document.documentElement.scrollTop),\r\n left: rect.left + (window.pageXOffset || document.documentElement.scrollLeft)\r\n };\r\n } else {\r\n // Return position relative to declared element\r\n return {\r\n top: useElement.offsetTop - relativeTo.offsetTop,\r\n left: useElement.offsetLeft - relativeTo.offsetLeft\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Get the current scroll values of the given element (or window). Will return an object containing\r\n * \"left\" and \"top\" properties, which are set to the scroll values, or false if no compatible element\r\n * was given.\r\n *\r\n * @param {Element|Window} [element=window]\r\n * @returns {{ left: number, top: number } | boolean}\r\n */\r\nexport function getElementScroll(element = window) {\r\n if (isElement(element)) {\r\n if (element instanceof Window) {\r\n return {\r\n left: element.pageXOffset || document.documentElement.scrollLeft,\r\n top: element.pageYOffset || document.documentElement.scrollTop\r\n };\r\n } else {\r\n return {\r\n left: element.scrollX || element.scrollLeft,\r\n top: element.scrollY || element.scrollTop\r\n };\r\n }\r\n } else {\r\n console.warn('Can\\'t get scroll-position or given argument type.');\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get both width and height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includePadding=false] - Get size including padding (defaults to true)\r\n * @param {boolean} [options.includeBorder=false] - Get size including border (defaults to true)\r\n * @param {boolean} [options.includeMargin=true] - Get size including margin (defaults to false)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get size of pseudo element ':before' or ':after'\r\n * @returns {{width: number, height: number}} An object with the width and height as numbers\r\n */\r\nexport function getElementSize(element, options = {}) {\r\n // Get styles\r\n const elementStyle = window.getComputedStyle(element, options.pseudoElement);\r\n\r\n return {\r\n width: getElementWidth(element, options, elementStyle),\r\n height: getElementHeight(element, options, elementStyle)\r\n };\r\n}\r\n\r\n/**\r\n * Get width of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get width including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get width including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get width including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get width of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The width as a number\r\n */\r\nexport function getElementWidth(element, options = {}, elementStyle = null) {\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get width including border and padding\r\n let width = element.offsetWidth;\r\n\r\n // Calculate width with margin\r\n if (options.includeMargin) {\r\n width += parseFloat(style.marginLeft) + parseFloat(style.marginRight);\r\n }\r\n\r\n // Calculate width without border\r\n if (!options.includeBorder) {\r\n width -= parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth);\r\n }\r\n\r\n // Calculate width without padding\r\n if (!options.includePadding) {\r\n width -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);\r\n }\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * Get height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get height including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get height including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get height including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get height of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The height as a number\r\n */\r\nexport function getElementHeight(element, options = {}, elementStyle = null) {\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get height including border and padding\r\n let height = element.offsetHeight;\r\n\r\n // Calculate height with margin\r\n if (options.includeMargin) {\r\n height += parseFloat(style.marginTop) + parseFloat(style.marginBottom);\r\n }\r\n\r\n // Calculate height without border\r\n if (!options.includeBorder) {\r\n height -= parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);\r\n }\r\n\r\n // Calculate height without padding\r\n if (!options.includePadding) {\r\n height -= parseFloat(style.paddingTop) + parseFloat(style.paddingBottom);\r\n }\r\n\r\n return height;\r\n}\r\n","/**\r\n * A utility to **lock the viewport** at the current position in order to **stop scrolling**.\r\n *\r\n * @example Basic usage\r\n * import { enableScrollLock, disableScrollLock } from './utils/dom/scrollLock';\r\n *\r\n * enableScrollLock();\r\n * window.setTimeout(disableScrollLock, 3000);\r\n */\r\n\r\nimport { getElementScroll } from './elementProperties';\r\n\r\nconst className = 'scroll-lock';\r\nlet scrollTop = 0;\r\n\r\n/**\r\n * Get the current state of the scroll lock. `true` if the scroll lock is enabled, otherwise `false`.\r\n *\r\n * @type {boolean}\r\n */\r\nexport let scrollLocked = false;\r\n\r\n/**\r\n * Enable the scroll lock.\r\n */\r\nexport function enableScrollLock() {\r\n if (!scrollLocked) {\r\n // Get scroll position\r\n const scrollPosition = getElementScroll();\r\n\r\n // Reset scroll position\r\n window.scrollTo(scrollPosition.left, 0);\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.add(className);\r\n htmlTag.style.marginTop = `${-scrollPosition.top}px`;\r\n htmlTag.style.position = 'fixed';\r\n htmlTag.style.overflow = 'hidden';\r\n htmlTag.style.width = '100%';\r\n document.body.style.overflowY = 'scroll';\r\n\r\n // Remember state\r\n scrollLocked = true;\r\n scrollTop = scrollPosition.top;\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const enable = enableScrollLock;\r\n\r\n/**\r\n * Disable the scroll lock\r\n */\r\nexport function disableScrollLock() {\r\n if (scrollLocked) {\r\n const scrollPosition = getElementScroll();\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.remove(className);\r\n htmlTag.style.marginTop = '';\r\n htmlTag.style.position = '';\r\n htmlTag.style.overflow = '';\r\n htmlTag.style.width = '';\r\n document.body.removeAttribute('style');\r\n // Set the scroll position to what it was before\r\n window.scrollTo(scrollPosition.left, scrollTop);\r\n\r\n // Remember state\r\n scrollLocked = false;\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const disable = disableScrollLock;\r\n\r\n/**\r\n * Toggle the scroll lock between on and off\r\n */\r\nexport function toggleScrollLock() {\r\n if (scrollLocked) {\r\n disableScrollLock();\r\n } else {\r\n enableScrollLock();\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const toggle = toggleScrollLock;\r\n\r\nexport default {\r\n enable,\r\n disable,\r\n toggle\r\n};\r\n","export let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\r\n\r\nlet ticking = false;\r\nconst scrollFunctions = [];\r\n\r\nfunction animate() {\r\n scrollFunctions.forEach(funcRef => funcRef());\r\n\r\n ticking = false;\r\n}\r\n\r\nfunction requestTick() {\r\n if (!ticking) {\r\n requestAnimationFrame(animate);\r\n ticking = true;\r\n }\r\n}\r\n\r\nfunction scrollHandler() {\r\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\r\n requestTick();\r\n}\r\n/**\r\n * Adds a function to a function array, executed on a single scroll-event set on window.\r\n * This avoids the memory load and possible hickups of setting multiple eventlisteners for the same event.\r\n * Also this optimizes rendering by utilising the requestAnimationFrame for these scroll-events.\r\n * \r\n * @param {Function} handler - function to be called on scroll \r\n * @param {boolean} triggerNow - Should the function be called at once\r\n */\r\nexport function onScroll(handler, triggerNow = false) {\r\n // if first call: setup eventlistener on window\r\n !scrollFunctions.length ? initScroll() : null;\r\n\r\n // Trigger function\r\n triggerNow ? handler() : null;\r\n\r\n scrollFunctions.push(handler); \r\n}\r\n\r\nexport function initScroll() {\r\n window.addEventListener('scroll', scrollHandler);\r\n}\r\n","import { stickyNavOnScroll } from '../utils/stickyNavOnScroll';\r\nimport { enableScrollLock, disableScrollLock } from '../utils/scrollLock';\r\n\r\nexport let nav;\r\n\r\nexport function toggleMenuOpen() {\r\n if (nav.classList.contains('nav--open')) {\r\n disableScrollLock();\r\n nav.classList.remove('nav--open');\r\n\r\n if (window.pageYOffset > 50) {\r\n setTimeout(() => nav.classList.add('going-up'), 40);\r\n }\r\n\r\n } else {\r\n enableScrollLock();\r\n nav.classList.add('nav--open');\r\n }\r\n}\r\n\r\nexport function setupNav(selector = '.nav'/* , sticky = true */) {\r\n nav = document.body.querySelector(selector);\r\n\r\n if (nav) {\r\n const navBtn = nav.querySelector('.nav__btn');\r\n\r\n navBtn.addEventListener('click', toggleMenuOpen);\r\n\r\n /* if (sticky) {\r\n stickyNavOnScroll(nav, 'nav--sticky', 30, 'going-up');\r\n } */\r\n }\r\n}\r\n","import settings from '../../settings.json';\r\n\r\nexport const breakpoints = settings.breakpoints;\r\nexport const breakpointKeys = Object.keys(breakpoints);\r\nexport let currentWindowWidth = window.innerWidth;\r\nexport let currentWindowHeight = window.innerHeight;\r\nexport let currentBreakpoint;\r\nexport let currentBreakpointIndex = 0;\r\nlet resizeTimer;\r\n\r\nconst resizeFunctions = [];\r\n\r\n/**\r\n * Get various window sizes - width, height etc.\r\n * This function is fired automatically upon page load. and run each time the window changes size.\r\n *\r\n */\r\nfunction getWindowSizes() {\r\n currentWindowWidth = window.innerWidth;\r\n currentWindowHeight = window.innerHeight;\r\n\r\n // Calculate which breakpoint is currently active, based on the screen width compared to the breakpoint definitions.\r\n\r\n let lastFoundWidth = 0;\r\n\r\n breakpointKeys.forEach((key, index) => {\r\n const width = breakpoints[key];\r\n if (currentWindowWidth >= width && width > lastFoundWidth) {\r\n lastFoundWidth = width;\r\n currentBreakpoint = key;\r\n currentBreakpointIndex = index;\r\n }\r\n });\r\n}\r\n\r\nfunction resizeHandler() {\r\n clearTimeout(resizeTimer);\r\n resizeTimer = setTimeout(() => {\r\n getWindowSizes();\r\n resizeFunctions.forEach(funcRef => funcRef());\r\n }, 100);\r\n}\r\n\r\nexport function onWindowResize(handler) {\r\n if (!currentBreakpoint) {\r\n initWindowResize();\r\n }\r\n\r\n resizeFunctions.push(handler);\r\n}\r\n\r\nexport function initWindowResize() { \r\n getWindowSizes();\r\n window.addEventListener('resize', resizeHandler);\r\n window.addEventListener('orientationchange', resizeHandler);\r\n}\r\n","import { breakpointKeys, currentBreakpointIndex } from '../utils/windowResize';\r\nimport { onWindowResize } from './windowResize';\r\nimport { onScroll } from './scroll';\r\n//import \"objectFitPolyfill\";\r\n\r\nlet lastUsedScreenWidth;\r\nlet lazyArray = [];\r\n\r\nlet options = {\r\n className: 'lazy',\r\n loadedClass: 'lazy--loaded',\r\n loadClass: 'lazy--loading',\r\n decodeImg: true, // This option requires promises support (incl. via polyfill.io)\r\n oldIe11Fit: false, // This option requires objectFit support\r\n offset: 0\r\n};\r\n\r\nexport function setupLazyLoading(customOptions = {}) {\r\n lastUsedScreenWidth = -1;\r\n options = { ...options, ...customOptions };\r\n lazyArray = document.body.getElementsByClassName(options.className);\r\n\r\n // onWindowsResize set before first lazyLoad, to insure currentBreakPoint is set \r\n onWindowResize(lazyLoad);\r\n\r\n onScroll(lazyLoad, true);\r\n}\r\n\r\nfunction lazyLoad() {\r\n // If our current screen mode does not match the one we used the last time we made an image lookup,\r\n // perform a new one now. Otherwise, what would be the point?\r\n \r\n if (lastUsedScreenWidth < currentBreakpointIndex) {\r\n \r\n for (let i = 0; i < lazyArray.length; i++) {\r\n const lazyElem = lazyArray[i];\r\n\r\n if (isInViewport(lazyElem)) {\r\n lazyElem.classList.add(options.loadClass);\r\n if (lazyElem.classList.contains('lazy--bg')) {\r\n loadBgImage(lazyElem);\r\n } else {\r\n loadLazyImage(lazyElem);\r\n }\r\n }\r\n }\r\n\r\n cleanLazy();\r\n }\r\n}\r\n\r\nfunction cleanLazy() {\r\n lazyArray = Array.prototype.filter.call(lazyArray, l => !l.classList.contains(options.loadClass));\r\n}\r\n\r\nfunction isInViewport(el) {\r\n const rect = el.getBoundingClientRect();\r\n\r\n return (\r\n rect.bottom >= 0 &&\r\n rect.right >= 0 &&\r\n rect.top - options.offset <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.left - options.offset <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n}\r\n\r\n/**\r\n * This function gets the image wrapper data attributes src and alt text\r\n * and creates an new image tag to download the image.\r\n * It then uses the src as a background-image.\r\n *\r\n * @param {HTMLElement} bgContainer - Image wrapper element\r\n */\r\nexport function loadBgImage(bgContainer) {\r\n const src = getImageSrc(bgContainer);\r\n const handleLoadedBg = () => {\r\n bgContainer.style.backgroundImage = formattedSrc;\r\n bgContainer.classList.add(options.loadedClass);\r\n bgContainer.classList.remove(options.loadClass);\r\n };\r\n\r\n // If no usable source was returned, abort at once.\r\n if (!src) {\r\n return;\r\n }\r\n\r\n const formattedSrc = `url(${src})`;\r\n\r\n if (bgContainer.style.backgroundImage === formattedSrc) {\r\n return;\r\n }\r\n\r\n if (options.decodeImg) {\r\n // Start loading the new image.\r\n loadImage(src).then(handleLoadedBg);\r\n } else {\r\n handleLoadedBg();\r\n }\r\n}\r\n\r\n/**\r\n * This function gets the container data attributes src.\r\n * If the container is an image it sets the src of it.\r\n * If the container is not an image it creates a new image tag and inserts it into the given container.\r\n *\r\n * @param {HTMLElement} container - Image wrapper element\r\n */\r\nexport function loadLazyImage(container) {\r\n const src = getImageSrc(container);\r\n\r\n // If no usable source was returned, abort mission.\r\n if (!src) {\r\n return;\r\n }\r\n\r\n if (options.decodeImg) {\r\n // We don't want to start processing if the new URL matches the old one.\r\n const oldImage = container.querySelector('img');\r\n if (oldImage && container.classList.contains(options.loadedClass)) {\r\n if (oldImage.getAttribute('src') === src) {\r\n if (options.oldIe11Fit) {\r\n window.objectFitPolyfill(oldImage);\r\n }\r\n return;\r\n } else {\r\n container.removeChild(oldImage);\r\n }\r\n }\r\n\r\n // Start loading the new image.\r\n loadImage(src).then(newImageTag => {\r\n // Set src and ALT text if defined.\r\n if (container.tagName === 'IMG') {\r\n container.src = src;\r\n } else {\r\n const altText = container.getAttribute('data-alt') || '';\r\n newImageTag.setAttribute('alt', altText);\r\n\r\n container.appendChild(newImageTag);\r\n }\r\n\r\n container.classList.add(options.loadedClass);\r\n container.classList.remove(options.loadClass);\r\n\r\n // oldIE object-fit polyfill placed here to take resize into account\r\n if (options.oldIe11Fit) {\r\n window.objectFitPolyfill(newImageTag);\r\n }\r\n });\r\n } else {\r\n container.src = src;\r\n container.classList.add(options.loadedClass);\r\n container.classList.remove(options.loadClass);\r\n }\r\n}\r\n\r\n/**\r\n * Try to decode the image, after it's loaded, and resolve the Promise.\r\n *\r\n * @param {Element} newImage\r\n * @returns {Promise}\r\n */\r\nfunction decodeImage(newImage) {\r\n return 'decode' in newImage ? newImage.decode().then(() => newImage) : Promise.resolve(newImage);\r\n}\r\n\r\n/**\r\n * Load an image, and return a Promise that resolves once the image is loaded.\r\n *\r\n * @param {string} path\r\n * @returns {Promise} Promise that will resolve with the loaded image once it's ready.\r\n */\r\nexport function loadImage(path) {\r\n const newImage = new Image();\r\n\r\n return new Promise(resolve => {\r\n newImage.addEventListener('load', () => decodeImage(newImage).then(image => resolve(image)), false);\r\n newImage.src = path;\r\n });\r\n}\r\n\r\n/**\r\n * This function gets the data-src from the image wrapper, based on width of the browser window.\r\n *\r\n * @param {HTMLElement} container - Image wrapper element\r\n * @returns {string}\r\n */\r\nfunction getImageSrc(container) {\r\n let src = '';\r\n let largestBreakpointFound = 0;\r\n\r\n if (container.getAttribute('data-src')) {\r\n src = container.getAttribute('data-src');\r\n container.removeAttribute('data-src');\r\n } else {\r\n breakpointKeys.forEach((breakpointName, index) => {\r\n if (currentBreakpointIndex >= index) {\r\n if (index === 0 || index > largestBreakpointFound) {\r\n const srcAttribute = `data-src-${breakpointName}`;\r\n src = container.getAttribute(srcAttribute) || src;\r\n\r\n container.removeAttribute(srcAttribute);\r\n\r\n // Make sure we won't set the size to a smaller breakpoint later, in case they're not properly ordered.\r\n largestBreakpointFound = index;\r\n }\r\n }\r\n });\r\n }\r\n\r\n return src;\r\n}\r\n","export const transitionEndEventName = detectStyleDeclatationName();\r\nexport const animationEndEventName = detectStyleDeclatationName('animation');\r\n\r\n/**\r\n * Detects which prefixed eventName is in CSSStyleDeclaration\r\n *\r\n * @param {string} eventTypeName - choose 'transition' or 'animation'\r\n * @returns {string}\r\n */\r\nexport function detectStyleDeclatationName(eventTypeName = 'transition') {\r\n const transitions = {\r\n transition: `${eventTypeName}end`,\r\n OTransition: `o${eventTypeName}end`,\r\n MozTransition: `${eventTypeName}end`,\r\n WebkitTransition: `webkit${eventTypeName}end`\r\n };\r\n\r\n const el = document.createElement('div');\r\n\r\n for (const t in transitions) {\r\n if (el.style[t] !== undefined) {\r\n return transitions[t];\r\n }\r\n }\r\n return '';\r\n}\r\n\r\nexport function cssAnimateNewHeight(container, classTarget = container, classOnBoth = false) {\r\n let newHeight;\r\n const prevHeight = container.offsetHeight;\r\n\r\n const delayedClose = () => {\r\n if (classOnBoth) {\r\n container.classList.remove('open');\r\n classTarget.classList.remove('open');\r\n } else {\r\n classTarget.classList.remove('open');\r\n }\r\n\r\n container.removeEventListener(transitionEndEventName, delayedClose);\r\n };\r\n\r\n container.removeAttribute('style');\r\n\r\n if (classTarget.classList.contains('open')) {\r\n newHeight = 0;\r\n container.addEventListener(transitionEndEventName, delayedClose);\r\n\r\n if (classOnBoth) {\r\n classTarget.classList.remove('open');\r\n }\r\n } else {\r\n classTarget.classList.add('open');\r\n\r\n if (classOnBoth) {\r\n container.classList.add('open');\r\n }\r\n\r\n newHeight = container.offsetHeight;\r\n }\r\n\r\n container.style.height = `${prevHeight}px`;\r\n\r\n setTimeout(() => {\r\n container.style.height = `${newHeight}px`;\r\n }, 10);\r\n}","import { cssAnimateNewHeight } from '../utils/animation';\r\n\r\n/**\r\n * Attention\r\n * Be aware that this module is dependent on support for Element.prototype.closest\r\n * This is included as default in https://polyfill.io/v3/polyfill.min.js\r\n */\r\n\r\n// Used keycodes\r\nconst keycode = {\r\n space: 32,\r\n arrowUp: 38,\r\n arrowDown: 40,\r\n home: 36,\r\n end: 35\r\n};\r\n\r\nlet activeAccordion;\r\nlet index = 0;\r\n\r\n/**\r\n * The Accordion class uses the cssAnimateNewHeight function to reveal hidden content.\r\n * Default element selector is data-action*=\"accordion\"\r\n * If data-action is set to \"accordion-switch\", active accordions will close when another is opened.\r\n *\r\n * @param {HTMLElement} trigger\r\n * @constructor\r\n */\r\nexport class Accordion {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} trigger\r\n */\r\n constructor(trigger) {\r\n this.dom = {\r\n trigger,\r\n container: trigger.parentNode.querySelector('.accordion__content') || trigger.nextElementSibling\r\n };\r\n\r\n this.settings = {\r\n type: trigger.getAttribute('data-action')\r\n };\r\n\r\n this.index = index;\r\n\r\n index++;\r\n\r\n this.dom.trigger.addEventListener('click', e => {\r\n if (!(event.ctrlKey || event.metaKey || event.shiftKey)) {\r\n e.preventDefault();\r\n }\r\n if (activeAccordion && this.index !== activeAccordion.index) {\r\n // Dobbelt check added to prevent delayed dobbelt opening\r\n if (activeAccordion.dom.container.classList.contains('open')) {\r\n cssAnimateNewHeight(activeAccordion.dom.container, activeAccordion.dom.trigger, true);\r\n this.dom.container.setAttribute('aria-hidden', true);\r\n activeAccordion.dom.trigger.setAttribute('aria-expanded', 'false');\r\n }\r\n }\r\n\r\n cssAnimateNewHeight(this.dom.container, this.dom.trigger, true);\r\n this.dom.container.setAttribute('aria-hidden', false);\r\n\r\n // Set the inverted value of aria-expanded\r\n const ariaExpanded = this.dom.trigger.getAttribute('aria-expanded') || 'false';\r\n this.dom.trigger.setAttribute('aria-expanded', ariaExpanded === 'false');\r\n\r\n if (this.settings.type === 'accordion-switch') {\r\n activeAccordion = this;\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction openAccordByHashId() {\r\n if (window.location.hash.indexOf('accordion') > -1) {\r\n const accordionContent = document.getElementById(window.location.hash.replace('#', ''));\r\n if (accordionContent) {\r\n const accord = document.getElementById(accordionContent.getAttribute('aria-labelledby'));\r\n accord.click();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Initialise Accordions with this function\r\n * Will only run if given selector elements are found in DOM\r\n *\r\n * @param {string} selector - element selector string\r\n */\r\n\r\nexport function setupAccordions(selector = '[data-action*=\"accordion\"]') {\r\n const accordions = document.querySelectorAll(selector);\r\n\r\n if (accordions) {\r\n for (let i = 0; i < accordions.length; i++) {\r\n void new Accordion(accordions[i]);\r\n }\r\n\r\n openAccordByHashId();\r\n }\r\n}\r\n\r\nwindow.addEventListener('keydown', event => {\r\n const focusedElement = document.activeElement;\r\n\r\n if (focusedElement) {\r\n\r\n /* if (event.keyCode === keycode.space) {\r\n // Toggle accordion\r\n event.preventDefault();\r\n focusedElement.click();\r\n } */\r\n\r\n if (event.keyCode === keycode.arrowUp) {\r\n // Focus prevoius accordion\r\n if (focusedElement.closest('.accordion').previousElementSibling && focusedElement.closest('.accordion').previousElementSibling.querySelector('.accordion__head')) {\r\n focusedElement.closest('.accordion').previousElementSibling.querySelector('.accordion__head').focus();\r\n }\r\n }\r\n if (event.keyCode === keycode.arrowDown) {\r\n // Focus next accordion\r\n if (focusedElement.closest('.accordion').nextElementSibling && focusedElement.closest('.accordion').nextElementSibling.querySelector('.accordion__head')) {\r\n focusedElement.closest('.accordion').nextElementSibling.querySelector('.accordion__head').focus();\r\n }\r\n }\r\n if (event.keyCode === keycode.home) {\r\n // Focus first accordion\r\n if (focusedElement.closest('.accordion').parentNode.querySelector('.accordion:first-child .accordion__head')) {\r\n event.preventDefault();\r\n focusedElement.closest('.accordion').parentNode.querySelector('.accordion:first-child .accordion__head').focus();\r\n }\r\n }\r\n if (event.keyCode === keycode.end) {\r\n // Focus last accordion\r\n if (focusedElement.closest('.accordion').parentNode.querySelector('.accordion:last-child .accordion__head')) {\r\n event.preventDefault();\r\n focusedElement.closest('.accordion').parentNode.querySelector('.accordion:last-child .accordion__head').focus();\r\n }\r\n }\r\n }\r\n});\r\n","export const body = document.body;\r\nexport const qs = (s, o = body) => o.querySelector(s);\r\nexport const qsa = (s, o = body) => o.querySelectorAll(s);\r\n\r\n\r\n/**\r\n * Sets a custom CSS variable to ensure precise vh unit mesuarment\r\n *\r\n */\r\n\r\nexport function setVhProp() {\r\n // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\r\n const vh = window.innerHeight * 0.01;\r\n // Then we set the value in the --vh custom property to the root of the document\r\n document.documentElement.style.setProperty('--vh', `${vh}px`);\r\n}\r\n\r\nexport function initVhUnitOverwrite() {\r\n setVhProp();\r\n window.addEventListener('resize', setVhProp);\r\n}\r\n\r\nexport function canUseWebP() {\r\n const elem = document.createElement('canvas');\r\n\r\n if (elem.getContext && elem.getContext('2d')) {\r\n // was able or not to get WebP representation\r\n return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;\r\n }\r\n\r\n // very old browser like IE 8, canvas not supported\r\n return false;\r\n}\r\n\r\n/**\r\n * Add a to the head\r\n */\r\nexport function addPrefetch(kind, url, as) {\r\n const linkElem = document.createElement('link');\r\n linkElem.rel = kind;\r\n linkElem.href = url;\r\n if (as) {\r\n linkElem.as = as;\r\n }\r\n linkElem.crossorigin = true;\r\n document.head.append(linkElem);\r\n}\r\n\r\n/**\r\n * Format number sparated with commas per thousand.\r\n *\r\n * @param {Number} num - Number you want to format\r\n *\r\n * @returns {string} - Returns the number formatet with commas\r\n *\r\n * @example:\r\n * console.info(formatNumber(2665)) // 2,665\r\n * console.info(formatNumber(102665)) // 102,665\r\n * console.info(formatNumber(1240.5)) // 1,240.5\r\n */\r\n\r\nexport function formatNumber(num, seperator = '.') {\r\n return num.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, `$1${seperator}`);\r\n}\r\n\r\n/**\r\n * Prevent function from being executed as long as it is invoked, while given delay hasn't passed.\r\n *\r\n * @param {Function} callback Callback\r\n * @param {String} delay Delay\r\n * @return {Function} Callback\r\n */\r\nexport function debounce(callback, delay) {\r\n let timer = null;\r\n\r\n return function () {\r\n const context = this,\r\n args = arguments;\r\n\r\n clearTimeout(timer);\r\n\r\n timer = setTimeout(function () {\r\n callback.apply(context, args);\r\n }, delay);\r\n };\r\n}\r\n\r\n/*\r\n* Load JavsScript asynchronously when needed\r\n* @param {String} source The path to the file\r\n* @param {Function} callback The callback to excecute upon load\r\n* @return {Element} Element to attach\r\n*/\r\nexport function loadJS (source, callback) {\r\n const reference = document.getElementsByTagName('script')[0];\r\n const script = document.createElement('script');\r\n\r\n script.src = source;\r\n script.async = true;\r\n reference.parentNode.insertBefore(script, reference);\r\n\r\n if (callback && typeof(callback) === 'function') {\r\n script.onload = callback;\r\n }\r\n\r\n return script;\r\n}\r\n\r\n/**\r\n * Get the thumbnail dimensions to use for a given player size.\r\n *\r\n * @param {Object} options\r\n * @param {number} options.width The width of the player\r\n * @param {number} options.height The height of the player\r\n * @return {Object} The width and height\r\n */\r\nexport function getRoundedDimensions({ width, height }) {\r\n let roundedWidth = width;\r\n let roundedHeight = height;\r\n\r\n // If the original width is a multiple of 320 then we should\r\n // not round up. This is to keep the native image dimensions\r\n // so that they match up with the actual frames from the video.\r\n //\r\n // For example 640x360, 960x540, 1280x720, 1920x1080\r\n //\r\n // Round up to nearest 100 px to improve cacheability at the\r\n // CDN. For example, any width between 601 pixels and 699\r\n // pixels will render the thumbnail at 700 pixels width.\r\n if (roundedWidth % 320 !== 0) {\r\n roundedWidth = Math.ceil(width / 100) * 100;\r\n roundedHeight = Math.round((roundedWidth / width) * height);\r\n }\r\n\r\n return {\r\n width: roundedWidth,\r\n height: roundedHeight\r\n };\r\n}\r\n\r\nexport function showHideElem(selector = '[data-action=\"show-hide\"]') {\r\n const showBtns = document.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < showBtns.length; i++) {\r\n const showBtn = showBtns[i];\r\n if (showBtn) {\r\n const showElem = document.querySelector(showBtn.getAttribute('data-show'));\r\n const hideElem = document.querySelector(showBtn.getAttribute('data-hide'));\r\n\r\n if (showElem && hideElem) {\r\n showBtn.addEventListener('click', e => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n hideElem.classList.add('hidden');\r\n showElem.classList.remove('hidden');\r\n });\r\n } else {\r\n console.warn('Show / Hide target not found');\r\n }\r\n } else {\r\n console.warn('ShowHideElem button not found not found');\r\n }\r\n }\r\n}\r\n","import { getElementPosition } from './elementProperties';\r\n\r\nconst easeInOutQuad = function(currentTime, start, change, duration) {\r\n let time = currentTime;\r\n time /= duration / 2;\r\n if (time < 1) {\r\n return (change / 2) * time * time + start;\r\n }\r\n time--;\r\n return (-change / 2) * (time * (time - 2) - 1) + start;\r\n};\r\n\r\nconst easeInOutQuintic = function(currentTime, start, change, duration) {\r\n let time = currentTime;\r\n const ts = (time /= duration) * time,\r\n tc = ts * time;\r\n return start + change * (6 * tc * ts + -15 * ts * ts + 10 * tc);\r\n};\r\n\r\nexport function scrollTo(to, duration = 750, callback) {\r\n function move(amount) {\r\n if (document.scrollingElement) {\r\n document.scrollingElement.scrollTop = amount;\r\n } else {\r\n document.documentElement.scrollTop = amount;\r\n document.body.parentNode.scrollTop = amount;\r\n document.body.scrollTop = amount;\r\n }\r\n }\r\n function position() {\r\n return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop;\r\n }\r\n\r\n const start = position(),\r\n change = to instanceof Element ? getElementPosition(to).top - start : to - start,\r\n increment = 20;\r\n\r\n\r\n let currentTime = 0;\r\n\r\n const animate = function() {\r\n // increment the time\r\n currentTime += increment;\r\n // find the value with the quadratic in-out easing function\r\n const val = easeInOutQuintic(currentTime, start, change, duration);\r\n // move the document.body\r\n move(val);\r\n // do the animation unless its over\r\n if (currentTime < duration) {\r\n requestAnimationFrame(animate);\r\n } else {\r\n if (callback && typeof callback === 'function') {\r\n // the animation is done so lets callback\r\n if (typeof callback === 'function') {\r\n callback();\r\n }\r\n }\r\n }\r\n };\r\n animate();\r\n}\r\n","import { addPrefetch, canUseWebP, getRoundedDimensions } from '../utils/helpers';\r\nimport { scrollTo } from '../utils/scrollTo';\r\n\r\n/**\r\n * Combined lightweight vimeo/youtube embed code.\r\n *\r\n * Ported from https://github.com/paulirish/lite-youtube-embed by Paul Irish\r\n * and https://github.com/luwes/lite-vimeo-embed by Wesley Luyten\r\n *\r\n */\r\nclass Video {\r\n constructor(container) {\r\n this.container = container;\r\n this.id = container.getAttribute('data-video-id');\r\n this.bg = container.getAttribute('data-video-bg') || 0;\r\n this.byline = container.getAttribute('data-video-byline') || 0;\r\n this.color = container.getAttribute('data-video-color') || 0;\r\n this.controls = container.getAttribute('data-video-controls') || 1;\r\n this.replaceHref = container.getAttribute('data-replace-href') || 0;\r\n\r\n if (!this.id) {\r\n this.videoLink = container.getAttribute('data-video-link') || container.href;\r\n if (this.videoLink) {\r\n this.id = extractVideoIdFromUrl(this.videoLink);\r\n } else {\r\n console.warn('Video missing video-id / data-video-link');\r\n return;\r\n }\r\n\r\n if (this.id.indexOf('/') > -1) {\r\n this.id = this.id.slice(0, this.id.indexOf('/'));\r\n this.isPrivate = true;\r\n }\r\n }\r\n\r\n this.isVimeo = container.getAttribute('data-action') === 'video-vimeo' || this.videoLink && this.videoLink.indexOf('vimeo') > -1;\r\n this.poster = container.getAttribute('data-video-poster');\r\n\r\n if (!this.poster) {\r\n if (this.isVimeo) {\r\n\r\n if (this.isPrivate) {\r\n this.container.classList.add('placeholder');\r\n } else {\r\n let { width, height } = getRoundedDimensions(container.getBoundingClientRect());\r\n const devicePixelRatio = window.devicePixelRatio || 1;\r\n width *= devicePixelRatio;\r\n height *= devicePixelRatio;\r\n /**\r\n * To get the vimeo poster image, we have to use the Vimeo API.\r\n */\r\n this.poster = `https://lite-vimeo-embed.now.sh/thumb/${this.id}`;\r\n this.poster += `.${canUseWebP() ? 'webp' : 'jpg'}`;\r\n this.poster += `?mw=${Math.ceil(width)}&mh=${Math.ceil(height)}&q=${devicePixelRatio > 1 ? 70 : 85}`;\r\n }\r\n\r\n } else {\r\n /**\r\n * Comment about the thumbnail, by original author: Paul Irish\r\n * Lo, the youtube placeholder image! (aka the thumbnail, poster image, etc)\r\n * There is much internet debate on the reliability of thumbnail URLs. Weak consensus is that you\r\n * cannot rely on anything and have to use the YouTube Data API.\r\n *\r\n * amp-youtube also eschews using the API, so they just try sddefault with a hqdefault fallback:\r\n * https://github.com/ampproject/amphtml/blob/6039a6317325a8589586e72e4f98c047dbcbf7ba/extensions/amp-youtube/0.1/amp-youtube.js#L498-L537\r\n * For now I'm gonna go with this confident (lol) assertion: https://stackoverflow.com/a/20542029, though I'll use `i.ytimg` to optimize for origin reuse.\r\n *\r\n * Worth noting that sddefault is _higher_ resolution than hqdefault. Naming is hard. ;)\r\n * From my own testing, it appears that hqdefault is ALWAYS there sddefault is missing for ~10% of videos*/\r\n\r\n this.poster = `https://i.ytimg.com/vi/${this.id}/sddefault.jpg`;\r\n }\r\n }\r\n\r\n if (this.poster) {\r\n this.container.style.backgroundImage = `url(\"${this.poster}\")`;\r\n }\r\n\r\n // On hover (or tap), warm up the TCP connections we're (likely) about to use.\r\n this.container.addEventListener('pointerover', Video.warmConnections, { once: true });\r\n\r\n // Once the user clicks, add the real iframe and drop our play button\r\n // TODO: In the future we could be like amp-youtube and silently swap in the iframe during idle time\r\n // We'd want to only do this for in-viewport or near-viewport ones: https://github.com/ampproject/amphtml/pull/5003\r\n if (this.replaceHref) {\r\n this.container.href = this.returnVideoIframeUrl();\r\n } else {\r\n this.container.addEventListener('click', () => this.addIframe());\r\n }\r\n }\r\n\r\n /**\r\n * Begin pre-connecting to warm up the iframe load\r\n * Since the embed's network requests load within its iframe,\r\n * preload/prefetch'ing them outside the iframe will only cause double-downloads.\r\n * So, the best we can do is warm up a few connections to origins that are in the critical path.\r\n *\r\n * Maybe `` would work, but it's unsupported: http://crbug.com/593267\r\n * But TBH, I don't think it'll happen soon with Site Isolation and split caches adding serious complexity.\r\n */\r\n static warmConnections() {\r\n if (Video.preconnected) return;\r\n\r\n if (this.isVimeo) {\r\n // The iframe document and most of its subresources come right off player.vimeo.com\r\n addPrefetch('preconnect', 'https://player.vimeo.com');\r\n // Images\r\n addPrefetch('preconnect', 'https://i.vimeocdn.com');\r\n // Files .js, .css\r\n addPrefetch('preconnect', 'https://f.vimeocdn.com');\r\n // Metrics\r\n addPrefetch('preconnect', 'https://fresnel.vimeocdn.com');\r\n } else {\r\n // The iframe document and most of its subresources come right off youtube.com\r\n addPrefetch('preconnect', 'https://www.youtube-nocookie.com');\r\n // The botguard script is fetched off from google.com\r\n addPrefetch('preconnect', 'https://www.google.com');\r\n // Not certain if these ad related domains are in the critical path. Could verify with domain-specific throttling.\r\n addPrefetch('preconnect', 'https://googleads.g.doubleclick.net');\r\n addPrefetch('preconnect', 'https://static.doubleclick.net');\r\n }\r\n\r\n Video.preconnected = true;\r\n }\r\n\r\n returnVideoIframeUrl() {\r\n const videoService = this.isVimeo ? 'https://player.vimeo.com/video' : 'https://www.youtube-nocookie.com/embed';\r\n let videoUrl = `${videoService}/${this.id}?autoplay=1&rel=0`;\r\n videoUrl += `&controls=${this.controls}&byline=${this.byline}&background=${this.bg}&mute=${this.bg}`;\r\n\r\n if (this.color) videoUrl += `&color=${this.color}`;\r\n\r\n return videoUrl;\r\n }\r\n\r\n addIframe() {\r\n videoUrl = this.returnVideoIframeUrl();\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.setAttribute('frameborder', 0);\r\n iframe.setAttribute('allowtransparency', 'true');\r\n iframe.setAttribute('playsinline', 'true');\r\n iframe.setAttribute('tabindex', '-1');\r\n iframe.setAttribute('allow', 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; autoplay');\r\n iframe.addEventListener('load', () => {\r\n // Timeout is set to prevent paint-lag when iframe is inserted\r\n setTimeout(() => {\r\n this.container.classList.add('video--loaded');\r\n this.container.classList.remove('loading');\r\n\r\n if (this.container.getAttribute('data-scroll-to')) {\r\n scrollTo(this.container, 1000);\r\n }\r\n }, 300);\r\n });\r\n\r\n iframe.src = videoUrl;\r\n this.container.classList.add('loading');\r\n this.container.appendChild(iframe);\r\n }\r\n}\r\n\r\n\r\nfunction extractVideoIdFromUrl(url) {\r\n const videoIdRegExp = /^.*((youtu.be\\/|vimeo.com\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#&?]*).*/;\r\n const match = url.match(videoIdRegExp);\r\n\r\n if (match && match[7]) {\r\n return match[7];\r\n } else {\r\n console.warn(url, 'Invalid Video URL');\r\n }\r\n}\r\n\r\n/**\r\n * Initialise video embeds with this function\r\n * Will only run if given selector elements are found in DOM\r\n *\r\n * @param {string} selector - element selector string\r\n */\r\n\r\nexport function setupVideos(selector = '[data-action^=\"video\"]') {\r\n const videos = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < videos.length; i++) {\r\n void new Video(videos[i]);\r\n }\r\n}\r\n","import { isVisible } from '../utils/elementProperties';\r\nimport { enableScrollLock, disableScrollLock } from '../utils/scrollLock';\r\n\r\nlet activeOverlay;\r\nlet activeOverlayContent;\r\nlet activeOverlayCloseBtn;\r\n\r\nconst openClass = 'overlay--active';\r\n\r\nfunction outsideClickListener(e) {\r\n if (!activeOverlayContent.contains(e.target) && isVisible(activeOverlayContent)) {\r\n // or use: event.target.closest(selector) === null\r\n overlayClose(e);\r\n activeOverlay.removeEventListener('click', outsideClickListener);\r\n }\r\n}\r\n\r\nfunction overlayOpen(e, lockScroll = true) {\r\n const targetId = e.target ? e.target.getAttribute('data-target') : e;\r\n activeOverlay = document.getElementById(targetId);\r\n \r\n typeof e.preventDefault == 'function' ? e.preventDefault() : null;\r\n\r\n if (activeOverlay) {\r\n activeOverlay.classList.add(openClass);\r\n activeOverlayContent = activeOverlay.querySelector('.overlay__box');\r\n\r\n activeOverlayCloseBtn = activeOverlay.querySelector('[data-action=\"overlay-close\"]');\r\n activeOverlayCloseBtn.addEventListener('click', overlayClose);\r\n\r\n if (lockScroll) {\r\n enableScrollLock();\r\n }\r\n\r\n\r\n if (activeOverlayContent) {\r\n activeOverlay.addEventListener('click', outsideClickListener);\r\n }\r\n } else {\r\n console.warn(`Overlay data-target missing or no element with id: ${targetId} found`);\r\n }\r\n}\r\n\r\nfunction overlayClose(e) {\r\n e.preventDefault();\r\n disableScrollLock();\r\n activeOverlay.classList.remove(openClass);\r\n activeOverlayCloseBtn.removeEventListener('click', overlayClose);\r\n}\r\n\r\nexport function setupOverlay(selector = '[data-action=\"overlay-open\"]') {\r\n const overlayButtonOpen = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < overlayButtonOpen.length; i++) {\r\n overlayButtonOpen[i].addEventListener('click', overlayOpen);\r\n }\r\n}\r\n\r\nwindow.showCookieBanner = (selector = 'cookiebanner') => {\r\n if (!window.declaration || (window.declaration && window.declaration > 1)) {\r\n overlayOpen(selector, false);\r\n } else {\r\n window.declaration = 2;\r\n }\r\n};\r\n\r\nwindow.hideCookieBanner = e => overlayClose(e);\r\n","\r\nconst classNames = {\r\n activeBtn: 'filter__tab--active',\r\n hiddenItem: 'hidden',\r\n activeRadio: 'form__radio--active'\r\n};\r\n\r\n/**\r\n *\r\n * @param {HTMLElement} container\r\n *\r\n * @constructor\r\n */\r\nexport class Filter {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} container - Element containing filter options (Could be .filter__tabs or .filter__select)\r\n */\r\n constructor(container) {\r\n if (container) {\r\n this.dom = {\r\n container,\r\n filters: container.querySelectorAll('[data-filter]'),\r\n targetContainer: document.body.querySelector(container.getAttribute('data-target-container'))\r\n };\r\n\r\n this.settings = {\r\n filterType: container.getAttribute('data-action')\r\n };\r\n\r\n if (this.dom.targetContainer) {\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n\r\n const filter = this.dom.filters[i];\r\n const itemCountReplace = filter.getAttribute('data-item-count-replace');\r\n\r\n if (filter.tagName === 'BUTTON') {\r\n filter.addEventListener('click', e => this.filterHandler(e));\r\n } else {\r\n filter.addEventListener('change', e => this.filterHandler(e));\r\n\r\n if (itemCountReplace) {\r\n this.replaceWithNumberOfItems(filter, itemCountReplace);\r\n }\r\n }\r\n }\r\n\r\n } else {\r\n window.console.warn('Can\\'t find [data-target-container] on filter container: ', container);\r\n }\r\n } else {\r\n window.console.warn('Filter container missing');\r\n }\r\n }\r\n\r\n /**\r\n * Filter function that compares selected filter values with filter-values on filter-item.\r\n * Added hidden-class to items that hasn't got the selected filter value.\r\n *\r\n * @param {HTMLElement} e - event (click or change event\r\n */\r\n filterHandler(e) {\r\n const filter = e.target;\r\n const filterItems = this.dom.targetContainer.querySelectorAll('[data-filter-value]');\r\n const isButton = filter.tagName === 'BUTTON';\r\n const filterValue = isButton ? filter.getAttribute('data-filter') : filter.value;\r\n\r\n\r\n if (isButton) {\r\n if (this.settings.filterType === 'filter-switch') {\r\n\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n this.dom.filters[i].classList.remove(classNames.activeBtn);\r\n }\r\n\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n this.dom.targetContainer.classList.add(classNames.transitionItems);\r\n\r\n if (!filter.classList.contains(classNames.activeBtn)) {\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n filter.classList.remove(classNames.activeBtn);\r\n }\r\n }\r\n }\r\n\r\n if (this.settings.filterType === 'filter-switch') {\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n const cleanFilterValue = filterValue.trim().toLowerCase();\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n if (filterValue !== '*' && itemFilterValues.indexOf(cleanFilterValue) === -1) {\r\n item.classList.add(classNames.hiddenItem);\r\n } else {\r\n item.classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n } else {\r\n const filterValues = Filter.getSetValues(this.dom.filters);\r\n\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n let showItem = true;\r\n\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n filterValues.forEach(value => {\r\n const cleanValue = value.trim().toLowerCase();\r\n if (cleanValue !== '*' && itemFilterValues.indexOf(cleanValue) === -1) {\r\n showItem = false;\r\n }\r\n });\r\n\r\n if (!showItem) {\r\n item.classList.add(classNames.hiddenItem);\r\n } else {\r\n item.classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n }\r\n }\r\n\r\n static getSetValues(filters) {\r\n const valArray = [];\r\n\r\n // loop through list of filters\r\n for (let i = 0, len = filters.length; i < len; i++) {\r\n const filter = filters[i];\r\n if (filter.tagName === 'SELECT') {\r\n if (filter.value !== '*' && filter.value !== '') {\r\n valArray.push(filter.value);\r\n }\r\n } else if (filter.tagName === 'BUTTON') {\r\n if (filter.classList.contains(classNames.activeBtn)) {\r\n valArray.push(filter.getAttribute('data-filter'));\r\n }\r\n } else {\r\n if (filter.checked && filter.value !== '*') { // radio checked?\r\n valArray.push(filter.value); // if so, add its value to array\r\n }\r\n }\r\n }\r\n return valArray; // return value of checked radio or undefined if none checked\r\n }\r\n\r\n replaceWithNumberOfItems(element, replaceValue) {\r\n const options = element.children;\r\n const items = this.dom.targetContainer.querySelectorAll('[data-filter-value]');\r\n\r\n if (options) {\r\n for (let i = 0; i < options.length; i++) {\r\n const option = options[i];\r\n\r\n if (option.value !== '*' && option.value !== '') {\r\n let count = 0;\r\n const optionStr = option.innerText;\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n let itemFilterValues = items[i].getAttribute('data-filter-value').split(',');\r\n\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n const cleanValue = option.value.trim().toLowerCase();\r\n\r\n if (itemFilterValues.indexOf(cleanValue) > -1) {\r\n count++;\r\n }\r\n }\r\n\r\n option.innerText = optionStr.replace(replaceValue, count);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function setupFilters(selector = '[data-action*=\"filter\"]') {\r\n const filterContainers = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < filterContainers.length; i++) {\r\n void new Filter(filterContainers[i]);\r\n }\r\n}\r\n","/**\r\n * Attention\r\n * Be aware that this module is dependent on support for Element.prototype.closest\r\n * This is included as default in https://polyfill.io/v3/polyfill.min.js\r\n */\r\n\r\n/**\r\n * Function that opens new tab\r\n * and hides the activeTab if found\r\n *\r\n * @param {object|HTMLElement} e - click event or tab element\r\n */\r\n\r\n// Used keycodes\r\nconst keycode = {\r\n arrowRight: 39,\r\n arrowLeft: 37,\r\n home: 36,\r\n end: 35\r\n};\r\n\r\nfunction openTab(e) {\r\n const tab = e.target ? e.target : e;\r\n\r\n if (!(event.ctrlKey || event.metaKey || event.shiftKey) && e.target) {\r\n e.preventDefault();\r\n }\r\n\r\n const tabContent = document.getElementById(tab.getAttribute('aria-controls').replace('#', ''));\r\n\r\n if (tabContent) {\r\n const activeTab = tab.parentNode.parentNode.querySelector('.tab--active');\r\n\r\n if (activeTab) {\r\n activeTab.classList.remove('tab--active');\r\n activeTab.setAttribute('aria-selected', false);\r\n activeTab.setAttribute('tabindex', -1);\r\n\r\n const activeTabContent = document.getElementById(activeTab.getAttribute('aria-controls').replace('#', ''));\r\n if (activeTabContent) {\r\n activeTabContent.classList.remove('tab__content--active');\r\n activeTabContent.setAttribute('aria-hidden', true);\r\n }\r\n }\r\n\r\n tab.classList.add('tab--active');\r\n tab.removeAttribute('tabindex');\r\n tab.setAttribute('aria-selected', true);\r\n tab.focus();\r\n tabContent.classList.add('tab__content--active');\r\n tabContent.setAttribute('aria-hidden', false);\r\n }\r\n}\r\n\r\nfunction openTabByHashId() {\r\n if (window.location.hash.indexOf('tab') > -1) {\r\n const tabContent = document.getElementById(window.location.hash.replace('#', ''));\r\n if (tabContent) {\r\n const tab = document.getElementById(tabContent.getAttribute('aria-labelledby'));\r\n openTab(tab);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n* Initialise Tabs with this function\r\n* Will only run if given selector elements are found in DOM\r\n*\r\n* @param {string} selector - element selector string\r\n*/\r\nexport function setupTabs(selector = '[data-action=\"tabs\"]') {\r\n const tabsContainer = document.body.querySelectorAll(selector);\r\n\r\n if (tabsContainer) {\r\n for (let i = 0; i < tabsContainer.length; i++) {\r\n const tabs = tabsContainer[i].querySelectorAll('[role=\"tab\"]');\r\n\r\n for (let t = 0; t < tabs.length; t++) {\r\n tabs[t].addEventListener('click', openTab);\r\n }\r\n }\r\n }\r\n\r\n openTabByHashId();\r\n\r\n window.addEventListener('hashchange', openTabByHashId, false);\r\n}\r\n\r\nwindow.addEventListener('keydown', event => {\r\n const focusedElement = document.activeElement;\r\n const tabs = document.activeElement.closest('.tabs__nav');\r\n\r\n if (focusedElement && tabs) {\r\n if (event.keyCode === keycode.arrowLeft) {\r\n // Open prevoius tab\r\n if (focusedElement.closest('li').previousElementSibling && focusedElement.closest('li').previousElementSibling.querySelector('.tab')) {\r\n openTab(focusedElement.closest('li').previousElementSibling.querySelector('.tab'));\r\n }\r\n }\r\n if (event.keyCode === keycode.arrowRight) {\r\n // Open next tab\r\n if (focusedElement.closest('li').nextElementSibling && focusedElement.closest('li').nextElementSibling.querySelector('.tab')) {\r\n openTab(focusedElement.closest('li').nextElementSibling.querySelector('.tab'));\r\n }\r\n }\r\n if (event.keyCode === keycode.home) {\r\n // Open first tab\r\n if (tabs.querySelector('li:first-child .tab')) {\r\n event.preventDefault();\r\n openTab(tabs.querySelector('li:first-child .tab'));\r\n }\r\n }\r\n if (event.keyCode === keycode.end) {\r\n // Open last tab\r\n if (tabs.querySelector('li:last-child .tab')) {\r\n event.preventDefault();\r\n openTab(tabs.querySelector('li:last-child .tab'));\r\n }\r\n }\r\n }\r\n});\r\n","/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice(0);\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( var i=0; i < listeners.length; i++ ) {\n var listener = listeners[i]\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n","/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n /* jshint strict: false */ /* globals define, module */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See https://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n","/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n","/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'desandro-matches-selector/matches-selector'\n ], function( matchesSelector ) {\n return factory( window, matchesSelector );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) {\n return [];\n }\n\n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n clearTimeout( timeout );\n\n var args = arguments;\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n","// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'get-size/get-size'\n ], function( getSize ) {\n return factory( window, getSize );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('get-size')\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Cell = factory(\n window,\n window.getSize\n );\n }\n\n}( window, function factory( window, getSize ) {\n\n'use strict';\n\nfunction Cell( elem, parent ) {\n this.element = elem;\n this.parent = parent;\n\n this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n this.element.style.position = 'absolute';\n this.element.setAttribute( 'aria-hidden', 'true' );\n this.x = 0;\n this.shift = 0;\n};\n\nproto.destroy = function() {\n // reset style\n this.unselect();\n this.element.style.position = '';\n var side = this.parent.originSide;\n this.element.style[ side ] = '';\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n this.x = x;\n this.updateTarget();\n this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n this.target = this.x + this.size[ marginProperty ] +\n this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n // render position of cell with in slider\n var side = this.parent.originSide;\n this.element.style[ side ] = this.parent.getPositionValue( x );\n};\n\nproto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\n/**\n * @param {Integer} factor - 0, 1, or -1\n**/\nproto.wrapShift = function( shift ) {\n this.shift = shift;\n this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n}));\n","// slide\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Slide = factory();\n }\n\n}( window, function factory() {\n'use strict';\n\nfunction Slide( parent ) {\n this.parent = parent;\n this.isOriginLeft = parent.originSide == 'left';\n this.cells = [];\n this.outerWidth = 0;\n this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n this.cells.push( cell );\n this.outerWidth += cell.size.outerWidth;\n this.height = Math.max( cell.size.outerHeight, this.height );\n // first cell stuff\n if ( this.cells.length == 1 ) {\n this.x = cell.x; // x comes from first cell\n var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n this.firstMargin = cell.size[ beginMargin ];\n }\n};\n\nproto.updateTarget = function() {\n var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n var lastCell = this.getLastCell();\n var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n this.cells.forEach( function( cell ) {\n cell.select();\n });\n};\n\nproto.unselect = function() {\n this.cells.forEach( function( cell ) {\n cell.unselect();\n });\n};\n\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n });\n};\n\nreturn Slide;\n\n}));\n","// animate\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'fizzy-ui-utils/utils'\n ], function( utils ) {\n return factory( window, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.animatePrototype = factory(\n window,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, utils ) {\n\n'use strict';\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n if ( this.isAnimating ) {\n return;\n }\n\n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n};\n\nproto.animate = function() {\n this.applyDragForce();\n this.applySelectedAttraction();\n\n var previousX = this.x;\n\n this.integratePhysics();\n this.positionSlider();\n this.settle( previousX );\n // animate next frame\n if ( this.isAnimating ) {\n var _this = this;\n requestAnimationFrame( function animateFrame() {\n _this.animate();\n });\n }\n};\n\nproto.positionSlider = function() {\n var x = this.x;\n // wrap position around\n if ( this.options.wrapAround && this.cells.length > 1 ) {\n x = utils.modulo( x, this.slideableWidth );\n x = x - this.slideableWidth;\n this.shiftWrapCells( x );\n }\n\n this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n x += this.cursorPosition;\n // reverse if right-to-left and using transform\n x = this.options.rightToLeft ? -x : x;\n var translateX = this.getPositionValue( x );\n // use 3D tranforms for hardware acceleration on iOS\n // but use 2D when settled, for better font-rendering\n this.slider.style.transform = is3d ?\n 'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n};\n\nproto.dispatchScrollEvent = function() {\n var firstSlide = this.slides[0];\n if ( !firstSlide ) {\n return;\n }\n var positionX = -this.x - firstSlide.target;\n var progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) {\n return;\n }\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\n this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n if ( this.options.percentPosition ) {\n // percent position, round to 2 digits, like 12.34%\n return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 )+ '%';\n } else {\n // pixel positioning\n return Math.round( position ) + 'px';\n }\n};\n\nproto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n if ( !this.isPointerDown && Math.round( this.x * 100 ) == Math.round( previousX * 100 ) ) {\n this.restingFrames++;\n }\n // stop animating if resting for 3 or more frames\n if ( this.restingFrames > 2 ) {\n this.isAnimating = false;\n delete this.isFreeScrolling;\n // render position with translateX when settled\n this.positionSlider();\n this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n }\n};\n\nproto.shiftWrapCells = function( x ) {\n // shift before cells\n var beforeGap = this.cursorPosition + x;\n this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n // shift after cells\n var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n for ( var i=0; i < cells.length; i++ ) {\n var cell = cells[i];\n var cellShift = gap > 0 ? shift : 0;\n cell.wrapShift( cellShift );\n gap -= cell.size.outerWidth;\n }\n};\n\nproto._unshiftCells = function( cells ) {\n if ( !cells || !cells.length ) {\n return;\n }\n for ( var i=0; i < cells.length; i++ ) {\n cells[i].wrapShift( 0 );\n }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n if ( !this.isDraggable || !this.isPointerDown ) {\n return;\n }\n // change the position to drag position by applying force\n var dragVelocity = this.dragX - this.x;\n var dragForce = dragVelocity - this.velocity;\n this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n // do not attract if pointer down or no slides\n var dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n return;\n }\n var distance = this.selectedSlide.target * -1 - this.x;\n var force = distance * this.options.selectedAttraction;\n this.applyForce( force );\n};\n\nreturn proto;\n\n}));\n","// Flickity main\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter',\n 'get-size/get-size',\n 'fizzy-ui-utils/utils',\n './cell',\n './slide',\n './animate'\n ], function( EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n return factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./cell'),\n require('./slide'),\n require('./animate')\n );\n } else {\n // browser global\n var _Flickity = window.Flickity;\n\n window.Flickity = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n _Flickity.Cell,\n _Flickity.Slide,\n _Flickity.animatePrototype\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize,\n utils, Cell, Slide, animatePrototype ) {\n\n'use strict';\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n elems = utils.makeArray( elems );\n while ( elems.length ) {\n toElem.appendChild( elems.shift() );\n }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // do not initialize twice on same element\n if ( this.element.flickityGUID ) {\n var instance = instances[ this.element.flickityGUID ];\n instance.option( options );\n return instance;\n }\n\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // kick things off\n this._create();\n}\n\nFlickity.defaults = {\n accessibility: true,\n // adaptiveHeight: false,\n cellAlign: 'center',\n // cellSelector: undefined,\n // contain: false,\n freeScrollFriction: 0.075, // friction when free-scrolling\n friction: 0.28, // friction when selecting\n namespaceJQueryEvents: true,\n // initialIndex: 0,\n percentPosition: true,\n resize: true,\n selectedAttraction: 0.025,\n setGallerySize: true\n // watchCSS: false,\n // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n // add id for Flickity.data\n var id = this.guid = ++GUID;\n this.element.flickityGUID = id; // expando\n instances[ id ] = this; // associate via id\n // initial properties\n this.selectedIndex = 0;\n // how many frames slider has been in same position\n this.restingFrames = 0;\n // initial physics properties\n this.x = 0;\n this.velocity = 0;\n this.originSide = this.options.rightToLeft ? 'right' : 'left';\n // create viewport & slider\n this.viewport = document.createElement('div');\n this.viewport.className = 'flickity-viewport';\n this._createSlider();\n\n if ( this.options.resize || this.options.watchCSS ) {\n window.addEventListener( 'resize', this );\n }\n\n // add listeners from on option\n for ( var eventName in this.options.on ) {\n var listener = this.options.on[ eventName ];\n this.on( eventName, listener );\n }\n\n Flickity.createMethods.forEach( function( method ) {\n this[ method ]();\n }, this );\n\n if ( this.options.watchCSS ) {\n this.watchCSS();\n } else {\n this.activate();\n }\n\n};\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n if ( this.isActive ) {\n return;\n }\n this.isActive = true;\n this.element.classList.add('flickity-enabled');\n if ( this.options.rightToLeft ) {\n this.element.classList.add('flickity-rtl');\n }\n\n this.getSize();\n // move initial cell elements so they can be loaded as cells\n var cellElems = this._filterFindCellElements( this.element.children );\n moveElements( cellElems, this.slider );\n this.viewport.appendChild( this.slider );\n this.element.appendChild( this.viewport );\n // get cells from children\n this.reloadCells();\n\n if ( this.options.accessibility ) {\n // allow element to focusable\n this.element.tabIndex = 0;\n // listen for key presses\n this.element.addEventListener( 'keydown', this );\n }\n\n this.emitEvent('activate');\n this.selectInitialIndex();\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n // slider element does all the positioning\n var slider = document.createElement('div');\n slider.className = 'flickity-slider';\n slider.style[ this.originSide ] = 0;\n this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n // collection of item elements\n this.cells = this._makeCells( this.slider.children );\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n var cellElems = this._filterFindCellElements( elems );\n\n // create new Flickity for collection\n var cells = cellElems.map( function( cellElem ) {\n return new Cell( cellElem, this );\n }, this );\n\n return cells;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n // size all cells\n this._sizeCells( this.cells );\n // position all cells\n this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n index = index || 0;\n // also measure maxCellHeight\n // start 0 if positioning all cells\n this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n var cellX = 0;\n // get cellX\n if ( index > 0 ) {\n var startCell = this.cells[ index - 1 ];\n cellX = startCell.x + startCell.size.outerWidth;\n }\n var len = this.cells.length;\n for ( var i=index; i < len; i++ ) {\n var cell = this.cells[i];\n cell.setPosition( cellX );\n cellX += cell.size.outerWidth;\n this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n }\n // keep track of cellX for wrap-around\n this.slideableWidth = cellX;\n // slides\n this.updateSlides();\n // contain slides target\n this._containSlides();\n // update slidesWidth\n this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells\n */\nproto._sizeCells = function( cells ) {\n cells.forEach( function( cell ) {\n cell.getSize();\n });\n};\n\n// -------------------------- -------------------------- //\n\nproto.updateSlides = function() {\n this.slides = [];\n if ( !this.cells.length ) {\n return;\n }\n\n var slide = new Slide( this );\n this.slides.push( slide );\n var isOriginLeft = this.originSide == 'left';\n var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n var canCellFit = this._getCanCellFit();\n\n this.cells.forEach( function( cell, i ) {\n // just add cell if first cell in slide\n if ( !slide.cells.length ) {\n slide.addCell( cell );\n return;\n }\n\n var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n if ( canCellFit.call( this, i, slideWidth ) ) {\n slide.addCell( cell );\n } else {\n // doesn't fit, new slide\n slide.updateTarget();\n\n slide = new Slide( this );\n this.slides.push( slide );\n slide.addCell( cell );\n }\n }, this );\n // last slide\n slide.updateTarget();\n // update .selectedSlide\n this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n var groupCells = this.options.groupCells;\n if ( !groupCells ) {\n return function() {\n return false;\n };\n } else if ( typeof groupCells == 'number' ) {\n // group by number. 3 -> [0,1,2], [3,4,5], ...\n var number = parseInt( groupCells, 10 );\n return function( i ) {\n return ( i % number ) !== 0;\n };\n }\n // default, group by width of slide\n // parse '75%\n var percentMatch = typeof groupCells == 'string' &&\n groupCells.match(/^(\\d+)%$/);\n var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n return function( i, slideWidth ) {\n return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n // cell align, then based on origin side\n center: {\n left: 0.5,\n right: 0.5\n },\n left: {\n left: 0,\n right: 1\n },\n right: {\n right: 0,\n left: 1\n }\n};\n\nproto.setCellAlign = function() {\n var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n if ( this.options.setGallerySize ) {\n var height = this.options.adaptiveHeight && this.selectedSlide ?\n this.selectedSlide.height : this.maxCellHeight;\n this.viewport.style.height = height + 'px';\n }\n};\n\nproto._getWrapShiftCells = function() {\n // only for wrap-around\n if ( !this.options.wrapAround ) {\n return;\n }\n // unshift previous cells\n this._unshiftCells( this.beforeShiftCells );\n this._unshiftCells( this.afterShiftCells );\n // get before cells\n // initial gap\n var gapX = this.cursorPosition;\n var cellIndex = this.cells.length - 1;\n this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n // get after cells\n // ending gap between last cell and end of gallery viewport\n gapX = this.size.innerWidth - this.cursorPosition;\n // start cloning at first cell, working forwards\n this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n // keep adding cells until the cover the initial gap\n var cells = [];\n while ( gapX > 0 ) {\n var cell = this.cells[ cellIndex ];\n if ( !cell ) {\n break;\n }\n cells.push( cell );\n cellIndex += increment;\n gapX -= cell.size.outerWidth;\n }\n return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n return;\n }\n var isRightToLeft = this.options.rightToLeft;\n var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n // content is less than gallery size\n var isContentSmaller = contentWidth < this.size.innerWidth;\n // bounds\n var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n // contain each cell target\n this.slides.forEach( function( slide ) {\n if ( isContentSmaller ) {\n // all cells fit inside gallery\n slide.target = contentWidth * this.cellAlign;\n } else {\n // contain to bounds\n slide.target = Math.max( slide.target, beginBound );\n slide.target = Math.min( slide.target, endBound );\n }\n }, this );\n};\n\n// ----- ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery && this.$element ) {\n // default trigger with type if no event\n type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n var $event = type;\n if ( event ) {\n // create jQuery event\n var jQEvent = jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n if ( !this.isActive ) {\n return;\n }\n index = parseInt( index, 10 );\n this._wrapSelect( index );\n\n if ( this.options.wrapAround || isWrap ) {\n index = utils.modulo( index, this.slides.length );\n }\n // bail if invalid index\n if ( !this.slides[ index ] ) {\n return;\n }\n var prevIndex = this.selectedIndex;\n this.selectedIndex = index;\n this.updateSelectedSlide();\n if ( isInstant ) {\n this.positionSliderAtSelected();\n } else {\n this.startAnimation();\n }\n if ( this.options.adaptiveHeight ) {\n this.setGallerySize();\n }\n // events\n this.dispatchEvent( 'select', null, [ index ] );\n // change event if new index\n if ( index != prevIndex ) {\n this.dispatchEvent( 'change', null, [ index ] );\n }\n // old v1 event name, remove in v3\n this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n var len = this.slides.length;\n var isWrapping = this.options.wrapAround && len > 1;\n if ( !isWrapping ) {\n return index;\n }\n var wrapIndex = utils.modulo( index, len );\n // go to shortest\n var delta = Math.abs( wrapIndex - this.selectedIndex );\n var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n if ( !this.isDragSelect && backWrapDelta < delta ) {\n index += len;\n } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n index -= len;\n }\n // wrap position so slider is within normal area\n if ( index < 0 ) {\n this.x -= this.slideableWidth;\n } else if ( index >= len ) {\n this.x += this.slideableWidth;\n }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n var slide = this.slides[ this.selectedIndex ];\n // selectedIndex could be outside of slides, if triggered before resize()\n if ( !slide ) {\n return;\n }\n // unselect previous selected slide\n this.unselectSelectedSlide();\n // update new selected slide\n this.selectedSlide = slide;\n slide.select();\n this.selectedCells = slide.cells;\n this.selectedElements = slide.getCellElements();\n // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n // Remove in v3?\n this.selectedCell = slide.cells[0];\n this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) {\n this.selectedSlide.unselect();\n }\n};\n\nproto.selectInitialIndex = function() {\n var initialIndex = this.options.initialIndex;\n // already activated, select previous selectedIndex\n if ( this.isInitActivated ) {\n this.select( this.selectedIndex, false, true );\n return;\n }\n // select with selector string\n if ( initialIndex && typeof initialIndex == 'string' ) {\n var cell = this.queryCell( initialIndex );\n if ( cell ) {\n this.selectCell( initialIndex, false, true );\n return;\n }\n }\n\n var index = 0;\n // select with number\n if ( initialIndex && this.slides[ initialIndex ] ) {\n index = initialIndex;\n }\n // select instantly\n this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {Element or Number} elem\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n // get cell\n var cell = this.queryCell( value );\n if ( !cell ) {\n return;\n }\n\n var index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n // get index of slides that has cell\n for ( var i=0; i < this.slides.length; i++ ) {\n var slide = this.slides[i];\n var index = slide.cells.indexOf( cell );\n if ( index != -1 ) {\n return i;\n }\n }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem\n * @returns {Flickity.Cell} item\n */\nproto.getCell = function( elem ) {\n // loop through cells to get the one that matches\n for ( var i=0; i < this.cells.length; i++ ) {\n var cell = this.cells[i];\n if ( cell.element == elem ) {\n return cell;\n }\n }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {Element, Array, NodeList} elems\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n elems = utils.makeArray( elems );\n var cells = [];\n elems.forEach( function( elem ) {\n var cell = this.getCell( elem );\n if ( cell ) {\n cells.push( cell );\n }\n }, this );\n return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n });\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem\n * @returns {Flickit.Cell} cell\n */\nproto.getParentCell = function( elem ) {\n // first check if elem is cell\n var cell = this.getCell( elem );\n if ( cell ) {\n return cell;\n }\n // try to get parent cell elem\n elem = utils.getParent( elem, '.flickity-slider > *' );\n return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n if ( !adjCount ) {\n return this.selectedSlide.getCellElements();\n }\n index = index === undefined ? this.selectedIndex : index;\n\n var len = this.slides.length;\n if ( 1 + ( adjCount * 2 ) >= len ) {\n return this.getCellElements();\n }\n\n var cellElems = [];\n for ( var i = index - adjCount; i <= index + adjCount ; i++ ) {\n var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n var slide = this.slides[ slideIndex ];\n if ( slide ) {\n cellElems = cellElems.concat( slide.getCellElements() );\n }\n }\n return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {Element, Selector String, or Number} selector\n */\nproto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n if ( typeof selector == 'string' ) {\n // do not select invalid selectors from hash: #123, #/. #791\n if ( selector.match(/^[#\\.]?[\\d\\/]/) ) {\n return;\n }\n // use string as selector, get element\n selector = this.element.querySelector( selector );\n }\n // get cell from element\n return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.childUIPointerDown = function( event ) {\n // HACK iOS does not allow touch events to bubble up?!\n if ( event.type != 'touchstart' ) {\n event.preventDefault();\n }\n this.focus();\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n this.watchCSS();\n this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n if ( !this.isActive ) {\n return;\n }\n this.getSize();\n // wrap values\n if ( this.options.wrapAround ) {\n this.x = utils.modulo( this.x, this.slideableWidth );\n }\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n this.emitEvent('resize');\n // update selected index for group slides, instant\n // TODO: position can be lost between groups of various numbers\n var selectedElement = this.selectedElements && this.selectedElements[0];\n this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n var watchOption = this.options.watchCSS;\n if ( !watchOption ) {\n return;\n }\n\n var afterContent = getComputedStyle( this.element, ':after' ).content;\n // activate if :after { content: 'flickity' }\n if ( afterContent.indexOf('flickity') != -1 ) {\n this.activate();\n } else {\n this.deactivate();\n }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n // only work if element is in focus\n var isNotFocused = document.activeElement && document.activeElement != this.element;\n if ( !this.options.accessibility ||isNotFocused ) {\n return;\n }\n\n var handler = Flickity.keyboardHandlers[ event.keyCode ];\n if ( handler ) {\n handler.call( this );\n }\n};\n\nFlickity.keyboardHandlers = {\n // left arrow\n 37: function() {\n var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this.uiChange();\n this[ leftMethod ]();\n },\n // right arrow\n 39: function() {\n var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this.uiChange();\n this[ rightMethod ]();\n },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n // TODO remove scrollTo once focus options gets more support\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#Browser_compatibility\n var prevScrollY = window.pageYOffset;\n this.element.focus({ preventScroll: true });\n // hack to fix scroll jump after focus, #76\n if ( window.pageYOffset != prevScrollY ) {\n window.scrollTo( window.pageXOffset, prevScrollY );\n }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n if ( !this.isActive ) {\n return;\n }\n this.element.classList.remove('flickity-enabled');\n this.element.classList.remove('flickity-rtl');\n this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( function( cell ) {\n cell.destroy();\n });\n this.element.removeChild( this.viewport );\n // move child elements back into element\n moveElements( this.slider.children, this.element );\n if ( this.options.accessibility ) {\n this.element.removeAttribute('tabIndex');\n this.element.removeEventListener( 'keydown', this );\n }\n // set flags\n this.isActive = false;\n this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n this.deactivate();\n window.removeEventListener( 'resize', this );\n this.allOff();\n this.emitEvent('destroy');\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'flickity' );\n }\n delete this.element.flickityGUID;\n delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {Element} elem\n * @returns {Flickity}\n */\nFlickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.flickityGUID;\n return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n}));\n","/*!\n * Unipointer v2.3.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*global define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter'\n ], function( EvEmitter ) {\n return factory( window, EvEmitter );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter')\n );\n } else {\n // browser global\n window.Unipointer = factory(\n window,\n window.EvEmitter\n );\n }\n\n}( window, function factory( window, EvEmitter ) {\n\n'use strict';\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n this._bindStartEvent( elem, false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n // default to mouse events\n var startEvent = 'mousedown';\n if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n } else if ( 'ontouchstart' in window ) {\n // Touch Events. iOS Safari\n startEvent = 'touchstart';\n }\n elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n for ( var i=0; i < touches.length; i++ ) {\n var touch = touches[i];\n if ( touch.identifier == this.pointerIdentifier ) {\n return touch;\n }\n }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n // dismiss clicks from right or middle buttons\n var button = event.button;\n if ( button && ( button !== 0 && button !== 1 ) ) {\n return;\n }\n this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n // dismiss right click and other pointers\n // button = 0 is okay, 1-4 not\n if ( event.button || this.isPointerDown ) {\n return;\n }\n\n this.isPointerDown = true;\n // save pointer identifier to match up touch events\n this.pointerIdentifier = pointer.pointerId !== undefined ?\n // pointerId for pointer events, touch.indentifier for touch events\n pointer.pointerId : pointer.identifier;\n\n this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n mousedown: [ 'mousemove', 'mouseup' ],\n touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n if ( !event ) {\n return;\n }\n // get proper events to match start event\n var events = postStartEvents[ event.type ];\n // bind events to node\n events.forEach( function( eventName ) {\n window.addEventListener( eventName, this );\n }, this );\n // save these arguments\n this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n if ( !this._boundPointerEvents ) {\n return;\n }\n this._boundPointerEvents.forEach( function( eventName ) {\n window.removeEventListener( eventName, this );\n }, this );\n\n delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerMove( event, event );\n }\n};\n\nproto.ontouchmove = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerMove( event, touch );\n }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerUp( event, event );\n }\n};\n\nproto.ontouchend = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerUp( event, touch );\n }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n this._pointerDone();\n this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n this._pointerReset();\n this._unbindPostStartEvents();\n this.pointerDone();\n};\n\nproto._pointerReset = function() {\n // reset properties\n this.isPointerDown = false;\n delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerCancel( event, event );\n }\n};\n\nproto.ontouchcancel = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerCancel( event, touch );\n }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n this._pointerDone();\n this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n return {\n x: pointer.pageX,\n y: pointer.pageY\n };\n};\n\n// ----- ----- //\n\nreturn Unipointer;\n\n}));\n","/*!\n * Unidragger v2.3.0\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'unipointer/unipointer'\n ], function( Unipointer ) {\n return factory( window, Unipointer );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('unipointer')\n );\n } else {\n // browser global\n window.Unidragger = factory(\n window,\n window.Unipointer\n );\n }\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n // bind each handle\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n var touchAction = isAdd ? this._touchActionValue : '';\n for ( var i=0; i < this.handles.length; i++ ) {\n var handle = this.handles[i];\n this._bindStartEvent( handle, isAdd );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) {\n handle.style.touchAction = touchAction;\n }\n }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n // track start event position\n this.pointerDownPointer = pointer;\n\n event.preventDefault();\n this.pointerDownBlur();\n // bind move and end events\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n TEXTAREA: true,\n INPUT: true,\n SELECT: true,\n OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n radio: true,\n checkbox: true,\n button: true,\n submit: true,\n image: true,\n file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n var isCursorNode = cursorNodes[ event.target.nodeName ];\n var isClickType = clickTypes[ event.target.type ];\n var isOkay = !isCursorNode || isClickType;\n if ( !isOkay ) {\n this._pointerReset();\n }\n return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n var focused = document.activeElement;\n // do not blur body for IE10, metafizzy/flickity#117\n var canBlur = focused && focused.blur && focused != document.body;\n if ( canBlur ) {\n focused.blur();\n }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n var moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY\n };\n // start drag if pointer has moved far enough to start drag\n if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n this._dragStart( event, pointer );\n }\n return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n if ( this.isDragging ) {\n this._dragEnd( event, pointer );\n } else {\n // pointer didn't move enough for drag to start\n this._staticClick( event, pointer );\n }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n this.isDragging = true;\n // prevent clicks\n this.isPreventingClicks = true;\n this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n // do not drag if not dragging yet\n if ( !this.isDragging ) {\n return;\n }\n\n this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n event.preventDefault();\n this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n // set flags\n this.isDragging = false;\n // re-enable clicking async\n setTimeout( function() {\n delete this.isPreventingClicks;\n }.bind( this ) );\n\n this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n if ( this.isPreventingClicks ) {\n event.preventDefault();\n }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n // ignore emulated mouse up clicks\n if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n return;\n }\n\n this.staticClick( event, pointer );\n\n // set flag for emulated clicks 300ms after touchend\n if ( event.type != 'mouseup' ) {\n this.isIgnoringMouseUp = true;\n // reset flag after 300ms\n setTimeout( function() {\n delete this.isIgnoringMouseUp;\n }.bind( this ), 400 );\n }\n};\n\nproto.staticClick = function( event, pointer ) {\n this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// ----- ----- //\n\nreturn Unidragger;\n\n}));\n","// drag\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unidragger/unidragger',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unidragger, utils ) {\n return factory( window, Flickity, Unidragger, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unidragger'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = factory(\n window,\n window.Flickity,\n window.Unidragger,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n'use strict';\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n draggable: '>1',\n dragThreshold: 3,\n});\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// -------------------------- -------------------------- //\n\nvar isTouch = 'createTouch' in document;\nvar isTouchmoveScrollCanceled = false;\n\nproto._createDrag = function() {\n this.on( 'activate', this.onActivateDrag );\n this.on( 'uiChange', this._uiChangeDrag );\n this.on( 'deactivate', this.onDeactivateDrag );\n this.on( 'cellChange', this.updateDraggable );\n // TODO updateDraggable on resize? if groupCells & slides change\n // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n // #457, RubaXa/Sortable#973\n if ( isTouch && !isTouchmoveScrollCanceled ) {\n window.addEventListener( 'touchmove', function() {});\n isTouchmoveScrollCanceled = true;\n }\n};\n\nproto.onActivateDrag = function() {\n this.handles = [ this.viewport ];\n this.bindHandles();\n this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n // disable dragging if less than 2 slides. #278\n if ( this.options.draggable == '>1' ) {\n this.isDraggable = this.slides.length > 1;\n } else {\n this.isDraggable = this.options.draggable;\n }\n if ( this.isDraggable ) {\n this.element.classList.add('is-draggable');\n } else {\n this.element.classList.remove('is-draggable');\n }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n this.options.draggable = true;\n this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n this.options.draggable = false;\n this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n if ( !this.isDraggable ) {\n this._pointerDownDefault( event, pointer );\n return;\n }\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n\n this._pointerDownPreventDefault( event );\n this.pointerDownFocus( event );\n // blur\n if ( document.activeElement != this.element ) {\n // do not blur if already focused\n this.pointerDownBlur();\n }\n\n // stop if it was moving\n this.dragX = this.x;\n this.viewport.classList.add('is-pointer-down');\n // track scrolling\n this.pointerDownScroll = getScrollPosition();\n window.addEventListener( 'scroll', this );\n\n this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n // bind move and end events\n this._bindPostStartEvents( event );\n this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n INPUT: true,\n TEXTAREA: true,\n SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isFocusNode ) {\n this.focus();\n }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n var isTouchStart = event.type == 'touchstart';\n var isTouchPointer = event.pointerType == 'touch';\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n event.preventDefault();\n }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n delete this.isTouchScrolling;\n this.viewport.classList.remove('is-pointer-down');\n this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n this.dragStartPosition = this.x;\n this.startAnimation();\n window.removeEventListener( 'scroll', this );\n this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n if ( !this.isDraggable ) {\n return;\n }\n event.preventDefault();\n\n this.previousDragX = this.dragX;\n // reverse if right-to-left\n var direction = this.options.rightToLeft ? -1 : 1;\n if ( this.options.wrapAround ) {\n // wrap around move. #589\n moveVector.x = moveVector.x % this.slideableWidth;\n }\n var dragX = this.dragStartPosition + moveVector.x * direction;\n\n if ( !this.options.wrapAround && this.slides.length ) {\n // slow drag\n var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n }\n\n this.dragX = dragX;\n\n this.dragMoveTime = new Date();\n this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n if ( this.options.freeScroll ) {\n this.isFreeScrolling = true;\n }\n // set selectedIndex based on where flick will end up\n var index = this.dragEndRestingSelect();\n\n if ( this.options.freeScroll && !this.options.wrapAround ) {\n // if free-scroll & not wrap around\n // do not free-scroll if going outside of bounding slides\n // so bounding slides can attract slider, and keep it in bounds\n var restingX = this.getRestingPosition();\n this.isFreeScrolling = -restingX > this.slides[0].target &&\n -restingX < this.getLastSlide().target;\n } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n // boost selection if selected index has not changed\n index += this.dragEndBoostSelect();\n }\n delete this.previousDragX;\n // apply selection\n // TODO refactor this, selecting here feels weird\n // HACK, set flag so dragging stays in correct direction\n this.isDragSelect = this.options.wrapAround;\n this.select( index );\n delete this.isDragSelect;\n this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n var restingX = this.getRestingPosition();\n // how far away from selected slide\n var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n // get closet resting going up and going down\n var positiveResting = this._getClosestResting( restingX, distance, 1 );\n var negativeResting = this._getClosestResting( restingX, distance, -1 );\n // use closer resting for wrap-around\n var index = positiveResting.distance < negativeResting.distance ?\n positiveResting.index : negativeResting.index;\n return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n var index = this.selectedIndex;\n var minDistance = Infinity;\n var condition = this.options.contain && !this.options.wrapAround ?\n // if contain, keep going if distance is equal to minDistance\n function( d, md ) { return d <= md; } : function( d, md ) { return d < md; };\n while ( condition( distance, minDistance ) ) {\n // measure distance to next cell\n index += increment;\n minDistance = distance;\n distance = this.getSlideDistance( -restingX, index );\n if ( distance === null ) {\n break;\n }\n distance = Math.abs( distance );\n }\n return {\n distance: minDistance,\n // selected was previous index\n index: index - increment\n };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x\n * @param {Integer} index - slide index\n */\nproto.getSlideDistance = function( x, index ) {\n var len = this.slides.length;\n // wrap around if at least 2 slides\n var isWrapAround = this.options.wrapAround && len > 1;\n var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n var slide = this.slides[ slideIndex ];\n if ( !slide ) {\n return null;\n }\n // add distance for wrap-around slides\n var wrap = isWrapAround ? this.slideableWidth * Math.floor( index / len ) : 0;\n return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n // do not boost if no previousDragX or dragMoveTime\n if ( this.previousDragX === undefined || !this.dragMoveTime ||\n // or if drag was held for 100 ms\n new Date() - this.dragMoveTime > 100 ) {\n return 0;\n }\n\n var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n var delta = this.previousDragX - this.dragX;\n if ( distance > 0 && delta > 0 ) {\n // boost to next if moving towards the right, and positive velocity\n return 1;\n } else if ( distance < 0 && delta < 0 ) {\n // boost to previous if moving towards the left, and negative velocity\n return -1;\n }\n return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n // get clickedCell, if cell was clicked\n var clickedCell = this.getParentCell( event.target );\n var cellElem = clickedCell && clickedCell.element;\n var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n var scroll = getScrollPosition();\n var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n // cancel click/tap if scroll is too much\n if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n this._pointerDone();\n }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n}\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n","// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unipointer/unipointer',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n'use strict';\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n this.direction = direction;\n this.parent = parent;\n this._create();\n}\n\nPrevNextButton.prototype = Object.create( Unipointer.prototype );\n\nPrevNextButton.prototype._create = function() {\n // properties\n this.isEnabled = true;\n this.isPrevious = this.direction == -1;\n var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n this.isLeft = this.direction == leftDirection;\n\n var element = this.element = document.createElement('button');\n element.className = 'flickity-button flickity-prev-next-button';\n element.className += this.isPrevious ? ' previous' : ' next';\n // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n element.setAttribute( 'type', 'button' );\n // init as disabled\n this.disable();\n\n element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n\n // create arrow\n var svg = this.createSVG();\n element.appendChild( svg );\n // events\n this.parent.on( 'select', this.update.bind( this ) );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n this.bindStartEvent( this.element );\n this.element.addEventListener( 'click', this );\n // add to DOM\n this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n // remove from DOM\n this.parent.element.removeChild( this.element );\n // click events\n this.unbindStartEvent( this.element );\n this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n var svg = document.createElementNS( svgURI, 'svg');\n svg.setAttribute( 'class', 'flickity-button-icon' );\n svg.setAttribute( 'viewBox', '0 0 100 100' );\n var path = document.createElementNS( svgURI, 'path');\n var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n path.setAttribute( 'd', pathMovements );\n path.setAttribute( 'class', 'arrow' );\n // rotate arrow\n if ( !this.isLeft ) {\n path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n }\n svg.appendChild( path );\n return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n // use shape as movement if string\n if ( typeof shape == 'string' ) {\n return shape;\n }\n // create movement string\n return 'M ' + shape.x0 + ',50' +\n ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n ' L ' + shape.x3 + ',50 ' +\n ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n ' Z';\n}\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.parent.uiChange();\n var method = this.isPrevious ? 'previous' : 'next';\n this.parent[ method ]();\n};\n\n// ----- ----- //\n\nPrevNextButton.prototype.enable = function() {\n if ( this.isEnabled ) {\n return;\n }\n this.element.disabled = false;\n this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.element.disabled = true;\n this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n // index of first or last slide, if previous or next\n var slides = this.parent.slides;\n // enable is wrapAround and at least 2 slides\n if ( this.parent.options.wrapAround && slides.length > 1 ) {\n this.enable();\n return;\n }\n var lastIndex = slides.length ? slides.length - 1 : 0;\n var boundIndex = this.isPrevious ? 0 : lastIndex;\n var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n prevNextButtons: true,\n arrowShape: {\n x0: 10,\n x1: 60, y1: 50,\n x2: 70, y2: 40,\n x3: 30\n }\n});\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n if ( !this.options.prevNextButtons ) {\n return;\n }\n\n this.prevButton = new PrevNextButton( -1, this );\n this.nextButton = new PrevNextButton( 1, this );\n\n this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n this.prevButton.activate();\n this.nextButton.activate();\n this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n this.prevButton.deactivate();\n this.nextButton.deactivate();\n this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// -------------------------- -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n}));\n","// page dots\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unipointer/unipointer',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n'use strict';\n\nfunction PageDots( parent ) {\n this.parent = parent;\n this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\n\nPageDots.prototype._create = function() {\n // create holder element\n this.holder = document.createElement('ol');\n this.holder.className = 'flickity-page-dots';\n // create dots, array of elements\n this.dots = [];\n // events\n this.handleClick = this.onClick.bind( this );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n this.setDots();\n this.holder.addEventListener( 'click', this.handleClick );\n this.bindStartEvent( this.holder );\n // add to DOM\n this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n this.holder.removeEventListener( 'click', this.handleClick );\n this.unbindStartEvent( this.holder );\n // remove from DOM\n this.parent.element.removeChild( this.holder );\n};\n\nPageDots.prototype.setDots = function() {\n // get difference between number of slides and number of dots\n var delta = this.parent.slides.length - this.dots.length;\n if ( delta > 0 ) {\n this.addDots( delta );\n } else if ( delta < 0 ) {\n this.removeDots( -delta );\n }\n};\n\nPageDots.prototype.addDots = function( count ) {\n var fragment = document.createDocumentFragment();\n var newDots = [];\n var length = this.dots.length;\n var max = length + count;\n\n for ( var i = length; i < max; i++ ) {\n var dot = document.createElement('li');\n dot.className = 'dot';\n dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n fragment.appendChild( dot );\n newDots.push( dot );\n }\n\n this.holder.appendChild( fragment );\n this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n // remove from this.dots collection\n var removeDots = this.dots.splice( this.dots.length - count, count );\n // remove from DOM\n removeDots.forEach( function( dot ) {\n this.holder.removeChild( dot );\n }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n // remove selected class on previous\n if ( this.selectedDot ) {\n this.selectedDot.className = 'dot';\n this.selectedDot.removeAttribute('aria-current');\n }\n // don't proceed if no dots\n if ( !this.dots.length ) {\n return;\n }\n this.selectedDot = this.dots[ this.parent.selectedIndex ];\n this.selectedDot.className = 'dot is-selected';\n this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.prototype.onClick = function( event ) {\n var target = event.target;\n // only care about dot clicks\n if ( target.nodeName != 'LI' ) {\n return;\n }\n\n this.parent.uiChange();\n var index = this.dots.indexOf( target );\n this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pageDots: true\n});\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n if ( !this.options.pageDots ) {\n return;\n }\n this.pageDots = new PageDots( this );\n // events\n this.on( 'activate', this.activatePageDots );\n this.on( 'select', this.updateSelectedPageDots );\n this.on( 'cellChange', this.updatePageDots );\n this.on( 'resize', this.updatePageDots );\n this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n this.pageDots.deactivate();\n};\n\n// ----- ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n}));\n","// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter',\n 'fizzy-ui-utils/utils',\n './flickity'\n ], function( EvEmitter, utils, Flickity ) {\n return factory( EvEmitter, utils, Flickity );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('ev-emitter'),\n require('fizzy-ui-utils'),\n require('./flickity')\n );\n } else {\n // browser global\n factory(\n window.EvEmitter,\n window.fizzyUIUtils,\n window.Flickity\n );\n }\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n'use strict';\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n this.parent = parent;\n this.state = 'stopped';\n // visibility change event handler\n this.onVisibilityChange = this.visibilityChange.bind( this );\n this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n if ( this.state == 'playing' ) {\n return;\n }\n // do not play if page is hidden, start playing when page is visible\n var isPageHidden = document.hidden;\n if ( isPageHidden ) {\n document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n return;\n }\n\n this.state = 'playing';\n // listen to visibility change\n document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n // start ticking\n this.tick();\n};\n\nPlayer.prototype.tick = function() {\n // do not tick if not playing\n if ( this.state != 'playing' ) {\n return;\n }\n\n var time = this.parent.options.autoPlay;\n // default to 3 seconds\n time = typeof time == 'number' ? time : 3000;\n var _this = this;\n // HACK: reset ticks if stopped and started within interval\n this.clear();\n this.timeout = setTimeout( function() {\n _this.parent.next( true );\n _this.tick();\n }, time );\n};\n\nPlayer.prototype.stop = function() {\n this.state = 'stopped';\n this.clear();\n // remove visibility change event\n document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n if ( this.state == 'playing' ) {\n this.state = 'paused';\n this.clear();\n }\n};\n\nPlayer.prototype.unpause = function() {\n // re-start play if paused\n if ( this.state == 'paused' ) {\n this.play();\n }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n var isPageHidden = document.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pauseAutoPlayOnHover: true\n});\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n this.player = new Player( this );\n\n this.on( 'activate', this.activatePlayer );\n this.on( 'uiChange', this.stopPlayer );\n this.on( 'pointerDown', this.stopPlayer );\n this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n if ( !this.options.autoPlay ) {\n return;\n }\n this.player.play();\n this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n this.player.play();\n};\n\nproto.stopPlayer = function() {\n this.player.stop();\n};\n\nproto.pausePlayer = function() {\n this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n this.player.stop();\n this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n if ( !this.options.pauseAutoPlayOnHover ) {\n return;\n }\n this.player.pause();\n this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n this.player.unpause();\n this.element.removeEventListener( 'mouseleave', this );\n};\n\n// ----- ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n}));\n","// add, remove cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n\n'use strict';\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n var fragment = document.createDocumentFragment();\n cells.forEach( function( cell ) {\n fragment.appendChild( cell.element );\n });\n return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {Element, Array, NodeList} elems\n * @param {Integer} index\n */\nproto.insert = function( elems, index ) {\n var cells = this._makeCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n var len = this.cells.length;\n // default to append\n index = index === undefined ? len : index;\n // add cells with document fragment\n var fragment = getCellsFragment( cells );\n // append to slider\n var isAppend = index == len;\n if ( isAppend ) {\n this.slider.appendChild( fragment );\n } else {\n var insertCellElement = this.cells[ index ].element;\n this.slider.insertBefore( fragment, insertCellElement );\n }\n // add to this.cells\n if ( index === 0 ) {\n // prepend, add to start\n this.cells = cells.concat( this.cells );\n } else if ( isAppend ) {\n // append, add to end\n this.cells = this.cells.concat( cells );\n } else {\n // insert in this.cells\n var endCells = this.cells.splice( index, len - index );\n this.cells = this.cells.concat( cells ).concat( endCells );\n }\n\n this._sizeCells( cells );\n this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {Element, Array, NodeList} elems\n */\nproto.remove = function( elems ) {\n var cells = this.getCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n\n var minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( function( cell ) {\n cell.remove();\n var index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n }, this );\n\n this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n var cell = this.getCell( elem );\n if ( !cell ) {\n return;\n }\n cell.getSize();\n\n var index = this.cells.indexOf( cell );\n this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n var prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._getWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex\n // try to maintain position & select previous selected element\n var cell = this.getCell( prevSelectedElem );\n if ( cell ) {\n this.selectedIndex = this.getCellSlideIndex( cell );\n }\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n this.emitEvent( 'cellChange', [ changedCellIndex ] );\n // position slider\n this.select( this.selectedIndex );\n // do not position slider after lazy load\n if ( isPositioningSlider ) {\n this.positionSliderAtSelected();\n }\n};\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n","// lazyload\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n'use strict';\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n var lazyLoad = this.options.lazyLoad;\n if ( !lazyLoad ) {\n return;\n }\n // get adjacent cells, use lazyLoad option for adjacent count\n var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n var cellElems = this.getAdjacentCellElements( adjCount );\n // get lazy images in those cells\n var lazyImages = [];\n cellElems.forEach( function( cellElem ) {\n var lazyCellImages = getCellLazyImages( cellElem );\n lazyImages = lazyImages.concat( lazyCellImages );\n });\n // load lazy images\n lazyImages.forEach( function( img ) {\n new LazyLoader( img, this );\n }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n // check if cell element is lazy image\n if ( cellElem.nodeName == 'IMG' ) {\n var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n return [ cellElem ];\n }\n }\n // select lazy images in cell\n var lazySelector = 'img[data-flickity-lazyload], ' +\n 'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n var imgs = cellElem.querySelectorAll( lazySelector );\n return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n */\nfunction LazyLoader( img, flickity ) {\n this.img = img;\n this.flickity = flickity;\n this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n // get src & srcset\n var src = this.img.getAttribute('data-flickity-lazyload') ||\n this.img.getAttribute('data-flickity-lazyload-src');\n var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n // set src & serset\n this.img.src = src;\n if ( srcset ) {\n this.img.setAttribute( 'srcset', srcset );\n }\n // remove attr\n this.img.removeAttribute('data-flickity-lazyload');\n this.img.removeAttribute('data-flickity-lazyload-src');\n this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n // unbind events\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n\n var cell = this.flickity.getParentCell( this.img );\n var cellElem = cell && cell.element;\n this.flickity.cellSizeChange( cellElem );\n\n this.img.classList.add( className );\n this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// ----- ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n}));\n","/*!\n * Flickity v2.2.1\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2019 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n './drag',\n './prev-next-button',\n './page-dots',\n './player',\n './add-remove-cell',\n './lazyload'\n ], factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./flickity'),\n require('./drag'),\n require('./prev-next-button'),\n require('./page-dots'),\n require('./player'),\n require('./add-remove-cell'),\n require('./lazyload')\n );\n }\n\n})( window, function factory( Flickity ) {\n /*jshint strict: false*/\n return Flickity;\n});\n","import Flickity from '../../../node_modules/flickity';\r\nimport { currentWindowWidth, onWindowResize } from '../utils/windowResize';\r\n\r\n/**\r\n * The Slider class uses the cssAnimateNewHeight function to reveal hidden content.\r\n * Default element selector is data-action*=\"slider\"\r\n *\r\n * @param {HTMLElement} container\r\n * @constructor\r\n */\r\nexport class Slider {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} container\r\n */\r\n constructor(container) {\r\n this.container = container;\r\n this.nav = container.parentNode.querySelector('.slider__nav');\r\n\r\n if (this.container) {\r\n const mobileMode = !(currentWindowWidth >= 480);\r\n\r\n this.flkty = new Flickity(this.container, {\r\n cellAlign: mobileMode ? 'center' : 'left',\r\n //prevNextButtons: false,\r\n percentPosition: false,\r\n autoPlay: parseInt(this.container.getAttribute('data-autoplay')) || false,\r\n wrapAround: true,\r\n selectedAttraction: mobileMode ? 0.025 : 0.02,\r\n friction: 0.20,\r\n pageDots: false,\r\n draggable: true,\r\n lazyLoad: mobileMode ? 1 : 3,\r\n // dragThreshold: 10,\r\n // freeScroll: true,\r\n });\r\n\r\n this.bindEvents();\r\n }\r\n }\r\n\r\n bindEvents() {\r\n const scope = this;\r\n //Change cell position on resize, when width is smaller than 768px\r\n onWindowResize(\r\n function alignSlider() {\r\n const mobileMode = !(currentWindowWidth >= 480);\r\n\r\n scope.flkty.option({ cellAlign: (mobileMode ? 'center' : 'left') });\r\n scope.flkty.reloadCells();\r\n }\r\n );\r\n\r\n // Following Code is only used in case you use Custom navigation\r\n\r\n if (this.nav) {\r\n const navButtons = Array.from(this.nav.children);\r\n\r\n // update buttons on select\r\n this.flkty.on('select', function () {\r\n const previousSelectedButton = scope.nav.querySelector('.is-selected');\r\n const selectedButton = scope.nav.children[scope.flkty.selectedIndex];\r\n previousSelectedButton.classList.remove('is-selected');\r\n selectedButton.classList.add('is-selected');\r\n });\r\n\r\n // cell select\r\n this.nav.addEventListener('click', function (event) {\r\n if (!event.target.matches('.dot')) {\r\n return;\r\n }\r\n const index = navButtons.indexOf(event.target);\r\n scope.flkty.select(index, false, false);\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function setupSliders(selector = '[data-action*=\"slider\"]') {\r\n const sliders = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < sliders.length; i++) {\r\n void new Slider(sliders[i]);\r\n }\r\n}\r\n","const invalidClass = 'invalid';\r\n\r\n/**\r\n * Check validation of single form field\r\n * @param {HTMLElement | Object} field - Form field element or event object.\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction checkValidation(input) {\r\n let valid = true;\r\n let val = '';\r\n const field = input.target ? input.target : input;\r\n\r\n field.classList.remove(invalidClass);\r\n\r\n switch (field.nodeName) {\r\n case 'INPUT':\r\n case 'TEXTAREA':\r\n case 'SELECT':\r\n default:\r\n val = field.value;\r\n break;\r\n }\r\n\r\n if (field.type == 'checkbox' && !field.checked || val.trim() == '') {\r\n valid = false;\r\n field.classList.add(invalidClass);\r\n field.focus();\r\n }\r\n\r\n return valid;\r\n}\r\n\r\n/**\r\n * Runs [required] fields within form through validation function\r\n *\r\n * @param {HTMLElement} form - Form element to validate *\r\n * @returns {boolean}\r\n */\r\nexport function validateForm(form) {\r\n const requiredFields = form.querySelectorAll('[required]');\r\n let valid = true;\r\n\r\n for (let i = 0; i < requiredFields.length; i++) {\r\n const field = requiredFields[i];\r\n\r\n valid = checkValidation(field);\r\n if (!valid) {\r\n break;\r\n }\r\n\r\n }\r\n\r\n return valid;\r\n}\r\n\r\n/**\r\n * This is ment as an 'input' eventhandler set on textareas,\r\n * to auto increase it's height depending on the users text-input.\r\n */\r\nfunction textAreaAutoHeight() {\r\n this.style.height = ''; // Resets height, in case text is removed\r\n this.style.height = `${this.scrollHeight}px`;\r\n}\r\n\r\n/**\r\n * Simply adds a class to target field if it has a value and removes it if not.\r\n *\r\n * @param {Object || HTMLElement} e - Event or field element\r\n */\r\nfunction checkFieldValue(e) {\r\n const field = e.target || e;\r\n field.value ? field.classList.add('has-text') : field.classList.remove('has-text');\r\n}\r\n\r\n/**\r\n * Sets up 'change'-eventhandler as checkValidation on given fields\r\n *\r\n * @param {HTMLElement} form - Form fields to validate\r\n */\r\n\r\nexport function watchFormFields(selector = 'form[data-action*=\"form\"]') {\r\n const form = document.body.querySelectorAll(selector);\r\n\r\n if (form) {\r\n for (let f = 0; f < form.length; f++) {\r\n const fields = form[f].querySelectorAll('input, select, textarea');\r\n\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n field.addEventListener('keyup', checkFieldValue);\r\n\r\n if (field.hasAttribute('required')) {\r\n field.addEventListener('change', checkValidation);\r\n }\r\n\r\n if (field.type == 'textarea') {\r\n field.addEventListener('input', textAreaAutoHeight);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Serializes form fields\r\n *\r\n * @param {HTMLElement} form - Form element to serialize *\r\n * @returns {string} - Returns querystring of fields names and values\r\n */\r\nexport function serialize(form) {\r\n if (!form || form.nodeName !== 'FORM') {\r\n return;\r\n }\r\n let i, j;\r\n const q = [];\r\n for (i = form.elements.length - 1; i >= 0; i = i - 1) {\r\n if (form.elements[i].name === '') {\r\n continue;\r\n }\r\n switch (form.elements[i].nodeName) {\r\n case 'INPUT':\r\n switch (form.elements[i].type) {\r\n case 'text':\r\n case 'tel':\r\n case 'email':\r\n case 'date':\r\n case 'number':\r\n case 'hidden':\r\n case 'password':\r\n case 'button':\r\n case 'reset':\r\n case 'submit':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n case 'checkbox':\r\n case 'radio':\r\n if (form.elements[i].checked) {\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n }\r\n break;\r\n case 'file':\r\n break;\r\n }\r\n break;\r\n case 'TEXTAREA':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n case 'SELECT':\r\n switch (form.elements[i].type) {\r\n case 'select-one':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n case 'select-multiple':\r\n for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {\r\n if (form.elements[i].options[j].selected) {\r\n q.push(\r\n `${form.elements[i].name}=${encodeURIComponent(form.elements[i].options[j].value)}`\r\n );\r\n }\r\n }\r\n break;\r\n }\r\n break;\r\n case 'BUTTON':\r\n switch (form.elements[i].type) {\r\n case 'reset':\r\n case 'submit':\r\n case 'button':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n return q.join('&').replace(/%20/g, '+');\r\n}","import { serialize, validateForm } from '../components/form';\r\nimport { insertElementAfter } from '../utils/elementManipulation';\r\n\r\n/**\r\n * Sets up Form submit eventhandler used when submitting form for login\r\n *\r\n * @param {string} selector - querySelector string\r\n */\r\nexport function setupUmbracoMemberLoginForm (selector = 'form[data-action*=\"umbraco-member-login\"]') {\r\n const loginForm = document.querySelector(selector);\r\n\r\n function loginSubmit(e) {\r\n e.preventDefault();\r\n\r\n const form = e.target;\r\n const XHR = new XMLHttpRequest();\r\n const formData = serialize(form);\r\n\r\n form.classList.add('loading');\r\n\r\n clearFormMessage(form);\r\n\r\n XHR.onreadystatechange = function () {\r\n if (this.readyState === this.DONE) {\r\n if (XHR.onreadystatechange) {\r\n XHR.onreadystatechange = null;\r\n\r\n if (this.status == 200) {\r\n if (form.hasAttribute('data-login-url') && form.getAttribute('data-login-url') != '') {\r\n window.location = form.getAttribute('data-login-url');\r\n } else {\r\n window.location.reload(false);\r\n }\r\n } else {\r\n const responseJson = JSON.parse(this.responseText);\r\n displayFormMessage(responseJson.Message, form);\r\n }\r\n\r\n form.classList.remove('loading');\r\n }\r\n }\r\n };\r\n\r\n XHR.open('POST', '/umbraco/api/memberapi/login', true);\r\n XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n XHR.send(formData);\r\n }\r\n\r\n if (loginForm) {\r\n loginForm.addEventListener('submit', loginSubmit);\r\n }\r\n}\r\n\r\n/**\r\n * Sets up click eventhandler for log out\r\n *\r\n * @param {string} selector - querySelector string\r\n */\r\nexport function setupUmbracoMemberLogoutTriggers (selector = '[data-action*=\"umbraco-member-logout\"]') {\r\n const logoutTriggers = document.querySelectorAll(selector);\r\n\r\n function logout(e) {\r\n e.preventDefault();\r\n\r\n const trigger = e.target;\r\n const XHR = new XMLHttpRequest();\r\n\r\n XHR.onreadystatechange = function () {\r\n if (this.readyState === this.DONE) {\r\n if (XHR.onreadystatechange) {\r\n XHR.onreadystatechange = null;\r\n\r\n if (this.status == 200) {\r\n if (trigger.hasAttribute('data-logout-url') && trigger.getAttribute('data-logout-url') != '') {\r\n window.location = trigger.getAttribute('data-logout-url');\r\n } else {\r\n window.location.reload(false);\r\n }\r\n } else {\r\n console.warn('Logout Error');\r\n }\r\n }\r\n }\r\n };\r\n\r\n XHR.open('GET', '/umbraco/api/memberapi/logout', true);\r\n XHR.send();\r\n }\r\n\r\n for (let i = 0; i < logoutTriggers.length; i++) {\r\n logoutTriggers[i].addEventListener('click', logout);\r\n }\r\n}\r\n\r\n/**\r\n * Sets up Form submit eventhandler used when submitting form for login\r\n *\r\n * @param {string} selector - querySelector string\r\n */\r\nexport function setupUmbracoMemberResetPasswordForm (selector = 'form[data-action*=\"umbraco-member-reset-password\"]') {\r\n const passwordRecoveryForm = document.querySelector(selector);\r\n\r\n function recoverySubmit(e) {\r\n e.preventDefault();\r\n\r\n const form = e.target;\r\n const XHR = new XMLHttpRequest();\r\n const formData = serialize(form);\r\n\r\n form.classList.add('loading');\r\n\r\n clearFormMessage(form);\r\n\r\n XHR.onreadystatechange = function () {\r\n if (this.readyState === this.DONE) {\r\n if (XHR.onreadystatechange) {\r\n XHR.onreadystatechange = null;\r\n\r\n if (this.status == 200) {\r\n if (form.hasAttribute('data-success-text') && form.getAttribute('data-success-text') != '') {\r\n\r\n displaySuccessMessage(form);\r\n form.style.display = 'none';\r\n\r\n } else {\r\n window.location.reload(false);\r\n }\r\n } else {\r\n const responseJson = JSON.parse(this.responseText);\r\n displayFormMessage(responseJson.Message, form);\r\n }\r\n\r\n form.classList.remove('loading');\r\n }\r\n }\r\n };\r\n\r\n XHR.open('POST', '/umbraco/api/memberapi/resetpassword', true);\r\n XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n XHR.send(formData);\r\n }\r\n\r\n if (passwordRecoveryForm) {\r\n passwordRecoveryForm.addEventListener('submit', recoverySubmit);\r\n }\r\n}\r\n\r\n/**\r\n * Sets up Form submit eventhandler used when submitting form for change password\r\n *\r\n * @param {string} selector - querySelector string\r\n */\r\nexport function setupUmbracoMemberChangePasswordForm (selector = 'form[data-action*=\"umbraco-member-change-password\"]') {\r\n const passwordRecoveryForm = document.querySelector(selector);\r\n\r\n function changePasswordSubmit(e) {\r\n e.preventDefault();\r\n\r\n const form = e.target;\r\n const XHR = new XMLHttpRequest();\r\n const formData = serialize(form);\r\n\r\n form.classList.add('loading');\r\n\r\n clearFormMessage(form);\r\n\r\n XHR.onreadystatechange = function () {\r\n if (this.readyState === this.DONE) {\r\n if (XHR.onreadystatechange) {\r\n XHR.onreadystatechange = null;\r\n\r\n if (this.status == 200) {\r\n if (form.hasAttribute('data-success-text') && form.getAttribute('data-success-text') != '') {\r\n\r\n displaySuccessMessage(form);\r\n form.style.display = 'none';\r\n\r\n } else {\r\n window.location.reload(false);\r\n }\r\n } else {\r\n const responseJson = JSON.parse(this.responseText);\r\n displayFormMessage(responseJson.Message, form);\r\n }\r\n\r\n form.classList.remove('loading');\r\n }\r\n }\r\n };\r\n\r\n XHR.open('POST', '/umbraco/api/memberapi/changepassword', true);\r\n XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n XHR.send(formData);\r\n }\r\n\r\n if (passwordRecoveryForm) {\r\n passwordRecoveryForm.addEventListener('submit', changePasswordSubmit);\r\n }\r\n}\r\n\r\nfunction displayFormMessage(message, parentElem, selector = '.form__message--last') {\r\n let formMessage = parentElem.querySelector(selector);\r\n\r\n if (formMessage) {\r\n formMessage.textContent = message;\r\n } else {\r\n formMessage = document.createElement('span');\r\n formMessage.classList.add('form__message');\r\n formMessage.classList.add('form__message--error');\r\n formMessage.classList.add('form__message--last');\r\n formMessage.textContent = message;\r\n\r\n parentElem.appendChild(formMessage);\r\n }\r\n}\r\n\r\nfunction displaySuccessMessage(form, selector = '.form__message--last') {\r\n let formMessage = form.querySelector(selector);\r\n\r\n if (formMessage) {\r\n formMessage.textContent = form.getAttribute('data-success-text');\r\n } else {\r\n formMessage = document.createElement('span');\r\n formMessage.classList.add('form__message');\r\n formMessage.textContent = form.getAttribute('data-success-text');\r\n\r\n insertElementAfter(formMessage, form);\r\n }\r\n}\r\n\r\nfunction clearFormMessage(form, selector = '.form__message') {\r\n const formMessage = form.querySelector(selector);\r\n\r\n if (formMessage) {\r\n formMessage.textContent = '';\r\n }\r\n}\r\n\r\n\r\nexport function setupUmbracoMemberLogin() {\r\n setupUmbracoMemberLoginForm();\r\n setupUmbracoMemberLogoutTriggers();\r\n setupUmbracoMemberResetPasswordForm();\r\n setupUmbracoMemberChangePasswordForm();\r\n}\r\n","/**\r\n * Helper-utilities for inserting, moving and emptying DOM-elements.\r\n *\r\n * When inserting elements, they are first added to a document fragment, keeping the repainting and\r\n * recalculating of the DOM to a minimum.\r\n *\r\n * These have also been tested to be way faster than solutions using `innerHTML` and `insertAdjecentHTML`.\r\n *\r\n * @module utils/dom/elementManipulation\r\n * @author Lars Munkholm \r\n * @author Nicolaj Lund Hummel \r\n */\r\n\r\n/**\r\n * Parse a string into an array of DOM nodes.\r\n *\r\n * @param {Node|string} input - String to parse. If input is already a node or an element, nothing will be done to it.\r\n * @returns {Node} DOM node.\r\n *\r\n * @example\r\n * import { parseHTML } from \"./utils/dom/elementManipulation\";\r\n *\r\n * const HTMLString = \"An example with text and HTML...\";\r\n * const nodes = parseHTML(HTMLString);\r\n *\r\n * const nodeNames = nodes.map(node => node.nodeName);\r\n * // Outputs [\"#text\", \"B\", \"#text\", \"I\", \"#text\"]\r\n *\r\n * const textOnly = nodes.map(node => node.nodeName === \"#text\" ? node.textContent : \"\").join(\"\");\r\n * // Outputs \"An example with and ...\"\r\n *\r\n * const htmlOnly = nodes.map(node => node.nodeName !== \"#text\" ? node.outerHTML : \"\").join(\"\");\r\n * // Outputs \"HTMLstuff\"\r\n */\r\nexport function parseHTML(input) {\r\n if (typeof input === 'string') {\r\n const divElem = document.createElement('div');\r\n divElem.innerHTML = input;\r\n return divElem;\r\n } else {\r\n return input;\r\n }\r\n}\r\n\r\n/**\r\n * **Delete an element** from the DOM.\r\n *\r\n * @param {Node} element - Element to delete.\r\n */\r\nexport function deleteElement(element) {\r\n element.parentNode ? element.parentNode.removeChild(element) : null;\r\n}\r\n\r\n/**\r\n * **Appends an element** inside another element, which means it will be placed as the last child.\r\n *\r\n * @param {Node|string} element - The element to append.\r\n * @param {Node} container - Append the element inside this container.\r\n */\r\nexport function appendElement(element, container) {\r\n const fragment = document.createDocumentFragment();\r\n\r\n // Use createTextNode() before appending text to fragment\r\n fragment.appendChild(typeof element === 'string' ? document.createTextNode(element) : element);\r\n\r\n container.appendChild(fragment);\r\n}\r\n\r\n/**\r\n * Insert one or more elements **after** another element.\r\n *\r\n * @param {Node|string} newElement - The element to insert after another.\r\n * @param {Node} existingElement - The existing element to insert after.\r\n */\r\nexport function insertElementAfter(newElement, existingElement) {\r\n const parent = existingElement.parentNode;\r\n\r\n if (parent) {\r\n const fragment = document.createDocumentFragment();\r\n\r\n // Make sure strings are converted to text nodes before moving on\r\n const node = typeof newElement === 'string' ? document.createTextNode(newElement) : newElement;\r\n fragment.appendChild(node);\r\n\r\n parent.insertBefore(fragment, existingElement.nextSibling);\r\n }\r\n}\r\n\r\n/**\r\n * Insert one or more elements **before** another element.\r\n *\r\n * @param {Node|string} newElement - The element to insert before another.\r\n * @param {Node} existingElement - The existing element to insert before.\r\n */\r\nexport function insertElementBefore(newElement, existingElement) {\r\n const fragment = document.createDocumentFragment();\r\n\r\n fragment.appendChild(typeof newElement === 'string' ? document.createTextNode(newElement) : newElement);\r\n\r\n existingElement.parentNode.insertBefore(fragment, existingElement);\r\n}\r\n\r\n/**\r\n * **Prepend an element** (or multiple) inside another element, which means it will be placed as the first child.\r\n *\r\n * @param {Node|NodeList|string|Array.<(Node|string)>} elements - The element(s) to prepend.\r\n * @param {Node} container - Prepend the element inside this container.\r\n */\r\nexport function prependElement(elements, container) {\r\n const fragment = document.createDocumentFragment();\r\n let lastInsertedElement;\r\n\r\n if (elements instanceof NodeList || elements.constructor === Array) {\r\n for (let i = 0; i < elements.length; i++) {\r\n const element = elements[i];\r\n // Make sure strings are converted to text nodes before moving on\r\n const node = typeof element === 'string' ? document.createTextNode(element) : element;\r\n\r\n if (lastInsertedElement) {\r\n insertElementAfter(node, lastInsertedElement);\r\n } else if (fragment.firstChild) {\r\n insertElementBefore(node, fragment.firstChild);\r\n } else {\r\n fragment.appendChild(node);\r\n }\r\n\r\n lastInsertedElement = node;\r\n }\r\n } else {\r\n fragment.appendChild(elements);\r\n }\r\n\r\n if (container.firstChild) {\r\n insertElementBefore(fragment, container.firstChild);\r\n } else {\r\n appendElement(fragment, container);\r\n }\r\n}\r\n\r\n/**\r\n * **Swap two elements** with each other.\r\n *\r\n * @param {Node} element1 - This will be replaced with `element2`\r\n * @param {Node} element2 - This will be replaced with `element1`\r\n */\r\nexport function swapElements(element1, element2) {\r\n // Remember the location of element2\r\n const parent2 = element2.parentNode;\r\n const next2 = element2.nextSibling;\r\n\r\n // If element1 is the next sibling of element2\r\n if (next2 === element1) {\r\n parent2.insertBefore(element1, element2);\r\n }\r\n\r\n // Otherwise, insert element2 right before element1\r\n else {\r\n element1.parentNode.insertBefore(element2, element1);\r\n\r\n // And now insert element1 where element2 was\r\n if (next2) {\r\n // If there was an element after element2, then insert element1 right before that\r\n parent2.insertBefore(element1, next2);\r\n } else {\r\n // Otherwise, just append as last child\r\n parent2.appendChild(element1);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * **Replace an element** with another one.\r\n *\r\n * @param {Node} oldElement - The existing element to be replaced.\r\n * @param {Node} newElement - The new element to take its place.\r\n */\r\nexport function replaceElement(oldElement, newElement) {\r\n insertElementAfter(newElement, oldElement);\r\n oldElement.parentElement.removeChild(oldElement);\r\n}\r\n\r\n/**\r\n * **Wrap an element** in a new element.\r\n *\r\n * @param {Node} existingElement - The existing element, which is about to be wrapped.\r\n * @param {Node} newWrapper - The new element which the existing one should be wrapped inside.\r\n *\r\n * @example\r\n * import { wrapElement } from \"./utils/dom/elementManipulation\";\r\n * import { createElement } from \"./utils/dom/createElement\";\r\n *\r\n * const newWrapper = createElement(\"div\", {className: \"wrapper\"});\r\n * const wrapThis = document.getElementById(\"wrapThis\");\r\n *\r\n * wrapElement(wrapThis, newWrapper);\r\n */\r\nexport function wrapElement(existingElement, newWrapper) {\r\n existingElement.parentNode.insertBefore(newWrapper, existingElement);\r\n newWrapper.appendChild(existingElement);\r\n}\r\n\r\n/**\r\n * **Inner wrap an element** in a new element.\r\n *\r\n * Actually, the children are what will be wrapped.\r\n *\r\n * @param {Node} existingElement - The existing element, which is about have its children wrapped.\r\n * @param {Node} newWrapper - The new element which the existing one should be wrapped inside.\r\n */\r\nexport function wrapInnerElement(existingElement, newWrapper) {\r\n while (existingElement.childNodes.length > 0) {\r\n newWrapper.appendChild(existingElement.childNodes[0]);\r\n }\r\n\r\n appendElement(newWrapper, existingElement);\r\n}\r\n\r\n/**\r\n * Empty one or more elements by removing all children.\r\n *\r\n * This is more than 75% faster than `innerHTML = \"\"` according to performance tests on jsPerf.com.\r\n *\r\n * @param {Node|Node[]|NodeList} element - The element(s) to be emptied.\r\n */\r\nexport function emptyElement(element) {\r\n if (element instanceof NodeList || element.constructor === Array) {\r\n for (let i = 0; i < element.length; i += 1) {\r\n const elem = element[i];\r\n while (elem.firstChild) {\r\n elem.removeChild(elem.firstChild);\r\n }\r\n }\r\n } else {\r\n while (element.firstChild) {\r\n element.removeChild(element.firstChild);\r\n }\r\n }\r\n}\r\n","!function(){var t=function(){this.el=document.createElement(\"div\"),this.el.classList.add(\"wa-mediabox-preloader\"),this.wrap=document.createElement(\"div\"),this.wrap.classList.add(\"wa-mediabox-preloader-wrap\"),this.spinner=document.createElement(\"div\"),this.spinner.classList.add(\"wa-mediabox-preloader-spinner\"),this.patch=document.createElement(\"div\"),this.patch.classList.add(\"wa-mediabox-preloader-patch\"),this.clipperLeft=document.createElement(\"div\"),this.clipperLeft.classList.add(\"wa-mediabox-preloader-clipper\"),this.clipperLeft.classList.add(\"left\"),this.clipperRight=document.createElement(\"div\"),this.clipperRight.classList.add(\"wa-mediabox-preloader-clipper\"),this.clipperRight.classList.add(\"right\");var t=document.createElement(\"div\");t.classList.add(\"wa-mediabox-preloader-circle\"),this.patch.appendChild(t),this.clipperLeft.appendChild(t.cloneNode(!0)),this.clipperRight.appendChild(t.cloneNode(!0)),this.spinner.appendChild(this.clipperLeft),this.spinner.appendChild(this.patch),this.spinner.appendChild(this.clipperRight),this.wrap.appendChild(this.spinner),this.el.appendChild(this.wrap)};t.prototype.show=function(){this.el.classList.remove(\"hidden\"),this.el.style.display=\"\"},t.prototype.hide=function(){var t=this;this.el.classList.add(\"hidden\"),setTimeout(function(){t.el.classList.contains(\"hidden\")&&(t.el.style.display=\"none\")},350)};var e=function(t){this.parent=t,this.mediaList=[],this.opened=!1,this.loaded=!1,this.current=null,this.containerWidth=null,this.containerHeight=null};e.prototype.addImage=function(t,e){return this.mediaList.push({type:\"image\",src:t,title:e}),this.mediaList.length-1},e.prototype.addIframe=function(t,e,i,n){return this.mediaList.push({type:\"iframe\",src:t,title:e,width:i,height:n}),this.mediaList.length-1},e.prototype.open=function(e){if(!this.opened){var i=this;this.current=-1,this.loaded=!1,this.overlay=document.createElement(\"div\"),this.overlay.classList.add(\"wa-mediabox-overlay\"),this.frame=document.createElement(\"div\"),this.frame.classList.add(\"wa-mediabox-frame\"),this.container=document.createElement(\"div\"),this.container.classList.add(\"wa-mediabox-container\"),this.title=document.createElement(\"div\"),this.title.classList.add(\"wa-mediabox-title\"),this.loading=new t,this.closeBtn=document.createElement(\"button\"),this.closeBtn.classList.add(\"wa-mediabox-close\"),this.closeBtn.innerHTML='',this.closeBtn.setAttribute(\"title\",this.parent.lang.close),this.prevBtn=document.createElement(\"button\"),this.prevBtn.classList.add(\"wa-mediabox-prev\"),this.prevBtn.innerHTML='',this.prevBtn.setAttribute(\"title\",this.parent.lang.prev),this.nextBtn=document.createElement(\"button\"),this.nextBtn.classList.add(\"wa-mediabox-next\"),this.nextBtn.innerHTML='',this.nextBtn.setAttribute(\"title\",this.parent.lang.next),this.openBtn=document.createElement(\"button\"),this.openBtn.classList.add(\"wa-mediabox-open\"),this.openBtn.innerHTML='',this.openBtn.setAttribute(\"title\",this.parent.lang.openInNew),this.frame.appendChild(this.container),this.frame.appendChild(this.title),this.frame.appendChild(this.loading.el),this.frame.appendChild(this.closeBtn),this.frame.appendChild(this.prevBtn),this.frame.appendChild(this.nextBtn),this.frame.appendChild(this.openBtn),this.overlay.appendChild(this.frame),document.body.appendChild(this.overlay),this.overlay.addEventListener(\"click\",function(t){t.stopPropagation(),i.close()}),this.closeBtn.addEventListener(\"click\",function(t){t.stopPropagation(),i.close()}),this.prevBtn.addEventListener(\"click\",function(t){t.stopPropagation(),i.prev()}),this.nextBtn.addEventListener(\"click\",function(t){t.stopPropagation(),i.next()}),this.container.addEventListener(\"click\",function(t){t.stopPropagation(),i.next()}),this.openBtn.addEventListener(\"click\",function(t){t.stopPropagation(),i.openSource()}),this.resizeHandler=function(){i.resizeContainer()},this.keyDownHandler=function(t){return t.preventDefault(),t.stopPropagation(),37===t.keyCode?i.prev():39===t.keyCode?i.next():27===t.keyCode&&i.close(),!1},window.addEventListener(\"resize\",this.resizeHandler),document.body.addEventListener(\"keydown\",this.keyDownHandler),setTimeout(function(){i.overlay.classList.add(\"opened\"),i.loadMedia(e)},10),this.opened=!0}},e.prototype.close=function(){if(this.opened){var t=this;this.overlay.classList.remove(\"opened\"),window.removeEventListener(\"resize\",this.resizeHandler),document.body.removeEventListener(\"keydown\",this.keyDownHandler),setTimeout(function(){t.overlay.parentElement.removeChild(t.overlay),t.opened=!1,t.nextBtn=null,t.prevBtn=null,t.closeBtn=null,t.openBtn=null,t.loading=null,t.container=null,t.frame=null,t.overlay=null,t.current=null,t.containerWidth=null,t.containerHeight=null},450)}},e.prototype.resizeContainer=function(){if(this.opened){this.containerWidth||(this.containerWidth=Math.round(.7*this.overlay.offsetWidth)),this.containerHeight||(this.containerHeight=Math.round(.7*this.overlay.offsetWidth));var t=160;this.overlay.offsetWidth<480&&(t=70);var e=Math.min(.9*this.overlay.offsetWidth,this.overlay.offsetWidth-t),i=Math.min(.9*this.overlay.offsetHeight,this.overlay.offsetHeight-64),n=this.containerWidth,s=this.containerHeight,a=n/s;n>e&&(n=Math.round(e),s=n/a),s>i&&(s=Math.round(i),n=s*a),this.frame.style.width=n+\"px\",this.frame.style.height=s+\"px\",this.frame.style.marginLeft=-Math.round(n/2)+\"px\",this.frame.style.marginTop=-Math.round(s/2)+\"px\"}},e.prototype.setMedia=function(t,e,i,n,s){if(this.opened){var a=this;this.loaded=!1,this.frame.classList.remove(\"can-open-in-new\"),a.frame.classList.remove(\"has-title\"),this.container.innerHTML=\"\";var r=null;\"image\"==t?(n&&(this.containerWidth=n),s&&(this.containerHeight=s),this.resizeContainer(),r=document.createElement(\"img\"),r.addEventListener(\"load\",function(){a.containerWidth=r.width,a.containerHeight=r.height,a.resizeContainer(),a.frame.classList.add(\"can-open-in-new\"),a.container.appendChild(r)}),r.src=e):(n&&(this.containerWidth=n),s&&(this.containerHeight=s+(i?52:0)),this.resizeContainer(),r=document.createElement(\"iframe\"),r.src=e,r.setAttribute(\"width\",parseInt(this.frame.style.width)),r.setAttribute(\"height\",parseInt(this.frame.style.height)-(i?52:0)),r.setAttribute(\"frameborder\",\"0\"),r.setAttribute(\"allowfullscreen\",\"allowfullscreen\"),this.container.appendChild(r)),r.addEventListener(\"load\",function(){setTimeout(function(){i&&(a.title.innerHTML=i,a.frame.classList.add(\"has-title\")),a.frame.classList.add(\"loaded\"),a.loading.hide(),a.loaded=!0},550)})}},e.prototype.loadMedia=function(t){if(this.opened&&t!=this.current){var e=this;if(!this.mediaList[t])throw new Error(\"Undefined media\");var i=function(){e.setMedia(e.mediaList[t].type,e.mediaList[t].src,e.mediaList[t].title,e.mediaList[t].width,e.mediaList[t].height)};this.loaded?(this.frame.classList.remove(\"loaded\"),this.loading.show(),setTimeout(i,350)):i(),t>0?this.frame.classList.add(\"has-prev\"):this.frame.classList.remove(\"has-prev\"),t=0?!0:!1,r=t.hasAttribute(\"data-width\")?parseInt(t.getAttribute(\"data-width\")):null,o=t.hasAttribute(\"data-height\")?parseInt(t.getAttribute(\"data-height\")):null,d=null;d=a?this.addIframe(i,n,s,r,o):this.addImage(i,n,s),t.addEventListener(\"click\",function(t){return t.preventDefault(),t.stopPropagation(),e.openGallery(i,d),!1})}},i.prototype.bindAll=function(t){for(var e=t.querySelectorAll(\"a[data-mediabox]\"),i=0;i {\r\n initVhUnitOverwrite();\r\n\r\n setupLazyLoading();\r\n\r\n setupAccordions();\r\n\r\n setupFilters();\r\n\r\n setupOverlay();\r\n\r\n setupVideos();\r\n\r\n setupTabs();\r\n\r\n setupSliders();\r\n\r\n watchFormFields();\r\n\r\n setupUmbracoMemberLogin();\r\n\r\n activateProfile();\r\n\r\n showHideElem();\r\n });\r\n\r\n console.info(`fong kører - nedkogt til version ${version}`);\r\n}\r\n\r\ninit();\r\n","export function activateProfile() {\r\n const container = document.body.querySelector('.top-bar__profile');\r\n\r\n if (container) {\r\n const btn = container.querySelector('button');\r\n\r\n btn.addEventListener('click', e => {\r\n e.preventDefault();\r\n container.classList.toggle('open');\r\n });\r\n }\r\n}\r\n"],"names":["functionReferences","readyState","document","readyEventBound","emptyCallbackArrays","length","tempArray","slice","forEach","funcRef","onReady","functionReference","addEventListener","push","getElementScroll","element","window","Element","Document","Window","left","pageXOffset","documentElement","scrollLeft","top","pageYOffset","scrollTop","scrollX","scrollY","console","warn","className","scrollLocked","enableScrollLock","scrollPosition","scrollTo","htmlTag","classList","add","style","marginTop","position","overflow","width","body","overflowY","disableScrollLock","remove","removeAttribute","nav","ticking","scrollFunctions","animate","scrollHandler","requestAnimationFrame","onScroll","handler","triggerNow","toggleMenuOpen","contains","setTimeout","currentBreakpoint","resizeTimer","lastUsedScreenWidth","breakpoints","breakpointKeys","Object","keys","currentWindowWidth","innerWidth","currentBreakpointIndex","resizeFunctions","getWindowSizes","lastFoundWidth","key","index","resizeHandler","clearTimeout","onWindowResize","lazyArray","options","loadedClass","loadClass","decodeImg","oldIe11Fit","offset","lazyLoad","i","lazyElem","rect","getBoundingClientRect","bottom","right","innerHeight","clientHeight","clientWidth","loadBgImage","loadLazyImage","Array","prototype","filter","call","l","bgContainer","handleLoadedBg","backgroundImage","formattedSrc","src","getImageSrc","loadImage","then","container","oldImage","querySelector","getAttribute","objectFitPolyfill","removeChild","newImageTag","tagName","altText","setAttribute","appendChild","path","newImage","Image","Promise","resolve","decode","image","largestBreakpointFound","breakpointName","srcAttribute","transitionEndEventName","detectStyleDeclatationName","eventTypeName","transitions","transition","OTransition","MozTransition","WebkitTransition","el","createElement","t","undefined","cssAnimateNewHeight","newHeight","classTarget","classOnBoth","prevHeight","offsetHeight","delayedClose","removeEventListener","height","activeAccordion","keycode","Accordion","trigger","dom","parentNode","nextElementSibling","settings","type","e","event","ctrlKey","metaKey","shiftKey","preventDefault","_this","ariaExpanded","setupAccordions","selector","accordions","querySelectorAll","location","hash","indexOf","accordionContent","getElementById","replace","click","openAccordByHashId","setVhProp","vh","setProperty","addPrefetch","kind","url","as","linkElem","rel","href","crossorigin","head","append","focusedElement","activeElement","keyCode","closest","previousElementSibling","focus","to","duration","callback","start","change","relativeTo","useElement","offsetTop","offsetLeft","getElementPosition","currentTime","time","ts","tc","amount","val","scrollingElement","Video","elem","roundedWidth","roundedHeight","id","bg","byline","color","controls","replaceHref","this","videoLink","match","extractVideoIdFromUrl","isPrivate","isVimeo","poster","Math","ceil","round","devicePixelRatio","getContext","toDataURL","warmConnections","once","returnVideoIframeUrl","addIframe","videoService","videoUrl","iframe","_this2","preconnected","activeOverlay","activeOverlayContent","activeOverlayCloseBtn","classNames","activeBtn","hiddenItem","activeRadio","Filter","filters","targetContainer","filterType","itemCountReplace","filterHandler","replaceWithNumberOfItems","target","filterItems","isButton","filterValue","value","transitionItems","item","itemFilterValues","split","cleanFilterValue","trim","toLowerCase","map","filterValues","getSetValues","showItem","cleanValue","replaceValue","children","items","option","count","optionStr","innerText","valArray","len","checked","openClass","outsideClickListener","offsetWidth","getClientRects","overlayClose","overlayOpen","lockScroll","targetId","showCookieBanner","declaration","hideCookieBanner","openTab","tab","tabContent","activeTab","activeTabContent","openTabByHashId","tabs","global","factory","EvEmitter","proto","on","eventName","listener","events","_events","listeners","onceEvents","_onceEvents","off","splice","emitEvent","args","onceListeners","apply","allOff","module","exports","getStyleSize","num","parseFloat","isNaN","logError","message","error","measurements","measurementsLength","getStyle","getComputedStyle","isBoxSizeOuter","isSetup","getSize","div","padding","borderStyle","borderWidth","boxSizing","setup","nodeType","display","size","outerWidth","outerHeight","getZeroSize","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","matchesMethod","ElemProto","matches","matchesSelector","prefixes","method","utils","extend","a","b","prop","modulo","arraySlice","makeArray","obj","isArray","removeFrom","ary","getParent","getQueryElement","handleEvent","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","methodName","threshold","timeoutName","timeout","arguments","docReady","toDashed","str","$1","$2","htmlInit","WidgetClass","namespace","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","concat","dataOptionsAttr","jQuery","attr","JSON","parse","instance","data","require$$0","fizzyUIUtils","Cell","parent","create","x","shift","destroy","unselect","side","originSide","setPosition","updateTarget","renderPosition","setDefaultTarget","marginProperty","cellAlign","getPositionValue","select","wrapShift","slideableWidth","Flickity","Slide","isOriginLeft","cells","addCell","cell","max","beginMargin","firstMargin","endMargin","lastCell","getLastCell","lastMargin","slideWidth","getCellElements","startAnimation","isAnimating","restingFrames","applyDragForce","applySelectedAttraction","previousX","integratePhysics","positionSlider","settle","wrapAround","shiftWrapCells","setTranslateX","dispatchScrollEvent","is3d","cursorPosition","rightToLeft","translateX","slider","transform","firstSlide","slides","positionX","progress","slidesWidth","dispatchEvent","positionSliderAtSelected","selectedSlide","velocity","percentPosition","isPointerDown","isFreeScrolling","selectedIndex","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","gap","cellShift","_unshiftCells","getFrictionFactor","applyForce","force","getRestingPosition","isDraggable","dragForce","dragX","selectedAttraction","animatePrototype","require$$1","require$$2","require$$3","require$$4","require$$5","_Flickity","moveElements","toElem","GUID","instances","queryElement","flickityGUID","$element","constructor","defaults","_create","accessibility","freeScrollFriction","friction","namespaceJQueryEvents","resize","setGallerySize","createMethods","guid","viewport","_createSlider","watchCSS","activate","opts","isActive","_filterFindCellElements","reloadCells","tabIndex","selectInitialIndex","isInitActivated","cellSelector","_makeCells","positionCells","_getWrapShiftCells","cellElem","getLastSlide","_sizeCells","_positionCells","maxCellHeight","cellX","startCell","updateSlides","_containSlides","slide","nextMargin","canCellFit","_getCanCellFit","updateSelectedSlide","groupCells","number","parseInt","percentMatch","percent","_init","reposition","setCellAlign","cellAlignShorthands","center","shorthand","adaptiveHeight","gapX","cellIndex","_getGapCells","increment","contain","isRightToLeft","contentWidth","isContentSmaller","beginBound","endBound","min","emitArgs","$event","jQEvent","Event","isWrap","isInstant","_wrapSelect","prevIndex","wrapIndex","delta","abs","backWrapDelta","forewardWrapDelta","isDragSelect","previous","next","unselectSelectedSlide","selectedCells","selectedElements","selectedCell","selectedElement","initialIndex","queryCell","selectCell","getCellSlideIndex","getCell","getCells","getParentCell","getAdjacentCellElements","adjCount","cellElems","slideIndex","uiChange","childUIPointerDown","onresize","content","deactivate","onkeydown","isNotFocused","keyboardHandlers","37","leftMethod","39","rightMethod","prevScrollY","preventScroll","removeData","bridget","setJQuery","jq","Unipointer","bindStartEvent","_bindStartEvent","unbindStartEvent","isAdd","bindMethod","startEvent","PointerEvent","getTouch","touches","touch","identifier","pointerIdentifier","onmousedown","button","_pointerDown","ontouchstart","changedTouches","onpointerdown","pointer","pointerId","pointerDown","_bindPostStartEvents","postStartEvents","mousedown","touchstart","pointerdown","_boundPointerEvents","_unbindPostStartEvents","onmousemove","_pointerMove","onpointermove","ontouchmove","pointerMove","onmouseup","_pointerUp","onpointerup","ontouchend","_pointerDone","pointerUp","_pointerReset","pointerDone","onpointercancel","_pointerCancel","ontouchcancel","pointerCancel","getPointerPoint","pageX","y","pageY","Unidragger","bindHandles","_bindHandles","unbindHandles","touchAction","_touchActionValue","handles","handle","okayPointerDown","pointerDownPointer","pointerDownBlur","cursorNodes","TEXTAREA","INPUT","SELECT","OPTION","clickTypes","radio","checkbox","submit","file","isCursorNode","nodeName","isClickType","isOkay","focused","blur","moveVector","_dragPointerMove","_dragMove","isDragging","hasDragStarted","_dragStart","_dragPointerUp","_dragEnd","_staticClick","isPreventingClicks","dragStart","dragMove","bind","dragEnd","onclick","isIgnoringMouseUp","staticClick","draggable","dragThreshold","isTouch","isTouchmoveScrollCanceled","_createDrag","onActivateDrag","_uiChangeDrag","onDeactivateDrag","updateDraggable","bindDrag","unbindDrag","_pointerDownPreventDefault","pointerDownFocus","pointerDownScroll","getScrollPosition","_pointerDownDefault","focusNodes","isTouchStart","isTouchPointer","pointerType","isFocusNode","isTouchScrolling","dragStartPosition","previousDragX","direction","originBound","dragMoveTime","Date","freeScroll","dragEndRestingSelect","restingX","dragEndBoostSelect","distance","getSlideDistance","positiveResting","_getClosestResting","negativeResting","minDistance","Infinity","condition","d","md","isWrapAround","wrap","floor","clickedCell","onscroll","scroll","scrollMoveX","scrollMoveY","svgURI","PrevNextButton","isEnabled","isPrevious","leftDirection","isLeft","disable","svg","createSVG","update","createElementNS","shape","pathMovements","arrowShape","x0","x1","y1","x2","y2","x3","enable","disabled","lastIndex","boundIndex","prevNextButtons","_createPrevNextButtons","prevButton","nextButton","activatePrevNextButtons","deactivatePrevNextButtons","PageDots","holder","dots","handleClick","onClick","setDots","addDots","removeDots","fragment","createDocumentFragment","newDots","dot","updateSelected","selectedDot","onTap","pageDots","_createPageDots","activatePageDots","updateSelectedPageDots","updatePageDots","deactivatePageDots","Player","state","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","play","hidden","tick","autoPlay","clear","stop","pause","unpause","pauseAutoPlayOnHover","_createPlayer","player","activatePlayer","stopPlayer","deactivatePlayer","playPlayer","pausePlayer","unpausePlayer","onmouseenter","onmouseleave","insert","isAppend","insertCellElement","insertBefore","endCells","cellChange","prepend","minCellIndex","cellSizeChange","changedCellIndex","isPositioningSlider","prevSelectedElem","LazyLoader","img","flickity","load","_createLazyload","lazyImages","lazyCellImages","lazyloadAttr","srcAttr","srcsetAttr","imgs","getCellLazyImages","srcset","onload","complete","onerror","Slider","mobileMode","flkty","bindEvents","scope","navButtons","from","previousSelectedButton","selectedButton","invalidClass","checkValidation","input","valid","field","textAreaAutoHeight","scrollHeight","checkFieldValue","serialize","form","j","q","elements","name","encodeURIComponent","selected","join","setupUmbracoMemberLoginForm","loginForm","XHR","XMLHttpRequest","formData","clearFormMessage","onreadystatechange","DONE","status","hasAttribute","reload","displayFormMessage","responseText","Message","open","setRequestHeader","send","setupUmbracoMemberResetPasswordForm","passwordRecoveryForm","displaySuccessMessage","setupUmbracoMemberChangePasswordForm","parentElem","formMessage","textContent","newElement","existingElement","node","createTextNode","nextSibling","insertElementAfter","setupUmbracoMemberLogin","logoutTriggers","logout","setupUmbracoMemberLogoutTriggers","spinner","patch","clipperLeft","clipperRight","cloneNode","show","hide","mediaList","opened","loaded","current","containerWidth","containerHeight","addImage","title","n","overlay","frame","loading","closeBtn","innerHTML","lang","close","prevBtn","prev","nextBtn","openBtn","openInNew","stopPropagation","openSource","resizeContainer","keyDownHandler","loadMedia","parentElement","s","setMedia","r","Error","galleries","openGallery","_waMediaBoxBound","String","o","bindAll","WAMediaBox","lazySizes","cfg","loadMode","preloadAfterLoad","autoSizer","checkElems","setupNav","getElementsByClassName","setupLazyLoading","filterContainers","setupFilters","overlayButtonOpen","setupOverlay","videos","setupVideos","tabsContainer","setupTabs","sliders","setupSliders","f","fields","watchFormFields","toggle","showBtns","showBtn","showElem","hideElem","showHideElem","info"],"mappings":"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"}