{"version":3,"file":"main.min.js","sources":["../../../Frontend/js/utils/windowResize.js","../../../Frontend/js/utils/scroll.js","../../../Frontend/js/utils/onReady.js","../../../Frontend/js/utils/elementProperties.js","../../../Frontend/js/utils/scrollLock.js","../../../Frontend/js/components/nav.js","../../../Frontend/js/utils/stickyNavOnScroll.js","../../../Frontend/js/utils/animation.js","../../../Frontend/js/components/accordion.js","../../../Frontend/js/utils/helpers.js","../../../Frontend/js/utils/scrollTo.js","../../../Frontend/js/utils/lazyImage.js","../../../Frontend/js/components/video.js","../../../Frontend/js/components/anchors.js","../../../Frontend/js/components/filter.js","../../../Frontend/js/components/overlay.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","../../../Frontend/js/main.js"],"sourcesContent":["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","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","/**\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","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 { getElementScroll } from './elementProperties';\r\nimport { scrollLocked } from './scrollLock';\r\nimport { onScroll } from './scroll';\r\n\r\n/**\r\n * \r\n * @param {HTMLElement} element - element to add sticky class to\r\n * @param {string} className - sticky class name to add on scroll\r\n * @param {number} scrollInPixels - number of pixels before activating scroll\r\n * @param {string} goingUpClass - class added when scrolling up\r\n */\r\nexport function stickyNavOnScroll(element, className = 'nav--sticky', scrollInPixels = 30, goingUpClass = 'nav--going-up') {\r\n let scrollTimer;\r\n let lastScrollPosition;\r\n\r\n const scrollHandler = () => {\r\n\r\n clearTimeout(scrollTimer);\r\n\r\n if (!scrollLocked) {\r\n scrollTimer = setTimeout(() => {\r\n const windowScroll = getElementScroll();\r\n \r\n if (windowScroll.top > scrollInPixels) {\r\n element.classList.add(className);\r\n \r\n if (lastScrollPosition > windowScroll.top) {\r\n element.classList.add(goingUpClass);\r\n } else {\r\n element.classList.remove(goingUpClass);\r\n }\r\n \r\n lastScrollPosition = windowScroll.top;\r\n } else {\r\n element.classList.remove(className);\r\n element.classList.remove(goingUpClass);\r\n }\r\n }, 30);\r\n }\r\n\r\n };\r\n\r\n onScroll(scrollHandler, true);\r\n}\r\n","gsap.registerPlugin(ScrollTrigger);\r\n\r\nexport const transitionEndEventName = detectStyleDeclatationName();\r\nexport const animationEndEventName = detectStyleDeclatationName('animation');\r\n\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\n/**\r\n *\r\n * @param {HTMLElement} container - container to animate height of\r\n * @param {HTMLElement} classTarget [default = container] - target element that gets class\r\n * @param {Boolean} classOnBoth [default = false] - set class on both container and classTarget\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}\r\n\r\nexport function scrollAnimations() {\r\n\r\n //Scroll trigger for text-image\r\n const textImages = document.querySelectorAll('.text-image--animate');\r\n for (let i = 0; i < textImages.length; i++) {\r\n const textImage = textImages[i];\r\n const txt = textImage.querySelector('.text-image__text');\r\n const img = textImage.querySelector('img');\r\n\r\n if (txt && img) {\r\n const isReversed = textImage.querySelector('.grid-row').classList.contains('grid-row--reverse');\r\n\r\n const timeLine = gsap.timeline({\r\n scrollTrigger: {\r\n trigger: textImage,\r\n toggleActions:'restart none none none',\r\n start: 'top bottom',\r\n // markers: true,\r\n }\r\n });\r\n\r\n\r\n timeLine.from(txt,{\r\n x:isReversed ? 500 : -500,\r\n alpha:0,\r\n ease: 'power3.out',\r\n duration:.7,\r\n\r\n });\r\n timeLine.from(img,{\r\n x:isReversed ? -500 : 500,\r\n alpha:0,\r\n ease: 'power3.out',\r\n duration:.7,\r\n\r\n },'-=.7');\r\n\r\n img.addEventListener('lazyloaded', () => {\r\n ScrollTrigger.refresh();\r\n });\r\n\r\n\r\n }\r\n }\r\n\r\n\r\n\r\n //Scroll trigger for events\r\n const events = document.querySelectorAll('.event');\r\n\r\n for (let i = 0; i < events.length; i++) {\r\n const event = events[i];\r\n const txt = event.querySelector('.col.col--sm-6.h--pad.v--pad');\r\n const img = event.querySelector('img');\r\n\r\n if (txt && img) {\r\n\r\n const timeLine = gsap.timeline({\r\n scrollTrigger: {\r\n trigger: event,\r\n toggleActions:'restart none none none',\r\n start: 'top bottom',\r\n // markers: true,\r\n }\r\n });\r\n\r\n\r\n timeLine.from(txt,{\r\n x:500,\r\n alpha:0,\r\n ease: 'power2.out',\r\n duration:.7,\r\n });\r\n timeLine.from(img,{\r\n x:-500,\r\n alpha:0,\r\n ease: 'power2.out',\r\n duration:.7,\r\n\r\n },'-=.7');\r\n\r\n img.addEventListener('lazyloaded', () => {\r\n ScrollTrigger.refresh();\r\n });\r\n\r\n\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n //Scroll trigger for events\r\n const sliders = document.querySelectorAll('.slider');\r\n\r\n for (let i = 0; i < sliders.length; i++) {\r\n const slider = sliders[i];\r\n const sliderItems = slider.querySelectorAll('.slider__cell');\r\n\r\n if (sliderItems) {\r\n\r\n const timeLine = gsap.timeline({\r\n scrollTrigger: {\r\n trigger: sliders,\r\n toggleActions:'play none none none',\r\n start: 'top center',\r\n // markers: true,\r\n }\r\n });\r\n\r\n timeLine.from(sliderItems,{\r\n x:500,\r\n alpha:0,\r\n ease: 'power2.out',\r\n duration:0.7,\r\n stagger: 0.1,\r\n });\r\n\r\n }\r\n }\r\n\r\n\r\n //Memberlist\r\n // const memberLists = document.querySelectorAll('.participants--list--large');\r\n // if (memberLists) {\r\n // for (let i = 0; i < memberLists.length; i++) {\r\n // const memberList = memberLists[i];\r\n\r\n // console.log(memberList);\r\n\r\n // const members = memberList.querySelectorAll('.participants--list__participant');\r\n\r\n // if (members) {\r\n // const timeLine = gsap.timeline({\r\n // scrollTrigger: {\r\n // trigger: memberList,\r\n // toggleActions:'play none none none',\r\n // start: 'bottom bottom',\r\n // // markers: true,\r\n // }\r\n // });\r\n\r\n\r\n // timeLine.from(members,{\r\n // scale:0,\r\n // alpha:0,\r\n // ease: 'power2.out',\r\n // duration:0.3,\r\n // stagger: 0.01,\r\n\r\n // });\r\n\r\n\r\n\r\n // }\r\n // }\r\n // }\r\n\r\n\r\n // const members = memberList.querySelectorAll('.participants--list__participant');\r\n // if (members) {\r\n // ScrollTrigger.batch('.participants--list__participant',{\r\n // onEnter: batch => gsap.from(batch, {alpha:1,stagger:0.1})\r\n // });\r\n // }\r\n\r\n\r\n}\r\n\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\r\n if (focusedElement) {\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\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 { breakpointKeys, currentBreakpointIndex } from '../utils/windowResize';\r\nimport { onWindowResize } from './windowResize';\r\nimport { onScroll } from './scroll';\r\n//import \"objectFitPolyfill\";\r\n\r\nexport const isBot = (!('onscroll' in window)) || (typeof navigator !== 'undefined' && /(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent));\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 (isBot || 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 (isBot || 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","import { addPrefetch, canUseWebP, getRoundedDimensions } from '../utils/helpers';\r\nimport { scrollTo } from '../utils/scrollTo';\r\nimport { loadImage } from '../utils/lazyImage';\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-id');\r\n this.controls = container.getAttribute('data-controls') || 1,\r\n this.bg = container.getAttribute('data-bg') || 0,\r\n this.byline = container.getAttribute('data-byline') || 0;\r\n this.scrollto = container.getAttribute('data-scroll-to') || 0;\r\n\r\n let videoLink;\r\n\r\n if (!this.id) {\r\n videoLink = container.getAttribute('data-video-link');\r\n if (videoLink) {\r\n this.id = extractVideoIdFromUrl(videoLink);\r\n } else {\r\n console.warn('Video missing video-id / data-video-link');\r\n return;\r\n }\r\n }\r\n\r\n this.isVimeo = container.getAttribute('data-action') === 'video-vimeo' || videoLink && videoLink.indexOf('vimeo') > -1;\r\n this.poster = container.getAttribute('data-poster');\r\n\r\n if (!this.poster) {\r\n if (this.isVimeo) {\r\n\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=${width}&mh=${height}&q=${devicePixelRatio > 1 ? 70 : 85}`;\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 loadImage(this.poster).then(newImageTag => {\r\n // Set src and ALT text if defined.\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 if (!!this.bg) {\r\n Video.warmConnections();\r\n this.addIframe();\r\n } else {\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 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 addIframe() {\r\n let videoUrl = this.isVimeo ? `https://player.vimeo.com/video/${this.id}?autoplay=1&rel=0` : `https://www.youtube-nocookie.com/embed/${this.id}?autoplay=1&rel=0`;\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 }, 300);\r\n\r\n if (this.scrollto) {\r\n scrollTo(this.container, 2000);\r\n }\r\n });\r\n\r\n videoUrl += `&controls=${this.controls}&byline=${this.byline}&background=${this.bg}&mute=${this.bg}`;\r\n\r\n iframe.src = '';\r\n iframe.setAttribute('data-src', videoUrl);\r\n iframe.classList.add('lazyload');\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 { scrollTo } from '../utils/scrollTo';\r\n\r\n/**\r\n * This function strips relative site path from hashlink \r\n * \r\n * @param {string} hashLink \r\n * \r\n * @returns {HTMLElement}\r\n */\r\nfunction returnHashElement(hashLink) {\r\n if (hashLink.indexOf(window.location.pathname) !== -1) {\r\n return document.getElementById(hashLink.replace(window.location.pathname, '').replace('#', ''));\r\n } else {\r\n return document.getElementById(hashLink.replace('#', ''));\r\n }\r\n}\r\n\r\n/**\r\n * Scrolls the viewport to an hash-id\r\n * if found in querystring\r\n */\r\nexport function scrollToUrlHash() {\r\n if (window.location.hash) {\r\n const element = document.getElementById(window.location.hash.replace('#', ''));\r\n\r\n if (element) {\r\n scrollTo(element);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Activate Anchor Link Scroll with this function\r\n * Will only run if given selector elements are found in DOM\r\n * \r\n * @param {string} triggerSelector \r\n */\r\n\r\nexport function setupAnchorLinkScroll(triggerSelector = '[data-action*=\"anchor\"], a[href^=\"#\"]:not([href=\"#\"]):not([role=\"tab\"]):not([data-action*=\"accordion\"])') {\r\n\r\n const triggers = document.querySelectorAll(triggerSelector);\r\n\r\n for (let i = 0; i < triggers.length; i++) {\r\n const trigger = triggers[i];\r\n const hashLink = trigger.getAttribute('href') || trigger.getAttribute('data-target');\r\n\r\n if (hashLink) {\r\n const element = returnHashElement(hashLink);\r\n\r\n trigger.addEventListener('click', e => {\r\n e.preventDefault();\r\n scrollTo(element);\r\n });\r\n }\r\n }\r\n}\r\n","const classNames = {\r\n hiddenItem: 'hidden',\r\n filteredItem: 'filtered',\r\n filteringItem: 'filtering'\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 search: container.querySelector('[data-filter][type=\"text\"]'),\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 const filter = this.dom.filters[i];\r\n if (filter.tagName === 'SELECT') {\r\n filter.addEventListener('change', e => this.filterHandler(e));\r\n\r\n // Trigger change if filter.value is cached in the browser\r\n setTimeout(() => {\r\n if (filter.value != undefined) {\r\n filter.dispatchEvent(new Event('change'));\r\n }\r\n }, 0);\r\n\r\n } else if (filter.type === 'text') {\r\n filter.addEventListener('keyup', e => this.filterHandler(e));\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 filterHandler() {\r\n const filterItems = this.dom.targetContainer.querySelectorAll('[data-filter-value]');\r\n\r\n this.dom.targetContainer.classList.add(classNames.filteringItem);\r\n this.dom.targetContainer.classList.add(classNames.filteredItem);\r\n\r\n setTimeout(() => {\r\n this.dom.targetContainer.classList.remove(classNames.filteringItem);\r\n }, 300);\r\n\r\n const filterValues = Filter.getSetValues(this.dom.filters);\r\n const searchItem = this.dom.search;\r\n const cleanSearchValue = searchItem ? searchItem.value.trim().toLowerCase() : '*';\r\n\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n const itemSearchValue = item.textContent.trim().toLowerCase();\r\n const itemSearchTagValues = item.hasAttribute('data-search-value') ? item.getAttribute('data-search-value').toLowerCase() : null;\r\n const itemFilterValues = item.getAttribute('data-filter-value').split(',')\r\n .map(value => value.trim().toLowerCase());\r\n let showItem = true;\r\n\r\n for (let i = 0; i < filterValues.length; i++) {\r\n const value = filterValues[i];\r\n const cleanFilterValue = value.trim().toLowerCase();\r\n\r\n if (cleanFilterValue != '*' && itemFilterValues.indexOf(cleanFilterValue) === -1) {\r\n showItem = false;\r\n }\r\n }\r\n\r\n if (cleanSearchValue != '*' && itemSearchValue.indexOf(cleanSearchValue) === -1 && itemSearchTagValues.indexOf(cleanSearchValue) === -1) {\r\n showItem = false;\r\n }\r\n\r\n if (!filterValues.length) {\r\n this.dom.targetContainer.classList.remove(classNames.filteredItem);\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 static getSetValues(filters) {\r\n const valArray = [];\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 }\r\n }\r\n return valArray;\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","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\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\r\n if (this.container) {\r\n const mobileMode = !(currentWindowWidth > 1023);\r\n\r\n this.flkty = new Flickity(this.container, {\r\n cellAlign: 'left',\r\n prevNextButtons: false,\r\n percentPosition: false,\r\n autoPlay: parseInt(this.container.getAttribute('data-autoplay')) || false,\r\n wrapAround: false,\r\n selectedAttraction: mobileMode ? 0.025 : 0.02,\r\n friction: 0.20,\r\n pageDots: false,\r\n draggable: true,\r\n adaptiveHeight: false,\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 > 1023);\r\n\r\n scope.flkty.option({ cellAlign: 'left' });\r\n scope.flkty.reloadCells();\r\n }\r\n );\r\n\r\n //Custom navigation\r\n const cellsButtonGroup = this.container.parentElement.querySelector('.slider__nav');\r\n\r\n const previousButton = this.container.parentElement.querySelectorAll('.btn--previous');\r\n const nextButton = this.container.parentElement.querySelectorAll('.btn--next');\r\n\r\n // previous\r\n if (previousButton) {\r\n for (let i = 0; i < previousButton.length; i++) {\r\n\r\n previousButton[i].addEventListener('click', function () {\r\n scope.flkty.previous();\r\n });\r\n }\r\n }\r\n // next\r\n if (nextButton) {\r\n for (let i = 0; i < nextButton.length; i++) {\r\n\r\n nextButton[i].addEventListener('click', function () {\r\n scope.flkty.next();\r\n });\r\n }\r\n }\r\n\r\n\r\n function disableButton() {\r\n if (previousButton) {\r\n\r\n for (let i = 0; i < previousButton.length; i++) {\r\n if (scope.flkty.selectedIndex == 0) {\r\n previousButton[i].disabled = true;\r\n }\r\n else {\r\n previousButton[i].disabled = false;\r\n }\r\n }\r\n }\r\n\r\n if (nextButton) {\r\n for (let i = 0; i < nextButton.length; i++) {\r\n\r\n if (scope.flkty.selectedIndex == cellsButtonGroup.children.length - 1) {\r\n nextButton[i].disabled = true;\r\n }\r\n else {\r\n nextButton[i].disabled = false;\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n }\r\n\r\n disableButton();\r\n\r\n if (cellsButtonGroup) {\r\n const navButtons = Array.from(cellsButtonGroup.children);\r\n\r\n // update buttons on select\r\n this.flkty.on('select', function () {\r\n const previousSelectedButton = cellsButtonGroup.querySelector('.is-selected');\r\n const selectedButton = cellsButtonGroup.children[scope.flkty.selectedIndex];\r\n previousSelectedButton.classList.remove('is-selected');\r\n selectedButton.classList.add('is-selected');\r\n\r\n disableButton();\r\n\r\n });\r\n\r\n // cell select\r\n cellsButtonGroup.addEventListener('click', function (event) {\r\n if (!event.target.matches('[data-nav=\"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\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\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 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 container with fields to validate\r\n */\r\n\r\nexport function watchFormFields(selector = '[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\r\n //Check for prefilled fields\r\n checkFieldValue(field);\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}\r\n\r\n/**\r\n * Sets up Form submit eventhandler used when submitting form data through Mandrill\r\n *\r\n * @param {string} selector - querySelector string\r\n */\r\nexport function setupMandrilForms(selector = 'form[data-action*=\"form-mandrill\"]') {\r\n //mandrill forms\r\n const mandrillForms = document.querySelectorAll(selector);\r\n\r\n function mandrillFormSubmit(e) {\r\n e.preventDefault();\r\n\r\n const form = e.target;\r\n if (form !== null) {\r\n if (validateForm(form)) {\r\n form.classList.add('form--working');\r\n\r\n const dealerSelect = form.querySelector('select[name=dealer-mail]');\r\n\r\n if (dealerSelect) {\r\n const dealer = dealerSelect.querySelector(`option[value=\"${dealerSelect.value}\"]`);\r\n\r\n if (dealer && dealer.innerText !== 0) {\r\n form.querySelector('input[name=dealer-name]').value = dealer.innerText;\r\n }\r\n }\r\n\r\n const XHR = new XMLHttpRequest();\r\n const formData = serialize(form);\r\n\r\n // Define what happens\r\n XHR.onreadystatechange = function () {\r\n if (this.readyState === this.DONE) {\r\n if (XHR.onreadystatechange) {\r\n XHR.onreadystatechange = null;\r\n const json = JSON.parse(this.responseText);\r\n\r\n if (json.status !== 'ok') {\r\n const errorText = form.getAttribute('data-error-message');\r\n alert(errorText);\r\n window.console.warn(json);\r\n\r\n form.classList.remove('form--working');\r\n } else {\r\n window.location = form.getAttribute('data-confirmation-url');\r\n }\r\n }\r\n }\r\n };\r\n // Set up our request\r\n XHR.open('POST', '/umbraco/api/mail/sendmultinestedcontent', true);\r\n // Add the required HTTP header for form data POST requests\r\n XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n // Finally, send our data.\r\n XHR.send(formData);\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < mandrillForms.length; i++) {\r\n mandrillForms[i].addEventListener('submit', mandrillFormSubmit);\r\n }\r\n}\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 if (responseJson.Message === 'Could not log in user') {\r\n responseJson.Message = 'Kunne ikke logge på bruger';\r\n }\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\n\r\n/**\r\n * Sets up Form submit eventhandler used when submitting form for edit member profile\r\n *\r\n * @param {string} selector - querySelector string\r\n */\r\nexport function setupUmbracoMemberEditProfileForm (selector = 'form[data-action*=\"umbraco-member-edit\"]') {\r\n const editMemberForm = document.querySelector(selector);\r\n\r\n function memberEditSubmit(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/updateprofile', true);\r\n XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n XHR.send(formData);\r\n }\r\n\r\n if (editMemberForm) {\r\n editMemberForm.addEventListener('submit', memberEditSubmit);\r\n }\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 setupUmbracoMemberEditProfileForm();\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","import { onWindowResize, currentBreakpoint, currentBreakpointIndex } from './utils/windowResize';\r\nimport { onScroll, scrollTop } from './utils/scroll';\r\nimport { onReady } from './utils/onReady';\r\nimport { setupNav } from './components/nav';\r\n// import { setupLazyLoading } from './utils/lazyImage';\r\nimport { setupAccordions } from './components/accordion';\r\nimport { setupVideos } from './components/video';\r\nimport { initVhUnitOverwrite, showHideElem } from './utils/helpers';\r\n// import { version } from '../../package.json';\r\nimport { setupAnchorLinkScroll } from './components/anchors';\r\nimport { setupFilters } from './components/filter';\r\nimport { setupOverlay } from './components/overlay';\r\nimport { setupTabs } from './components/tabs';\r\nimport { setupSliders } from './components/slider';\r\nimport { watchFormFields } from './components/form';\r\nimport { setupUmbracoMemberLogin } from './components/umbraco-member';\r\nimport { scrollAnimations } from './utils/animation';\r\n// import lazySizes from 'lazysizes';\r\n// Below are example of how to use import libraries installed via npm.\r\n// import sal from 'sal.js';\r\n\r\nfunction init() {\r\n document.body.classList.remove('standby');\r\n\r\n lazySizes.cfg.loadMode = 1;\r\n lazySizes.cfg.preloadAfterLoad = false;\r\n lazySizes.autoSizer.checkElems();\r\n\r\n setupAnchorLinkScroll();\r\n\r\n setupNav('.nav');\r\n\r\n onReady(() => {\r\n initVhUnitOverwrite();\r\n\r\n setupAccordions();\r\n\r\n\r\n setupOverlay();\r\n\r\n setupVideos();\r\n\r\n setupTabs();\r\n\r\n setupSliders();\r\n\r\n setupUmbracoMemberLogin();\r\n\r\n watchFormFields();\r\n\r\n showHideElem();\r\n\r\n setupFilters();\r\n\r\n scrollAnimations();\r\n\r\n });\r\n\r\n // Simulated CookieBot function-call via GTM\r\n //window.showCookieBanner();\r\n\r\n}\r\n\r\ninit();\r\n"],"names":["currentBreakpoint","resizeTimer","breakpoints","breakpointKeys","Object","keys","currentWindowWidth","window","innerWidth","resizeFunctions","getWindowSizes","lastFoundWidth","forEach","key","index","width","resizeHandler","clearTimeout","setTimeout","funcRef","onWindowResize","handler","addEventListener","push","document","documentElement","scrollTop","body","ticking","scrollFunctions","animate","scrollHandler","requestAnimationFrame","onScroll","triggerNow","length","functionReferences","readyState","readyEventBound","emptyCallbackArrays","tempArray","slice","onReady","functionReference","getElementScroll","element","Element","Document","Window","left","pageXOffset","scrollLeft","top","pageYOffset","scrollX","scrollY","console","warn","nav","className","scrollLocked","enableScrollLock","scrollPosition","htmlTag","scrollTo","classList","add","style","marginTop","position","overflow","overflowY","disableScrollLock","remove","removeAttribute","toggleMenuOpen","contains","setupNav","selector","sticky","querySelector","scrollTimer","lastScrollPosition","scrollInPixels","goingUpClass","windowScroll","stickyNavOnScroll","gsap","registerPlugin","ScrollTrigger","transitionEndEventName","detectStyleDeclatationName","eventTypeName","transitions","transition","OTransition","MozTransition","WebkitTransition","el","createElement","t","undefined","cssAnimateNewHeight","container","newHeight","classTarget","classOnBoth","prevHeight","offsetHeight","delayedClose","removeEventListener","height","activeAccordion","keycode","Accordion","trigger","dom","parentNode","nextElementSibling","settings","type","getAttribute","e","event","ctrlKey","metaKey","shiftKey","preventDefault","_this","setAttribute","ariaExpanded","setupAccordions","accordionContent","accordions","querySelectorAll","i","location","hash","indexOf","getElementById","replace","click","setVhProp","vh","innerHeight","setProperty","addPrefetch","kind","url","as","linkElem","rel","href","crossorigin","head","append","focusedElement","activeElement","keyCode","closest","previousElementSibling","focus","easeInOutQuintic","currentTime","start","change","duration","time","ts","tc","to","callback","relativeTo","useElement","offsetTop","offsetLeft","rect","getBoundingClientRect","getElementPosition","amount","val","scrollingElement","navigator","test","userAgent","loadImage","path","newImage","Image","Promise","resolve","decode","then","image","src","Video","videoLink","devicePixelRatio","elem","roundedWidth","roundedHeight","id","controls","this","bg","byline","scrollto","match","extractVideoIdFromUrl","isVimeo","poster","Math","ceil","round","getContext","toDataURL","newImageTag","altText","appendChild","warmConnections","addIframe","once","videoUrl","iframe","_this2","preconnected","setupAnchorLinkScroll","triggerSelector","triggers","hashLink","pathname","activeOverlay","activeOverlayContent","activeOverlayCloseBtn","classNames","Filter","search","filters","targetContainer","filterType","filter","tagName","filterHandler","value","dispatchEvent","Event","filterItems","filterValues","getSetValues","searchItem","cleanSearchValue","trim","toLowerCase","item","itemSearchValue","textContent","itemSearchTagValues","hasAttribute","itemFilterValues","split","map","showItem","cleanFilterValue","valArray","len","openClass","outsideClickListener","target","offsetWidth","getClientRects","overlayClose","overlayOpen","lockScroll","targetId","showCookieBanner","declaration","hideCookieBanner","openTab","tab","activeTab","activeTabContent","tabContent","openTabByHashId","tabs","global","factory","EvEmitter","proto","prototype","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","removeChild","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","Array","makeArray","obj","isArray","call","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","options","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","beginMargin","max","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","positionX","progress","firstSlide","slides","slidesWidth","positionSliderAtSelected","selectedSlide","velocity","percentPosition","isPointerDown","isFreeScrolling","selectedIndex","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","gap","cellShift","_unshiftCells","getFrictionFactor","applyForce","force","getRestingPosition","dragForce","isDraggable","dragX","selectedAttraction","animatePrototype","_Flickity","moveElements","toElem","GUID","instances","queryElement","flickityGUID","option","$element","constructor","defaults","_create","accessibility","freeScrollFriction","friction","namespaceJQueryEvents","resize","setGallerySize","createMethods","guid","viewport","_createSlider","watchCSS","activate","opts","isActive","_filterFindCellElements","children","reloadCells","tabIndex","selectInitialIndex","isInitActivated","cellSelector","_makeCells","positionCells","_getWrapShiftCells","cellElem","getLastSlide","_sizeCells","_positionCells","maxCellHeight","startCell","cellX","updateSlides","_containSlides","slide","nextMargin","canCellFit","_getCanCellFit","updateSelectedSlide","groupCells","number","parseInt","percentMatch","percent","_init","reposition","setCellAlign","cellAlignShorthands","center","right","shorthand","adaptiveHeight","gapX","cellIndex","_getGapCells","increment","isRightToLeft","contentWidth","isContentSmaller","beginBound","endBound","contain","min","$event","jQEvent","emitArgs","isWrap","isInstant","prevIndex","_wrapSelect","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","require$$1","require$$2","require$$3","require$$4","require$$5","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","direction","originBound","previousDragX","dragMoveTime","Date","restingX","freeScroll","dragEndRestingSelect","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","count","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","endCells","insertBefore","cellChange","prepend","minCellIndex","cellSizeChange","changedCellIndex","isPositioningSlider","prevSelectedElem","LazyLoader","img","flickity","load","_createLazyload","lazyLoad","lazyImages","lazyCellImages","lazyloadAttr","srcAttr","srcsetAttr","imgs","getCellLazyImages","srcset","onload","complete","onerror","Slider","mobileMode","flkty","bindEvents","scope","navButtons","cellsButtonGroup","parentElement","previousButton","disableButton","from","previousSelectedButton","selectedButton","invalidClass","checkValidation","input","valid","field","checked","textAreaAutoHeight","scrollHeight","checkFieldValue","serialize","form","j","q","elements","name","encodeURIComponent","selected","join","setupUmbracoMemberLoginForm","loginForm","XHR","XMLHttpRequest","formData","clearFormMessage","onreadystatechange","responseJson","DONE","status","reload","responseText","Message","displayFormMessage","open","setRequestHeader","send","setupUmbracoMemberResetPasswordForm","passwordRecoveryForm","displaySuccessMessage","setupUmbracoMemberChangePasswordForm","setupUmbracoMemberEditProfileForm","editMemberForm","parentElem","formMessage","newElement","existingElement","node","createTextNode","nextSibling","setupUmbracoMemberLogin","logoutTriggers","logout","setupUmbracoMemberLogoutTriggers","lazySizes","cfg","loadMode","preloadAfterLoad","autoSizer","checkElems","overlayButtonOpen","setupOverlay","videos","setupVideos","tabsContainer","setupTabs","sliders","setupSliders","f","fields","watchFormFields","showBtns","showBtn","showElem","hideElem","stopPropagation","showHideElem","filterContainers","setupFilters","textImages","isReversed","timeLine","textImage","txt","timeline","scrollTrigger","toggleActions","alpha","ease","refresh","sliderItems","stagger","scrollAnimations"],"mappings":"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"}