{"version":3,"file":"main.min.js","sources":["../../../../Frontend/js/utils/onReady.js","../../../../Frontend/js/utils/elementProperties.js","../../../../Frontend/js/utils/scrollLock.js","../../../../Frontend/js/utils/scroll.js","../../../../Frontend/js/components/nav.js","../../../../Frontend/js/utils/stickyNavOnScroll.js","../../../../Frontend/js/utils/clickOutside.js","../../../../Frontend/js/utils/windowResize.js","../../../../Frontend/js/utils/lazyImage.js","../../../../Frontend/js/utils/animation.js","../../../../Frontend/js/components/accordion.js","../../../../Frontend/js/utils/helpers.js","../../../../Frontend/js/utils/scrollTo.js","../../../../Frontend/js/components/anchors.js","../../../../Frontend/js/components/filter.js","../../../../Frontend/js/components/overlay.js","../../../../Frontend/js/components/tabs.js","../../../../Frontend/js/components/video-yt.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/usp.js","../../../../Frontend/js/components/featured-cases.js","../../../../Frontend/js/components/product-video.js","../../../../Frontend/js/components/intro.js","../../../../Frontend/js/main.js","../../../../Frontend/js/utils/intersect.js","../../../../Frontend/js/components/video.js"],"sourcesContent":["/**\r\n * Handler to trigger callbacks once the browser is ready for them.\r\n *\r\n * You can keep adding references using onReady() even after the page is loaded. In that case they will be\r\n * run at once.\r\n *\r\n * @example\r\n * import { onReady } from './utils/events/onReady';\r\n *\r\n * onReady(yourFunctionHere);\r\n *\r\n */\r\n\r\nlet functionReferences = [];\r\n\r\n// Set the initial readyState based on the browser's current state. If the script has been loaded\r\n// asynchronously, the DOM might be ready for us already, in which case there's no reason to delay\r\n// any further processing. The following will evaluate as true if the DOM is ready, or the page is\r\n// complete.\r\nlet readyState = document.readyState === 'interactive' || document.readyState === 'complete';\r\n\r\n// Defines whether or not the window.onReady event has been bound, so we won't do it twice. That\r\n// would just be stupid.\r\nlet readyEventBound = false;\r\n\r\n/**\r\n * Run the given array of callback functions.\r\n *\r\n * @private\r\n * @param {Array} funcArray\r\n */\r\nfunction runFunctionArray(funcArray) {\r\n funcArray.forEach(funcRef => funcRef());\r\n}\r\n\r\n/**\r\n * Empty the callback arrays\r\n *\r\n * @private\r\n */\r\nfunction emptyCallbackArrays() {\r\n // Keep iterating through the function references until there are none left.\r\n while (functionReferences.length) {\r\n // Set up a temporary array that mirrors the list of callbacks, and empty the real one.\r\n const tempArray = functionReferences.slice(0);\r\n functionReferences = [];\r\n\r\n // Run the callbacks. The callbacks themselves may set up more callbacks, which\r\n // is why we keep looping the array until we're done.\r\n runFunctionArray(tempArray);\r\n }\r\n\r\n // At this point we'll assume we're ready for anything!\r\n readyState = true;\r\n}\r\n\r\n/**\r\n * Make sure the \"ready\"-event is set.\r\n *\r\n * @private\r\n */\r\nfunction bindReadyEvent() {\r\n if (!readyEventBound) {\r\n if (document.readyState === 'loading') {\r\n // loading yet, wait for the event\r\n document.addEventListener('DOMContentLoaded', emptyCallbackArrays);\r\n } else {\r\n // DOM is ready!\r\n emptyCallbackArrays();\r\n }\r\n\r\n readyEventBound = true;\r\n }\r\n}\r\n\r\n/**\r\n * Register a function to run when the page is ready.\r\n *\r\n * @param {Function} functionReference - The function you want to run.\r\n */\r\nexport function onReady(functionReference) {\r\n if (typeof functionReference === 'function') {\r\n if (readyState) {\r\n functionReference();\r\n } else {\r\n bindReadyEvent();\r\n\r\n functionReferences.push(functionReference);\r\n }\r\n }\r\n}\r\n","/**\r\n * Utilities for checking properties and states of elements.\r\n */\r\n\r\n/**\r\n * Check if an element is empty.\r\n *\r\n * @param {Node} element - Check if this element is empty.\r\n * @param {boolean} [strict=true] - Set this to **false** to ignore nodes with whitespace.\r\n * @returns {boolean} **True** if the element is empty.\r\n */\r\nexport function elementIsEmpty(element, strict = true) {\r\n return strict ? !element.childNodes.length : !element.innerHTML.trim().length;\r\n}\r\n\r\n/**\r\n * Check if an element is hidden in the DOM with `display: none;`\r\n *\r\n * @param {HTMLElement} element - The element to check.\r\n * @returns {boolean} **True** if element is hidden, otherwise **false**.\r\n */\r\nexport function elementIsHidden(element) {\r\n return element.offsetParent === null;\r\n}\r\n\r\n/**\r\n * Check if an element is in the viewport\r\n *\r\n * @param {HTMLElement} elem - The element to check\r\n */\r\nexport function isVisible(elem) {\r\n return !!elem && !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\r\n}\r\n\r\n/**\r\n * Find out whether or not the given argument is an element that would react somewhat normally to DOM-manipulations.\r\n *\r\n * @param {*} element - The element to check.\r\n * @returns {boolean} `true` if the given argument is an element (or document, or window), and `false` otherwise.\r\n */\r\nexport function isElement(element) {\r\n return element instanceof Element || element instanceof Document || element instanceof Window;\r\n}\r\n\r\n/**\r\n * Return the position of an element\r\n *\r\n * @param {Element|String} element - The HTML element to work with or its ID\r\n * @param {Element|String|Window} [relativeTo=window] - The HTML element to return the position relative to or its ID\r\n * @returns {{top: Number, left: Number}} An object with top and left positions in pixels\r\n *\r\n *\r\n * @example Basic usage:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * const element = document.querySelector('.anElement');\r\n * getElementPosition(element);\r\n *\r\n *\r\n * @example Perform a search for an element with an ID equal to the string, i.e. 'elementId', and get the position of that:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * getElementPosition('elementId');\r\n */\r\nexport function getElementPosition(element, relativeTo = window) {\r\n const useElement = typeof element === 'string' ? document.getElementById(element) : element;\r\n\r\n // Throw error if element wasn't found\r\n if (!useElement) {\r\n throw 'getElementPosition did not find an element.';\r\n }\r\n\r\n const useRelativeTo = typeof relativeTo === 'string' ? document.getElementById(relativeTo) : relativeTo;\r\n\r\n // Throw error if relative element wasn't found\r\n if (!useRelativeTo) {\r\n throw 'getElementPosition did not find an element to show the position relative to.';\r\n }\r\n\r\n if (relativeTo === window) {\r\n // Return position relative to window\r\n const rect = useElement.getBoundingClientRect();\r\n return {\r\n top: rect.top + (window.pageYOffset || document.documentElement.scrollTop),\r\n left: rect.left + (window.pageXOffset || document.documentElement.scrollLeft)\r\n };\r\n } else {\r\n // Return position relative to declared element\r\n return {\r\n top: useElement.offsetTop - relativeTo.offsetTop,\r\n left: useElement.offsetLeft - relativeTo.offsetLeft\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Get the current scroll values of the given element (or window). Will return an object containing\r\n * \"left\" and \"top\" properties, which are set to the scroll values, or false if no compatible element\r\n * was given.\r\n *\r\n * @param {Element|Window} [element=window]\r\n * @returns {{ left: number, top: number } | boolean}\r\n */\r\nexport function getElementScroll(element = window) {\r\n if (isElement(element)) {\r\n if (element instanceof Window) {\r\n return {\r\n left: element.pageXOffset || document.documentElement.scrollLeft,\r\n top: element.pageYOffset || document.documentElement.scrollTop\r\n };\r\n } else {\r\n return {\r\n left: element.scrollX || element.scrollLeft,\r\n top: element.scrollY || element.scrollTop\r\n };\r\n }\r\n } else {\r\n console.warn('Can\\'t get scroll-position or given argument type.');\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get both width and height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includePadding=false] - Get size including padding (defaults to true)\r\n * @param {boolean} [options.includeBorder=false] - Get size including border (defaults to true)\r\n * @param {boolean} [options.includeMargin=true] - Get size including margin (defaults to false)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get size of pseudo element ':before' or ':after'\r\n * @returns {{width: number, height: number}} An object with the width and height as numbers\r\n */\r\nexport function getElementSize(element, options = {}) {\r\n // Get styles\r\n const elementStyle = window.getComputedStyle(element, options.pseudoElement);\r\n\r\n return {\r\n width: getElementWidth(element, options, elementStyle),\r\n height: getElementHeight(element, options, elementStyle)\r\n };\r\n}\r\n\r\n/**\r\n * Get width of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get width including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get width including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get width including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get width of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The width as a number\r\n */\r\nexport function getElementWidth(element, options = {}, elementStyle = null) {\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get width including border and padding\r\n let width = element.offsetWidth;\r\n\r\n if (!width) {\r\n width = parseInt(style.width);\r\n }\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 if (!height) {\r\n height = parseInt(style.height);\r\n }\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\nexport function getElementTransform(element) {\r\n const style = window.getComputedStyle(element);\r\n const transform = style.transform;\r\n\r\n const transformObj = {\r\n scaleX: 0,\r\n scaleY: 0,\r\n skewX: 0,\r\n skewY: 0,\r\n translateX: 0,\r\n translateY: 0\r\n }\r\n\r\n if (transform && transform != 'none') {\r\n const numberPattern = /-?\\d+\\.?\\d+|\\d+/g;\r\n const values = transform.match(numberPattern);\r\n\r\n transformObj.scaleX = parseFloat(values[0]),\r\n transformObj.scaleY = parseFloat(values[3]),\r\n transformObj.skewX = parseFloat(values[1]),\r\n transformObj.skewY = parseFloat(values[2]),\r\n transformObj.translateX = parseFloat(values[4]),\r\n transformObj.translateY = parseFloat(values[5]);\r\n }\r\n\r\n return transformObj;\r\n}\r\n","/**\r\n * A utility to **lock the viewport** at the current position in order to **stop scrolling**.\r\n *\r\n * @example Basic usage\r\n * import { enableScrollLock, disableScrollLock } from './utils/dom/scrollLock';\r\n *\r\n * enableScrollLock();\r\n * window.setTimeout(disableScrollLock, 3000);\r\n */\r\n\r\nimport { getElementScroll } from './elementProperties';\r\n\r\nconst className = 'scroll-lock';\r\nlet scrollTop = 0;\r\n\r\n/**\r\n * Get the current state of the scroll lock. `true` if the scroll lock is enabled, otherwise `false`.\r\n *\r\n * @type {boolean}\r\n */\r\nexport let scrollLocked = false;\r\n\r\n/**\r\n * Enable the scroll lock.\r\n */\r\nexport function enableScrollLock() {\r\n if (!scrollLocked) {\r\n // Get scroll position\r\n const scrollPosition = getElementScroll();\r\n\r\n // Reset scroll position\r\n window.scrollTo(scrollPosition.left, 0);\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.add(className);\r\n htmlTag.style.marginTop = `${-scrollPosition.top}px`;\r\n htmlTag.style.position = 'fixed';\r\n htmlTag.style.overflow = 'hidden';\r\n htmlTag.style.width = '100%';\r\n document.body.style.overflowY = 'scroll';\r\n\r\n // Remember state\r\n scrollLocked = true;\r\n scrollTop = scrollPosition.top;\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const enable = enableScrollLock;\r\n\r\n/**\r\n * Disable the scroll lock\r\n */\r\nexport function disableScrollLock() {\r\n if (scrollLocked) {\r\n const scrollPosition = getElementScroll();\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.remove(className);\r\n htmlTag.style.marginTop = '';\r\n htmlTag.style.position = '';\r\n htmlTag.style.overflow = '';\r\n htmlTag.style.width = '';\r\n document.body.removeAttribute('style');\r\n // Set the scroll position to what it was before\r\n window.scrollTo(scrollPosition.left, scrollTop);\r\n\r\n // Remember state\r\n scrollLocked = false;\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const disable = disableScrollLock;\r\n\r\n/**\r\n * Toggle the scroll lock between on and off\r\n */\r\nexport function toggleScrollLock() {\r\n if (scrollLocked) {\r\n disableScrollLock();\r\n } else {\r\n enableScrollLock();\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const toggle = toggleScrollLock;\r\n\r\nexport default {\r\n enable,\r\n disable,\r\n toggle\r\n};\r\n","export let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\r\n\r\nlet ticking = false;\r\nconst scrollFunctions = [];\r\n\r\nfunction animate() {\r\n scrollFunctions.forEach(funcRef => funcRef());\r\n\r\n ticking = false;\r\n}\r\n\r\nfunction requestTick() {\r\n if (!ticking) {\r\n requestAnimationFrame(animate);\r\n ticking = true;\r\n }\r\n}\r\n\r\nfunction scrollHandler() {\r\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\r\n requestTick();\r\n}\r\n/**\r\n * Adds a function to a function array, executed on a single scroll-event set on window.\r\n * This avoids the memory load and possible hickups of setting multiple eventlisteners for the same event.\r\n * Also this optimizes rendering by utilising the requestAnimationFrame for these scroll-events.\r\n * \r\n * @param {Function} handler - function to be called on scroll \r\n * @param {boolean} triggerNow - Should the function be called at once\r\n */\r\nexport function onScroll(handler, triggerNow = false) {\r\n // if first call: setup eventlistener on window\r\n !scrollFunctions.length ? initScroll() : null;\r\n\r\n // Trigger function\r\n triggerNow ? handler() : null;\r\n\r\n scrollFunctions.push(handler); \r\n}\r\n\r\nexport function initScroll() {\r\n window.addEventListener('scroll', scrollHandler);\r\n}\r\n","import { stickyNavOnScroll } from '../utils/stickyNavOnScroll';\r\nimport { enableScrollLock, disableScrollLock } from '../utils/scrollLock';\r\nimport { hideOnClickOutside } from '../utils/clickOutside';\r\n\r\nexport let nav,\r\n langPickers;\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\r\n nav = document.body.querySelector(selector);\r\n langPickers = document.body.querySelectorAll('.lang-picker');\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 if (langPickers) {\r\n Array.from(langPickers).forEach(langPicker => {\r\n langPicker.addEventListener('click', function() {\r\n nav.classList.add('nav--language-selector-open');\r\n hideOnClickOutside(langPicker, function() {\r\n nav.classList.remove('nav--language-selector-open');\r\n });\r\n });\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","import { isVisible } from '../utils/elementProperties';\r\n\r\nexport function hideOnClickOutside(element, callback) {\r\n function outsideClickListener(event) {\r\n if (!element.contains(event.target) && isVisible(element)) {\r\n // or use: event.target.closest(selector) === null\r\n callback(event);\r\n removeClickListener();\r\n }\r\n }\r\n\r\n function removeClickListener() {\r\n document.removeEventListener('click', outsideClickListener);\r\n }\r\n\r\n document.addEventListener('click', outsideClickListener);\r\n}\r\n","import settings from '../../settings.json';\r\n\r\nexport const breakpoints = settings.breakpoints;\r\nexport const breakpointKeys = Object.keys(breakpoints);\r\nexport let currentWindowWidth = window.innerWidth;\r\nexport let currentWindowHeight = window.innerHeight;\r\nexport let currentBreakpoint;\r\nexport let currentBreakpointIndex = 0;\r\nlet resizeTimer;\r\n\r\nconst resizeFunctions = [];\r\n\r\n/**\r\n * Get various window sizes - width, height etc.\r\n * This function is fired automatically upon page load. and run each time the window changes size.\r\n *\r\n */\r\nfunction getWindowSizes() {\r\n currentWindowWidth = window.innerWidth;\r\n currentWindowHeight = window.innerHeight;\r\n\r\n // Calculate which breakpoint is currently active, based on the screen width compared to the breakpoint definitions.\r\n\r\n let lastFoundWidth = 0;\r\n\r\n breakpointKeys.forEach((key, index) => {\r\n const width = breakpoints[key];\r\n if (currentWindowWidth >= width && width > lastFoundWidth) {\r\n lastFoundWidth = width;\r\n currentBreakpoint = key;\r\n currentBreakpointIndex = index;\r\n }\r\n });\r\n}\r\n\r\nfunction resizeHandler() {\r\n clearTimeout(resizeTimer);\r\n resizeTimer = setTimeout(() => {\r\n getWindowSizes();\r\n resizeFunctions.forEach(funcRef => funcRef());\r\n }, 100);\r\n}\r\n\r\nexport function onWindowResize(handler) {\r\n if (!currentBreakpoint) {\r\n initWindowResize();\r\n }\r\n\r\n resizeFunctions.push(handler);\r\n}\r\n\r\nexport function initWindowResize() { \r\n getWindowSizes();\r\n window.addEventListener('resize', resizeHandler);\r\n window.addEventListener('orientationchange', resizeHandler);\r\n}\r\n","import { breakpointKeys, currentBreakpointIndex } from '../utils/windowResize';\r\nimport { onWindowResize } from './windowResize';\r\nimport { onScroll } from './scroll';\r\n\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 document.addEventListener(\"lazy-load\", lazyLoad);\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","export const transitionEndEventName = detectStyleDeclatationName();\r\nexport const animationEndEventName = detectStyleDeclatationName('animation');\r\n\r\n/**\r\n * Detects which prefixed eventName is in CSSStyleDeclaration\r\n *\r\n * @param {string} eventTypeName - choose 'transition' or 'animation'\r\n * @returns {string}\r\n */\r\nexport function detectStyleDeclatationName(eventTypeName = 'transition') {\r\n const transitions = {\r\n transition: `${eventTypeName}end`,\r\n OTransition: `o${eventTypeName}end`,\r\n MozTransition: `${eventTypeName}end`,\r\n WebkitTransition: `webkit${eventTypeName}end`\r\n };\r\n\r\n const el = document.createElement('div');\r\n\r\n for (const t in transitions) {\r\n if (el.style[t] !== undefined) {\r\n return transitions[t];\r\n }\r\n }\r\n return '';\r\n}\r\n\r\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","import { cssAnimateNewHeight } from '../utils/animation';\r\n\r\n/**\r\n * Attention\r\n * Be aware that this module is dependent on support for Element.prototype.closest\r\n * This is included as default in https://polyfill.io/v3/polyfill.min.js\r\n */\r\n\r\n// Used keycodes\r\nconst keycode = {\r\n space: 32,\r\n arrowUp: 38,\r\n arrowDown: 40,\r\n home: 36,\r\n end: 35\r\n};\r\n\r\nlet activeAccordion;\r\nlet index = 0;\r\n\r\n/**\r\n * The Accordion class uses the cssAnimateNewHeight function to reveal hidden content.\r\n * Default element selector is data-action*=\"accordion\"\r\n * If data-action is set to \"accordion-switch\", active accordions will close when another is opened.\r\n *\r\n * @param {HTMLElement} trigger\r\n * @constructor\r\n */\r\nexport class Accordion {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} trigger\r\n */\r\n constructor(trigger) {\r\n this.dom = {\r\n trigger,\r\n container: trigger.parentNode.querySelector('.accordion__content') || trigger.nextElementSibling\r\n };\r\n\r\n this.settings = {\r\n type: trigger.getAttribute('data-action')\r\n };\r\n\r\n this.index = index;\r\n\r\n index++;\r\n\r\n this.dom.trigger.addEventListener('click', e => {\r\n if (!(event.ctrlKey || event.metaKey || event.shiftKey)) {\r\n e.preventDefault();\r\n }\r\n if (activeAccordion && this.index !== activeAccordion.index) {\r\n // Dobbelt check added to prevent delayed dobbelt opening\r\n if (activeAccordion.dom.container.classList.contains('open')) {\r\n cssAnimateNewHeight(activeAccordion.dom.container, activeAccordion.dom.trigger, true);\r\n this.dom.container.setAttribute('aria-hidden', true);\r\n activeAccordion.dom.trigger.setAttribute('aria-expanded', 'false');\r\n }\r\n }\r\n\r\n cssAnimateNewHeight(this.dom.container, this.dom.trigger, true);\r\n this.dom.container.setAttribute('aria-hidden', false);\r\n\r\n // Set the inverted value of aria-expanded\r\n const ariaExpanded = this.dom.trigger.getAttribute('aria-expanded') || 'false';\r\n this.dom.trigger.setAttribute('aria-expanded', ariaExpanded === 'false');\r\n\r\n if (this.settings.type === 'accordion-switch') {\r\n activeAccordion = this;\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction openAccordByHashId() {\r\n if (window.location.hash.indexOf('accordion') > -1) {\r\n const accordionContent = document.getElementById(window.location.hash.replace('#', ''));\r\n if (accordionContent) {\r\n const accord = document.getElementById(accordionContent.getAttribute('aria-labelledby'));\r\n accord.click();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Initialise Accordions with this function\r\n * Will only run if given selector elements are found in DOM\r\n *\r\n * @param {string} selector - element selector string\r\n */\r\n\r\nexport function setupAccordions(selector = '[data-action*=\"accordion\"]') {\r\n const accordions = document.querySelectorAll(selector);\r\n\r\n if (accordions) {\r\n for (let i = 0; i < accordions.length; i++) {\r\n void new Accordion(accordions[i]);\r\n }\r\n\r\n openAccordByHashId();\r\n }\r\n}\r\n\r\nwindow.addEventListener('keydown', event => {\r\n const focusedElement = document.activeElement;\r\n\r\n if (focusedElement) {\r\n /* This code needs to be fixed!\r\n It makes it imposible to type spaces (ex. in input fields)\r\n\r\n if (event.keyCode === keycode.space) {\r\n // Toggle accordion\r\n event.preventDefault();\r\n focusedElement.click();\r\n\r\n } */\r\n if (event.keyCode === keycode.arrowUp) {\r\n // Focus prevoius accordion\r\n if (focusedElement.closest('.accordion').previousElementSibling && focusedElement.closest('.accordion').previousElementSibling.querySelector('.accordion__head')) {\r\n focusedElement.closest('.accordion').previousElementSibling.querySelector('.accordion__head').focus();\r\n }\r\n }\r\n if (event.keyCode === keycode.arrowDown) {\r\n // Focus next accordion\r\n if (focusedElement.closest('.accordion').nextElementSibling && focusedElement.closest('.accordion').nextElementSibling.querySelector('.accordion__head')) {\r\n focusedElement.closest('.accordion').nextElementSibling.querySelector('.accordion__head').focus();\r\n }\r\n }\r\n if (event.keyCode === keycode.home) {\r\n // Focus first accordion\r\n if (focusedElement.closest('.accordion').parentNode.querySelector('.accordion:first-child .accordion__head')) {\r\n event.preventDefault();\r\n focusedElement.closest('.accordion').parentNode.querySelector('.accordion:first-child .accordion__head').focus();\r\n }\r\n }\r\n if (event.keyCode === keycode.end) {\r\n // Focus last accordion\r\n if (focusedElement.closest('.accordion').parentNode.querySelector('.accordion:last-child .accordion__head')) {\r\n event.preventDefault();\r\n focusedElement.closest('.accordion').parentNode.querySelector('.accordion:last-child .accordion__head').focus();\r\n }\r\n }\r\n }\r\n});\r\n","export const body = document.body;\r\nexport const qs = (s, o = body) => o.querySelector(s);\r\nexport const qsa = (s, o = body) => o.querySelectorAll(s);\r\n\r\nexport const allowStatCookies = window.CookieInformation && CookieInformation.getConsentGivenFor('cookie_cat_statistic');\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\n/**\r\n * Detect if a device as touch support\r\n *\r\n * 'ontouchstart' in window - works on most browsers\r\n * navigator.maxTouchPoints - works on IE10/11 and Surface\r\n */\r\nexport function isTouchDevice() {\r\n return !!('ontouchstart' in window || navigator.maxTouchPoints);\r\n}\r\n","import { getElementPosition } from './elementProperties';\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 { 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","\r\nconst classNames = {\r\n activeBtn: 'filter__tab--active',\r\n hiddenItem: 'js-hidden'\r\n};\r\n\r\n/**\r\n *\r\n * @param {HTMLElement} container\r\n *\r\n * @constructor\r\n */\r\nexport class Filter {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} container - Element containing filter options (Could be .filter__tabs or .filter__select)\r\n */\r\n constructor(container) {\r\n if (container) {\r\n this.dom = {\r\n container,\r\n filters: container.querySelectorAll('[data-filter]'),\r\n allFilter: container.querySelector('[data-filter=\"*\"]'),\r\n targetContainer: document.body.querySelector(container.getAttribute('data-target-container'))\r\n };\r\n\r\n this.settings = {\r\n filterType: container.getAttribute('data-action')\r\n };\r\n\r\n if (this.dom.targetContainer) {\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n\r\n const filter = this.dom.filters[i];\r\n const itemCountReplace = filter.getAttribute('data-item-count-replace');\r\n\r\n if (filter.tagName === 'BUTTON') {\r\n filter.addEventListener('click', e => this.filterHandler(e));\r\n } else {\r\n filter.addEventListener('change', e => this.filterHandler(e));\r\n\r\n if (itemCountReplace) {\r\n this.replaceWithNumberOfItems(filter, itemCountReplace);\r\n }\r\n }\r\n }\r\n\r\n } else {\r\n window.console.warn('Can\\'t find [data-target-container] on filter container: ', container);\r\n }\r\n } else {\r\n window.console.warn('Filter container missing');\r\n }\r\n }\r\n\r\n static deselectRadio(e) {\r\n e.target.checked = !e.target.checked;\r\n e.target.removeEventListener('click', Filter.deselectRadio);\r\n\r\n this.filterHandler(e);\r\n }\r\n\r\n /**\r\n * Filter function that compares selected filter values with filter-values on filter-item.\r\n * Added hidden-class to items that hasn't got the selected filter value.\r\n *\r\n * @param {HTMLElement} e - event (click or change event\r\n */\r\n filterHandler(e) {\r\n const filter = e.target;\r\n const filterItems = this.dom.targetContainer.querySelectorAll('[data-filter-value]');\r\n const isButton = filter.tagName === 'BUTTON';\r\n const filterValue = isButton ? filter.getAttribute('data-filter') : filter.value;\r\n\r\n\r\n if (isButton) {\r\n if (this.settings.filterType === 'filter-switch') {\r\n\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n this.dom.filters[i].classList.remove(classNames.activeBtn);\r\n }\r\n\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n if (this.dom.allFilter && filter != this.dom.allFilter) {\r\n this.dom.allFilter.classList.remove(classNames.activeBtn);\r\n } else {\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n if (this.dom.filters[i].tagName === 'SELECT') {\r\n // This is a small hack to avoid misleeding results if selector is not reset\r\n // assumes that your selector has a default value of '*'\r\n this.dom.filters[i].value = '*';\r\n } else {\r\n this.dom.filters[i].classList.remove(classNames.activeBtn);\r\n }\r\n }\r\n }\r\n\r\n if (!filter.classList.contains(classNames.activeBtn)) {\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n filter.classList.remove(classNames.activeBtn);\r\n }\r\n }\r\n } else if (filter.type === 'radio') {\r\n const name = filter.name;\r\n const siblingRadios = this.dom.container.querySelectorAll(`[name=\"${name}\"]`);\r\n\r\n for (let r = 0; r < siblingRadios.length; r++) {\r\n const radio = siblingRadios[r];\r\n radio.removeEventListener('click', Filter.deselectRadio);\r\n }\r\n\r\n //filter.addEventListener('click', Filter.deselectRadio.bind(this));\r\n }\r\n\r\n if (this.settings.filterType === 'filter-switch') {\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n const cleanFilterValue = filterValue.trim().toLowerCase();\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n if (filterValue !== '*' && itemFilterValues.indexOf(cleanFilterValue) === -1) {\r\n item.classList.add(classNames.hiddenItem);\r\n } else {\r\n item.classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n } else {\r\n const filterValues = Filter.getSetValues(this.dom.filters);\r\n const isComboFilter = this.settings.filterType === 'filter-combo';\r\n\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n let showItem = !isComboFilter;\r\n\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n if (filter === this.dom.allFilter && this.dom.allFilter.classList.contains(classNames.activeBtn)) {\r\n showItem = true;\r\n } else {\r\n for (let i = 0; i < filterValues.length; i++) {\r\n const value = filterValues[i];\r\n const cleanValue = value.trim().toLowerCase();\r\n\r\n if (isComboFilter) {\r\n if (itemFilterValues.indexOf(cleanValue) > -1) {\r\n showItem = true;\r\n break;\r\n }\r\n } else if (cleanValue != '*' && itemFilterValues.indexOf(cleanValue) === -1) {\r\n showItem = false;\r\n }\r\n }\r\n }\r\n\r\n if (!showItem) {\r\n item.classList.add(classNames.hiddenItem);\r\n } else {\r\n item.classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n }\r\n\r\n // Hide empty Filter sections\r\n const sections = this.dom.targetContainer.querySelectorAll('[data-filter-section]');\r\n if (sections.length) {\r\n for (let s = 0; s < sections.length; s++) {\r\n const section = sections[s];\r\n const itemsShownInSection = section.querySelectorAll('[data-filter-value]:not(.js-hidden)');\r\n\r\n if (itemsShownInSection.length < 1) {\r\n section.classList.add(classNames.hiddenItem);\r\n } else {\r\n section.classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n }\r\n }\r\n\r\n static getSetValues(filters) {\r\n const valArray = [];\r\n\r\n // loop through list of filters\r\n for (let i = 0, len = filters.length; i < len; i++) {\r\n const filter = filters[i];\r\n if (filter.tagName === 'SELECT') {\r\n if (filter.value !== '*' && filter.value !== '') {\r\n valArray.push(filter.value);\r\n }\r\n } else if (filter.tagName === 'BUTTON') {\r\n if (filter.classList.contains(classNames.activeBtn)) {\r\n valArray.push(filter.getAttribute('data-filter'));\r\n }\r\n } else {\r\n if (filter.checked && filter.value !== '*') { // radio checked?\r\n valArray.push(filter.value); // if so, add its value to array\r\n }\r\n }\r\n }\r\n return valArray; // return value of checked radio or undefined if none checked\r\n }\r\n\r\n replaceWithNumberOfItems(element, replaceValue) {\r\n const options = element.children;\r\n const items = this.dom.targetContainer.querySelectorAll('[data-filter-value]');\r\n\r\n if (options) {\r\n for (let i = 0; i < options.length; i++) {\r\n const option = options[i];\r\n\r\n if (option.value !== '*' && option.value !== '') {\r\n let count = 0;\r\n const optionStr = option.innerText;\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n let itemFilterValues = items[i].getAttribute('data-filter-value').split(',');\r\n\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n const cleanValue = option.value.trim().toLowerCase();\r\n\r\n if (itemFilterValues.indexOf(cleanValue) > -1) {\r\n count++;\r\n }\r\n }\r\n\r\n option.innerText = optionStr.replace(replaceValue, count);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function setupFilters(selector = '[data-action*=\"filter\"]') {\r\n const filterContainers = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < filterContainers.length; i++) {\r\n void new Filter(filterContainers[i]);\r\n }\r\n}\r\n","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) {\r\n const targetId = e.currentTarget ? e.currentTarget.getAttribute('data-target') : e;\r\n const lockScroll = e.currentTarget.hasAttribute('data-scroll-lock') ? e.currentTarget.getAttribute('data-scroll-lock') : true;\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 === true) {\r\n enableScrollLock();\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","// Polyfills\r\nif (!Element.prototype.matches) {\r\n Element.prototype.matches =\r\n Element.prototype.msMatchesSelector ||\r\n Element.prototype.webkitMatchesSelector;\r\n}\r\n\r\nif (!Element.prototype.closest) {\r\n Element.prototype.closest = function(s) {\r\n let el = this;\r\n\r\n do {\r\n if (Element.prototype.matches.call(el, s)) return el;\r\n el = el.parentElement || el.parentNode;\r\n } while (el !== null && el.nodeType === 1);\r\n return null;\r\n };\r\n}\r\n\r\n/**\r\n * Attention\r\n * Be aware that this module is dependent on support for Element.prototype.closest\r\n * This is included as default in https://polyfill.io/v3/polyfill.min.js\r\n */\r\n\r\n/**\r\n * Function that opens new tab\r\n * and hides the activeTab if found\r\n *\r\n * @param {object|HTMLElement} e - click event or tab element\r\n */\r\n\r\n// Used keycodes\r\nconst keycode = {\r\n arrowRight: 39,\r\n arrowLeft: 37,\r\n home: 36,\r\n end: 35\r\n};\r\n\r\nfunction openTab(e) {\r\n const tab = e.target ? e.target : e;\r\n\r\n if (!(event.ctrlKey || event.metaKey || event.shiftKey) && e.target) {\r\n e.preventDefault();\r\n }\r\n\r\n const tabContent = document.getElementById(tab.getAttribute('aria-controls').replace('#', ''));\r\n\r\n if (tabContent) {\r\n const activeTab = tab.parentNode.parentNode.querySelector('.tab--active');\r\n\r\n if (activeTab) {\r\n activeTab.classList.remove('tab--active');\r\n activeTab.setAttribute('aria-selected', false);\r\n activeTab.setAttribute('tabindex', -1);\r\n\r\n const activeTabContent = document.getElementById(activeTab.getAttribute('aria-controls').replace('#', ''));\r\n if (activeTabContent) {\r\n activeTabContent.classList.remove('tab__content--active');\r\n activeTabContent.setAttribute('aria-hidden', true);\r\n }\r\n }\r\n\r\n tab.classList.add('tab--active');\r\n tab.removeAttribute('tabindex');\r\n tab.setAttribute('aria-selected', true);\r\n tab.focus();\r\n tabContent.classList.add('tab__content--active');\r\n tabContent.setAttribute('aria-hidden', false);\r\n }\r\n}\r\n\r\nfunction openTabByHashId() {\r\n if (window.location.hash.indexOf('tab') > -1) {\r\n const tabContent = document.getElementById(window.location.hash.replace('#', ''));\r\n if (tabContent) {\r\n const tab = document.getElementById(tabContent.getAttribute('aria-labelledby'));\r\n openTab(tab);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n* Initialise Tabs with this function\r\n* Will only run if given selector elements are found in DOM\r\n*\r\n* @param {string} selector - element selector string\r\n*/\r\nexport function setupTabs(selector = '[data-action=\"tabs\"]') {\r\n const tabsContainer = document.body.querySelectorAll(selector);\r\n\r\n if (tabsContainer) {\r\n for (let i = 0; i < tabsContainer.length; i++) {\r\n const tabs = tabsContainer[i].querySelectorAll('[role=\"tab\"]');\r\n\r\n for (let t = 0; t < tabs.length; t++) {\r\n tabs[t].addEventListener('click', openTab);\r\n }\r\n }\r\n }\r\n\r\n openTabByHashId();\r\n\r\n window.addEventListener('hashchange', openTabByHashId, false);\r\n}\r\n\r\nwindow.addEventListener('keydown', event => {\r\n const focusedElement = document.activeElement;\r\n const tabs = document.activeElement.closest('.tabs__nav');\r\n\r\n if (focusedElement && tabs) {\r\n if (event.keyCode === keycode.arrowLeft) {\r\n // Open prevoius tab\r\n if (focusedElement.closest('li').previousElementSibling && focusedElement.closest('li').previousElementSibling.querySelector('.tab')) {\r\n openTab(focusedElement.closest('li').previousElementSibling.querySelector('.tab'));\r\n }\r\n }\r\n if (event.keyCode === keycode.arrowRight) {\r\n // Open next tab\r\n if (focusedElement.closest('li').nextElementSibling && focusedElement.closest('li').nextElementSibling.querySelector('.tab')) {\r\n openTab(focusedElement.closest('li').nextElementSibling.querySelector('.tab'));\r\n }\r\n }\r\n if (event.keyCode === keycode.home) {\r\n // Open first tab\r\n if (tabs.querySelector('li:first-child .tab')) {\r\n event.preventDefault();\r\n openTab(tabs.querySelector('li:first-child .tab'));\r\n }\r\n }\r\n if (event.keyCode === keycode.end) {\r\n // Open last tab\r\n if (tabs.querySelector('li:last-child .tab')) {\r\n event.preventDefault();\r\n openTab(tabs.querySelector('li:last-child .tab'));\r\n }\r\n }\r\n }\r\n});\r\n","/*global YT */\r\nimport { isElement } from '../utils/elementProperties';\r\nimport { allowStatCookies } from '../utils/helpers';\r\n\r\nlet loadingVideoId;\r\nlet activePlayer;\r\n\r\nexport function loadYouTubeApi() {\r\n const tag = document.createElement('script');\r\n\r\n tag.src = `${window.location.protocol}//www.youtube.com/iframe_api`;\r\n const firstScriptTag = document.getElementsByTagName('script')[0];\r\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n}\r\n\r\n/**\r\n * Sets up YouTube Player via YT API using YouTube id\r\n * Does the following as video is ready:\r\n * Forces hd720 quality\r\n * Mutes video\r\n * Autoplays video\r\n *\r\n * @param {string} youtubeId - YouTube video ID\r\n * @param {boolean} allowCookies - Set to false to force use of youtube-nocookie\r\n */\r\n\r\nfunction generateYoutubeIframe(youtubeId, allowCookies = true) {\r\n const youtubeContainer = document.getElementById(youtubeId);\r\n\r\n if (youtubeContainer) {\r\n let ytPlayerHost = 'https://www.youtube-nocookie.com';\r\n\r\n if (allowStatCookies && allowCookies) {\r\n ytPlayerHost = 'https://www.youtube.com';\r\n }\r\n\r\n void new YT.Player(youtubeId, {\r\n videoId: youtubeId,\r\n host: ytPlayerHost,\r\n playerVars: {\r\n autoplay: 1,\r\n rel: 0,\r\n controls: 0,\r\n muted: 1\r\n },\r\n\r\n events: {\r\n onReady: event => {\r\n event.target.setPlaybackQuality('hd720');\r\n event.target.mute();\r\n event.target.playVideo();\r\n },\r\n onStateChange: event => {\r\n const YTP = event.target; // YouTube Player\r\n const resumePlayback = function(e) {\r\n e.preventDefault();\r\n\r\n if (activePlayer) {\r\n activePlayer.playVideo();\r\n }\r\n };\r\n\r\n if (event.data === YT.PlayerState.BUFFERING) {\r\n // Force better quality video\r\n YTP.setPlaybackQuality('hd720');\r\n }\r\n\r\n // TODO: Review if pause abillity makes sense in this module\r\n\r\n // Sets pause class\r\n // By default this hides video iframe and shows media__content\r\n\r\n if (event.data === YT.PlayerState.PAUSED) {\r\n if (YTP.a) {\r\n activePlayer = YTP;\r\n YTP.a.parentNode.addEventListener('click', resumePlayback);\r\n YTP.a.parentNode.classList.add('video--paused');\r\n }\r\n } else if (event.data === YT.PlayerState.PLAYING) {\r\n if (YTP.a && YTP.a.parentNode.classList.contains('video--paused')) {\r\n YTP.a.parentNode.classList.remove('video--paused');\r\n YTP.a.parentNode.removeEventListener('click', resumePlayback);\r\n } else {\r\n onIframeReady(YTP.a.parentNode);\r\n\r\n // Fix to black screen on loop in background-video\r\n // Bug found in Chrome 78 and Safari 13\r\n // ---------------------------------------------------\r\n const remains = YTP.getDuration() - YTP.getCurrentTime();\r\n\r\n if (window.rewindTO) {\r\n clearTimeout(window.rewindTO);\r\n }\r\n\r\n window.rewindTO = setTimeout(() => {\r\n YTP.seekTo(0);\r\n }, (remains - 0.01) * 1000);\r\n }\r\n } else if (event.data === YT.PlayerState.ENDED) {\r\n YTP.playVideo();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Static standard youtube ready function\r\n * run from YouTube Iframe API when it is done loading\r\n *\r\n */\r\n\r\nwindow.onYouTubeIframeAPIReady = function() {\r\n if (loadingVideoId) {\r\n generateYoutubeIframe(loadingVideoId);\r\n }\r\n};\r\n\r\nfunction onIframeReady(container) {\r\n container.classList.remove('video--loading');\r\n container.classList.add('video--loaded');\r\n}\r\n\r\nexport function 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 * Loads iframe video inside video target\r\n * in element or data-target attribute depending on given trigger\r\n *\r\n * Generates YouTube or Vimeo iframe detected in videoLink set as data-video-link.\r\n *\r\n * @param {obejct|HTMLElement|string} trigger - event obj, element or selector string of video component\r\n */\r\n\r\nexport function initIframeVideoBg(trigger) {\r\n let videoTrigger;\r\n\r\n if (trigger) {\r\n if (isElement(trigger)) {\r\n videoTrigger = trigger;\r\n } else if (typeof trigger === 'object') {\r\n trigger.preventDefault();\r\n videoTrigger = trigger.target;\r\n videoTrigger.removeEventListener('click', initIframeVideoBg);\r\n } else if (typeof trigger === 'string') {\r\n videoTrigger = document.body.querySelector(trigger);\r\n } else {\r\n window.console.warn('trigger in initIframeVideoBg is wrong type of thing');\r\n }\r\n } else {\r\n window.console.warn(\r\n `Type: ${typeof trigger} not compatiple with initIframeVideoBg.. what is this kind of nonsans ?`\r\n );\r\n }\r\n\r\n const videoTarget = videoTrigger.getAttribute('data-target')\r\n ? document.getElementById(videoTrigger.getAttribute('data-target'))\r\n : videoTrigger;\r\n\r\n if (videoTarget) {\r\n const videoLink = videoTrigger.href ? videoTrigger.href : videoTrigger.getAttribute('data-video-link');\r\n\r\n if (videoLink) {\r\n const videoId = videoLink.indexOf('/') !== -1 ? extractVideoIdFromUrl(videoLink) : videoLink;\r\n const player = document.createElement('div');\r\n player.id = videoId;\r\n videoTarget.appendChild(player);\r\n videoTarget.classList.add('video--loading');\r\n\r\n if (!window.YT) {\r\n loadingVideoId = videoId;\r\n\r\n loadYouTubeApi();\r\n } else {\r\n generateYoutubeIframe(videoId, false);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Sets up Video components found\r\n * As click eventListener or direct inizialiser depending on 'data-target'\r\n * Note - 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 setupYTVideos(selector = '[data-action^=\"youtube-video\"]') {\r\n const videoElems = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < videoElems.length; i++) {\r\n const videoElem = videoElems[i];\r\n\r\n if (videoElem.getAttribute('data-target')) {\r\n videoElem.addEventListener('click', initIframeVideoBg);\r\n } else {\r\n initIframeVideoBg(videoElem);\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 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 this.element.style[ this.parent.originSide ] = 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 this.element.style.transform = '';\n this.element.removeAttribute('aria-hidden');\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 sideOffset = this.parent.originSide === 'left' ? 1 : -1;\n\n var adjustedX = this.parent.options.percentPosition ?\n x * sideOffset * ( this.parent.size.innerWidth / this.size.width ) :\n x * sideOffset;\n\n this.element.style.transform = 'translateX(' +\n this.parent.getPositionValue( adjustedX ) + ')';\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} shift - 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 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 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 -= 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 transforms 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 var isResting = !this.isPointerDown &&\n Math.round( this.x * 100 ) == Math.round( previousX * 100 );\n if ( isResting ) {\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/* eslint-disable max-params */\n( function( window, factory ) {\n // universal module definition\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/* eslint-enable max-params */\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 if ( instance ) 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 - options to extend\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, NodeList, HTMLElement]} elems - elements to make into cells\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 - cells to size\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 /* eslint-disable-next-line no-invalid-this */\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 = new 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, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\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 - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\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 - multiple elements\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 - child element\n * @returns {Flickit.Cell} cell - parent 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, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\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 // #1177 disable resize behavior when animating or dragging for iOS 15\n if ( !this.isActive || this.isAnimating || this.isDragging ) {\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 ...\n // #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, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\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.4.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 ( 'ontouchstart' in window ) {\n // HACK prefer Touch Events as you can preventDefault on touchstart to\n // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n startEvent = 'touchstart';\n } else if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\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.4.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 // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\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 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\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};\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 %= 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( dist, minDist ) {\n return dist <= minDist;\n } : function( dist, minDist ) {\n return dist < minDist;\n };\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 - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\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 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 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 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 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 - Elements to insert\n * @param {Integer} index - Zero-based number to insert\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 - ELements to remove\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 * @param {Boolean} isPositioningSlider - Positions slider after selection\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 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 * @param {Image} img - Image element\n * @param {Flickity} flickity - Flickity instance\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.3.0\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-2021 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\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 return Flickity;\n} );\n","import Flickity from '../../../node_modules/flickity';\r\nimport { currentWindowWidth, onWindowResize } from '../utils/windowResize';\r\nimport { loadBgImage } from '../utils/lazyImage';\r\n\r\n/**\r\n * The Slider class uses the cssAnimateNewHeight function to reveal hidden content.\r\n * Default element selector is data-action*=\"slider\"\r\n *\r\n * @param {HTMLElement} container\r\n * @constructor\r\n */\r\nexport class Slider {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} container\r\n */\r\n constructor(container) {\r\n this.container = container;\r\n this.nav = container.parentNode.querySelector('.slider__nav');\r\n\r\n if (this.container) {\r\n const mobileMode = !(currentWindowWidth >= 480);\r\n\r\n const lazyImgs = Array.from(this.container.querySelectorAll('.lazy'));\r\n\r\n this.flkty = new Flickity(this.container, {\r\n cellAlign: mobileMode ? 'center' : 'left',\r\n percentPosition: false,\r\n autoPlay: parseInt(this.container.getAttribute('data-autoplay')) || false,\r\n wrapAround: true,\r\n selectedAttraction: mobileMode ? 0.025 : 0.02,\r\n friction: 0.20,\r\n pageDots: !this.nav,\r\n draggable: true,\r\n lazyLoad: mobileMode ? 1 : 3,\r\n on: {\r\n ready: () => {\r\n // Do something when slider is rendered and ready\r\n },\r\n select: () => {\r\n if (lazyImgs.length) {\r\n lazyImgs\r\n .filter(x => !x.classList.contains('lazy--loaded') || !x.classList.contains('lazy--loading'))\r\n .forEach(elem => loadBgImage(elem));\r\n }\r\n }\r\n },\r\n });\r\n\r\n this.bindEvents();\r\n }\r\n }\r\n\r\n bindEvents() {\r\n const scope = this;\r\n //Change cell position on resize, when width is smaller than 768px\r\n onWindowResize(\r\n function alignSlider() {\r\n const mobileMode = !(currentWindowWidth >= 480);\r\n\r\n scope.flkty.option({ cellAlign: (mobileMode ? 'center' : 'left') });\r\n scope.flkty.reloadCells();\r\n }\r\n );\r\n\r\n // Following Code is only used in case you use Custom navigation\r\n\r\n if (this.nav) {\r\n const navButtons = Array.from(this.nav.children);\r\n\r\n // update buttons on select\r\n this.flkty.on('select', function () {\r\n const previousSelectedButton = scope.nav.querySelector('.is-selected');\r\n const selectedButton = scope.nav.children[scope.flkty.selectedIndex];\r\n previousSelectedButton.classList.remove('is-selected');\r\n selectedButton.classList.add('is-selected');\r\n });\r\n\r\n // cell select\r\n this.nav.addEventListener('click', function (event) {\r\n if (!event.target.matches('.dot')) {\r\n return;\r\n }\r\n const index = navButtons.indexOf(event.target);\r\n scope.flkty.select(index, false, false);\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function setupSliders(selector = '[data-action*=\"slider\"]') {\r\n const sliders = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < sliders.length; i++) {\r\n void new Slider(sliders[i]);\r\n }\r\n}\r\n","const invalidClass = 'invalid';\r\n\r\n/**\r\n * Check validation of single form field\r\n * @param {HTMLElement | Object} field - Form field element or event object.\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction checkValidation(input) {\r\n let valid = true;\r\n let val = '';\r\n const field = input.target ? input.target : input;\r\n\r\n field.classList.remove(invalidClass);\r\n\r\n switch (field.nodeName) {\r\n case 'INPUT':\r\n case 'TEXTAREA':\r\n case 'SELECT':\r\n default:\r\n val = field.value;\r\n break;\r\n }\r\n\r\n if (field.type == 'checkbox' && !field.checked || val.trim() == '') {\r\n valid = false;\r\n field.classList.add(invalidClass);\r\n field.focus();\r\n }\r\n\r\n if (field.type == 'select-one' && val == 0) {\r\n valid = false;\r\n field.classList.add(invalidClass);\r\n field.classList.remove('has-text');\r\n field.focus();\r\n } else {\r\n field.classList.add('has-text');\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 + 1}px`; // add an extra px to prevent scrollbar\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\r\n field.value ? field.classList.add('has-text') : field.classList.remove('has-text');\r\n\r\n if (field.nodeName == 'SELECT' && field.value == 0) {\r\n field.classList.remove('has-text');\r\n }\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","export class Usp {\r\n /**\r\n *\r\n * @param {HTMLElement} mainElement\r\n */\r\n constructor(mainElement) {\r\n this.elements = {\r\n mainElement,\r\n container: mainElement.querySelector('.usp__container'),\r\n nav: mainElement.querySelector('.usp__nav'),\r\n bullets: mainElement.querySelectorAll('.usp__nav span')\r\n };\r\n\r\n this.firstX = null;\r\n this.lastX = null;\r\n\r\n this.elements.mainElement.addEventListener('touchstart', this.handleStart);\r\n this.elements.mainElement.addEventListener('touchmove', this.handleMove, false);\r\n this.elements.mainElement.addEventListener('touchend', this.handleEnd, false);\r\n this.elements.nav.addEventListener('click', this.handleNavClick, false);\r\n }\r\n\r\n handleStart = event => {\r\n const firstTouch = getTouches(event)[0];\r\n this.firstX = firstTouch.clientX;\r\n }\r\n\r\n handleMove = event => {\r\n this.lastX = getTouches(event)[0].clientX;\r\n }\r\n\r\n handleEnd = () => {\r\n if (!this.firstX || !this.lastX) {\r\n return;\r\n }\r\n\r\n const diff = this.firstX - this.lastX;\r\n const currentActiveSlide = parseInt(this.elements.nav.querySelector('.active').getAttribute('data-nav'));\r\n\r\n if (diff > 50) {\r\n if (currentActiveSlide < 3) {\r\n this.changeSlide((currentActiveSlide + 1));\r\n }\r\n } else if (diff < -50) {\r\n if (currentActiveSlide > 1) {\r\n this.changeSlide((currentActiveSlide - 1));\r\n }\r\n }\r\n }\r\n\r\n handleNavClick = event => {\r\n const navClicked = parseInt(event.target.getAttribute('data-nav'));\r\n\r\n if (navClicked) {\r\n this.changeSlide(navClicked);\r\n }\r\n }\r\n\r\n changeSlide = changeTo => {\r\n const index = changeTo - 1;\r\n\r\n for (let i = 0; i < this.elements.bullets.length; i++) {\r\n this.elements.bullets[i].classList.remove('active');\r\n\r\n if (i == index) {\r\n this.elements.bullets[i].classList.add('active');\r\n }\r\n }\r\n\r\n this.elements.container.style.transform = `translate3d(-${window.innerWidth * index}px,0,0)`;\r\n }\r\n}\r\n\r\nexport function setupUsp() {\r\n const modules = document.querySelectorAll('.usp');\r\n\r\n if (modules) {\r\n Array.from(modules).forEach(module => {\r\n const moduleNav = module.querySelector('.usp__nav');\r\n\r\n if (moduleNav) {\r\n const moduleNavStyle = window.getComputedStyle(moduleNav);\r\n\r\n if (moduleNavStyle.display !== 'none') {\r\n void new Usp(module);\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction getTouches(event) {\r\n return event.touches || event.originalEvent.touches;\r\n}\r\n","import { getElementPosition, getElementTransform } from '../utils/elementProperties';\r\nimport { scrollTop } from '../utils/scroll';\r\n\r\nexport class CaseCarousel {\r\n /**\r\n *\r\n * @param {HTMLElement} mainElement\r\n */\r\n constructor(mainElement) {\r\n this.elements = {\r\n mainElement,\r\n nav: mainElement.querySelector('.featured-cases__controls-arrows'),\r\n container: mainElement.querySelector('.featured-cases__container'),\r\n anchors: mainElement.querySelectorAll('.featured-cases__container a'),\r\n cursor: mainElement.querySelector('.featured-cases__cursor')\r\n };\r\n\r\n this.currentCase = 1;\r\n this.caseWidth = this.getCaseWidth();\r\n this.nunmberOfCases = mainElement.querySelectorAll('.featured-cases__case').length;\r\n this.numberOfVisibleCases = this.calculateVisibleCases();\r\n this.remainingSpace = this.calculateRemainingSpace();\r\n\r\n this.inputDown = false;\r\n this.inputInitX = null;\r\n this.inputCurrentX = null;\r\n this.tolerance = 10;\r\n this.currentPosition = null;\r\n this.changeWaiting = 0;\r\n this.wasMovedByInput = false;\r\n this.savedUrl = null;\r\n\r\n this.elements.nav.addEventListener('click', this.handleNavClick, false);\r\n\r\n this.elements.container.addEventListener('mousedown', this.handleInputStart, false);\r\n this.elements.container.addEventListener('touchstart', this.handleInputStart, false);\r\n\r\n this.elements.container.addEventListener('mousemove', this.handleInputMove, false);\r\n this.elements.container.addEventListener('touchmove', this.handleInputMove, false);\r\n\r\n this.elements.container.addEventListener('mouseup', this.handleInputEnd, false);\r\n this.elements.container.addEventListener('touchend', this.handleInputEnd, false);\r\n\r\n Array.from(this.elements.anchors).forEach(a => {\r\n a.addEventListener('click', event => {\r\n event.preventDefault();\r\n\r\n if (!this.wasMovedByInput) {\r\n window.location.href = a.getAttribute('href');\r\n }\r\n\r\n this.wasMovedByInput = false;\r\n });\r\n });\r\n\r\n this.elements.mainElement.addEventListener('mouseenter', () => {\r\n this.elements.mainElement.classList.add('active-cursor');\r\n }, false);\r\n\r\n this.elements.mainElement.addEventListener('mousemove', this.moveCursor, false);\r\n\r\n this.elements.mainElement.addEventListener('mouseleave', () => {\r\n this.elements.mainElement.classList.remove('active-cursor');\r\n }, false);\r\n\r\n this.elements.container.addEventListener('mouseenter', () => {\r\n this.elements.cursor.classList.add('active');\r\n }, false);\r\n\r\n this.elements.container.addEventListener('mouseleave', () => {\r\n this.elements.cursor.classList.remove('active');\r\n }, false);\r\n }\r\n\r\n getCaseWidth = () => {\r\n const firstCase = this.elements.mainElement.querySelector('.featured-cases__case');\r\n const style = window.getComputedStyle(firstCase);\r\n const width = parseFloat(style.width);\r\n\r\n return width;\r\n }\r\n\r\n calculateRemainingSpace = () => {\r\n const fullWidth = parseInt(window.getComputedStyle(this.elements.container).width);\r\n const remainingSpace = fullWidth - (this.numberOfVisibleCases * this.caseWidth);\r\n\r\n return remainingSpace;\r\n }\r\n\r\n calculateVisibleCases = () => {\r\n const fullWidth = parseInt(window.getComputedStyle(this.elements.container).width);\r\n const casesInARow = Math.floor(fullWidth / this.caseWidth);\r\n\r\n return casesInARow;\r\n }\r\n\r\n handleNavClick = event => {\r\n const prev = event.target.className.indexOf('prev');\r\n const next = event.target.className.indexOf('next');\r\n\r\n if (prev > -1) {\r\n if (this.currentCase > 1) {\r\n this.changeActiveCase(this.currentCase - 1);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (next > -1) {\r\n if (this.currentCase < this.nunmberOfCases && this.currentCase + this.numberOfVisibleCases <= this.nunmberOfCases) {\r\n this.changeActiveCase(this.currentCase + 1);\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n handleInputStart = event => {\r\n this.inputDown = true;\r\n\r\n const images = this.elements.container.querySelectorAll('img');\r\n const anchors = this.elements.container.querySelectorAll('a');\r\n\r\n Array.from(images).forEach(img => {\r\n img.setAttribute('draggable', false);\r\n });\r\n\r\n Array.from(anchors).forEach(a => {\r\n a.setAttribute('draggable', false);\r\n });\r\n\r\n const touch = getTouches(event);\r\n\r\n if (touch) {\r\n this.inputInitX = touch[0].clientX;\r\n } else {\r\n this.inputInitX = event.clientX;\r\n }\r\n\r\n this.currentPosition = getElementTransform(this.elements.container).translateX;\r\n // Create the event\r\n var event = new CustomEvent(\"lazy-load\", { \"lazy\": \"load\" });\r\n\r\n // Dispatch/Trigger/Fire the event\r\n document.dispatchEvent(event);\r\n }\r\n\r\n handleInputMove = event => {\r\n if (this.inputDown) {\r\n const touch = getTouches(event);\r\n\r\n if (touch) {\r\n this.inputCurrentX = touch[0].clientX;\r\n\r\n if (this.inputCurrentX - this.inputInitX > 0) {\r\n this.changeWaiting = this.currentCase - 1;\r\n\r\n if (this.changeWaiting < 1) {\r\n this.changeWaiting = 1;\r\n }\r\n } else {\r\n this.changeWaiting = this.currentCase + 1;\r\n\r\n if (this.changeWaiting >= this.nunmberOfCases - this.numberOfVisibleCases + 1) {\r\n this.changeWaiting = this.nunmberOfCases - this.numberOfVisibleCases + 1;\r\n }\r\n }\r\n } else {\r\n this.inputCurrentX = event.clientX;\r\n\r\n if (this.inputCurrentX && this.inputInitX) {\r\n this.moveContainer(this.inputCurrentX - this.inputInitX);\r\n }\r\n }\r\n // Create the event\r\n var event = new CustomEvent(\"lazy-load\", { \"lazy\": \"load\" });\r\n\r\n // Dispatch/Trigger/Fire the event\r\n document.dispatchEvent(event);\r\n }\r\n }\r\n\r\n handleInputEnd = event => {\r\n this.inputDown = false;\r\n\r\n this.inputInitX = null;\r\n this.inputCurrentX = null;\r\n\r\n this.elements.container.classList.remove('no-transition');\r\n this.currentPosition = getElementTransform(this.elements.container).translateX;\r\n\r\n if (this.changeWaiting) {\r\n this.changeActiveCase(this.changeWaiting);\r\n\r\n this.changeWaiting = 0;\r\n }\r\n\r\n const images = this.elements.container.querySelectorAll('img');\r\n const anchors = this.elements.container.querySelectorAll('a');\r\n\r\n Array.from(images).forEach(img => {\r\n img.removeAttribute('draggable');\r\n });\r\n\r\n Array.from(anchors).forEach(a => {\r\n a.removeAttribute('draggable');\r\n });\r\n // Create the event\r\n var event = new CustomEvent(\"lazy-load\", { \"lazy\": \"load\" });\r\n\r\n // Dispatch/Trigger/Fire the event\r\n document.dispatchEvent(event);\r\n }\r\n\r\n changeActiveCase = changeTo => {\r\n let transformDistance = (changeTo - 1) * this.caseWidth;\r\n\r\n if (transformDistance > 0) {\r\n transformDistance -= this.remainingSpace;\r\n }\r\n\r\n this.currentCase = changeTo;\r\n this.elements.container.style.transform = `translate3d(-${transformDistance}px, 0, 0)`;\r\n }\r\n\r\n moveContainer = inputMoved => {\r\n this.wasMovedByInput = true;\r\n this.elements.container.classList.add('no-transition');\r\n\r\n if (inputMoved > this.tolerance) {\r\n const newTranslate = this.currentPosition + inputMoved - this.tolerance;\r\n\r\n if (newTranslate < 0) {\r\n this.elements.container.style.transform = `translate3d(${newTranslate}px, 0, 0)`;\r\n } else {\r\n this.elements.container.style.transform = 'translate3d(0, 0, 0)';\r\n }\r\n } else if (inputMoved < -this.tolerance) {\r\n const newTranslate = this.currentPosition + inputMoved - this.tolerance;\r\n\r\n if (newTranslate > -(this.caseWidth * (this.nunmberOfCases - this.numberOfVisibleCases)) + this.remainingSpace) {\r\n this.elements.container.style.transform = `translate3d(${newTranslate}px, 0, 0)`;\r\n } else {\r\n this.elements.container.style.transform = `translate3d(${-(this.caseWidth * (this.nunmberOfCases - this.numberOfVisibleCases))}${this.remainingSpace}px, 0, 0)`;\r\n }\r\n }\r\n }\r\n\r\n moveCursor = event => {\r\n const position = {\r\n x: getElementPosition(this.elements.mainElement).left,\r\n y: getElementPosition(this.elements.mainElement).top\r\n };\r\n\r\n const positionRelativeToScreen = position.y - scrollTop;\r\n\r\n const cursorX = event.clientX - position.x;\r\n const cursorY = event.clientY - positionRelativeToScreen;\r\n\r\n this.elements.cursor.style.left = `${cursorX}px`;\r\n this.elements.cursor.style.top = `${cursorY}px`;\r\n }\r\n}\r\n\r\nexport function setupFeaturedCases() {\r\n const modules = document.querySelectorAll('.featured-cases');\r\n\r\n if (modules) {\r\n Array.from(modules).forEach(module => {\r\n void new CaseCarousel(module);\r\n });\r\n }\r\n}\r\n\r\nfunction getTouches(event) {\r\n if (event.touches || event.originalEvent) {\r\n return event.touches || event.originalEvent.touches;\r\n } else {\r\n return false;\r\n }\r\n}\r\n","import { disableScrollLock, enableScrollLock } from '../utils/scrollLock';\r\nimport { extractVideoIdFromUrl } from './video-yt';\r\n\r\nlet player;\r\n\r\nexport function setupProductVideo() {\r\n const videoToggle = document.querySelector('.toggle-product-video');\r\n\r\n if (videoToggle) {\r\n const url = videoToggle.getAttribute('href');\r\n const poster = videoToggle.getAttribute('data-poster');\r\n videoToggle.addEventListener('click', event => {\r\n event.preventDefault();\r\n\r\n if (extractVideoIdFromUrl(url)) {\r\n openVideoOverlay(url, poster);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction openVideoOverlay(url, poster) {\r\n enableScrollLock();\r\n const closeButton = document.createElement('div');\r\n closeButton.classList.add('modal__close');\r\n closeButton.addEventListener('click', closeVideoOverlay);\r\n\r\n const playerContainer = document.createElement('div');\r\n playerContainer.setAttribute('id', 'modalPlayer');\r\n\r\n const playButton = document.createElement('div');\r\n playButton.classList.add('modal__play-button');\r\n playButton.addEventListener('click', startVideo);\r\n\r\n const playerPoster = new Image();\r\n playerPoster.src = poster;\r\n\r\n const modalBox = document.createElement('div');\r\n modalBox.classList.add('modal__box');\r\n modalBox.appendChild(playerContainer);\r\n modalBox.appendChild(playerPoster);\r\n modalBox.appendChild(playButton);\r\n\r\n const modalOverlay = document.createElement('div');\r\n modalOverlay.classList.add('modal__overlay');\r\n modalOverlay.addEventListener('click', closeVideoOverlay);\r\n\r\n const modal = document.createElement('div');\r\n modal.classList.add('modal');\r\n modal.appendChild(closeButton);\r\n modal.appendChild(modalOverlay);\r\n modal.appendChild(modalBox);\r\n\r\n document.body.appendChild(modal);\r\n\r\n player = new YT.Player('modalPlayer', {\r\n width: '100%',\r\n height: '100%',\r\n videoId: extractVideoIdFromUrl(url),\r\n playerVars: {\r\n rel: 0\r\n }\r\n });\r\n}\r\n\r\nfunction closeVideoOverlay() {\r\n disableScrollLock();\r\n\r\n document.querySelector('.modal').remove();\r\n}\r\n\r\nfunction startVideo() {\r\n player.playVideo();\r\n document.querySelector('.modal__play-button').remove();\r\n document.querySelector('.modal__box img').remove();\r\n}\r\n","import { enableScrollLock, disableScrollLock } from '../utils/scrollLock';\r\n\r\nexport function setupIntro() {\r\n\r\n const curtain = document.querySelector('.page-curtain');\r\n\r\n if (curtain) {\r\n enableScrollLock();\r\n\r\n window.addEventListener('load', () => {\r\n curtain.classList.add('pull-up');\r\n\r\n setTimeout(() => {\r\n curtain.classList.add('hide');\r\n disableScrollLock();\r\n }, 1500);\r\n });\r\n }\r\n}\r\n","import { onReady } from './utils/onReady';\r\nimport { setupNav } from './components/nav';\r\nimport { setupLazyLoading } from './utils/lazyImage';\r\nimport { setupAccordions } from './components/accordion';\r\nimport { setupVideos } from './components/video';\r\nimport { initVhUnitOverwrite, debounce } from './utils/helpers';\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 { setupYTVideos } from './components/video-yt';\r\nimport { setupSliders } from './components/slider';\r\nimport { watchFormFields } from './components/form';\r\nimport { setupIntro } from './components/intro';\r\nimport { setupUsp } from './components/usp';\r\nimport { setupFeaturedCases } from './components/featured-cases';\r\nimport { setupIntersect } from './utils/intersect';\r\nimport { setupProductVideo } from './components/product-video';\r\n\r\nfunction init() {\r\n document.body.classList.remove('standby');\r\n\r\n setupIntersect();\r\n\r\n setupIntro();\r\n\r\n setupAnchorLinkScroll();\r\n\r\n setupNav('.nav');\r\n\r\n onReady(() => {\r\n initVhUnitOverwrite();\r\n setupLazyLoading();\r\n setupAccordions();\r\n setupFilters();\r\n setupOverlay();\r\n setupVideos();\r\n setupYTVideos();\r\n setupTabs();\r\n setupSliders();\r\n watchFormFields();\r\n setupUsp();\r\n setupFeaturedCases();\r\n setupProductVideo();\r\n });\r\n}\r\n\r\ninit();\r\n","export function setupIntersect(target = '[data-intersect]') {\r\n const targets = document.querySelectorAll(target);\r\n\r\n const options = {\r\n threshold: 0.15\r\n };\r\n\r\n function observeSection(section) {\r\n const io = new IntersectionObserver((entries, observer) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n entry.target.classList.add('js-intersected');\r\n\r\n observer.disconnect();\r\n }\r\n });\r\n }, options);\r\n\r\n io.observe(section);\r\n }\r\n\r\n Array.from(targets).forEach(observeSection);\r\n}\r\n","export function setupVideos(selector = '.video') {\r\n const videos = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < videos.length; i++) {\r\n const videoPosition = videos[i].querySelector('.player-position');\r\n if(!videoPosition) {\r\n continue;\r\n }\r\n const videoId = videoPosition.getAttribute('data-video-id');\r\n\r\n let player;\r\n\r\n setTimeout(() => {\r\n player = new YT.Player(videoPosition.getAttribute('id'), {\r\n videoId,\r\n playerVars: {\r\n 'playsinline': 1\r\n }\r\n });\r\n }, 1000);\r\n\r\n videos[i].querySelector('.play-button').addEventListener('click', () => {\r\n videos[i].classList.add('active');\r\n player.playVideo();\r\n });\r\n\r\n videos[i].querySelector('.stop-button').addEventListener('click', () => {\r\n videos[i].classList.remove('active');\r\n player.pauseVideo();\r\n });\r\n }\r\n}\r\n"],"names":["functionReferences","readyState","document","readyEventBound","emptyCallbackArrays","length","tempArray","slice","forEach","funcRef","onReady","functionReference","addEventListener","push","isVisible","elem","offsetWidth","offsetHeight","getClientRects","isElement","element","Element","Document","Window","getElementPosition","relativeTo","arguments","undefined","window","useElement","getElementById","useRelativeTo","rect","getBoundingClientRect","top","pageYOffset","documentElement","scrollTop","left","pageXOffset","scrollLeft","offsetTop","offsetLeft","getElementScroll","scrollX","scrollY","console","warn","getElementTransform","transform","getComputedStyle","transformObj","scaleX","scaleY","skewX","skewY","translateX","translateY","values","match","parseFloat","scrollLocked","enableScrollLock","scrollPosition","scrollTo","htmlTag","classList","add","style","marginTop","concat","position","overflow","width","body","overflowY","disableScrollLock","remove","removeAttribute","nav","langPickers","ticking","scrollFunctions","animate","scrollHandler","requestAnimationFrame","onScroll","handler","triggerNow","initScroll","stickyNavOnScroll","scrollTimer","lastScrollPosition","className","scrollInPixels","goingUpClass","clearTimeout","setTimeout","windowScroll","hideOnClickOutside","callback","outsideClickListener","event","contains","target","removeEventListener","toggleMenuOpen","currentBreakpoint","resizeTimer","breakpoints","breakpointKeys","Object","keys","currentWindowWidth","innerWidth","currentBreakpointIndex","resizeFunctions","getWindowSizes","lastFoundWidth","key","index","resizeHandler","onWindowResize","lastUsedScreenWidth","isBot","navigator","test","userAgent","lazyArray","options","loadedClass","loadClass","decodeImg","oldIe11Fit","offset","lazyLoad","i","lazyElem","bottom","right","innerHeight","clientHeight","clientWidth","loadBgImage","loadLazyImage","Array","prototype","filter","call","l","bgContainer","src","getImageSrc","handleLoadedBg","backgroundImage","formattedSrc","loadImage","then","container","oldImage","querySelector","getAttribute","objectFitPolyfill","removeChild","newImageTag","tagName","altText","setAttribute","appendChild","path","newImage","Image","Promise","resolve","decode","decodeImage","image","largestBreakpointFound","breakpointName","srcAttribute","transitionEndEventName","detectStyleDeclatationName","eventTypeName","transitions","transition","OTransition","MozTransition","WebkitTransition","el","createElement","t","cssAnimateNewHeight","newHeight","classTarget","classOnBoth","prevHeight","delayedClose","height","activeAccordion","keycode","Accordion","_createClass","trigger","_this","this","_classCallCheck","dom","parentNode","nextElementSibling","settings","type","e","ctrlKey","metaKey","shiftKey","preventDefault","ariaExpanded","openAccordByHashId","location","hash","indexOf","accordionContent","replace","click","focusedElement","activeElement","keyCode","closest","previousElementSibling","focus","allowStatCookies","CookieInformation","getConsentGivenFor","setVhProp","vh","setProperty","easeInOutQuintic","currentTime","start","change","duration","time","ts","tc","to","move","amount","scrollingElement","increment","returnHashElement","hashLink","pathname","activeOverlay","activeOverlayContent","activeOverlayCloseBtn","classNames","Filter","filters","querySelectorAll","allFilter","targetContainer","filterType","itemCountReplace","filterHandler","replaceWithNumberOfItems","value","filterItems","isButton","filterValue","name","siblingRadios","r","deselectRadio","item","itemFilterValues","split","cleanFilterValue","trim","toLowerCase","map","filterValues","getSetValues","isComboFilter","showItem","cleanValue","sections","s","section","replaceValue","children","items","option","count","optionStr","innerText","checked","valArray","len","overlayClose","overlayOpen","targetId","currentTarget","lockScroll","hasAttribute","matches","msMatchesSelector","webkitMatchesSelector","parentElement","nodeType","loadingVideoId","activePlayer","openTab","tab","tabContent","activeTab","activeTabContent","openTabByHashId","generateYoutubeIframe","youtubeId","allowCookies","youtubeContainer","ytPlayerHost","YT","Player","videoId","host","playerVars","autoplay","rel","controls","muted","events","setPlaybackQuality","mute","playVideo","onStateChange","YTP","resumePlayback","data","PlayerState","BUFFERING","PAUSED","a","PLAYING","onIframeReady","remains","getDuration","getCurrentTime","rewindTO","seekTo","ENDED","extractVideoIdFromUrl","url","initIframeVideoBg","videoTrigger","_typeof","videoTarget","videoLink","href","player","id","tag","protocol","firstScriptTag","getElementsByTagName","insertBefore","loadYouTubeApi","tabs","onYouTubeIframeAPIReady","global","factory","module","exports","EvEmitter","proto","on","eventName","listener","_events","listeners","once","onceEvents","_onceEvents","off","splice","emitEvent","args","onceListeners","apply","allOff","getSize","getStyleSize","num","isNaN","logError","message","error","measurements","measurementsLength","getStyle","isBoxSizeOuter","isSetup","div","padding","borderStyle","borderWidth","boxSizing","Math","round","setup","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","matchesSelector","matchesMethod","ElemProto","prefixes","method","selector","require$$0","fizzyUIUtils","utils","extend","b","prop","modulo","arraySlice","makeArray","obj","isArray","removeFrom","ary","getParent","getQueryElement","handleEvent","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","methodName","threshold","timeoutName","timeout","docReady","toDashed","str","$1","$2","htmlInit","WidgetClass","namespace","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","dataOptionsAttr","jQuery","attr","JSON","parse","instance","Flickity","Cell","parent","create","x","shift","originSide","destroy","unselect","side","setPosition","updateTarget","renderPosition","setDefaultTarget","marginProperty","cellAlign","sideOffset","adjustedX","percentPosition","getPositionValue","select","wrapShift","slideableWidth","Slide","isOriginLeft","cells","addCell","cell","max","beginMargin","firstMargin","endMargin","lastCell","getLastCell","lastMargin","slideWidth","getCellElements","animatePrototype","startAnimation","isAnimating","restingFrames","applyDragForce","applySelectedAttraction","previousX","integratePhysics","positionSlider","settle","wrapAround","shiftWrapCells","setTranslateX","dispatchScrollEvent","is3d","cursorPosition","rightToLeft","slider","firstSlide","slides","positionX","progress","slidesWidth","dispatchEvent","positionSliderAtSelected","selectedSlide","velocity","isPointerDown","isFreeScrolling","selectedIndex","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","gap","cellShift","_unshiftCells","getFrictionFactor","applyForce","force","getRestingPosition","isDraggable","dragForce","dragX","selectedAttraction","require$$1","require$$2","require$$3","require$$4","require$$5","_Flickity","moveElements","toElem","GUID","instances","queryElement","flickityGUID","$element","constructor","defaults","_create","accessibility","freeScrollFriction","friction","namespaceJQueryEvents","resize","setGallerySize","createMethods","guid","viewport","_createSlider","watchCSS","activate","opts","isActive","_filterFindCellElements","reloadCells","tabIndex","selectInitialIndex","isInitActivated","cellSelector","_makeCells","positionCells","_getWrapShiftCells","cellElem","getLastSlide","_sizeCells","_positionCells","maxCellHeight","cellX","startCell","updateSlides","_containSlides","slide","nextMargin","canCellFit","_getCanCellFit","updateSelectedSlide","groupCells","number","parseInt","percentMatch","percent","_init","reposition","setCellAlign","cellAlignShorthands","center","shorthand","adaptiveHeight","gapX","cellIndex","_getGapCells","contain","isRightToLeft","contentWidth","isContentSmaller","beginBound","endBound","min","emitArgs","$event","jQEvent","Event","isWrap","isInstant","_wrapSelect","prevIndex","wrapIndex","delta","abs","backWrapDelta","forewardWrapDelta","isDragSelect","previous","next","unselectSelectedSlide","selectedCells","selectedElements","selectedCell","selectedElement","initialIndex","queryCell","selectCell","getCellSlideIndex","getCell","getCells","getParentCell","getAdjacentCellElements","adjCount","cellElems","slideIndex","uiChange","childUIPointerDown","onresize","isDragging","content","deactivate","onkeydown","isNotFocused","keyboardHandlers","37","leftMethod","39","rightMethod","prevScrollY","preventScroll","removeData","bridget","setJQuery","jq","Unipointer","bindStartEvent","_bindStartEvent","unbindStartEvent","isAdd","bindMethod","startEvent","PointerEvent","getTouch","touches","touch","identifier","pointerIdentifier","onmousedown","button","_pointerDown","ontouchstart","changedTouches","onpointerdown","pointer","pointerId","pointerDown","_bindPostStartEvents","postStartEvents","mousedown","touchstart","pointerdown","_boundPointerEvents","_unbindPostStartEvents","onmousemove","_pointerMove","onpointermove","ontouchmove","pointerMove","onmouseup","_pointerUp","onpointerup","ontouchend","_pointerDone","pointerUp","_pointerReset","pointerDone","onpointercancel","_pointerCancel","ontouchcancel","pointerCancel","getPointerPoint","pageX","y","pageY","Unidragger","bindHandles","_bindHandles","unbindHandles","touchAction","_touchActionValue","handles","handle","okayPointerDown","pointerDownPointer","pointerDownBlur","cursorNodes","TEXTAREA","INPUT","SELECT","OPTION","clickTypes","radio","checkbox","submit","file","isCursorNode","nodeName","isClickType","isOkay","focused","blur","moveVector","_dragPointerMove","_dragMove","hasDragStarted","_dragStart","_dragPointerUp","_dragEnd","_staticClick","isPreventingClicks","dragStart","dragMove","bind","dragEnd","onclick","isIgnoringMouseUp","staticClick","draggable","dragThreshold","_createDrag","onActivateDrag","_uiChangeDrag","onDeactivateDrag","updateDraggable","bindDrag","unbindDrag","_pointerDownPreventDefault","pointerDownFocus","pointerDownScroll","getScrollPosition","_pointerDownDefault","focusNodes","isTouchStart","isTouchPointer","pointerType","isFocusNode","isTouchScrolling","dragStartPosition","previousDragX","direction","originBound","dragMoveTime","Date","freeScroll","dragEndRestingSelect","restingX","dragEndBoostSelect","distance","getSlideDistance","positiveResting","_getClosestResting","negativeResting","minDistance","Infinity","condition","dist","minDist","isWrapAround","wrap","floor","clickedCell","onscroll","scroll","scrollMoveX","scrollMoveY","svgURI","PrevNextButton","isEnabled","isPrevious","leftDirection","isLeft","disable","svg","createSVG","update","createElementNS","pathMovements","shape","x0","x1","y1","x2","y2","x3","getArrowMovements","arrowShape","enable","disabled","lastIndex","boundIndex","prevNextButtons","_createPrevNextButtons","prevButton","nextButton","activatePrevNextButtons","deactivatePrevNextButtons","PageDots","holder","dots","handleClick","onClick","setDots","addDots","removeDots","fragment","createDocumentFragment","newDots","dot","updateSelected","selectedDot","onTap","pageDots","_createPageDots","activatePageDots","updateSelectedPageDots","updatePageDots","deactivatePageDots","state","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","play","hidden","tick","autoPlay","clear","stop","pause","unpause","pauseAutoPlayOnHover","_createPlayer","activatePlayer","stopPlayer","deactivatePlayer","playPlayer","pausePlayer","unpausePlayer","onmouseenter","onmouseleave","insert","getCellsFragment","isAppend","insertCellElement","endCells","cellChange","append","prepend","minCellIndex","cellSizeChange","changedCellIndex","isPositioningSlider","prevSelectedElem","LazyLoader","img","flickity","load","_createLazyload","lazyImages","lazyCellImages","lazyloadAttr","srcAttr","srcsetAttr","imgs","getCellLazyImages","srcset","onload","complete","onerror","Slider","mobileMode","lazyImgs","from","flkty","ready","bindEvents","scope","navButtons","previousSelectedButton","selectedButton","checkValidation","input","valid","val","field","textAreaAutoHeight","scrollHeight","checkFieldValue","Usp","mainElement","_defineProperty","firstTouch","getTouches","firstX","clientX","lastX","diff","currentActiveSlide","elements","changeSlide","navClicked","changeTo","bullets","handleStart","handleMove","handleEnd","handleNavClick","originalEvent","CaseCarousel","curtain","firstCase","numberOfVisibleCases","caseWidth","fullWidth","prev","currentCase","changeActiveCase","nunmberOfCases","inputDown","images","anchors","inputInitX","currentPosition","CustomEvent","lazy","inputCurrentX","changeWaiting","moveContainer","transformDistance","remainingSpace","inputMoved","wasMovedByInput","tolerance","newTranslate","positionRelativeToScreen","cursorX","cursorY","clientY","cursor","getCaseWidth","calculateVisibleCases","calculateRemainingSpace","savedUrl","handleInputStart","handleInputMove","handleInputEnd","moveCursor","setupProductVideo","videoToggle","poster","closeButton","closeVideoOverlay","playerContainer","playButton","startVideo","playerPoster","modalBox","modalOverlay","modal","openVideoOverlay","targets","observeSection","IntersectionObserver","entries","observer","entry","isIntersecting","disconnect","observe","setupIntersect","triggerSelector","triggers","_loop","setupAnchorLinkScroll","sticky","navBtn","langPicker","setupNav","modules","customOptions","_objectSpread","getElementsByClassName","setupLazyLoading","accordions","setupAccordions","filterContainers","setupFilters","overlayButtonOpen","setupOverlay","videos","videoPosition","playsinline","pauseVideo","setupVideos","videoElems","videoElem","setupYTVideos","tabsContainer","setupTabs","sliders","setupSliders","form","f","fields","watchFormFields","moduleNav","setupFeaturedCases"],"mappings":"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"}