{"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/utils/windowResize.js","../../../Frontend/js/components/nav.js","../../../Frontend/js/utils/stickyNavOnScroll.js","../../../Frontend/js/utils/animation.js","../../../Frontend/js/components/accordion.js","../../../Frontend/js/utils/helpers.js","../../../Frontend/js/utils/scrollTo.js","../../../Frontend/js/utils/lazyImage.js","../../../Frontend/js/components/video.js","../../../Frontend/js/components/anchors.js","../../../Frontend/js/components/filter.js","../../../Frontend/js/components/overlay.js","../../../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/gallery.js","../../../Frontend/js/components/stickyHeader.js","../../../Frontend/js/components/simple-steps.js","../../../node_modules/noUiSlider/distribute/nouislider.js","../../../Frontend/js/components/form.js","../../../Frontend/js/main.js"],"sourcesContent":["/**\r\n * Handler to trigger callbacks once the browser is ready for them.\r\n *\r\n * You can keep adding references using onReady() even after the page is loaded. In that case they will be\r\n * run at once.\r\n *\r\n * @example\r\n * import { onReady } from './utils/events/onReady';\r\n *\r\n * onReady(yourFunctionHere);\r\n *\r\n */\r\n\r\nlet functionReferences = [];\r\n\r\n// Set the initial readyState based on the browser's current state. If the script has been loaded\r\n// asynchronously, the DOM might be ready for us already, in which case there's no reason to delay\r\n// any further processing. The following will evaluate as true if the DOM is ready, or the page is\r\n// complete.\r\nlet readyState = document.readyState === 'interactive' || document.readyState === 'complete';\r\n\r\n// Defines whether or not the window.onReady event has been bound, so we won't do it twice. That\r\n// would just be stupid.\r\nlet readyEventBound = false;\r\n\r\n/**\r\n * Run the given array of callback functions.\r\n *\r\n * @private\r\n * @param {Array} funcArray\r\n */\r\nfunction runFunctionArray(funcArray) {\r\n funcArray.forEach(funcRef => funcRef());\r\n}\r\n\r\n/**\r\n * Empty the callback arrays\r\n *\r\n * @private\r\n */\r\nfunction emptyCallbackArrays() {\r\n // Keep iterating through the function references until there are none left.\r\n while (functionReferences.length) {\r\n // Set up a temporary array that mirrors the list of callbacks, and empty the real one.\r\n const tempArray = functionReferences.slice(0);\r\n functionReferences = [];\r\n\r\n // Run the callbacks. The callbacks themselves may set up more callbacks, which\r\n // is why we keep looping the array until we're done.\r\n runFunctionArray(tempArray);\r\n }\r\n\r\n // At this point we'll assume we're ready for anything!\r\n readyState = true;\r\n}\r\n\r\n/**\r\n * Make sure the \"ready\"-event is set.\r\n *\r\n * @private\r\n */\r\nfunction bindReadyEvent() {\r\n if (!readyEventBound) {\r\n if (document.readyState === 'loading') {\r\n // loading yet, wait for the event\r\n document.addEventListener('DOMContentLoaded', emptyCallbackArrays);\r\n } else {\r\n // DOM is ready!\r\n emptyCallbackArrays();\r\n }\r\n\r\n readyEventBound = true;\r\n }\r\n}\r\n\r\n/**\r\n * Register a function to run when the page is ready.\r\n *\r\n * @param {Function} functionReference - The function you want to run.\r\n */\r\nexport function onReady(functionReference) {\r\n if (typeof functionReference === 'function') {\r\n if (readyState) {\r\n functionReference();\r\n } else {\r\n bindReadyEvent();\r\n\r\n functionReferences.push(functionReference);\r\n }\r\n }\r\n}\r\n","/**\r\n * Utilities for checking properties and states of elements.\r\n */\r\n\r\n/**\r\n * Check if an element is empty.\r\n *\r\n * @param {Node} element - Check if this element is empty.\r\n * @param {boolean} [strict=true] - Set this to **false** to ignore nodes with whitespace.\r\n * @returns {boolean} **True** if the element is empty.\r\n */\r\nexport function elementIsEmpty(element, strict = true) {\r\n return strict ? !element.childNodes.length : !element.innerHTML.trim().length;\r\n}\r\n\r\n/**\r\n * Check if an element is hidden in the DOM with `display: none;`\r\n *\r\n * @param {HTMLElement} element - The element to check.\r\n * @returns {boolean} **True** if element is hidden, otherwise **false**.\r\n */\r\nexport function elementIsHidden(element) {\r\n return element.offsetParent === null;\r\n}\r\n\r\n/**\r\n * Check if an element is in the viewport\r\n * \r\n * @param {HTMLElement} elem - The element to check \r\n */\r\nexport function isVisible(elem) {\r\n return !!elem && !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\r\n}\r\n\r\n/**\r\n * Find out whether or not the given argument is an element that would react somewhat normally to DOM-manipulations.\r\n *\r\n * @param {*} element - The element to check.\r\n * @returns {boolean} `true` if the given argument is an element (or document, or window), and `false` otherwise.\r\n */\r\nexport function isElement(element) {\r\n return element instanceof Element || element instanceof Document || element instanceof Window;\r\n}\r\n\r\n/**\r\n * Return the position of an element\r\n *\r\n * @param {Element|String} element - The HTML element to work with or its ID\r\n * @param {Element|String|Window} [relativeTo=window] - The HTML element to return the position relative to or its ID\r\n * @returns {{top: Number, left: Number}} An object with top and left positions in pixels\r\n *\r\n *\r\n * @example Basic usage:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * const element = document.querySelector('.anElement');\r\n * getElementPosition(element);\r\n *\r\n *\r\n * @example Perform a search for an element with an ID equal to the string, i.e. 'elementId', and get the position of that:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * getElementPosition('elementId');\r\n */\r\nexport function getElementPosition(element, relativeTo = window) {\r\n const useElement = typeof element === 'string' ? document.getElementById(element) : element;\r\n\r\n // Throw error if element wasn't found\r\n if (!useElement) {\r\n throw 'getElementPosition did not find an element.';\r\n }\r\n\r\n const useRelativeTo = typeof relativeTo === 'string' ? document.getElementById(relativeTo) : relativeTo;\r\n\r\n // Throw error if relative element wasn't found\r\n if (!useRelativeTo) {\r\n throw 'getElementPosition did not find an element to show the position relative to.';\r\n }\r\n\r\n if (relativeTo === window) {\r\n // Return position relative to window\r\n const rect = useElement.getBoundingClientRect();\r\n return {\r\n top: rect.top + (window.pageYOffset || document.documentElement.scrollTop),\r\n left: rect.left + (window.pageXOffset || document.documentElement.scrollLeft)\r\n };\r\n } else {\r\n // Return position relative to declared element\r\n return {\r\n top: useElement.offsetTop - relativeTo.offsetTop,\r\n left: useElement.offsetLeft - relativeTo.offsetLeft\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Get the current scroll values of the given element (or window). Will return an object containing\r\n * \"left\" and \"top\" properties, which are set to the scroll values, or false if no compatible element\r\n * was given.\r\n *\r\n * @param {Element|Window} [element=window]\r\n * @returns {{ left: number, top: number } | boolean}\r\n */\r\nexport function getElementScroll(element = window) {\r\n if (isElement(element)) {\r\n if (element instanceof Window) {\r\n return {\r\n left: element.pageXOffset || document.documentElement.scrollLeft,\r\n top: element.pageYOffset || document.documentElement.scrollTop\r\n };\r\n } else {\r\n return {\r\n left: element.scrollX || element.scrollLeft,\r\n top: element.scrollY || element.scrollTop\r\n };\r\n }\r\n } else {\r\n console.warn('Can\\'t get scroll-position or given argument type.');\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get both width and height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includePadding=false] - Get size including padding (defaults to true)\r\n * @param {boolean} [options.includeBorder=false] - Get size including border (defaults to true)\r\n * @param {boolean} [options.includeMargin=true] - Get size including margin (defaults to false)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get size of pseudo element ':before' or ':after'\r\n * @returns {{width: number, height: number}} An object with the width and height as numbers\r\n */\r\nexport function getElementSize(element, options = {}) {\r\n // Get styles\r\n const elementStyle = window.getComputedStyle(element, options.pseudoElement);\r\n\r\n return {\r\n width: getElementWidth(element, options, elementStyle),\r\n height: getElementHeight(element, options, elementStyle)\r\n };\r\n}\r\n\r\n/**\r\n * Get width of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get width including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get width including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get width including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get width of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The width as a number\r\n */\r\nexport function getElementWidth(element, options = {}, elementStyle = null) {\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get width including border and padding\r\n let width = element.offsetWidth;\r\n\r\n // Calculate width with margin\r\n if (options.includeMargin) {\r\n width += parseFloat(style.marginLeft) + parseFloat(style.marginRight);\r\n }\r\n\r\n // Calculate width without border\r\n if (!options.includeBorder) {\r\n width -= parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth);\r\n }\r\n\r\n // Calculate width without padding\r\n if (!options.includePadding) {\r\n width -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);\r\n }\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * Get height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get height including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get height including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get height including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get height of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The height as a number\r\n */\r\nexport function getElementHeight(element, options = {}, elementStyle = null) {\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get height including border and padding\r\n let height = element.offsetHeight;\r\n\r\n // Calculate height with margin\r\n if (options.includeMargin) {\r\n height += parseFloat(style.marginTop) + parseFloat(style.marginBottom);\r\n }\r\n\r\n // Calculate height without border\r\n if (!options.includeBorder) {\r\n height -= parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);\r\n }\r\n\r\n // Calculate height without padding\r\n if (!options.includePadding) {\r\n height -= parseFloat(style.paddingTop) + parseFloat(style.paddingBottom);\r\n }\r\n\r\n return height;\r\n}\r\n","/**\r\n * A utility to **lock the viewport** at the current position in order to **stop scrolling**.\r\n *\r\n * @example Basic usage\r\n * import { enableScrollLock, disableScrollLock } from './utils/dom/scrollLock';\r\n *\r\n * enableScrollLock();\r\n * window.setTimeout(disableScrollLock, 3000);\r\n */\r\n\r\nimport { getElementScroll } from './elementProperties';\r\n\r\nconst className = 'scroll-lock';\r\nlet scrollTop = 0;\r\n\r\n/**\r\n * Get the current state of the scroll lock. `true` if the scroll lock is enabled, otherwise `false`.\r\n *\r\n * @type {boolean}\r\n */\r\nexport let scrollLocked = false;\r\n\r\n/**\r\n * Enable the scroll lock.\r\n */\r\nexport function enableScrollLock() {\r\n if (!scrollLocked) {\r\n // Get scroll position\r\n const scrollPosition = getElementScroll();\r\n\r\n // Reset scroll position\r\n window.scrollTo(scrollPosition.left, 0);\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.add(className);\r\n htmlTag.style.marginTop = `${-scrollPosition.top}px`;\r\n htmlTag.style.position = 'fixed';\r\n htmlTag.style.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 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 { stickyNavOnScroll } from '../utils/stickyNavOnScroll';\r\nimport { enableScrollLock, disableScrollLock } from '../utils/scrollLock';\r\nimport { currentWindowWidth} from '../utils/windowResize';\r\n\r\n\r\nexport let nav;\r\n\r\nexport function toggleMenuOpen() {\r\n if (nav.classList.contains('nav--open')) {\r\n disableScrollLock();\r\n nav.classList.remove('nav--open');\r\n\r\n if (window.pageYOffset > 50) {\r\n setTimeout(() => {\r\n nav.classList.add('going-up');\r\n }, 50);\r\n }\r\n\r\n } else {\r\n enableScrollLock();\r\n nav.classList.add('nav--open');\r\n\r\n //First lazyload images when overlay is open, and not mobile\r\n if (currentWindowWidth > 1023) {\r\n const lazyElements = nav.querySelectorAll('.lazyload-overlay');\r\n for (let i = 0; i < lazyElements.length; i++) {\r\n const lazyElement = lazyElements[i];\r\n\r\n lazyElement.classList.remove('lazyload-overlay');\r\n lazyElement.classList.add('lazyload');\r\n }\r\n\r\n }\r\n }\r\n\r\n}\r\n\r\nexport function setupNav(selector = '.nav', sticky = true) {\r\n nav = document.body.querySelector(selector);\r\n\r\n if (nav) {\r\n const navBtn = nav.querySelector('.nav__btn');\r\n\r\n navBtn.addEventListener('click', toggleMenuOpen);\r\n\r\n if (sticky) {\r\n stickyNavOnScroll(nav, 'nav--sticky', 30, 'going-up');\r\n }\r\n }\r\n}\r\n","import { getElementScroll} from './elementProperties';\r\nimport { scrollLocked } from './scrollLock';\r\nimport { onScroll } from './scroll';\r\n\r\n/**\r\n *\r\n * @param {HTMLElement} element - element to add sticky class to\r\n * @param {string} className - sticky class name to add on scroll\r\n * @param {number} scrollInPixels - number of pixels before activating scroll\r\n * @param {string} goingUpClass - class added when scrolling up\r\n */\r\nexport function stickyNavOnScroll(element, className = 'nav--sticky', scrollInPixels = 0, goingUpClass = 'nav--going-up') {\r\n let lastScrollPosition;\r\n const header = document.body.querySelector('.header__wrap') || document.body.querySelector('.header--simple');\r\n const headerHeight = header ? header.offsetHeight - 2 : 200;\r\n\r\n const scrollHandler = () => {\r\n if (!scrollLocked) {\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 lastScrollPosition = windowScroll.top;\r\n } else {\r\n element.classList.remove(className);\r\n element.classList.remove(goingUpClass);\r\n }\r\n\r\n // Added white background after menu passes header\r\n if (windowScroll.top > headerHeight) {\r\n element.classList.add('nav--white-bg');\r\n } else {\r\n element.classList.remove('nav--white-bg');\r\n }\r\n }\r\n };\r\n\r\n onScroll(scrollHandler, true);\r\n}\r\n","//import { gsap } from 'gsap';\r\n//import { ScrollTrigger } from 'gsap/ScrollTrigger';\r\nimport { currentWindowWidth, onWindowResize } from './windowResize';\r\n\r\ngsap.registerPlugin(ScrollTrigger);\r\n\r\nexport const transitionEndEventName = detectStyleDeclatationName();\r\nexport const animationEndEventName = detectStyleDeclatationName('animation');\r\n\r\n/**\r\n * Detects which prefixed eventName is in CSSStyleDeclaration\r\n *\r\n * @param {string} eventTypeName - choose 'transition' or 'animation'\r\n * @returns {string}\r\n */\r\nexport function detectStyleDeclatationName(eventTypeName = 'transition') {\r\n const transitions = {\r\n transition: `${eventTypeName}end`,\r\n OTransition: `o${eventTypeName}end`,\r\n MozTransition: `${eventTypeName}end`,\r\n WebkitTransition: `webkit${eventTypeName}end`\r\n };\r\n\r\n const el = document.createElement('div');\r\n\r\n for (const t in transitions) {\r\n if (el.style[t] !== undefined) {\r\n return transitions[t];\r\n }\r\n }\r\n return '';\r\n}\r\n\r\nexport function cssAnimateNewHeight(container, classTarget = container, classOnBoth = false) {\r\n let newHeight;\r\n const prevHeight = container.offsetHeight;\r\n\r\n const delayedClose = () => {\r\n if (classOnBoth) {\r\n container.classList.remove('open');\r\n classTarget.classList.remove('open');\r\n } else {\r\n classTarget.classList.remove('open');\r\n }\r\n\r\n classTarget.blur(); // removes focus if its a button\r\n container.removeEventListener(transitionEndEventName, delayedClose);\r\n };\r\n\r\n container.removeAttribute('style');\r\n\r\n if (classTarget.classList.contains('open')) {\r\n newHeight = 0;\r\n container.addEventListener(transitionEndEventName, delayedClose);\r\n\r\n if (classOnBoth) {\r\n classTarget.classList.remove('open');\r\n }\r\n } else {\r\n classTarget.classList.add('open');\r\n\r\n if (classOnBoth) {\r\n container.classList.add('open');\r\n }\r\n\r\n newHeight = container.offsetHeight;\r\n }\r\n\r\n container.style.height = `${prevHeight}px`;\r\n\r\n setTimeout(() => {\r\n container.style.height = `${newHeight}px`;\r\n }, 10);\r\n}\r\n\r\nexport function scrollAnimations() {\r\n\r\n if (currentWindowWidth >= 600) {\r\n const headerElem = document.querySelector('.header--zoom .header__wrap');\r\n if (headerElem) {\r\n const headerImg = headerElem.querySelector('img');\r\n\r\n if (headerImg) {\r\n gsap.to(headerImg, {\r\n objectPosition: '50% 80%',\r\n scale: 1.15,\r\n ease: 'none',\r\n scrollTrigger: {\r\n trigger: headerElem,\r\n //markers: true,\r\n start: 'top top',\r\n end: '+=60%',\r\n scrub: 0.5\r\n },\r\n });\r\n }\r\n }\r\n\r\n const categoryOverview = document.body.querySelector('.category-overview');\r\n if (categoryOverview) {\r\n const categoryImages = categoryOverview.querySelectorAll('.category-overview__img');\r\n\r\n if (categoryImages.length) {\r\n const skipFirstCat = Array.from(categoryImages).slice(1);\r\n\r\n gsap.from(skipFirstCat, {\r\n scale: 1.2,\r\n stagger: 1 / skipFirstCat.length,\r\n ease: 'none',\r\n scrollTrigger: {\r\n trigger: categoryOverview,\r\n //markers: true,\r\n scrub: true\r\n },\r\n });\r\n }\r\n }\r\n\r\n const videoContents = document.body.querySelectorAll('.video-module__content');\r\n if (videoContents.length && currentWindowWidth >= 1024) {\r\n for (let c = 0; c < videoContents.length; c++) {\r\n const videoContent = videoContents[c];\r\n const video = videoContent.parentNode.querySelector('.video');\r\n\r\n gsap.from(video, {\r\n scale: 1.2,\r\n ease: 'none',\r\n scrollTrigger: {\r\n trigger: videoContent,\r\n //markers: true,\r\n start: 'top 20%',\r\n end: '+=90%',\r\n scrub: true\r\n },\r\n });\r\n }\r\n }\r\n\r\n const fullCtas = document.body.querySelectorAll('.fullscreen-cta');\r\n\r\n for (let fs = 0; fs < fullCtas.length; fs++) {\r\n const fullCtaElem = fullCtas[fs];\r\n const fullImg = fullCtaElem.querySelector('img');\r\n const content = fullCtaElem.querySelector('.content');\r\n\r\n if (fullImg && content) {\r\n const fullCtaTimeline = gsap.timeline({\r\n paused: true,\r\n scrollTrigger: {\r\n trigger: fullCtaElem,\r\n //markers: true,\r\n start: 'top +=60%',\r\n end: 'bottom +=90%',\r\n scrub: true\r\n }\r\n });\r\n\r\n fullCtaTimeline.from(fullImg, {\r\n scale: 1.2,\r\n duration: 1,\r\n ease: 'power1.out',\r\n });\r\n\r\n fullCtaTimeline.from(content, {\r\n opacity: 0,\r\n y: 30,\r\n duration: 0.4,\r\n ease: 'power1.out'\r\n }, '-=0.4');\r\n }\r\n }\r\n }\r\n\r\n const newsEntrence = document.body.querySelector('.news-entrence');\r\n if (newsEntrence) {\r\n const curtain = newsEntrence.querySelector('.news-entrence__picture i');\r\n\r\n gsap.from(curtain, {\r\n x: 0,\r\n ease: 'power2.out',\r\n scrollTrigger: {\r\n trigger: newsEntrence,\r\n start: 'top 70%'\r\n }\r\n });\r\n }\r\n\r\n // This animation needs some bugfixing!\r\n // It has been outcommented due to iregular scrollTrigger start/end placement.\r\n\r\n // ------------------------------------------------\r\n if (currentWindowWidth >= 1024) {\r\n const textImages = document.body.querySelectorAll('.text-image');\r\n\r\n for (let ti = 0; ti < textImages.length; ti++) {\r\n const textImage = textImages[ti];\r\n const curtain = textImage.querySelector('i');\r\n const img = textImage.querySelector('img');\r\n\r\n if (curtain && img) {\r\n\r\n const isReversed = textImage.querySelector('.grid-row').classList.contains('grid-row--reverse');\r\n\r\n const tl = gsap.timeline({\r\n paused: true,\r\n scrollTrigger: {\r\n trigger: textImage,\r\n start: 'top center',\r\n //markers: true,\r\n // end: '+=70%',\r\n // scrub: 1\r\n }\r\n });\r\n\r\n tl.from(curtain, {\r\n x: 0,\r\n ease: 'power3.out',\r\n duration: 1.2,\r\n });\r\n\r\n tl.from(img, {\r\n xPercent: isReversed ? -10 : 10,\r\n scale: 1.1,\r\n ease: 'power3.out',\r\n duration: 1,\r\n }, '<');\r\n\r\n img.addEventListener('lazyloaded', () => {\r\n ScrollTrigger.refresh();\r\n });\r\n }\r\n }\r\n }\r\n\r\n onWindowResize(ScrollTrigger.refresh);\r\n}\r\n","import { cssAnimateNewHeight } from '../utils/animation';\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 e.preventDefault();\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 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\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 if (this.settings.type === 'accordion-once') {\r\n this.dom.trigger.classList.add('hidden');\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.body.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","export const body = document.body;\r\nexport const qs = (s, o = body) => o.querySelector(s);\r\nexport const qsa = (s, o = body) => o.querySelectorAll(s);\r\n\r\n\r\n/**\r\n * Sets a custom CSS variable to ensure precise vh unit mesuarment\r\n *\r\n */\r\n\r\nexport function setVhProp() {\r\n // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\r\n const vh = window.innerHeight * 0.01;\r\n // Then we set the value in the --vh custom property to the root of the document\r\n document.documentElement.style.setProperty('--vh', `${vh}px`);\r\n}\r\n\r\nexport function initVhUnitOverwrite() {\r\n setVhProp();\r\n window.addEventListener('resize', setVhProp);\r\n}\r\n\r\nexport function canUseWebP() {\r\n const elem = document.createElement('canvas');\r\n\r\n if (elem.getContext && elem.getContext('2d')) {\r\n // was able or not to get WebP representation\r\n return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;\r\n }\r\n\r\n // very old browser like IE 8, canvas not supported\r\n return false;\r\n}\r\n\r\n/**\r\n * Add a to the head\r\n */\r\nexport function addPrefetch(kind, url, as) {\r\n const linkElem = document.createElement('link');\r\n linkElem.rel = kind;\r\n linkElem.href = url;\r\n if (as) {\r\n linkElem.as = as;\r\n }\r\n linkElem.crossorigin = true;\r\n document.head.append(linkElem);\r\n}\r\n\r\n/**\r\n * Format number sparated with commas per thousand.\r\n *\r\n * @param {Number} num - Number you want to format\r\n *\r\n * @returns {string} - Returns the number formatet with commas\r\n *\r\n * @example:\r\n * console.info(formatNumber(2665)) // 2,665\r\n * console.info(formatNumber(102665)) // 102,665\r\n * console.info(formatNumber(1240.5)) // 1,240.5\r\n */\r\n\r\nexport function formatNumber(num, seperator = '.') {\r\n return num.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, `$1${seperator}`);\r\n}\r\n\r\n/**\r\n * Prevent function from being executed as long as it is invoked, while given delay hasn't passed.\r\n *\r\n * @param {Function} callback Callback\r\n * @param {String} delay Delay\r\n * @return {Function} Callback\r\n */\r\nexport function debounce(callback, delay) {\r\n let timer = null;\r\n\r\n return function () {\r\n const context = this,\r\n args = arguments;\r\n\r\n clearTimeout(timer);\r\n\r\n timer = setTimeout(function () {\r\n callback.apply(context, args);\r\n }, delay);\r\n };\r\n}\r\n\r\n/*\r\n* Load JavsScript asynchronously when needed\r\n* @param {String} source The path to the file\r\n* @param {Function} callback The callback to excecute upon load\r\n* @return {Element} Element to attach\r\n*/\r\nexport function loadJS (source, callback) {\r\n const reference = document.getElementsByTagName('script')[0];\r\n const script = document.createElement('script');\r\n\r\n script.src = source;\r\n script.async = true;\r\n reference.parentNode.insertBefore(script, reference);\r\n\r\n if (callback && typeof(callback) === 'function') {\r\n script.onload = callback;\r\n }\r\n\r\n return script;\r\n}\r\n\r\n/**\r\n * Get the thumbnail dimensions to use for a given player size.\r\n *\r\n * @param {Object} options\r\n * @param {number} options.width The width of the player\r\n * @param {number} options.height The height of the player\r\n * @return {Object} The width and height\r\n */\r\nexport function getRoundedDimensions({ width, height }) {\r\n let roundedWidth = width;\r\n let roundedHeight = height;\r\n\r\n // If the original width is a multiple of 320 then we should\r\n // not round up. This is to keep the native image dimensions\r\n // so that they match up with the actual frames from the video.\r\n //\r\n // For example 640x360, 960x540, 1280x720, 1920x1080\r\n //\r\n // Round up to nearest 100 px to improve cacheability at the\r\n // CDN. For example, any width between 601 pixels and 699\r\n // pixels will render the thumbnail at 700 pixels width.\r\n if (roundedWidth % 320 !== 0) {\r\n roundedWidth = Math.ceil(width / 100) * 100;\r\n roundedHeight = Math.round((roundedWidth / width) * height);\r\n }\r\n\r\n return {\r\n width: roundedWidth,\r\n height: roundedHeight\r\n };\r\n}","const easeInOutQuad = function(currentTime, start, change, duration) {\r\n let time = currentTime;\r\n time /= duration / 2;\r\n if (time < 1) {\r\n return (change / 2) * time * time + start;\r\n }\r\n time--;\r\n return (-change / 2) * (time * (time - 2) - 1) + start;\r\n};\r\n\r\nconst easeInOutQuintic = function(currentTime, start, change, duration) {\r\n let time = currentTime;\r\n const ts = (time /= duration) * time,\r\n tc = ts * time;\r\n return start + change * (6 * tc * ts + -15 * ts * ts + 10 * tc);\r\n};\r\n\r\nexport function scrollTo(to, duration = 1500, 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 ? to.offsetTop - start : to - start,\r\n increment = 20;\r\n\r\n let currentTime = 0;\r\n\r\n const animate = function() {\r\n // increment the time\r\n currentTime += increment;\r\n // find the value with the quadratic in-out easing function\r\n const val = easeInOutQuintic(currentTime, start, change, duration);\r\n // move the document.body\r\n move(val);\r\n // do the animation unless its over\r\n if (currentTime < duration) {\r\n requestAnimationFrame(animate);\r\n } else {\r\n if (callback && typeof callback === 'function') {\r\n // the animation is done so lets callback\r\n if (typeof callback === 'function') {\r\n callback();\r\n }\r\n }\r\n }\r\n };\r\n animate();\r\n}\r\n","import { breakpointKeys, currentBreakpointIndex } from '../utils/windowResize';\r\nimport { onWindowResize } from './windowResize';\r\nimport { onScroll } from './scroll';\r\n//import 'objectFitPolyfill';\r\n\r\nlet lastUsedScreenWidth;\r\nlet lazyArray = [];\r\n\r\nlet options = {\r\n className: 'lazy',\r\n loadedClass: 'lazy--loaded',\r\n loadClass: 'lazy--loading',\r\n decodeImg: true, // This option requires promises support (incl. via polyfill.io)\r\n oldIe11Fit: false, // This option requires objectFit support\r\n offset: 0\r\n};\r\n\r\nexport function setupLazyLoading(customOptions = {}) {\r\n lastUsedScreenWidth = -1;\r\n options = { ...options, ...customOptions };\r\n lazyArray = document.body.getElementsByClassName(options.className);\r\n\r\n // onWindowsResize set before first lazyLoad, to insure currentBreakPoint is set\r\n onWindowResize(lazyLoad);\r\n\r\n onScroll(lazyLoad, true);\r\n}\r\n\r\nfunction lazyLoad() {\r\n // If our current screen mode does not match the one we used the last time we made an image lookup,\r\n // perform a new one now. Otherwise, what would be the point?\r\n\r\n if (lastUsedScreenWidth < currentBreakpointIndex) {\r\n\r\n for (let i = 0; i < lazyArray.length; i++) {\r\n const lazyElem = lazyArray[i];\r\n\r\n if (isInViewport(lazyElem)) {\r\n lazyElem.classList.add(options.loadClass);\r\n if (lazyElem.classList.contains('lazy--bg')) {\r\n loadBgImage(lazyElem);\r\n } else {\r\n loadLazyImage(lazyElem);\r\n }\r\n }\r\n }\r\n\r\n cleanLazy();\r\n }\r\n}\r\n\r\nfunction cleanLazy() {\r\n lazyArray = Array.prototype.filter.call(lazyArray, l => !l.classList.contains(options.loadClass));\r\n}\r\n\r\nfunction isInViewport(el) {\r\n const rect = el.getBoundingClientRect();\r\n\r\n return (\r\n rect.bottom >= 0 &&\r\n rect.right >= 0 &&\r\n rect.top - options.offset <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.left - options.offset <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n}\r\n\r\n/**\r\n * This function gets the image wrapper data attributes src and alt text\r\n * and creates an new image tag to download the image.\r\n * It then uses the src as a background-image.\r\n *\r\n * @param {HTMLElement} bgContainer - Image wrapper element\r\n */\r\nexport function loadBgImage(bgContainer) {\r\n const src = getImageSrc(bgContainer);\r\n const handleLoadedBg = () => {\r\n bgContainer.style.backgroundImage = formattedSrc;\r\n bgContainer.classList.add(options.loadedClass);\r\n bgContainer.classList.remove(options.loadClass);\r\n };\r\n\r\n // If no usable source was returned, abort at once.\r\n if (!src) {\r\n return;\r\n }\r\n\r\n const formattedSrc = `url(${src})`;\r\n\r\n if (bgContainer.style.backgroundImage === formattedSrc) {\r\n return;\r\n }\r\n\r\n if (options.decodeImg) {\r\n // Start loading the new image.\r\n loadImage(src).then(handleLoadedBg);\r\n } else {\r\n handleLoadedBg();\r\n }\r\n}\r\n\r\n/**\r\n * This function gets the container data attributes src.\r\n * If the container is an image it sets the src of it.\r\n * If the container is not an image it creates a new image tag and inserts it into the given container.\r\n *\r\n * @param {HTMLElement} container - Image wrapper element\r\n */\r\nexport function loadLazyImage(container) {\r\n const src = getImageSrc(container);\r\n\r\n // If no usable source was returned, abort mission.\r\n if (!src) {\r\n return;\r\n }\r\n\r\n if (options.decodeImg) {\r\n // We don't want to start processing if the new URL matches the old one.\r\n const oldImage = container.querySelector('img');\r\n if (oldImage && container.classList.contains(options.loadedClass)) {\r\n if (oldImage.getAttribute('src') === src) {\r\n if (options.oldIe11Fit) {\r\n window.objectFitPolyfill(oldImage);\r\n }\r\n return;\r\n } else {\r\n container.removeChild(oldImage);\r\n }\r\n }\r\n\r\n // Start loading the new image.\r\n loadImage(src).then(newImageTag => {\r\n // Set src and ALT text if defined.\r\n if (container.tagName === 'IMG') {\r\n container.src = src;\r\n } else {\r\n const altText = container.getAttribute('data-alt') || '';\r\n newImageTag.setAttribute('alt', altText);\r\n\r\n container.appendChild(newImageTag);\r\n }\r\n\r\n container.classList.add(options.loadedClass);\r\n container.classList.remove(options.loadClass);\r\n\r\n // oldIE object-fit polyfill placed here to take resize into account\r\n if (options.oldIe11Fit) {\r\n window.objectFitPolyfill(newImageTag);\r\n }\r\n });\r\n } else {\r\n container.src = src;\r\n container.classList.add(options.loadedClass);\r\n container.classList.remove(options.loadClass);\r\n }\r\n}\r\n\r\n/**\r\n * Try to decode the image, after it's loaded, and resolve the Promise.\r\n *\r\n * @param {Element} newImage\r\n * @returns {Promise}\r\n */\r\nfunction decodeImage(newImage) {\r\n return 'decode' in newImage ? newImage.decode().then(() => newImage) : Promise.resolve(newImage);\r\n}\r\n\r\n/**\r\n * Load an image, and return a Promise that resolves once the image is loaded.\r\n *\r\n * @param {string} path\r\n * @returns {Promise} Promise that will resolve with the loaded image once it's ready.\r\n */\r\nexport function loadImage(path) {\r\n const newImage = new Image();\r\n\r\n return new Promise(resolve => {\r\n newImage.addEventListener('load', () => decodeImage(newImage).then(image => resolve(image)), false);\r\n newImage.src = path;\r\n });\r\n}\r\n\r\n/**\r\n * This function gets the data-src from the image wrapper, based on width of the browser window.\r\n *\r\n * @param {HTMLElement} container - Image wrapper element\r\n * @returns {string}\r\n */\r\nfunction getImageSrc(container) {\r\n let src = '';\r\n let largestBreakpointFound = 0;\r\n\r\n if (container.getAttribute('data-src')) {\r\n src = container.getAttribute('data-src');\r\n container.removeAttribute('data-src');\r\n } else {\r\n breakpointKeys.forEach((breakpointName, index) => {\r\n if (currentBreakpointIndex >= index) {\r\n if (index === 0 || index > largestBreakpointFound) {\r\n const srcAttribute = `data-src-${breakpointName}`;\r\n src = container.getAttribute(srcAttribute) || src;\r\n\r\n container.removeAttribute(srcAttribute);\r\n\r\n // Make sure we won't set the size to a smaller breakpoint later, in case they're not properly ordered.\r\n largestBreakpointFound = index;\r\n }\r\n }\r\n });\r\n }\r\n\r\n return src;\r\n}\r\n","import { addPrefetch, canUseWebP, getRoundedDimensions } from '../utils/helpers';\r\nimport { scrollTo } from '../utils/scrollTo';\r\nimport { loadImage } from '../utils/lazyImage';\r\n\r\n/**\r\n * Combined lightweight vimeo/youtube embed code.\r\n *\r\n * Ported from https://github.com/paulirish/lite-youtube-embed by Paul Irish\r\n * and https://github.com/luwes/lite-vimeo-embed by Wesley Luyten\r\n *\r\n */\r\nclass Video {\r\n constructor(container) {\r\n this.container = container;\r\n this.id = container.getAttribute('data-id');\r\n this.controls = container.getAttribute('data-controls') || 1,\r\n this.bg = container.getAttribute('data-bg') || 0,\r\n this.byline = container.getAttribute('data-byline') || 0;\r\n this.scrollto = container.getAttribute('data-scroll-to') || 0;\r\n\r\n let videoLink;\r\n\r\n if (!this.id) {\r\n videoLink = container.getAttribute('data-video-link');\r\n if (videoLink) {\r\n this.id = extractVideoIdFromUrl(videoLink);\r\n } else {\r\n console.warn('Video missing video-id / data-video-link');\r\n return;\r\n }\r\n }\r\n\r\n this.isVimeo = container.getAttribute('data-action') === 'video-vimeo' || videoLink && videoLink.indexOf('vimeo') > -1;\r\n this.poster = container.getAttribute('data-poster');\r\n\r\n if (!this.poster) {\r\n if (this.isVimeo) {\r\n\r\n let { width, height } = getRoundedDimensions(container.getBoundingClientRect());\r\n const devicePixelRatio = window.devicePixelRatio || 1;\r\n width *= devicePixelRatio;\r\n height *= devicePixelRatio;\r\n /**\r\n * To get the vimeo poster image, we have to use the Vimeo API.\r\n */\r\n this.poster = `https://lite-vimeo-embed.now.sh/thumb/${this.id}`;\r\n this.poster += `.${canUseWebP() ? 'webp' : 'jpg'}`;\r\n this.poster += `?mw=${width}&mh=${height}&q=${devicePixelRatio > 1 ? 70 : 85}`;\r\n\r\n } else {\r\n /**\r\n * Comment about the thumbnail, by original author: Paul Irish\r\n * Lo, the youtube placeholder image! (aka the thumbnail, poster image, etc)\r\n * There is much internet debate on the reliability of thumbnail URLs. Weak consensus is that you\r\n * cannot rely on anything and have to use the YouTube Data API.\r\n *\r\n * amp-youtube also eschews using the API, so they just try sddefault with a hqdefault fallback:\r\n * https://github.com/ampproject/amphtml/blob/6039a6317325a8589586e72e4f98c047dbcbf7ba/extensions/amp-youtube/0.1/amp-youtube.js#L498-L537\r\n * For now I'm gonna go with this confident (lol) assertion: https://stackoverflow.com/a/20542029, though I'll use `i.ytimg` to optimize for origin reuse.\r\n *\r\n * Worth noting that sddefault is _higher_ resolution than hqdefault. Naming is hard. ;)\r\n * From my own testing, it appears that hqdefault is ALWAYS there sddefault is missing for ~10% of videos*/\r\n\r\n this.poster = `https://i.ytimg.com/vi/${this.id}/sddefault.jpg`;\r\n }\r\n }\r\n\r\n loadImage(this.poster).then(newImageTag => {\r\n // Set src and ALT text if defined.\r\n const altText = container.getAttribute('data-alt') || '';\r\n newImageTag.setAttribute('alt', altText);\r\n\r\n container.appendChild(newImageTag);\r\n });\r\n\r\n if (!!this.bg) {\r\n Video.warmConnections();\r\n this.addIframe();\r\n } else {\r\n // On hover (or tap), warm up the TCP connections we're (likely) about to use.\r\n this.container.addEventListener('pointerover', Video.warmConnections, { once: true });\r\n\r\n // Once the user clicks, add the real iframe and drop our play button\r\n // TODO: In the future we could be like amp-youtube and silently swap in the iframe during idle time\r\n // We'd want to only do this for in-viewport or near-viewport ones: https://github.com/ampproject/amphtml/pull/5003\r\n this.container.addEventListener('click', () => this.addIframe());\r\n }\r\n }\r\n\r\n /**\r\n * Begin pre-connecting to warm up the iframe load\r\n * Since the embed's network requests load within its iframe,\r\n * preload/prefetch'ing them outside the iframe will only cause double-downloads.\r\n * So, the best we can do is warm up a few connections to origins that are in the critical path.\r\n *\r\n * Maybe `` would work, but it's unsupported: http://crbug.com/593267\r\n * But TBH, I don't think it'll happen soon with Site Isolation and split caches adding serious complexity.\r\n */\r\n static warmConnections() {\r\n if (Video.preconnected) return;\r\n\r\n if (this.isVimeo) {\r\n // The iframe document and most of its subresources come right off player.vimeo.com\r\n addPrefetch('preconnect', 'https://player.vimeo.com');\r\n // Images\r\n addPrefetch('preconnect', 'https://i.vimeocdn.com');\r\n // Files .js, .css\r\n addPrefetch('preconnect', 'https://f.vimeocdn.com');\r\n // Metrics\r\n addPrefetch('preconnect', 'https://fresnel.vimeocdn.com');\r\n } else {\r\n // The iframe document and most of its subresources come right off youtube.com\r\n addPrefetch('preconnect', 'https://www.youtube-nocookie.com');\r\n // The botguard script is fetched off from google.com\r\n addPrefetch('preconnect', 'https://www.google.com');\r\n // Not certain if these ad related domains are in the critical path. Could verify with domain-specific throttling.\r\n addPrefetch('preconnect', 'https://googleads.g.doubleclick.net');\r\n addPrefetch('preconnect', 'https://static.doubleclick.net');\r\n }\r\n\r\n Video.preconnected = true;\r\n }\r\n\r\n addIframe() {\r\n let videoUrl = this.isVimeo ? `https://player.vimeo.com/video/${this.id}?autoplay=1&rel=0` : `https://www.youtube-nocookie.com/embed/${this.id}?autoplay=1&rel=0`;\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.setAttribute('frameborder', 0);\r\n iframe.setAttribute('allowtransparency', 'true');\r\n iframe.setAttribute('playsinline', 'true');\r\n iframe.setAttribute('tabindex', '-1');\r\n iframe.setAttribute('allow', 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; autoplay');\r\n iframe.addEventListener('load', () => {\r\n // Timeout is set to prevent paint-lag when iframe is inserted\r\n setTimeout(() => {\r\n this.container.classList.add('video--loaded');\r\n this.container.classList.remove('loading');\r\n }, 300);\r\n\r\n if (this.scrollto) {\r\n scrollTo(this.container, 2000);\r\n }\r\n });\r\n\r\n videoUrl += `&controls=${this.controls}&byline=${this.byline}&background=${this.bg}&mute=${this.bg}`;\r\n\r\n iframe.src = videoUrl;\r\n\r\n this.container.classList.add('loading');\r\n this.container.appendChild(iframe);\r\n }\r\n}\r\n\r\n\r\nfunction extractVideoIdFromUrl(url) {\r\n const videoIdRegExp = /^.*((youtu.be\\/|vimeo.com\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#&?]*).*/;\r\n const match = url.match(videoIdRegExp);\r\n\r\n if (match && match[7]) {\r\n return match[7];\r\n } else {\r\n console.warn(url, 'Invalid Video URL');\r\n }\r\n}\r\n\r\n/**\r\n * Initialise video embeds with this function\r\n * Will only run if given selector elements are found in DOM\r\n *\r\n * @param {string} selector - element selector string\r\n */\r\n\r\nexport function setupVideos(selector = '[data-action^=\"video\"]') {\r\n const videos = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < videos.length; i++) {\r\n void new Video(videos[i]);\r\n }\r\n}\r\n","import { scrollTo } from '../utils/scrollTo';\r\n\r\n/**\r\n * This function strips relative site path from hashlink\r\n *\r\n * @param {string} hashLink\r\n *\r\n * @returns {HTMLElement}\r\n */\r\nfunction returnHashElement(hashLink) {\r\n if (hashLink.indexOf(window.location.pathname) !== -1) {\r\n return document.getElementById(hashLink.replace(window.location.pathname, '').replace('#', ''));\r\n } else {\r\n return document.getElementById(hashLink.replace('#', ''));\r\n }\r\n}\r\n\r\n/**\r\n * Scrolls the viewport to an hash-id\r\n * if found in querystring\r\n */\r\nexport function scrollToUrlHash() {\r\n if (window.location.hash) {\r\n const element = document.getElementById(window.location.hash.replace('#', ''));\r\n\r\n if (element) {\r\n scrollTo(element);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Activate Anchor Link Scroll with this function\r\n * Will only run if given selector elements are found in DOM\r\n *\r\n * @param {string} triggerSelector\r\n */\r\n\r\nexport function setupAnchorLinkScroll(triggerSelector = '[data-action*=\"anchor\"], a[href^=\"#\"]:not([href=\"#\"]):not([role=\"tab\"]):not([data-action*=\"accordion\"])') {\r\n\r\n const triggers = document.querySelectorAll(triggerSelector);\r\n\r\n for (let i = 0; i < triggers.length; i++) {\r\n const trigger = triggers[i];\r\n const hashLink = trigger.getAttribute('href') || trigger.getAttribute('data-target');\r\n\r\n if (hashLink) {\r\n let element = returnHashElement(hashLink);\r\n\r\n if (hashLink == '#module1') {\r\n const headerHeight = document.body.querySelector('.header__wrap');\r\n\r\n if (headerHeight) {\r\n element = headerHeight.offsetHeight;\r\n }\r\n }\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: '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 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 if (isButton) {\r\n if (this.settings.filterType === 'filter-switch') {\r\n\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n this.dom.filters[i].classList.remove(classNames.activeBtn);\r\n }\r\n\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n this.dom.targetContainer.classList.add(classNames.transitionItems);\r\n\r\n if (!filter.classList.contains(classNames.activeBtn)) {\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n filter.classList.remove(classNames.activeBtn);\r\n }\r\n }\r\n } 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\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n let showItem = true;\r\n\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n filterValues.forEach(value => {\r\n const cleanValue = value.trim().toLowerCase();\r\n if (itemFilterValues.indexOf(cleanValue) === -1) {\r\n showItem = false;\r\n }\r\n });\r\n\r\n if (!showItem) {\r\n item.classList.add(classNames.hiddenItem);\r\n } else {\r\n item.classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n }\r\n\r\n // 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(.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.currentTarget) && isVisible(activeOverlayContent)) {\r\n // or use: event.target.closest(selector) === null\r\n overlayClose(e);\r\n activeOverlay.removeEventListener('click', outsideClickListener);\r\n }\r\n}\r\n\r\nfunction overlayOpen(e, lockScroll = true) {\r\n const targetId = e.currentTarget ? e.currentTarget.getAttribute('data-target') : e;\r\n activeOverlay = document.getElementById(targetId);\r\n\r\n typeof e.preventDefault == 'function' ? e.preventDefault() : null;\r\n\r\n if (activeOverlay) {\r\n activeOverlay.classList.add(openClass);\r\n activeOverlayContent = activeOverlay.querySelector('.overlay__box');\r\n\r\n activeOverlayCloseBtn = activeOverlay.querySelector('[data-action=\"overlay-close\"]');\r\n activeOverlayCloseBtn.addEventListener('click', overlayClose);\r\n\r\n //First lazyload images when overlay is open\r\n const lazyElements = activeOverlay.querySelectorAll('.lazyload-overlay');\r\n for (let i = 0; i < lazyElements.length; i++) {\r\n const lazyElement = lazyElements[i];\r\n\r\n lazyElement.classList.remove('lazyload-overlay');\r\n lazyElement.classList.add('lazyload');\r\n }\r\n\r\n if (lockScroll) {\r\n enableScrollLock();\r\n document.documentElement.classList.add('overlay-active');\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 id not 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 document.documentElement.classList.remove('overlay-active');\r\n activeOverlayCloseBtn.removeEventListener('click', overlayClose);\r\n}\r\n\r\nexport function setupOverlay(selector = '[data-action=\"overlay-open\"]') {\r\n const overlayButtonOpen = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < overlayButtonOpen.length; i++) {\r\n overlayButtonOpen[i].addEventListener('click', overlayOpen);\r\n }\r\n}\r\n\r\nwindow.showCookieBanner = (selector = 'cookiebanner') => {\r\n if (!window.declaration || (window.declaration && window.declaration > 1)) {\r\n overlayOpen(selector, false);\r\n } else {\r\n window.declaration = 2;\r\n }\r\n};\r\n\r\nwindow.hideCookieBanner = e => overlayClose(e);\r\n","/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice(0);\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( var i=0; i < listeners.length; i++ ) {\n var listener = listeners[i]\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n","/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n /* jshint strict: false */ /* globals define, module */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See https://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n","/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n","/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'desandro-matches-selector/matches-selector'\n ], function( matchesSelector ) {\n return factory( window, matchesSelector );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) {\n return [];\n }\n\n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n clearTimeout( timeout );\n\n var args = arguments;\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n","// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'get-size/get-size'\n ], function( getSize ) {\n return factory( window, getSize );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('get-size')\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Cell = factory(\n window,\n window.getSize\n );\n }\n\n}( window, function factory( window, getSize ) {\n\n'use strict';\n\nfunction Cell( elem, parent ) {\n this.element = elem;\n this.parent = parent;\n\n this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n this.element.style.position = 'absolute';\n this.element.setAttribute( 'aria-hidden', 'true' );\n this.x = 0;\n this.shift = 0;\n};\n\nproto.destroy = function() {\n // reset style\n this.unselect();\n this.element.style.position = '';\n var side = this.parent.originSide;\n this.element.style[ side ] = '';\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n this.x = x;\n this.updateTarget();\n this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n this.target = this.x + this.size[ marginProperty ] +\n this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n // render position of cell with in slider\n var side = this.parent.originSide;\n this.element.style[ side ] = this.parent.getPositionValue( x );\n};\n\nproto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\n/**\n * @param {Integer} factor - 0, 1, or -1\n**/\nproto.wrapShift = function( shift ) {\n this.shift = shift;\n this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n}));\n","// slide\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Slide = factory();\n }\n\n}( window, function factory() {\n'use strict';\n\nfunction Slide( parent ) {\n this.parent = parent;\n this.isOriginLeft = parent.originSide == 'left';\n this.cells = [];\n this.outerWidth = 0;\n this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n this.cells.push( cell );\n this.outerWidth += cell.size.outerWidth;\n this.height = Math.max( cell.size.outerHeight, this.height );\n // first cell stuff\n if ( this.cells.length == 1 ) {\n this.x = cell.x; // x comes from first cell\n var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n this.firstMargin = cell.size[ beginMargin ];\n }\n};\n\nproto.updateTarget = function() {\n var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n var lastCell = this.getLastCell();\n var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n this.cells.forEach( function( cell ) {\n cell.select();\n });\n};\n\nproto.unselect = function() {\n this.cells.forEach( function( cell ) {\n cell.unselect();\n });\n};\n\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n });\n};\n\nreturn Slide;\n\n}));\n","// animate\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'fizzy-ui-utils/utils'\n ], function( utils ) {\n return factory( window, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.animatePrototype = factory(\n window,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, utils ) {\n\n'use strict';\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n if ( this.isAnimating ) {\n return;\n }\n\n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n};\n\nproto.animate = function() {\n this.applyDragForce();\n this.applySelectedAttraction();\n\n var previousX = this.x;\n\n this.integratePhysics();\n this.positionSlider();\n this.settle( previousX );\n // animate next frame\n if ( this.isAnimating ) {\n var _this = this;\n requestAnimationFrame( function animateFrame() {\n _this.animate();\n });\n }\n};\n\nproto.positionSlider = function() {\n var x = this.x;\n // wrap position around\n if ( this.options.wrapAround && this.cells.length > 1 ) {\n x = utils.modulo( x, this.slideableWidth );\n x = x - this.slideableWidth;\n this.shiftWrapCells( x );\n }\n\n this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n x += this.cursorPosition;\n // reverse if right-to-left and using transform\n x = this.options.rightToLeft ? -x : x;\n var translateX = this.getPositionValue( x );\n // use 3D tranforms for hardware acceleration on iOS\n // but use 2D when settled, for better font-rendering\n this.slider.style.transform = is3d ?\n 'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n};\n\nproto.dispatchScrollEvent = function() {\n var firstSlide = this.slides[0];\n if ( !firstSlide ) {\n return;\n }\n var positionX = -this.x - firstSlide.target;\n var progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) {\n return;\n }\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\n this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n if ( this.options.percentPosition ) {\n // percent position, round to 2 digits, like 12.34%\n return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 )+ '%';\n } else {\n // pixel positioning\n return Math.round( position ) + 'px';\n }\n};\n\nproto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n if ( !this.isPointerDown && Math.round( this.x * 100 ) == Math.round( previousX * 100 ) ) {\n this.restingFrames++;\n }\n // stop animating if resting for 3 or more frames\n if ( this.restingFrames > 2 ) {\n this.isAnimating = false;\n delete this.isFreeScrolling;\n // render position with translateX when settled\n this.positionSlider();\n this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n }\n};\n\nproto.shiftWrapCells = function( x ) {\n // shift before cells\n var beforeGap = this.cursorPosition + x;\n this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n // shift after cells\n var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n for ( var i=0; i < cells.length; i++ ) {\n var cell = cells[i];\n var cellShift = gap > 0 ? shift : 0;\n cell.wrapShift( cellShift );\n gap -= cell.size.outerWidth;\n }\n};\n\nproto._unshiftCells = function( cells ) {\n if ( !cells || !cells.length ) {\n return;\n }\n for ( var i=0; i < cells.length; i++ ) {\n cells[i].wrapShift( 0 );\n }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n if ( !this.isDraggable || !this.isPointerDown ) {\n return;\n }\n // change the position to drag position by applying force\n var dragVelocity = this.dragX - this.x;\n var dragForce = dragVelocity - this.velocity;\n this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n // do not attract if pointer down or no slides\n var dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n return;\n }\n var distance = this.selectedSlide.target * -1 - this.x;\n var force = distance * this.options.selectedAttraction;\n this.applyForce( force );\n};\n\nreturn proto;\n\n}));\n","// Flickity main\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter',\n 'get-size/get-size',\n 'fizzy-ui-utils/utils',\n './cell',\n './slide',\n './animate'\n ], function( EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n return factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./cell'),\n require('./slide'),\n require('./animate')\n );\n } else {\n // browser global\n var _Flickity = window.Flickity;\n\n window.Flickity = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n _Flickity.Cell,\n _Flickity.Slide,\n _Flickity.animatePrototype\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize,\n utils, Cell, Slide, animatePrototype ) {\n\n'use strict';\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n elems = utils.makeArray( elems );\n while ( elems.length ) {\n toElem.appendChild( elems.shift() );\n }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // do not initialize twice on same element\n if ( this.element.flickityGUID ) {\n var instance = instances[ this.element.flickityGUID ];\n instance.option( options );\n return instance;\n }\n\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // kick things off\n this._create();\n}\n\nFlickity.defaults = {\n accessibility: true,\n // adaptiveHeight: false,\n cellAlign: 'center',\n // cellSelector: undefined,\n // contain: false,\n freeScrollFriction: 0.075, // friction when free-scrolling\n friction: 0.28, // friction when selecting\n namespaceJQueryEvents: true,\n // initialIndex: 0,\n percentPosition: true,\n resize: true,\n selectedAttraction: 0.025,\n setGallerySize: true\n // watchCSS: false,\n // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n // add id for Flickity.data\n var id = this.guid = ++GUID;\n this.element.flickityGUID = id; // expando\n instances[ id ] = this; // associate via id\n // initial properties\n this.selectedIndex = 0;\n // how many frames slider has been in same position\n this.restingFrames = 0;\n // initial physics properties\n this.x = 0;\n this.velocity = 0;\n this.originSide = this.options.rightToLeft ? 'right' : 'left';\n // create viewport & slider\n this.viewport = document.createElement('div');\n this.viewport.className = 'flickity-viewport';\n this._createSlider();\n\n if ( this.options.resize || this.options.watchCSS ) {\n window.addEventListener( 'resize', this );\n }\n\n // add listeners from on option\n for ( var eventName in this.options.on ) {\n var listener = this.options.on[ eventName ];\n this.on( eventName, listener );\n }\n\n Flickity.createMethods.forEach( function( method ) {\n this[ method ]();\n }, this );\n\n if ( this.options.watchCSS ) {\n this.watchCSS();\n } else {\n this.activate();\n }\n\n};\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n if ( this.isActive ) {\n return;\n }\n this.isActive = true;\n this.element.classList.add('flickity-enabled');\n if ( this.options.rightToLeft ) {\n this.element.classList.add('flickity-rtl');\n }\n\n this.getSize();\n // move initial cell elements so they can be loaded as cells\n var cellElems = this._filterFindCellElements( this.element.children );\n moveElements( cellElems, this.slider );\n this.viewport.appendChild( this.slider );\n this.element.appendChild( this.viewport );\n // get cells from children\n this.reloadCells();\n\n if ( this.options.accessibility ) {\n // allow element to focusable\n this.element.tabIndex = 0;\n // listen for key presses\n this.element.addEventListener( 'keydown', this );\n }\n\n this.emitEvent('activate');\n this.selectInitialIndex();\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n // slider element does all the positioning\n var slider = document.createElement('div');\n slider.className = 'flickity-slider';\n slider.style[ this.originSide ] = 0;\n this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n // collection of item elements\n this.cells = this._makeCells( this.slider.children );\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n var cellElems = this._filterFindCellElements( elems );\n\n // create new Flickity for collection\n var cells = cellElems.map( function( cellElem ) {\n return new Cell( cellElem, this );\n }, this );\n\n return cells;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n // size all cells\n this._sizeCells( this.cells );\n // position all cells\n this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n index = index || 0;\n // also measure maxCellHeight\n // start 0 if positioning all cells\n this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n var cellX = 0;\n // get cellX\n if ( index > 0 ) {\n var startCell = this.cells[ index - 1 ];\n cellX = startCell.x + startCell.size.outerWidth;\n }\n var len = this.cells.length;\n for ( var i=index; i < len; i++ ) {\n var cell = this.cells[i];\n cell.setPosition( cellX );\n cellX += cell.size.outerWidth;\n this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n }\n // keep track of cellX for wrap-around\n this.slideableWidth = cellX;\n // slides\n this.updateSlides();\n // contain slides target\n this._containSlides();\n // update slidesWidth\n this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells\n */\nproto._sizeCells = function( cells ) {\n cells.forEach( function( cell ) {\n cell.getSize();\n });\n};\n\n// -------------------------- -------------------------- //\n\nproto.updateSlides = function() {\n this.slides = [];\n if ( !this.cells.length ) {\n return;\n }\n\n var slide = new Slide( this );\n this.slides.push( slide );\n var isOriginLeft = this.originSide == 'left';\n var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n var canCellFit = this._getCanCellFit();\n\n this.cells.forEach( function( cell, i ) {\n // just add cell if first cell in slide\n if ( !slide.cells.length ) {\n slide.addCell( cell );\n return;\n }\n\n var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n if ( canCellFit.call( this, i, slideWidth ) ) {\n slide.addCell( cell );\n } else {\n // doesn't fit, new slide\n slide.updateTarget();\n\n slide = new Slide( this );\n this.slides.push( slide );\n slide.addCell( cell );\n }\n }, this );\n // last slide\n slide.updateTarget();\n // update .selectedSlide\n this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n var groupCells = this.options.groupCells;\n if ( !groupCells ) {\n return function() {\n return false;\n };\n } else if ( typeof groupCells == 'number' ) {\n // group by number. 3 -> [0,1,2], [3,4,5], ...\n var number = parseInt( groupCells, 10 );\n return function( i ) {\n return ( i % number ) !== 0;\n };\n }\n // default, group by width of slide\n // parse '75%\n var percentMatch = typeof groupCells == 'string' &&\n groupCells.match(/^(\\d+)%$/);\n var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n return function( i, slideWidth ) {\n return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n // cell align, then based on origin side\n center: {\n left: 0.5,\n right: 0.5\n },\n left: {\n left: 0,\n right: 1\n },\n right: {\n right: 0,\n left: 1\n }\n};\n\nproto.setCellAlign = function() {\n var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n if ( this.options.setGallerySize ) {\n var height = this.options.adaptiveHeight && this.selectedSlide ?\n this.selectedSlide.height : this.maxCellHeight;\n this.viewport.style.height = height + 'px';\n }\n};\n\nproto._getWrapShiftCells = function() {\n // only for wrap-around\n if ( !this.options.wrapAround ) {\n return;\n }\n // unshift previous cells\n this._unshiftCells( this.beforeShiftCells );\n this._unshiftCells( this.afterShiftCells );\n // get before cells\n // initial gap\n var gapX = this.cursorPosition;\n var cellIndex = this.cells.length - 1;\n this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n // get after cells\n // ending gap between last cell and end of gallery viewport\n gapX = this.size.innerWidth - this.cursorPosition;\n // start cloning at first cell, working forwards\n this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n // keep adding cells until the cover the initial gap\n var cells = [];\n while ( gapX > 0 ) {\n var cell = this.cells[ cellIndex ];\n if ( !cell ) {\n break;\n }\n cells.push( cell );\n cellIndex += increment;\n gapX -= cell.size.outerWidth;\n }\n return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n return;\n }\n var isRightToLeft = this.options.rightToLeft;\n var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n // content is less than gallery size\n var isContentSmaller = contentWidth < this.size.innerWidth;\n // bounds\n var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n // contain each cell target\n this.slides.forEach( function( slide ) {\n if ( isContentSmaller ) {\n // all cells fit inside gallery\n slide.target = contentWidth * this.cellAlign;\n } else {\n // contain to bounds\n slide.target = Math.max( slide.target, beginBound );\n slide.target = Math.min( slide.target, endBound );\n }\n }, this );\n};\n\n// ----- ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery && this.$element ) {\n // default trigger with type if no event\n type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n var $event = type;\n if ( event ) {\n // create jQuery event\n var jQEvent = jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n if ( !this.isActive ) {\n return;\n }\n index = parseInt( index, 10 );\n this._wrapSelect( index );\n\n if ( this.options.wrapAround || isWrap ) {\n index = utils.modulo( index, this.slides.length );\n }\n // bail if invalid index\n if ( !this.slides[ index ] ) {\n return;\n }\n var prevIndex = this.selectedIndex;\n this.selectedIndex = index;\n this.updateSelectedSlide();\n if ( isInstant ) {\n this.positionSliderAtSelected();\n } else {\n this.startAnimation();\n }\n if ( this.options.adaptiveHeight ) {\n this.setGallerySize();\n }\n // events\n this.dispatchEvent( 'select', null, [ index ] );\n // change event if new index\n if ( index != prevIndex ) {\n this.dispatchEvent( 'change', null, [ index ] );\n }\n // old v1 event name, remove in v3\n this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n var len = this.slides.length;\n var isWrapping = this.options.wrapAround && len > 1;\n if ( !isWrapping ) {\n return index;\n }\n var wrapIndex = utils.modulo( index, len );\n // go to shortest\n var delta = Math.abs( wrapIndex - this.selectedIndex );\n var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n if ( !this.isDragSelect && backWrapDelta < delta ) {\n index += len;\n } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n index -= len;\n }\n // wrap position so slider is within normal area\n if ( index < 0 ) {\n this.x -= this.slideableWidth;\n } else if ( index >= len ) {\n this.x += this.slideableWidth;\n }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n var slide = this.slides[ this.selectedIndex ];\n // selectedIndex could be outside of slides, if triggered before resize()\n if ( !slide ) {\n return;\n }\n // unselect previous selected slide\n this.unselectSelectedSlide();\n // update new selected slide\n this.selectedSlide = slide;\n slide.select();\n this.selectedCells = slide.cells;\n this.selectedElements = slide.getCellElements();\n // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n // Remove in v3?\n this.selectedCell = slide.cells[0];\n this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) {\n this.selectedSlide.unselect();\n }\n};\n\nproto.selectInitialIndex = function() {\n var initialIndex = this.options.initialIndex;\n // already activated, select previous selectedIndex\n if ( this.isInitActivated ) {\n this.select( this.selectedIndex, false, true );\n return;\n }\n // select with selector string\n if ( initialIndex && typeof initialIndex == 'string' ) {\n var cell = this.queryCell( initialIndex );\n if ( cell ) {\n this.selectCell( initialIndex, false, true );\n return;\n }\n }\n\n var index = 0;\n // select with number\n if ( initialIndex && this.slides[ initialIndex ] ) {\n index = initialIndex;\n }\n // select instantly\n this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {Element or Number} elem\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n // get cell\n var cell = this.queryCell( value );\n if ( !cell ) {\n return;\n }\n\n var index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n // get index of slides that has cell\n for ( var i=0; i < this.slides.length; i++ ) {\n var slide = this.slides[i];\n var index = slide.cells.indexOf( cell );\n if ( index != -1 ) {\n return i;\n }\n }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem\n * @returns {Flickity.Cell} item\n */\nproto.getCell = function( elem ) {\n // loop through cells to get the one that matches\n for ( var i=0; i < this.cells.length; i++ ) {\n var cell = this.cells[i];\n if ( cell.element == elem ) {\n return cell;\n }\n }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {Element, Array, NodeList} elems\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n elems = utils.makeArray( elems );\n var cells = [];\n elems.forEach( function( elem ) {\n var cell = this.getCell( elem );\n if ( cell ) {\n cells.push( cell );\n }\n }, this );\n return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n });\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem\n * @returns {Flickit.Cell} cell\n */\nproto.getParentCell = function( elem ) {\n // first check if elem is cell\n var cell = this.getCell( elem );\n if ( cell ) {\n return cell;\n }\n // try to get parent cell elem\n elem = utils.getParent( elem, '.flickity-slider > *' );\n return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n if ( !adjCount ) {\n return this.selectedSlide.getCellElements();\n }\n index = index === undefined ? this.selectedIndex : index;\n\n var len = this.slides.length;\n if ( 1 + ( adjCount * 2 ) >= len ) {\n return this.getCellElements();\n }\n\n var cellElems = [];\n for ( var i = index - adjCount; i <= index + adjCount ; i++ ) {\n var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n var slide = this.slides[ slideIndex ];\n if ( slide ) {\n cellElems = cellElems.concat( slide.getCellElements() );\n }\n }\n return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {Element, Selector String, or Number} selector\n */\nproto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n if ( typeof selector == 'string' ) {\n // do not select invalid selectors from hash: #123, #/. #791\n if ( selector.match(/^[#\\.]?[\\d\\/]/) ) {\n return;\n }\n // use string as selector, get element\n selector = this.element.querySelector( selector );\n }\n // get cell from element\n return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.childUIPointerDown = function( event ) {\n // HACK iOS does not allow touch events to bubble up?!\n if ( event.type != 'touchstart' ) {\n event.preventDefault();\n }\n this.focus();\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n this.watchCSS();\n this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n if ( !this.isActive ) {\n return;\n }\n this.getSize();\n // wrap values\n if ( this.options.wrapAround ) {\n this.x = utils.modulo( this.x, this.slideableWidth );\n }\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n this.emitEvent('resize');\n // update selected index for group slides, instant\n // TODO: position can be lost between groups of various numbers\n var selectedElement = this.selectedElements && this.selectedElements[0];\n this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n var watchOption = this.options.watchCSS;\n if ( !watchOption ) {\n return;\n }\n\n var afterContent = getComputedStyle( this.element, ':after' ).content;\n // activate if :after { content: 'flickity' }\n if ( afterContent.indexOf('flickity') != -1 ) {\n this.activate();\n } else {\n this.deactivate();\n }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n // only work if element is in focus\n var isNotFocused = document.activeElement && document.activeElement != this.element;\n if ( !this.options.accessibility ||isNotFocused ) {\n return;\n }\n\n var handler = Flickity.keyboardHandlers[ event.keyCode ];\n if ( handler ) {\n handler.call( this );\n }\n};\n\nFlickity.keyboardHandlers = {\n // left arrow\n 37: function() {\n var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this.uiChange();\n this[ leftMethod ]();\n },\n // right arrow\n 39: function() {\n var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this.uiChange();\n this[ rightMethod ]();\n },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n // TODO remove scrollTo once focus options gets more support\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#Browser_compatibility\n var prevScrollY = window.pageYOffset;\n this.element.focus({ preventScroll: true });\n // hack to fix scroll jump after focus, #76\n if ( window.pageYOffset != prevScrollY ) {\n window.scrollTo( window.pageXOffset, prevScrollY );\n }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n if ( !this.isActive ) {\n return;\n }\n this.element.classList.remove('flickity-enabled');\n this.element.classList.remove('flickity-rtl');\n this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( function( cell ) {\n cell.destroy();\n });\n this.element.removeChild( this.viewport );\n // move child elements back into element\n moveElements( this.slider.children, this.element );\n if ( this.options.accessibility ) {\n this.element.removeAttribute('tabIndex');\n this.element.removeEventListener( 'keydown', this );\n }\n // set flags\n this.isActive = false;\n this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n this.deactivate();\n window.removeEventListener( 'resize', this );\n this.allOff();\n this.emitEvent('destroy');\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'flickity' );\n }\n delete this.element.flickityGUID;\n delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {Element} elem\n * @returns {Flickity}\n */\nFlickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.flickityGUID;\n return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n}));\n","/*!\n * Unipointer v2.3.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*global define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter'\n ], function( EvEmitter ) {\n return factory( window, EvEmitter );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter')\n );\n } else {\n // browser global\n window.Unipointer = factory(\n window,\n window.EvEmitter\n );\n }\n\n}( window, function factory( window, EvEmitter ) {\n\n'use strict';\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n this._bindStartEvent( elem, false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n // default to mouse events\n var startEvent = 'mousedown';\n if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n } else if ( 'ontouchstart' in window ) {\n // Touch Events. iOS Safari\n startEvent = 'touchstart';\n }\n elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n for ( var i=0; i < touches.length; i++ ) {\n var touch = touches[i];\n if ( touch.identifier == this.pointerIdentifier ) {\n return touch;\n }\n }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n // dismiss clicks from right or middle buttons\n var button = event.button;\n if ( button && ( button !== 0 && button !== 1 ) ) {\n return;\n }\n this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n // dismiss right click and other pointers\n // button = 0 is okay, 1-4 not\n if ( event.button || this.isPointerDown ) {\n return;\n }\n\n this.isPointerDown = true;\n // save pointer identifier to match up touch events\n this.pointerIdentifier = pointer.pointerId !== undefined ?\n // pointerId for pointer events, touch.indentifier for touch events\n pointer.pointerId : pointer.identifier;\n\n this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n mousedown: [ 'mousemove', 'mouseup' ],\n touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n if ( !event ) {\n return;\n }\n // get proper events to match start event\n var events = postStartEvents[ event.type ];\n // bind events to node\n events.forEach( function( eventName ) {\n window.addEventListener( eventName, this );\n }, this );\n // save these arguments\n this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n if ( !this._boundPointerEvents ) {\n return;\n }\n this._boundPointerEvents.forEach( function( eventName ) {\n window.removeEventListener( eventName, this );\n }, this );\n\n delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerMove( event, event );\n }\n};\n\nproto.ontouchmove = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerMove( event, touch );\n }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerUp( event, event );\n }\n};\n\nproto.ontouchend = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerUp( event, touch );\n }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n this._pointerDone();\n this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n this._pointerReset();\n this._unbindPostStartEvents();\n this.pointerDone();\n};\n\nproto._pointerReset = function() {\n // reset properties\n this.isPointerDown = false;\n delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerCancel( event, event );\n }\n};\n\nproto.ontouchcancel = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerCancel( event, touch );\n }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n this._pointerDone();\n this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n return {\n x: pointer.pageX,\n y: pointer.pageY\n };\n};\n\n// ----- ----- //\n\nreturn Unipointer;\n\n}));\n","/*!\n * Unidragger v2.3.0\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'unipointer/unipointer'\n ], function( Unipointer ) {\n return factory( window, Unipointer );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('unipointer')\n );\n } else {\n // browser global\n window.Unidragger = factory(\n window,\n window.Unipointer\n );\n }\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n // bind each handle\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n var touchAction = isAdd ? this._touchActionValue : '';\n for ( var i=0; i < this.handles.length; i++ ) {\n var handle = this.handles[i];\n this._bindStartEvent( handle, isAdd );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) {\n handle.style.touchAction = touchAction;\n }\n }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n // track start event position\n this.pointerDownPointer = pointer;\n\n event.preventDefault();\n this.pointerDownBlur();\n // bind move and end events\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n TEXTAREA: true,\n INPUT: true,\n SELECT: true,\n OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n radio: true,\n checkbox: true,\n button: true,\n submit: true,\n image: true,\n file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n var isCursorNode = cursorNodes[ event.target.nodeName ];\n var isClickType = clickTypes[ event.target.type ];\n var isOkay = !isCursorNode || isClickType;\n if ( !isOkay ) {\n this._pointerReset();\n }\n return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n var focused = document.activeElement;\n // do not blur body for IE10, metafizzy/flickity#117\n var canBlur = focused && focused.blur && focused != document.body;\n if ( canBlur ) {\n focused.blur();\n }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n var moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY\n };\n // start drag if pointer has moved far enough to start drag\n if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n this._dragStart( event, pointer );\n }\n return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n if ( this.isDragging ) {\n this._dragEnd( event, pointer );\n } else {\n // pointer didn't move enough for drag to start\n this._staticClick( event, pointer );\n }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n this.isDragging = true;\n // prevent clicks\n this.isPreventingClicks = true;\n this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n // do not drag if not dragging yet\n if ( !this.isDragging ) {\n return;\n }\n\n this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n event.preventDefault();\n this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n // set flags\n this.isDragging = false;\n // re-enable clicking async\n setTimeout( function() {\n delete this.isPreventingClicks;\n }.bind( this ) );\n\n this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n if ( this.isPreventingClicks ) {\n event.preventDefault();\n }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n // ignore emulated mouse up clicks\n if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n return;\n }\n\n this.staticClick( event, pointer );\n\n // set flag for emulated clicks 300ms after touchend\n if ( event.type != 'mouseup' ) {\n this.isIgnoringMouseUp = true;\n // reset flag after 300ms\n setTimeout( function() {\n delete this.isIgnoringMouseUp;\n }.bind( this ), 400 );\n }\n};\n\nproto.staticClick = function( event, pointer ) {\n this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// ----- ----- //\n\nreturn Unidragger;\n\n}));\n","// drag\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unidragger/unidragger',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unidragger, utils ) {\n return factory( window, Flickity, Unidragger, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unidragger'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = factory(\n window,\n window.Flickity,\n window.Unidragger,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n'use strict';\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n draggable: '>1',\n dragThreshold: 3,\n});\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// -------------------------- -------------------------- //\n\nvar isTouch = 'createTouch' in document;\nvar isTouchmoveScrollCanceled = false;\n\nproto._createDrag = function() {\n this.on( 'activate', this.onActivateDrag );\n this.on( 'uiChange', this._uiChangeDrag );\n this.on( 'deactivate', this.onDeactivateDrag );\n this.on( 'cellChange', this.updateDraggable );\n // TODO updateDraggable on resize? if groupCells & slides change\n // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n // #457, RubaXa/Sortable#973\n if ( isTouch && !isTouchmoveScrollCanceled ) {\n window.addEventListener( 'touchmove', function() {});\n isTouchmoveScrollCanceled = true;\n }\n};\n\nproto.onActivateDrag = function() {\n this.handles = [ this.viewport ];\n this.bindHandles();\n this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n // disable dragging if less than 2 slides. #278\n if ( this.options.draggable == '>1' ) {\n this.isDraggable = this.slides.length > 1;\n } else {\n this.isDraggable = this.options.draggable;\n }\n if ( this.isDraggable ) {\n this.element.classList.add('is-draggable');\n } else {\n this.element.classList.remove('is-draggable');\n }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n this.options.draggable = true;\n this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n this.options.draggable = false;\n this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n if ( !this.isDraggable ) {\n this._pointerDownDefault( event, pointer );\n return;\n }\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n\n this._pointerDownPreventDefault( event );\n this.pointerDownFocus( event );\n // blur\n if ( document.activeElement != this.element ) {\n // do not blur if already focused\n this.pointerDownBlur();\n }\n\n // stop if it was moving\n this.dragX = this.x;\n this.viewport.classList.add('is-pointer-down');\n // track scrolling\n this.pointerDownScroll = getScrollPosition();\n window.addEventListener( 'scroll', this );\n\n this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n // bind move and end events\n this._bindPostStartEvents( event );\n this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n INPUT: true,\n TEXTAREA: true,\n SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isFocusNode ) {\n this.focus();\n }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n var isTouchStart = event.type == 'touchstart';\n var isTouchPointer = event.pointerType == 'touch';\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n event.preventDefault();\n }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n delete this.isTouchScrolling;\n this.viewport.classList.remove('is-pointer-down');\n this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n this.dragStartPosition = this.x;\n this.startAnimation();\n window.removeEventListener( 'scroll', this );\n this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n if ( !this.isDraggable ) {\n return;\n }\n event.preventDefault();\n\n this.previousDragX = this.dragX;\n // reverse if right-to-left\n var direction = this.options.rightToLeft ? -1 : 1;\n if ( this.options.wrapAround ) {\n // wrap around move. #589\n moveVector.x = moveVector.x % this.slideableWidth;\n }\n var dragX = this.dragStartPosition + moveVector.x * direction;\n\n if ( !this.options.wrapAround && this.slides.length ) {\n // slow drag\n var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n }\n\n this.dragX = dragX;\n\n this.dragMoveTime = new Date();\n this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n if ( this.options.freeScroll ) {\n this.isFreeScrolling = true;\n }\n // set selectedIndex based on where flick will end up\n var index = this.dragEndRestingSelect();\n\n if ( this.options.freeScroll && !this.options.wrapAround ) {\n // if free-scroll & not wrap around\n // do not free-scroll if going outside of bounding slides\n // so bounding slides can attract slider, and keep it in bounds\n var restingX = this.getRestingPosition();\n this.isFreeScrolling = -restingX > this.slides[0].target &&\n -restingX < this.getLastSlide().target;\n } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n // boost selection if selected index has not changed\n index += this.dragEndBoostSelect();\n }\n delete this.previousDragX;\n // apply selection\n // TODO refactor this, selecting here feels weird\n // HACK, set flag so dragging stays in correct direction\n this.isDragSelect = this.options.wrapAround;\n this.select( index );\n delete this.isDragSelect;\n this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n var restingX = this.getRestingPosition();\n // how far away from selected slide\n var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n // get closet resting going up and going down\n var positiveResting = this._getClosestResting( restingX, distance, 1 );\n var negativeResting = this._getClosestResting( restingX, distance, -1 );\n // use closer resting for wrap-around\n var index = positiveResting.distance < negativeResting.distance ?\n positiveResting.index : negativeResting.index;\n return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n var index = this.selectedIndex;\n var minDistance = Infinity;\n var condition = this.options.contain && !this.options.wrapAround ?\n // if contain, keep going if distance is equal to minDistance\n function( d, md ) { return d <= md; } : function( d, md ) { return d < md; };\n while ( condition( distance, minDistance ) ) {\n // measure distance to next cell\n index += increment;\n minDistance = distance;\n distance = this.getSlideDistance( -restingX, index );\n if ( distance === null ) {\n break;\n }\n distance = Math.abs( distance );\n }\n return {\n distance: minDistance,\n // selected was previous index\n index: index - increment\n };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x\n * @param {Integer} index - slide index\n */\nproto.getSlideDistance = function( x, index ) {\n var len = this.slides.length;\n // wrap around if at least 2 slides\n var isWrapAround = this.options.wrapAround && len > 1;\n var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n var slide = this.slides[ slideIndex ];\n if ( !slide ) {\n return null;\n }\n // add distance for wrap-around slides\n var wrap = isWrapAround ? this.slideableWidth * Math.floor( index / len ) : 0;\n return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n // do not boost if no previousDragX or dragMoveTime\n if ( this.previousDragX === undefined || !this.dragMoveTime ||\n // or if drag was held for 100 ms\n new Date() - this.dragMoveTime > 100 ) {\n return 0;\n }\n\n var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n var delta = this.previousDragX - this.dragX;\n if ( distance > 0 && delta > 0 ) {\n // boost to next if moving towards the right, and positive velocity\n return 1;\n } else if ( distance < 0 && delta < 0 ) {\n // boost to previous if moving towards the left, and negative velocity\n return -1;\n }\n return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n // get clickedCell, if cell was clicked\n var clickedCell = this.getParentCell( event.target );\n var cellElem = clickedCell && clickedCell.element;\n var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n var scroll = getScrollPosition();\n var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n // cancel click/tap if scroll is too much\n if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n this._pointerDone();\n }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n}\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n","// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unipointer/unipointer',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n'use strict';\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n this.direction = direction;\n this.parent = parent;\n this._create();\n}\n\nPrevNextButton.prototype = Object.create( Unipointer.prototype );\n\nPrevNextButton.prototype._create = function() {\n // properties\n this.isEnabled = true;\n this.isPrevious = this.direction == -1;\n var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n this.isLeft = this.direction == leftDirection;\n\n var element = this.element = document.createElement('button');\n element.className = 'flickity-button flickity-prev-next-button';\n element.className += this.isPrevious ? ' previous' : ' next';\n // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n element.setAttribute( 'type', 'button' );\n // init as disabled\n this.disable();\n\n element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n\n // create arrow\n var svg = this.createSVG();\n element.appendChild( svg );\n // events\n this.parent.on( 'select', this.update.bind( this ) );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n this.bindStartEvent( this.element );\n this.element.addEventListener( 'click', this );\n // add to DOM\n this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n // remove from DOM\n this.parent.element.removeChild( this.element );\n // click events\n this.unbindStartEvent( this.element );\n this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n var svg = document.createElementNS( svgURI, 'svg');\n svg.setAttribute( 'class', 'flickity-button-icon' );\n svg.setAttribute( 'viewBox', '0 0 100 100' );\n var path = document.createElementNS( svgURI, 'path');\n var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n path.setAttribute( 'd', pathMovements );\n path.setAttribute( 'class', 'arrow' );\n // rotate arrow\n if ( !this.isLeft ) {\n path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n }\n svg.appendChild( path );\n return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n // use shape as movement if string\n if ( typeof shape == 'string' ) {\n return shape;\n }\n // create movement string\n return 'M ' + shape.x0 + ',50' +\n ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n ' L ' + shape.x3 + ',50 ' +\n ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n ' Z';\n}\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.parent.uiChange();\n var method = this.isPrevious ? 'previous' : 'next';\n this.parent[ method ]();\n};\n\n// ----- ----- //\n\nPrevNextButton.prototype.enable = function() {\n if ( this.isEnabled ) {\n return;\n }\n this.element.disabled = false;\n this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.element.disabled = true;\n this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n // index of first or last slide, if previous or next\n var slides = this.parent.slides;\n // enable is wrapAround and at least 2 slides\n if ( this.parent.options.wrapAround && slides.length > 1 ) {\n this.enable();\n return;\n }\n var lastIndex = slides.length ? slides.length - 1 : 0;\n var boundIndex = this.isPrevious ? 0 : lastIndex;\n var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n prevNextButtons: true,\n arrowShape: {\n x0: 10,\n x1: 60, y1: 50,\n x2: 70, y2: 40,\n x3: 30\n }\n});\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n if ( !this.options.prevNextButtons ) {\n return;\n }\n\n this.prevButton = new PrevNextButton( -1, this );\n this.nextButton = new PrevNextButton( 1, this );\n\n this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n this.prevButton.activate();\n this.nextButton.activate();\n this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n this.prevButton.deactivate();\n this.nextButton.deactivate();\n this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// -------------------------- -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n}));\n","// page dots\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unipointer/unipointer',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n'use strict';\n\nfunction PageDots( parent ) {\n this.parent = parent;\n this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\n\nPageDots.prototype._create = function() {\n // create holder element\n this.holder = document.createElement('ol');\n this.holder.className = 'flickity-page-dots';\n // create dots, array of elements\n this.dots = [];\n // events\n this.handleClick = this.onClick.bind( this );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n this.setDots();\n this.holder.addEventListener( 'click', this.handleClick );\n this.bindStartEvent( this.holder );\n // add to DOM\n this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n this.holder.removeEventListener( 'click', this.handleClick );\n this.unbindStartEvent( this.holder );\n // remove from DOM\n this.parent.element.removeChild( this.holder );\n};\n\nPageDots.prototype.setDots = function() {\n // get difference between number of slides and number of dots\n var delta = this.parent.slides.length - this.dots.length;\n if ( delta > 0 ) {\n this.addDots( delta );\n } else if ( delta < 0 ) {\n this.removeDots( -delta );\n }\n};\n\nPageDots.prototype.addDots = function( count ) {\n var fragment = document.createDocumentFragment();\n var newDots = [];\n var length = this.dots.length;\n var max = length + count;\n\n for ( var i = length; i < max; i++ ) {\n var dot = document.createElement('li');\n dot.className = 'dot';\n dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n fragment.appendChild( dot );\n newDots.push( dot );\n }\n\n this.holder.appendChild( fragment );\n this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n // remove from this.dots collection\n var removeDots = this.dots.splice( this.dots.length - count, count );\n // remove from DOM\n removeDots.forEach( function( dot ) {\n this.holder.removeChild( dot );\n }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n // remove selected class on previous\n if ( this.selectedDot ) {\n this.selectedDot.className = 'dot';\n this.selectedDot.removeAttribute('aria-current');\n }\n // don't proceed if no dots\n if ( !this.dots.length ) {\n return;\n }\n this.selectedDot = this.dots[ this.parent.selectedIndex ];\n this.selectedDot.className = 'dot is-selected';\n this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.prototype.onClick = function( event ) {\n var target = event.target;\n // only care about dot clicks\n if ( target.nodeName != 'LI' ) {\n return;\n }\n\n this.parent.uiChange();\n var index = this.dots.indexOf( target );\n this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pageDots: true\n});\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n if ( !this.options.pageDots ) {\n return;\n }\n this.pageDots = new PageDots( this );\n // events\n this.on( 'activate', this.activatePageDots );\n this.on( 'select', this.updateSelectedPageDots );\n this.on( 'cellChange', this.updatePageDots );\n this.on( 'resize', this.updatePageDots );\n this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n this.pageDots.deactivate();\n};\n\n// ----- ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n}));\n","// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter',\n 'fizzy-ui-utils/utils',\n './flickity'\n ], function( EvEmitter, utils, Flickity ) {\n return factory( EvEmitter, utils, Flickity );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('ev-emitter'),\n require('fizzy-ui-utils'),\n require('./flickity')\n );\n } else {\n // browser global\n factory(\n window.EvEmitter,\n window.fizzyUIUtils,\n window.Flickity\n );\n }\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n'use strict';\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n this.parent = parent;\n this.state = 'stopped';\n // visibility change event handler\n this.onVisibilityChange = this.visibilityChange.bind( this );\n this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n if ( this.state == 'playing' ) {\n return;\n }\n // do not play if page is hidden, start playing when page is visible\n var isPageHidden = document.hidden;\n if ( isPageHidden ) {\n document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n return;\n }\n\n this.state = 'playing';\n // listen to visibility change\n document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n // start ticking\n this.tick();\n};\n\nPlayer.prototype.tick = function() {\n // do not tick if not playing\n if ( this.state != 'playing' ) {\n return;\n }\n\n var time = this.parent.options.autoPlay;\n // default to 3 seconds\n time = typeof time == 'number' ? time : 3000;\n var _this = this;\n // HACK: reset ticks if stopped and started within interval\n this.clear();\n this.timeout = setTimeout( function() {\n _this.parent.next( true );\n _this.tick();\n }, time );\n};\n\nPlayer.prototype.stop = function() {\n this.state = 'stopped';\n this.clear();\n // remove visibility change event\n document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n if ( this.state == 'playing' ) {\n this.state = 'paused';\n this.clear();\n }\n};\n\nPlayer.prototype.unpause = function() {\n // re-start play if paused\n if ( this.state == 'paused' ) {\n this.play();\n }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n var isPageHidden = document.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pauseAutoPlayOnHover: true\n});\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n this.player = new Player( this );\n\n this.on( 'activate', this.activatePlayer );\n this.on( 'uiChange', this.stopPlayer );\n this.on( 'pointerDown', this.stopPlayer );\n this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n if ( !this.options.autoPlay ) {\n return;\n }\n this.player.play();\n this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n this.player.play();\n};\n\nproto.stopPlayer = function() {\n this.player.stop();\n};\n\nproto.pausePlayer = function() {\n this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n this.player.stop();\n this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n if ( !this.options.pauseAutoPlayOnHover ) {\n return;\n }\n this.player.pause();\n this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n this.player.unpause();\n this.element.removeEventListener( 'mouseleave', this );\n};\n\n// ----- ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n}));\n","// add, remove cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n\n'use strict';\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n var fragment = document.createDocumentFragment();\n cells.forEach( function( cell ) {\n fragment.appendChild( cell.element );\n });\n return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {Element, Array, NodeList} elems\n * @param {Integer} index\n */\nproto.insert = function( elems, index ) {\n var cells = this._makeCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n var len = this.cells.length;\n // default to append\n index = index === undefined ? len : index;\n // add cells with document fragment\n var fragment = getCellsFragment( cells );\n // append to slider\n var isAppend = index == len;\n if ( isAppend ) {\n this.slider.appendChild( fragment );\n } else {\n var insertCellElement = this.cells[ index ].element;\n this.slider.insertBefore( fragment, insertCellElement );\n }\n // add to this.cells\n if ( index === 0 ) {\n // prepend, add to start\n this.cells = cells.concat( this.cells );\n } else if ( isAppend ) {\n // append, add to end\n this.cells = this.cells.concat( cells );\n } else {\n // insert in this.cells\n var endCells = this.cells.splice( index, len - index );\n this.cells = this.cells.concat( cells ).concat( endCells );\n }\n\n this._sizeCells( cells );\n this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {Element, Array, NodeList} elems\n */\nproto.remove = function( elems ) {\n var cells = this.getCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n\n var minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( function( cell ) {\n cell.remove();\n var index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n }, this );\n\n this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n var cell = this.getCell( elem );\n if ( !cell ) {\n return;\n }\n cell.getSize();\n\n var index = this.cells.indexOf( cell );\n this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n var prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._getWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex\n // try to maintain position & select previous selected element\n var cell = this.getCell( prevSelectedElem );\n if ( cell ) {\n this.selectedIndex = this.getCellSlideIndex( cell );\n }\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n this.emitEvent( 'cellChange', [ changedCellIndex ] );\n // position slider\n this.select( this.selectedIndex );\n // do not position slider after lazy load\n if ( isPositioningSlider ) {\n this.positionSliderAtSelected();\n }\n};\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n","// lazyload\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n'use strict';\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n var lazyLoad = this.options.lazyLoad;\n if ( !lazyLoad ) {\n return;\n }\n // get adjacent cells, use lazyLoad option for adjacent count\n var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n var cellElems = this.getAdjacentCellElements( adjCount );\n // get lazy images in those cells\n var lazyImages = [];\n cellElems.forEach( function( cellElem ) {\n var lazyCellImages = getCellLazyImages( cellElem );\n lazyImages = lazyImages.concat( lazyCellImages );\n });\n // load lazy images\n lazyImages.forEach( function( img ) {\n new LazyLoader( img, this );\n }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n // check if cell element is lazy image\n if ( cellElem.nodeName == 'IMG' ) {\n var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n return [ cellElem ];\n }\n }\n // select lazy images in cell\n var lazySelector = 'img[data-flickity-lazyload], ' +\n 'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n var imgs = cellElem.querySelectorAll( lazySelector );\n return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n */\nfunction LazyLoader( img, flickity ) {\n this.img = img;\n this.flickity = flickity;\n this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n // get src & srcset\n var src = this.img.getAttribute('data-flickity-lazyload') ||\n this.img.getAttribute('data-flickity-lazyload-src');\n var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n // set src & serset\n this.img.src = src;\n if ( srcset ) {\n this.img.setAttribute( 'srcset', srcset );\n }\n // remove attr\n this.img.removeAttribute('data-flickity-lazyload');\n this.img.removeAttribute('data-flickity-lazyload-src');\n this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n // unbind events\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n\n var cell = this.flickity.getParentCell( this.img );\n var cellElem = cell && cell.element;\n this.flickity.cellSizeChange( cellElem );\n\n this.img.classList.add( className );\n this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// ----- ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n}));\n","/*!\n * Flickity v2.2.1\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2019 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n './drag',\n './prev-next-button',\n './page-dots',\n './player',\n './add-remove-cell',\n './lazyload'\n ], factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./flickity'),\n require('./drag'),\n require('./prev-next-button'),\n require('./page-dots'),\n require('./player'),\n require('./add-remove-cell'),\n require('./lazyload')\n );\n }\n\n})( window, function factory( Flickity ) {\n /*jshint strict: false*/\n return Flickity;\n});\n","import Flickity from '../../../node_modules/flickity';\r\nimport { currentWindowWidth, onWindowResize } from '../utils/windowResize';\r\n\r\n/**\r\n * The Slider class uses the cssAnimateNewHeight function to reveal hidden content.\r\n * Default element selector is data-action*=\"slider\"\r\n *\r\n * @param {HTMLElement} container\r\n * @constructor\r\n */\r\nexport class Slider {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} container\r\n */\r\n constructor(container) {\r\n this.container = container;\r\n\r\n if (this.container) {\r\n const mobileMode = !(currentWindowWidth > 1023);\r\n\r\n this.flkty = new Flickity(this.container, {\r\n cellAlign: 'left',\r\n prevNextButtons: false,\r\n percentPosition: false,\r\n autoPlay: parseInt(this.container.getAttribute('data-autoplay')) || false,\r\n wrapAround: false,\r\n selectedAttraction: mobileMode ? 0.025 : 0.02,\r\n friction: 0.20,\r\n pageDots: false,\r\n draggable: true,\r\n // lazyLoad: mobileMode ? 1 : 3\r\n // dragThreshold: 10,\r\n // freeScroll: true,\r\n });\r\n\r\n this.bindEvents();\r\n }\r\n }\r\n\r\n bindEvents() {\r\n const scope = this;\r\n //Change cell position on resize, when width is smaller than 768px\r\n onWindowResize(\r\n function alignSlider() {\r\n const mobileMode = !(currentWindowWidth > 1023);\r\n\r\n scope.flkty.option({ cellAlign: 'left' });\r\n scope.flkty.reloadCells();\r\n }\r\n );\r\n\r\n //Custom navigation\r\n const cellsButtonGroup = document.querySelector('.slider__nav');\r\n if (cellsButtonGroup) {\r\n const navButtons = Array.from(cellsButtonGroup.children);\r\n\r\n // update buttons on select\r\n this.flkty.on('select', function () {\r\n const previousSelectedButton = cellsButtonGroup.querySelector('.is-selected');\r\n const selectedButton = cellsButtonGroup.children[scope.flkty.selectedIndex];\r\n previousSelectedButton.classList.remove('is-selected');\r\n selectedButton.classList.add('is-selected');\r\n });\r\n\r\n // cell select\r\n cellsButtonGroup.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","\r\nimport Flickity from 'flickity';\r\n// import { currentWindowWidth, onWindowResize } from '../utils/windowResize';\r\nimport { disableScrollLock, enableScrollLock } from '../utils/scrollLock';\r\n\r\n\r\n/**\r\n * The Gallery class\r\n * Default element selector is data-action*=\"gallery\"\r\n *\r\n * @param {HTMLElement} container\r\n * @constructor\r\n */\r\n\r\nexport class Gallery {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} container\r\n */\r\n constructor(container) {\r\n this.container = container;\r\n\r\n if (this.container) {\r\n // const gallerySlides = galleryModal.querySelector('.gallery__slides');\r\n\r\n this.flktyGallery = new Flickity(this.container.querySelector('.gallery__slides'), {\r\n // on: {\r\n // ready() {\r\n // galleryModal.classList.add('open');\r\n // }\r\n // },\r\n cellAlign: 'center',\r\n prevNextButtons: false,\r\n percentPosition: false,\r\n wrapAround: true,\r\n selectedAttraction: 0.02,\r\n friction: 0.20,\r\n pageDots: false,\r\n draggable: true,\r\n });\r\n\r\n this.bindEvents();\r\n }\r\n }\r\n\r\n bindEvents() {\r\n const scope = this;\r\n\r\n //Custom navigation\r\n // elements\r\n const cellsButtonGroup = scope.container.querySelector('.gallery__navigation__group');\r\n const cellsButtons = cellsButtonGroup ? Array.from(cellsButtonGroup.children) : null;\r\n\r\n\r\n function setDot(index) {\r\n const previousSelectedButton = cellsButtonGroup.querySelector('.is-selected');\r\n const selectedButton = cellsButtonGroup.children[index];\r\n previousSelectedButton.classList.remove('is-selected');\r\n selectedButton.classList.add('is-selected');\r\n }\r\n\r\n if (cellsButtons)\r\n {\r\n // update buttons on select\r\n scope.flktyGallery.on('select', function () {\r\n setDot(scope.flktyGallery.selectedIndex);\r\n });\r\n\r\n // cell select\r\n\r\n\r\n cellsButtonGroup.addEventListener('click', function (event) {\r\n if (!event.target.matches('.dot')) {\r\n return;\r\n }\r\n const index = cellsButtons.indexOf(event.target);\r\n scope.flktyGallery.select(index, false, false);\r\n });\r\n\r\n\r\n\r\n // previous\r\n const previousButton = scope.container.querySelector('.gallery__navigation .btn--previous');\r\n if (previousButton) {\r\n previousButton.addEventListener('click', function () {\r\n scope.flktyGallery.previous();\r\n });\r\n }\r\n\r\n // next\r\n const nextButton = scope.container.querySelector('.gallery__navigation .btn--next');\r\n if (nextButton) {\r\n nextButton.addEventListener('click', function () {\r\n scope.flktyGallery.next();\r\n });\r\n }\r\n }\r\n }\r\n\r\n}\r\nexport function setupGallery(selector = '[data-action*=\"gallery\"]') {\r\n const galleries = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < galleries.length; i++) {\r\n void new Gallery(galleries[i]);\r\n }\r\n}\r\n\r\n// function initGallery(galleryModal) {\r\n\r\n\r\n// //Close flikity and modal\r\n// galleryModal.querySelector('.gallery__close').addEventListener('click', function () {\r\n\r\n// galleryModal.classList.remove('open');\r\n\r\n// setTimeout(() => {\r\n// disableScrollLock();\r\n// flktyGallery.destroy();\r\n// setDot(0);\r\n\r\n// }, 500);\r\n// });\r\n// }\r\n\r\n\r\n\r\n// export function setupGallery() {\r\n// // const galleryElems = document.querySelectorAll('.gallery__item');\r\n\r\n// // if (galleryElems) {\r\n// // for (let index = 0; index < galleryElems.length; index++) {\r\n// // const galleryElem = galleryElems[index];\r\n// // const galleryModal = galleryElem.querySelector('.gallery');\r\n\r\n\r\n// // galleryElem.querySelector('.gallery__item__content').addEventListener('click', function () {\r\n// // // enableScrollLock();\r\n// // initGallery(galleryModal);\r\n// // });\r\n// // }\r\n// // }\r\n// }\r\n\r\n\r\n","export function extendStickyHeader() {\r\n const stickyHeader = document.querySelector('.header--sticky-text');\r\n const stickyHeaderContent = document.querySelector('.header__content--sticky');\r\n if (stickyHeader) {\r\n stickyHeader.style.paddingBottom = `${stickyHeaderContent.offsetHeight / 2}px`;\r\n }\r\n}\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 SimpleSteps {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} container\r\n */\r\n constructor(container) {\r\n this.container = container;\r\n\r\n if (this.container) {\r\n\r\n const simpleStepModal = this.container.querySelector('.simple-steps__modal');\r\n const stepsIds = this.container.querySelectorAll('.simple-steps__navigation__item');\r\n\r\n let simpleStepModalId = simpleStepModal.getAttribute('data-step');\r\n let wait = false;\r\n\r\n for (let p = 0; p < stepsIds.length; p++) {\r\n const stepId = stepsIds[p];\r\n const id = stepId.getAttribute('data-step-id');\r\n\r\n stepId.addEventListener('click', function () {\r\n\r\n if (simpleStepModalId < id) {\r\n simpleStepModal.setAttribute('data-direction', 'forwards');\r\n }\r\n else {\r\n simpleStepModal.setAttribute('data-direction', 'backwards');\r\n }\r\n\r\n simpleStepModal.setAttribute('data-step', id);\r\n simpleStepModalId = id;\r\n });\r\n\r\n };\r\n\r\n simpleStepModal.addEventListener('wheel', function () {\r\n if (wait === false) {\r\n event.preventDefault();\r\n const currentStep = parseInt(simpleStepModal.getAttribute('data-step'));\r\n wait = true;\r\n\r\n setTimeout(() => {\r\n wait = false;\r\n }, 300);\r\n\r\n\r\n debugger;\r\n if (event.deltaY < 0) {\r\n console.log('scrolling up');\r\n if (currentStep > 1) {\r\n\r\n const scrollId = currentStep - 1;\r\n\r\n simpleStepModal.setAttribute('data-direction', 'backwards');\r\n simpleStepModal.setAttribute('data-step',scrollId);\r\n simpleStepModalId = scrollId;\r\n }\r\n\r\n }\r\n else if (event.deltaY > 0) {\r\n console.log('scrolling down');\r\n if (currentStep < stepsIds.length) {\r\n\r\n const scrollId = currentStep + 1;\r\n\r\n\r\n simpleStepModal.setAttribute('data-direction', 'forwards');\r\n simpleStepModal.setAttribute('data-step', scrollId);\r\n simpleStepModalId = scrollId;\r\n }\r\n }\r\n\r\n\r\n }\r\n\r\n });\r\n\r\n }\r\n }\r\n}\r\n\r\nexport function setupSimpleSteps(selector = '[data-action*=\"simple-steps\"]') {\r\n const simpleStepsSections = document.body.querySelectorAll(selector);\r\n for (let i = 0; i < simpleStepsSections.length; i++) {\r\n void new SimpleSteps(simpleStepsSections[i]);\r\n }\r\n}\r\n","/*! nouislider - 14.5.0 - 5/11/2020 */\n(function(factory) {\n if (typeof define === \"function\" && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory);\n } else if (typeof exports === \"object\") {\n // Node/CommonJS\n module.exports = factory();\n } else {\n // Browser globals\n window.noUiSlider = factory();\n }\n})(function() {\n \"use strict\";\n\n var VERSION = \"14.5.0\";\n\n //region Helper Methods\n\n function isValidFormatter(entry) {\n return typeof entry === \"object\" && typeof entry.to === \"function\" && typeof entry.from === \"function\";\n }\n\n function removeElement(el) {\n el.parentElement.removeChild(el);\n }\n\n function isSet(value) {\n return value !== null && value !== undefined;\n }\n\n // Bindable version\n function preventDefault(e) {\n e.preventDefault();\n }\n\n // Removes duplicates from an array.\n function unique(array) {\n return array.filter(function(a) {\n return !this[a] ? (this[a] = true) : false;\n }, {});\n }\n\n // Round a value to the closest 'to'.\n function closest(value, to) {\n return Math.round(value / to) * to;\n }\n\n // Current position of an element relative to the document.\n function offset(elem, orientation) {\n var rect = elem.getBoundingClientRect();\n var doc = elem.ownerDocument;\n var docElem = doc.documentElement;\n var pageOffset = getPageOffset(doc);\n\n // getBoundingClientRect contains left scroll in Chrome on Android.\n // I haven't found a feature detection that proves this. Worst case\n // scenario on mis-match: the 'tap' feature on horizontal sliders breaks.\n if (/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)) {\n pageOffset.x = 0;\n }\n\n return orientation\n ? rect.top + pageOffset.y - docElem.clientTop\n : rect.left + pageOffset.x - docElem.clientLeft;\n }\n\n // Checks whether a value is numerical.\n function isNumeric(a) {\n return typeof a === \"number\" && !isNaN(a) && isFinite(a);\n }\n\n // Sets a class and removes it after [duration] ms.\n function addClassFor(element, className, duration) {\n if (duration > 0) {\n addClass(element, className);\n setTimeout(function() {\n removeClass(element, className);\n }, duration);\n }\n }\n\n // Limits a value to 0 - 100\n function limit(a) {\n return Math.max(Math.min(a, 100), 0);\n }\n\n // Wraps a variable as an array, if it isn't one yet.\n // Note that an input array is returned by reference!\n function asArray(a) {\n return Array.isArray(a) ? a : [a];\n }\n\n // Counts decimals\n function countDecimals(numStr) {\n numStr = String(numStr);\n var pieces = numStr.split(\".\");\n return pieces.length > 1 ? pieces[1].length : 0;\n }\n\n // http://youmightnotneedjquery.com/#add_class\n function addClass(el, className) {\n if (el.classList && !/\\s/.test(className)) {\n el.classList.add(className);\n } else {\n el.className += \" \" + className;\n }\n }\n\n // http://youmightnotneedjquery.com/#remove_class\n function removeClass(el, className) {\n if (el.classList && !/\\s/.test(className)) {\n el.classList.remove(className);\n } else {\n el.className = el.className.replace(\n new RegExp(\"(^|\\\\b)\" + className.split(\" \").join(\"|\") + \"(\\\\b|$)\", \"gi\"),\n \" \"\n );\n }\n }\n\n // https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/\n function hasClass(el, className) {\n return el.classList\n ? el.classList.contains(className)\n : new RegExp(\"\\\\b\" + className + \"\\\\b\").test(el.className);\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes\n function getPageOffset(doc) {\n var supportPageOffset = window.pageXOffset !== undefined;\n var isCSS1Compat = (doc.compatMode || \"\") === \"CSS1Compat\";\n var x = supportPageOffset\n ? window.pageXOffset\n : isCSS1Compat\n ? doc.documentElement.scrollLeft\n : doc.body.scrollLeft;\n var y = supportPageOffset\n ? window.pageYOffset\n : isCSS1Compat\n ? doc.documentElement.scrollTop\n : doc.body.scrollTop;\n\n return {\n x: x,\n y: y\n };\n }\n\n // we provide a function to compute constants instead\n // of accessing window.* as soon as the module needs it\n // so that we do not compute anything if not needed\n function getActions() {\n // Determine the events to bind. IE11 implements pointerEvents without\n // a prefix, which breaks compatibility with the IE10 implementation.\n return window.navigator.pointerEnabled\n ? {\n start: \"pointerdown\",\n move: \"pointermove\",\n end: \"pointerup\"\n }\n : window.navigator.msPointerEnabled\n ? {\n start: \"MSPointerDown\",\n move: \"MSPointerMove\",\n end: \"MSPointerUp\"\n }\n : {\n start: \"mousedown touchstart\",\n move: \"mousemove touchmove\",\n end: \"mouseup touchend\"\n };\n }\n\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // Issue #785\n function getSupportsPassive() {\n var supportsPassive = false;\n\n /* eslint-disable */\n try {\n var opts = Object.defineProperty({}, \"passive\", {\n get: function() {\n supportsPassive = true;\n }\n });\n\n window.addEventListener(\"test\", null, opts);\n } catch (e) {}\n /* eslint-enable */\n\n return supportsPassive;\n }\n\n function getSupportsTouchActionNone() {\n return window.CSS && CSS.supports && CSS.supports(\"touch-action\", \"none\");\n }\n\n //endregion\n\n //region Range Calculation\n\n // Determine the size of a sub-range in relation to a full range.\n function subRangeRatio(pa, pb) {\n return 100 / (pb - pa);\n }\n\n // (percentage) How many percent is this value of this range?\n function fromPercentage(range, value, startRange) {\n return (value * 100) / (range[startRange + 1] - range[startRange]);\n }\n\n // (percentage) Where is this value on this range?\n function toPercentage(range, value) {\n return fromPercentage(range, range[0] < 0 ? value + Math.abs(range[0]) : value - range[0], 0);\n }\n\n // (value) How much is this percentage on this range?\n function isPercentage(range, value) {\n return (value * (range[1] - range[0])) / 100 + range[0];\n }\n\n function getJ(value, arr) {\n var j = 1;\n\n while (value >= arr[j]) {\n j += 1;\n }\n\n return j;\n }\n\n // (percentage) Input a value, find where, on a scale of 0-100, it applies.\n function toStepping(xVal, xPct, value) {\n if (value >= xVal.slice(-1)[0]) {\n return 100;\n }\n\n var j = getJ(value, xVal);\n var va = xVal[j - 1];\n var vb = xVal[j];\n var pa = xPct[j - 1];\n var pb = xPct[j];\n\n return pa + toPercentage([va, vb], value) / subRangeRatio(pa, pb);\n }\n\n // (value) Input a percentage, find where it is on the specified range.\n function fromStepping(xVal, xPct, value) {\n // There is no range group that fits 100\n if (value >= 100) {\n return xVal.slice(-1)[0];\n }\n\n var j = getJ(value, xPct);\n var va = xVal[j - 1];\n var vb = xVal[j];\n var pa = xPct[j - 1];\n var pb = xPct[j];\n\n return isPercentage([va, vb], (value - pa) * subRangeRatio(pa, pb));\n }\n\n // (percentage) Get the step that applies at a certain value.\n function getStep(xPct, xSteps, snap, value) {\n if (value === 100) {\n return value;\n }\n\n var j = getJ(value, xPct);\n var a = xPct[j - 1];\n var b = xPct[j];\n\n // If 'snap' is set, steps are used as fixed points on the slider.\n if (snap) {\n // Find the closest position, a or b.\n if (value - a > (b - a) / 2) {\n return b;\n }\n\n return a;\n }\n\n if (!xSteps[j - 1]) {\n return value;\n }\n\n return xPct[j - 1] + closest(value - xPct[j - 1], xSteps[j - 1]);\n }\n\n function handleEntryPoint(index, value, that) {\n var percentage;\n\n // Wrap numerical input in an array.\n if (typeof value === \"number\") {\n value = [value];\n }\n\n // Reject any invalid input, by testing whether value is an array.\n if (!Array.isArray(value)) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'range' contains invalid value.\");\n }\n\n // Covert min/max syntax to 0 and 100.\n if (index === \"min\") {\n percentage = 0;\n } else if (index === \"max\") {\n percentage = 100;\n } else {\n percentage = parseFloat(index);\n }\n\n // Check for correct input.\n if (!isNumeric(percentage) || !isNumeric(value[0])) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'range' value isn't numeric.\");\n }\n\n // Store values.\n that.xPct.push(percentage);\n that.xVal.push(value[0]);\n\n // NaN will evaluate to false too, but to keep\n // logging clear, set step explicitly. Make sure\n // not to override the 'step' setting with false.\n if (!percentage) {\n if (!isNaN(value[1])) {\n that.xSteps[0] = value[1];\n }\n } else {\n that.xSteps.push(isNaN(value[1]) ? false : value[1]);\n }\n\n that.xHighestCompleteStep.push(0);\n }\n\n function handleStepPoint(i, n, that) {\n // Ignore 'false' stepping.\n if (!n) {\n return;\n }\n\n // Step over zero-length ranges (#948);\n if (that.xVal[i] === that.xVal[i + 1]) {\n that.xSteps[i] = that.xHighestCompleteStep[i] = that.xVal[i];\n\n return;\n }\n\n // Factor to range ratio\n that.xSteps[i] =\n fromPercentage([that.xVal[i], that.xVal[i + 1]], n, 0) / subRangeRatio(that.xPct[i], that.xPct[i + 1]);\n\n var totalSteps = (that.xVal[i + 1] - that.xVal[i]) / that.xNumSteps[i];\n var highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1);\n var step = that.xVal[i] + that.xNumSteps[i] * highestStep;\n\n that.xHighestCompleteStep[i] = step;\n }\n\n //endregion\n\n //region Spectrum\n\n function Spectrum(entry, snap, singleStep) {\n this.xPct = [];\n this.xVal = [];\n this.xSteps = [singleStep || false];\n this.xNumSteps = [false];\n this.xHighestCompleteStep = [];\n\n this.snap = snap;\n\n var index;\n var ordered = []; // [0, 'min'], [1, '50%'], [2, 'max']\n\n // Map the object keys to an array.\n for (index in entry) {\n if (entry.hasOwnProperty(index)) {\n ordered.push([entry[index], index]);\n }\n }\n\n // Sort all entries by value (numeric sort).\n if (ordered.length && typeof ordered[0][0] === \"object\") {\n ordered.sort(function(a, b) {\n return a[0][0] - b[0][0];\n });\n } else {\n ordered.sort(function(a, b) {\n return a[0] - b[0];\n });\n }\n\n // Convert all entries to subranges.\n for (index = 0; index < ordered.length; index++) {\n handleEntryPoint(ordered[index][1], ordered[index][0], this);\n }\n\n // Store the actual step values.\n // xSteps is sorted in the same order as xPct and xVal.\n this.xNumSteps = this.xSteps.slice(0);\n\n // Convert all numeric steps to the percentage of the subrange they represent.\n for (index = 0; index < this.xNumSteps.length; index++) {\n handleStepPoint(index, this.xNumSteps[index], this);\n }\n }\n\n Spectrum.prototype.getDistance = function(value) {\n var index;\n var distances = [];\n\n for (index = 0; index < this.xNumSteps.length - 1; index++) {\n // last \"range\" can't contain step size as it is purely an endpoint.\n var step = this.xNumSteps[index];\n\n if (step && (value / step) % 1 !== 0) {\n throw new Error(\n \"noUiSlider (\" +\n VERSION +\n \"): 'limit', 'margin' and 'padding' of \" +\n this.xPct[index] +\n \"% range must be divisible by step.\"\n );\n }\n\n // Calculate percentual distance in current range of limit, margin or padding\n distances[index] = fromPercentage(this.xVal, value, index);\n }\n\n return distances;\n };\n\n // Calculate the percentual distance over the whole scale of ranges.\n // direction: 0 = backwards / 1 = forwards\n Spectrum.prototype.getAbsoluteDistance = function(value, distances, direction) {\n var xPct_index = 0;\n\n // Calculate range where to start calculation\n if (value < this.xPct[this.xPct.length - 1]) {\n while (value > this.xPct[xPct_index + 1]) {\n xPct_index++;\n }\n } else if (value === this.xPct[this.xPct.length - 1]) {\n xPct_index = this.xPct.length - 2;\n }\n\n // If looking backwards and the value is exactly at a range separator then look one range further\n if (!direction && value === this.xPct[xPct_index + 1]) {\n xPct_index++;\n }\n\n var start_factor;\n var rest_factor = 1;\n\n var rest_rel_distance = distances[xPct_index];\n\n var range_pct = 0;\n\n var rel_range_distance = 0;\n var abs_distance_counter = 0;\n var range_counter = 0;\n\n // Calculate what part of the start range the value is\n if (direction) {\n start_factor = (value - this.xPct[xPct_index]) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]);\n } else {\n start_factor = (this.xPct[xPct_index + 1] - value) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]);\n }\n\n // Do until the complete distance across ranges is calculated\n while (rest_rel_distance > 0) {\n // Calculate the percentage of total range\n range_pct = this.xPct[xPct_index + 1 + range_counter] - this.xPct[xPct_index + range_counter];\n\n // Detect if the margin, padding or limit is larger then the current range and calculate\n if (distances[xPct_index + range_counter] * rest_factor + 100 - start_factor * 100 > 100) {\n // If larger then take the percentual distance of the whole range\n rel_range_distance = range_pct * start_factor;\n // Rest factor of relative percentual distance still to be calculated\n rest_factor = (rest_rel_distance - 100 * start_factor) / distances[xPct_index + range_counter];\n // Set start factor to 1 as for next range it does not apply.\n start_factor = 1;\n } else {\n // If smaller or equal then take the percentual distance of the calculate percentual part of that range\n rel_range_distance = ((distances[xPct_index + range_counter] * range_pct) / 100) * rest_factor;\n // No rest left as the rest fits in current range\n rest_factor = 0;\n }\n\n if (direction) {\n abs_distance_counter = abs_distance_counter - rel_range_distance;\n // Limit range to first range when distance becomes outside of minimum range\n if (this.xPct.length + range_counter >= 1) {\n range_counter--;\n }\n } else {\n abs_distance_counter = abs_distance_counter + rel_range_distance;\n // Limit range to last range when distance becomes outside of maximum range\n if (this.xPct.length - range_counter >= 1) {\n range_counter++;\n }\n }\n\n // Rest of relative percentual distance still to be calculated\n rest_rel_distance = distances[xPct_index + range_counter] * rest_factor;\n }\n\n return value + abs_distance_counter;\n };\n\n Spectrum.prototype.toStepping = function(value) {\n value = toStepping(this.xVal, this.xPct, value);\n\n return value;\n };\n\n Spectrum.prototype.fromStepping = function(value) {\n return fromStepping(this.xVal, this.xPct, value);\n };\n\n Spectrum.prototype.getStep = function(value) {\n value = getStep(this.xPct, this.xSteps, this.snap, value);\n\n return value;\n };\n\n Spectrum.prototype.getDefaultStep = function(value, isDown, size) {\n var j = getJ(value, this.xPct);\n\n // When at the top or stepping down, look at the previous sub-range\n if (value === 100 || (isDown && value === this.xPct[j - 1])) {\n j = Math.max(j - 1, 1);\n }\n\n return (this.xVal[j] - this.xVal[j - 1]) / size;\n };\n\n Spectrum.prototype.getNearbySteps = function(value) {\n var j = getJ(value, this.xPct);\n\n return {\n stepBefore: {\n startValue: this.xVal[j - 2],\n step: this.xNumSteps[j - 2],\n highestStep: this.xHighestCompleteStep[j - 2]\n },\n thisStep: {\n startValue: this.xVal[j - 1],\n step: this.xNumSteps[j - 1],\n highestStep: this.xHighestCompleteStep[j - 1]\n },\n stepAfter: {\n startValue: this.xVal[j],\n step: this.xNumSteps[j],\n highestStep: this.xHighestCompleteStep[j]\n }\n };\n };\n\n Spectrum.prototype.countStepDecimals = function() {\n var stepDecimals = this.xNumSteps.map(countDecimals);\n return Math.max.apply(null, stepDecimals);\n };\n\n // Outside testing\n Spectrum.prototype.convert = function(value) {\n return this.getStep(this.toStepping(value));\n };\n\n //endregion\n\n //region Options\n\n /*\tEvery input option is tested and parsed. This'll prevent\n endless validation in internal methods. These tests are\n structured with an item for every option available. An\n option can be marked as required by setting the 'r' flag.\n The testing function is provided with three arguments:\n - The provided value for the option;\n - A reference to the options object;\n - The name for the option;\n\n The testing function returns false when an error is detected,\n or true when everything is OK. It can also modify the option\n object, to make sure all values can be correctly looped elsewhere. */\n\n //region Defaults\n\n var defaultFormatter = {\n to: function(value) {\n return value !== undefined && value.toFixed(2);\n },\n from: Number\n };\n\n var cssClasses = {\n target: \"target\",\n base: \"base\",\n origin: \"origin\",\n handle: \"handle\",\n handleLower: \"handle-lower\",\n handleUpper: \"handle-upper\",\n touchArea: \"touch-area\",\n horizontal: \"horizontal\",\n vertical: \"vertical\",\n background: \"background\",\n connect: \"connect\",\n connects: \"connects\",\n ltr: \"ltr\",\n rtl: \"rtl\",\n textDirectionLtr: \"txt-dir-ltr\",\n textDirectionRtl: \"txt-dir-rtl\",\n draggable: \"draggable\",\n drag: \"state-drag\",\n tap: \"state-tap\",\n active: \"active\",\n tooltip: \"tooltip\",\n pips: \"pips\",\n pipsHorizontal: \"pips-horizontal\",\n pipsVertical: \"pips-vertical\",\n marker: \"marker\",\n markerHorizontal: \"marker-horizontal\",\n markerVertical: \"marker-vertical\",\n markerNormal: \"marker-normal\",\n markerLarge: \"marker-large\",\n markerSub: \"marker-sub\",\n value: \"value\",\n valueHorizontal: \"value-horizontal\",\n valueVertical: \"value-vertical\",\n valueNormal: \"value-normal\",\n valueLarge: \"value-large\",\n valueSub: \"value-sub\"\n };\n\n //endregion\n\n function validateFormat(entry) {\n // Any object with a to and from method is supported.\n if (isValidFormatter(entry)) {\n return true;\n }\n\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'format' requires 'to' and 'from' methods.\");\n }\n\n function testStep(parsed, entry) {\n if (!isNumeric(entry)) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'step' is not numeric.\");\n }\n\n // The step option can still be used to set stepping\n // for linear sliders. Overwritten if set in 'range'.\n parsed.singleStep = entry;\n }\n\n function testRange(parsed, entry) {\n // Filter incorrect input.\n if (typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'range' is not an object.\");\n }\n\n // Catch missing start or end.\n if (entry.min === undefined || entry.max === undefined) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): Missing 'min' or 'max' in 'range'.\");\n }\n\n // Catch equal start or end.\n if (entry.min === entry.max) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'range' 'min' and 'max' cannot be equal.\");\n }\n\n parsed.spectrum = new Spectrum(entry, parsed.snap, parsed.singleStep);\n }\n\n function testStart(parsed, entry) {\n entry = asArray(entry);\n\n // Validate input. Values aren't tested, as the public .val method\n // will always provide a valid location.\n if (!Array.isArray(entry) || !entry.length) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'start' option is incorrect.\");\n }\n\n // Store the number of handles.\n parsed.handles = entry.length;\n\n // When the slider is initialized, the .val method will\n // be called with the start options.\n parsed.start = entry;\n }\n\n function testSnap(parsed, entry) {\n // Enforce 100% stepping within subranges.\n parsed.snap = entry;\n\n if (typeof entry !== \"boolean\") {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'snap' option must be a boolean.\");\n }\n }\n\n function testAnimate(parsed, entry) {\n // Enforce 100% stepping within subranges.\n parsed.animate = entry;\n\n if (typeof entry !== \"boolean\") {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'animate' option must be a boolean.\");\n }\n }\n\n function testAnimationDuration(parsed, entry) {\n parsed.animationDuration = entry;\n\n if (typeof entry !== \"number\") {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'animationDuration' option must be a number.\");\n }\n }\n\n function testConnect(parsed, entry) {\n var connect = [false];\n var i;\n\n // Map legacy options\n if (entry === \"lower\") {\n entry = [true, false];\n } else if (entry === \"upper\") {\n entry = [false, true];\n }\n\n // Handle boolean options\n if (entry === true || entry === false) {\n for (i = 1; i < parsed.handles; i++) {\n connect.push(entry);\n }\n\n connect.push(false);\n }\n\n // Reject invalid input\n else if (!Array.isArray(entry) || !entry.length || entry.length !== parsed.handles + 1) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'connect' option doesn't match handle count.\");\n } else {\n connect = entry;\n }\n\n parsed.connect = connect;\n }\n\n function testOrientation(parsed, entry) {\n // Set orientation to an a numerical value for easy\n // array selection.\n switch (entry) {\n case \"horizontal\":\n parsed.ort = 0;\n break;\n case \"vertical\":\n parsed.ort = 1;\n break;\n default:\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'orientation' option is invalid.\");\n }\n }\n\n function testMargin(parsed, entry) {\n if (!isNumeric(entry)) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option must be numeric.\");\n }\n\n // Issue #582\n if (entry === 0) {\n return;\n }\n\n parsed.margin = parsed.spectrum.getDistance(entry);\n }\n\n function testLimit(parsed, entry) {\n if (!isNumeric(entry)) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'limit' option must be numeric.\");\n }\n\n parsed.limit = parsed.spectrum.getDistance(entry);\n\n if (!parsed.limit || parsed.handles < 2) {\n throw new Error(\n \"noUiSlider (\" +\n VERSION +\n \"): 'limit' option is only supported on linear sliders with 2 or more handles.\"\n );\n }\n }\n\n function testPadding(parsed, entry) {\n var index;\n\n if (!isNumeric(entry) && !Array.isArray(entry)) {\n throw new Error(\n \"noUiSlider (\" + VERSION + \"): 'padding' option must be numeric or array of exactly 2 numbers.\"\n );\n }\n\n if (Array.isArray(entry) && !(entry.length === 2 || isNumeric(entry[0]) || isNumeric(entry[1]))) {\n throw new Error(\n \"noUiSlider (\" + VERSION + \"): 'padding' option must be numeric or array of exactly 2 numbers.\"\n );\n }\n\n if (entry === 0) {\n return;\n }\n\n if (!Array.isArray(entry)) {\n entry = [entry, entry];\n }\n\n // 'getDistance' returns false for invalid values.\n parsed.padding = [parsed.spectrum.getDistance(entry[0]), parsed.spectrum.getDistance(entry[1])];\n\n for (index = 0; index < parsed.spectrum.xNumSteps.length - 1; index++) {\n // last \"range\" can't contain step size as it is purely an endpoint.\n if (parsed.padding[0][index] < 0 || parsed.padding[1][index] < 0) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be a positive number(s).\");\n }\n }\n\n var totalPadding = entry[0] + entry[1];\n var firstValue = parsed.spectrum.xVal[0];\n var lastValue = parsed.spectrum.xVal[parsed.spectrum.xVal.length - 1];\n\n if (totalPadding / (lastValue - firstValue) > 1) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must not exceed 100% of the range.\");\n }\n }\n\n function testDirection(parsed, entry) {\n // Set direction as a numerical value for easy parsing.\n // Invert connection for RTL sliders, so that the proper\n // handles get the connect/background classes.\n switch (entry) {\n case \"ltr\":\n parsed.dir = 0;\n break;\n case \"rtl\":\n parsed.dir = 1;\n break;\n default:\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'direction' option was not recognized.\");\n }\n }\n\n function testBehaviour(parsed, entry) {\n // Make sure the input is a string.\n if (typeof entry !== \"string\") {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'behaviour' must be a string containing options.\");\n }\n\n // Check if the string contains any keywords.\n // None are required.\n var tap = entry.indexOf(\"tap\") >= 0;\n var drag = entry.indexOf(\"drag\") >= 0;\n var fixed = entry.indexOf(\"fixed\") >= 0;\n var snap = entry.indexOf(\"snap\") >= 0;\n var hover = entry.indexOf(\"hover\") >= 0;\n var unconstrained = entry.indexOf(\"unconstrained\") >= 0;\n\n if (fixed) {\n if (parsed.handles !== 2) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'fixed' behaviour must be used with 2 handles\");\n }\n\n // Use margin to enforce fixed state\n testMargin(parsed, parsed.start[1] - parsed.start[0]);\n }\n\n if (unconstrained && (parsed.margin || parsed.limit)) {\n throw new Error(\n \"noUiSlider (\" + VERSION + \"): 'unconstrained' behaviour cannot be used with margin or limit\"\n );\n }\n\n parsed.events = {\n tap: tap || snap,\n drag: drag,\n fixed: fixed,\n snap: snap,\n hover: hover,\n unconstrained: unconstrained\n };\n }\n\n function testTooltips(parsed, entry) {\n if (entry === false) {\n return;\n }\n\n if (entry === true) {\n parsed.tooltips = [];\n\n for (var i = 0; i < parsed.handles; i++) {\n parsed.tooltips.push(true);\n }\n } else {\n parsed.tooltips = asArray(entry);\n\n if (parsed.tooltips.length !== parsed.handles) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): must pass a formatter for all handles.\");\n }\n\n parsed.tooltips.forEach(function(formatter) {\n if (\n typeof formatter !== \"boolean\" &&\n (typeof formatter !== \"object\" || typeof formatter.to !== \"function\")\n ) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'tooltips' must be passed a formatter or 'false'.\");\n }\n });\n }\n }\n\n function testAriaFormat(parsed, entry) {\n parsed.ariaFormat = entry;\n validateFormat(entry);\n }\n\n function testFormat(parsed, entry) {\n parsed.format = entry;\n validateFormat(entry);\n }\n\n function testKeyboardSupport(parsed, entry) {\n parsed.keyboardSupport = entry;\n\n if (typeof entry !== \"boolean\") {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'keyboardSupport' option must be a boolean.\");\n }\n }\n\n function testDocumentElement(parsed, entry) {\n // This is an advanced option. Passed values are used without validation.\n parsed.documentElement = entry;\n }\n\n function testCssPrefix(parsed, entry) {\n if (typeof entry !== \"string\" && entry !== false) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'cssPrefix' must be a string or `false`.\");\n }\n\n parsed.cssPrefix = entry;\n }\n\n function testCssClasses(parsed, entry) {\n if (typeof entry !== \"object\") {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'cssClasses' must be an object.\");\n }\n\n if (typeof parsed.cssPrefix === \"string\") {\n parsed.cssClasses = {};\n\n for (var key in entry) {\n if (!entry.hasOwnProperty(key)) {\n continue;\n }\n\n parsed.cssClasses[key] = parsed.cssPrefix + entry[key];\n }\n } else {\n parsed.cssClasses = entry;\n }\n }\n\n // Test all developer settings and parse to assumption-safe values.\n function testOptions(options) {\n // To prove a fix for #537, freeze options here.\n // If the object is modified, an error will be thrown.\n // Object.freeze(options);\n\n var parsed = {\n margin: 0,\n limit: 0,\n padding: 0,\n animate: true,\n animationDuration: 300,\n ariaFormat: defaultFormatter,\n format: defaultFormatter\n };\n\n // Tests are executed in the order they are presented here.\n var tests = {\n step: { r: false, t: testStep },\n start: { r: true, t: testStart },\n connect: { r: true, t: testConnect },\n direction: { r: true, t: testDirection },\n snap: { r: false, t: testSnap },\n animate: { r: false, t: testAnimate },\n animationDuration: { r: false, t: testAnimationDuration },\n range: { r: true, t: testRange },\n orientation: { r: false, t: testOrientation },\n margin: { r: false, t: testMargin },\n limit: { r: false, t: testLimit },\n padding: { r: false, t: testPadding },\n behaviour: { r: true, t: testBehaviour },\n ariaFormat: { r: false, t: testAriaFormat },\n format: { r: false, t: testFormat },\n tooltips: { r: false, t: testTooltips },\n keyboardSupport: { r: true, t: testKeyboardSupport },\n documentElement: { r: false, t: testDocumentElement },\n cssPrefix: { r: true, t: testCssPrefix },\n cssClasses: { r: true, t: testCssClasses }\n };\n\n var defaults = {\n connect: false,\n direction: \"ltr\",\n behaviour: \"tap\",\n orientation: \"horizontal\",\n keyboardSupport: true,\n cssPrefix: \"noUi-\",\n cssClasses: cssClasses\n };\n\n // AriaFormat defaults to regular format, if any.\n if (options.format && !options.ariaFormat) {\n options.ariaFormat = options.format;\n }\n\n // Run all options through a testing mechanism to ensure correct\n // input. It should be noted that options might get modified to\n // be handled properly. E.g. wrapping integers in arrays.\n Object.keys(tests).forEach(function(name) {\n // If the option isn't set, but it is required, throw an error.\n if (!isSet(options[name]) && defaults[name] === undefined) {\n if (tests[name].r) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): '\" + name + \"' is required.\");\n }\n\n return true;\n }\n\n tests[name].t(parsed, !isSet(options[name]) ? defaults[name] : options[name]);\n });\n\n // Forward pips options\n parsed.pips = options.pips;\n\n // All recent browsers accept unprefixed transform.\n // We need -ms- for IE9 and -webkit- for older Android;\n // Assume use of -webkit- if unprefixed and -ms- are not supported.\n // https://caniuse.com/#feat=transforms2d\n var d = document.createElement(\"div\");\n var msPrefix = d.style.msTransform !== undefined;\n var noPrefix = d.style.transform !== undefined;\n\n parsed.transformRule = noPrefix ? \"transform\" : msPrefix ? \"msTransform\" : \"webkitTransform\";\n\n // Pips don't move, so we can place them using left/top.\n var styles = [[\"left\", \"top\"], [\"right\", \"bottom\"]];\n\n parsed.style = styles[parsed.dir][parsed.ort];\n\n return parsed;\n }\n\n //endregion\n\n function scope(target, options, originalOptions) {\n var actions = getActions();\n var supportsTouchActionNone = getSupportsTouchActionNone();\n var supportsPassive = supportsTouchActionNone && getSupportsPassive();\n\n // All variables local to 'scope' are prefixed with 'scope_'\n\n // Slider DOM Nodes\n var scope_Target = target;\n var scope_Base;\n var scope_Handles;\n var scope_Connects;\n var scope_Pips;\n var scope_Tooltips;\n\n // Slider state values\n var scope_Spectrum = options.spectrum;\n var scope_Values = [];\n var scope_Locations = [];\n var scope_HandleNumbers = [];\n var scope_ActiveHandlesCount = 0;\n var scope_Events = {};\n\n // Exposed API\n var scope_Self;\n\n // Document Nodes\n var scope_Document = target.ownerDocument;\n var scope_DocumentElement = options.documentElement || scope_Document.documentElement;\n var scope_Body = scope_Document.body;\n\n // Pips constants\n var PIPS_NONE = -1;\n var PIPS_NO_VALUE = 0;\n var PIPS_LARGE_VALUE = 1;\n var PIPS_SMALL_VALUE = 2;\n\n // For horizontal sliders in standard ltr documents,\n // make .noUi-origin overflow to the left so the document doesn't scroll.\n var scope_DirOffset = scope_Document.dir === \"rtl\" || options.ort === 1 ? 0 : 100;\n\n // Creates a node, adds it to target, returns the new node.\n function addNodeTo(addTarget, className) {\n var div = scope_Document.createElement(\"div\");\n\n if (className) {\n addClass(div, className);\n }\n\n addTarget.appendChild(div);\n\n return div;\n }\n\n // Append a origin to the base\n function addOrigin(base, handleNumber) {\n var origin = addNodeTo(base, options.cssClasses.origin);\n var handle = addNodeTo(origin, options.cssClasses.handle);\n\n addNodeTo(handle, options.cssClasses.touchArea);\n\n handle.setAttribute(\"data-handle\", handleNumber);\n\n if (options.keyboardSupport) {\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\n // 0 = focusable and reachable\n handle.setAttribute(\"tabindex\", \"0\");\n handle.addEventListener(\"keydown\", function(event) {\n return eventKeydown(event, handleNumber);\n });\n }\n\n handle.setAttribute(\"role\", \"slider\");\n handle.setAttribute(\"aria-orientation\", options.ort ? \"vertical\" : \"horizontal\");\n\n if (handleNumber === 0) {\n addClass(handle, options.cssClasses.handleLower);\n } else if (handleNumber === options.handles - 1) {\n addClass(handle, options.cssClasses.handleUpper);\n }\n\n return origin;\n }\n\n // Insert nodes for connect elements\n function addConnect(base, add) {\n if (!add) {\n return false;\n }\n\n return addNodeTo(base, options.cssClasses.connect);\n }\n\n // Add handles to the slider base.\n function addElements(connectOptions, base) {\n var connectBase = addNodeTo(base, options.cssClasses.connects);\n\n scope_Handles = [];\n scope_Connects = [];\n\n scope_Connects.push(addConnect(connectBase, connectOptions[0]));\n\n // [::::O====O====O====]\n // connectOptions = [0, 1, 1, 1]\n\n for (var i = 0; i < options.handles; i++) {\n // Keep a list of all added handles.\n scope_Handles.push(addOrigin(base, i));\n scope_HandleNumbers[i] = i;\n scope_Connects.push(addConnect(connectBase, connectOptions[i + 1]));\n }\n }\n\n // Initialize a single slider.\n function addSlider(addTarget) {\n // Apply classes and data to the target.\n addClass(addTarget, options.cssClasses.target);\n\n if (options.dir === 0) {\n addClass(addTarget, options.cssClasses.ltr);\n } else {\n addClass(addTarget, options.cssClasses.rtl);\n }\n\n if (options.ort === 0) {\n addClass(addTarget, options.cssClasses.horizontal);\n } else {\n addClass(addTarget, options.cssClasses.vertical);\n }\n\n var textDirection = getComputedStyle(addTarget).direction;\n\n if (textDirection === \"rtl\") {\n addClass(addTarget, options.cssClasses.textDirectionRtl);\n } else {\n addClass(addTarget, options.cssClasses.textDirectionLtr);\n }\n\n return addNodeTo(addTarget, options.cssClasses.base);\n }\n\n function addTooltip(handle, handleNumber) {\n if (!options.tooltips[handleNumber]) {\n return false;\n }\n\n return addNodeTo(handle.firstChild, options.cssClasses.tooltip);\n }\n\n function isSliderDisabled() {\n return scope_Target.hasAttribute(\"disabled\");\n }\n\n // Disable the slider dragging if any handle is disabled\n function isHandleDisabled(handleNumber) {\n var handleOrigin = scope_Handles[handleNumber];\n return handleOrigin.hasAttribute(\"disabled\");\n }\n\n function removeTooltips() {\n if (scope_Tooltips) {\n removeEvent(\"update.tooltips\");\n scope_Tooltips.forEach(function(tooltip) {\n if (tooltip) {\n removeElement(tooltip);\n }\n });\n scope_Tooltips = null;\n }\n }\n\n // The tooltips option is a shorthand for using the 'update' event.\n function tooltips() {\n removeTooltips();\n\n // Tooltips are added with options.tooltips in original order.\n scope_Tooltips = scope_Handles.map(addTooltip);\n\n bindEvent(\"update.tooltips\", function(values, handleNumber, unencoded) {\n if (!scope_Tooltips[handleNumber]) {\n return;\n }\n\n var formattedValue = values[handleNumber];\n\n if (options.tooltips[handleNumber] !== true) {\n formattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]);\n }\n\n scope_Tooltips[handleNumber].innerHTML = formattedValue;\n });\n }\n\n function aria() {\n bindEvent(\"update\", function(values, handleNumber, unencoded, tap, positions) {\n // Update Aria Values for all handles, as a change in one changes min and max values for the next.\n scope_HandleNumbers.forEach(function(index) {\n var handle = scope_Handles[index];\n\n var min = checkHandlePosition(scope_Locations, index, 0, true, true, true);\n var max = checkHandlePosition(scope_Locations, index, 100, true, true, true);\n\n var now = positions[index];\n\n // Formatted value for display\n var text = options.ariaFormat.to(unencoded[index]);\n\n // Map to slider range values\n min = scope_Spectrum.fromStepping(min).toFixed(1);\n max = scope_Spectrum.fromStepping(max).toFixed(1);\n now = scope_Spectrum.fromStepping(now).toFixed(1);\n\n handle.children[0].setAttribute(\"aria-valuemin\", min);\n handle.children[0].setAttribute(\"aria-valuemax\", max);\n handle.children[0].setAttribute(\"aria-valuenow\", now);\n handle.children[0].setAttribute(\"aria-valuetext\", text);\n });\n });\n }\n\n function getGroup(mode, values, stepped) {\n // Use the range.\n if (mode === \"range\" || mode === \"steps\") {\n return scope_Spectrum.xVal;\n }\n\n if (mode === \"count\") {\n if (values < 2) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'values' (>= 2) required for mode 'count'.\");\n }\n\n // Divide 0 - 100 in 'count' parts.\n var interval = values - 1;\n var spread = 100 / interval;\n\n values = [];\n\n // List these parts and have them handled as 'positions'.\n while (interval--) {\n values[interval] = interval * spread;\n }\n\n values.push(100);\n\n mode = \"positions\";\n }\n\n if (mode === \"positions\") {\n // Map all percentages to on-range values.\n return values.map(function(value) {\n return scope_Spectrum.fromStepping(stepped ? scope_Spectrum.getStep(value) : value);\n });\n }\n\n if (mode === \"values\") {\n // If the value must be stepped, it needs to be converted to a percentage first.\n if (stepped) {\n return values.map(function(value) {\n // Convert to percentage, apply step, return to value.\n return scope_Spectrum.fromStepping(scope_Spectrum.getStep(scope_Spectrum.toStepping(value)));\n });\n }\n\n // Otherwise, we can simply use the values.\n return values;\n }\n }\n\n function generateSpread(density, mode, group) {\n function safeIncrement(value, increment) {\n // Avoid floating point variance by dropping the smallest decimal places.\n return (value + increment).toFixed(7) / 1;\n }\n\n var indexes = {};\n var firstInRange = scope_Spectrum.xVal[0];\n var lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length - 1];\n var ignoreFirst = false;\n var ignoreLast = false;\n var prevPct = 0;\n\n // Create a copy of the group, sort it and filter away all duplicates.\n group = unique(\n group.slice().sort(function(a, b) {\n return a - b;\n })\n );\n\n // Make sure the range starts with the first element.\n if (group[0] !== firstInRange) {\n group.unshift(firstInRange);\n ignoreFirst = true;\n }\n\n // Likewise for the last one.\n if (group[group.length - 1] !== lastInRange) {\n group.push(lastInRange);\n ignoreLast = true;\n }\n\n group.forEach(function(current, index) {\n // Get the current step and the lower + upper positions.\n var step;\n var i;\n var q;\n var low = current;\n var high = group[index + 1];\n var newPct;\n var pctDifference;\n var pctPos;\n var type;\n var steps;\n var realSteps;\n var stepSize;\n var isSteps = mode === \"steps\";\n\n // When using 'steps' mode, use the provided steps.\n // Otherwise, we'll step on to the next subrange.\n if (isSteps) {\n step = scope_Spectrum.xNumSteps[index];\n }\n\n // Default to a 'full' step.\n if (!step) {\n step = high - low;\n }\n\n // Low can be 0, so test for false. If high is undefined,\n // we are at the last subrange. Index 0 is already handled.\n if (low === false || high === undefined) {\n return;\n }\n\n // Make sure step isn't 0, which would cause an infinite loop (#654)\n step = Math.max(step, 0.0000001);\n\n // Find all steps in the subrange.\n for (i = low; i <= high; i = safeIncrement(i, step)) {\n // Get the percentage value for the current step,\n // calculate the size for the subrange.\n newPct = scope_Spectrum.toStepping(i);\n pctDifference = newPct - prevPct;\n\n steps = pctDifference / density;\n realSteps = Math.round(steps);\n\n // This ratio represents the amount of percentage-space a point indicates.\n // For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-divided.\n // Round the percentage offset to an even number, then divide by two\n // to spread the offset on both sides of the range.\n stepSize = pctDifference / realSteps;\n\n // Divide all points evenly, adding the correct number to this subrange.\n // Run up to <= so that 100% gets a point, event if ignoreLast is set.\n for (q = 1; q <= realSteps; q += 1) {\n // The ratio between the rounded value and the actual size might be ~1% off.\n // Correct the percentage offset by the number of points\n // per subrange. density = 1 will result in 100 points on the\n // full range, 2 for 50, 4 for 25, etc.\n pctPos = prevPct + q * stepSize;\n indexes[pctPos.toFixed(5)] = [scope_Spectrum.fromStepping(pctPos), 0];\n }\n\n // Determine the point type.\n type = group.indexOf(i) > -1 ? PIPS_LARGE_VALUE : isSteps ? PIPS_SMALL_VALUE : PIPS_NO_VALUE;\n\n // Enforce the 'ignoreFirst' option by overwriting the type for 0.\n if (!index && ignoreFirst && i !== high) {\n type = 0;\n }\n\n if (!(i === high && ignoreLast)) {\n // Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.\n indexes[newPct.toFixed(5)] = [i, type];\n }\n\n // Update the percentage count.\n prevPct = newPct;\n }\n });\n\n return indexes;\n }\n\n function addMarking(spread, filterFunc, formatter) {\n var element = scope_Document.createElement(\"div\");\n\n var valueSizeClasses = [];\n valueSizeClasses[PIPS_NO_VALUE] = options.cssClasses.valueNormal;\n valueSizeClasses[PIPS_LARGE_VALUE] = options.cssClasses.valueLarge;\n valueSizeClasses[PIPS_SMALL_VALUE] = options.cssClasses.valueSub;\n\n var markerSizeClasses = [];\n markerSizeClasses[PIPS_NO_VALUE] = options.cssClasses.markerNormal;\n markerSizeClasses[PIPS_LARGE_VALUE] = options.cssClasses.markerLarge;\n markerSizeClasses[PIPS_SMALL_VALUE] = options.cssClasses.markerSub;\n\n var valueOrientationClasses = [options.cssClasses.valueHorizontal, options.cssClasses.valueVertical];\n var markerOrientationClasses = [options.cssClasses.markerHorizontal, options.cssClasses.markerVertical];\n\n addClass(element, options.cssClasses.pips);\n addClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical);\n\n function getClasses(type, source) {\n var a = source === options.cssClasses.value;\n var orientationClasses = a ? valueOrientationClasses : markerOrientationClasses;\n var sizeClasses = a ? valueSizeClasses : markerSizeClasses;\n\n return source + \" \" + orientationClasses[options.ort] + \" \" + sizeClasses[type];\n }\n\n function addSpread(offset, value, type) {\n // Apply the filter function, if it is set.\n type = filterFunc ? filterFunc(value, type) : type;\n\n if (type === PIPS_NONE) {\n return;\n }\n\n // Add a marker for every point\n var node = addNodeTo(element, false);\n node.className = getClasses(type, options.cssClasses.marker);\n node.style[options.style] = offset + \"%\";\n\n // Values are only appended for points marked '1' or '2'.\n if (type > PIPS_NO_VALUE) {\n node = addNodeTo(element, false);\n node.className = getClasses(type, options.cssClasses.value);\n node.setAttribute(\"data-value\", value);\n node.style[options.style] = offset + \"%\";\n node.innerHTML = formatter.to(value);\n }\n }\n\n // Append all points.\n Object.keys(spread).forEach(function(offset) {\n addSpread(offset, spread[offset][0], spread[offset][1]);\n });\n\n return element;\n }\n\n function removePips() {\n if (scope_Pips) {\n removeElement(scope_Pips);\n scope_Pips = null;\n }\n }\n\n function pips(grid) {\n // Fix #669\n removePips();\n\n var mode = grid.mode;\n var density = grid.density || 1;\n var filter = grid.filter || false;\n var values = grid.values || false;\n var stepped = grid.stepped || false;\n var group = getGroup(mode, values, stepped);\n var spread = generateSpread(density, mode, group);\n var format = grid.format || {\n to: Math.round\n };\n\n scope_Pips = scope_Target.appendChild(addMarking(spread, filter, format));\n\n return scope_Pips;\n }\n\n // Shorthand for base dimensions.\n function baseSize() {\n var rect = scope_Base.getBoundingClientRect();\n var alt = \"offset\" + [\"Width\", \"Height\"][options.ort];\n return options.ort === 0 ? rect.width || scope_Base[alt] : rect.height || scope_Base[alt];\n }\n\n // Handler for attaching events trough a proxy.\n function attachEvent(events, element, callback, data) {\n // This function can be used to 'filter' events to the slider.\n // element is a node, not a nodeList\n\n var method = function(e) {\n e = fixEvent(e, data.pageOffset, data.target || element);\n\n // fixEvent returns false if this event has a different target\n // when handling (multi-) touch events;\n if (!e) {\n return false;\n }\n\n // doNotReject is passed by all end events to make sure released touches\n // are not rejected, leaving the slider \"stuck\" to the cursor;\n if (isSliderDisabled() && !data.doNotReject) {\n return false;\n }\n\n // Stop if an active 'tap' transition is taking place.\n if (hasClass(scope_Target, options.cssClasses.tap) && !data.doNotReject) {\n return false;\n }\n\n // Ignore right or middle clicks on start #454\n if (events === actions.start && e.buttons !== undefined && e.buttons > 1) {\n return false;\n }\n\n // Ignore right or middle clicks on start #454\n if (data.hover && e.buttons) {\n return false;\n }\n\n // 'supportsPassive' is only true if a browser also supports touch-action: none in CSS.\n // iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support\n // touch-action: manipulation, but that allows panning, which breaks\n // sliders after zooming/on non-responsive pages.\n // See: https://bugs.webkit.org/show_bug.cgi?id=133112\n if (!supportsPassive) {\n e.preventDefault();\n }\n\n e.calcPoint = e.points[options.ort];\n\n // Call the event handler with the event [ and additional data ].\n callback(e, data);\n };\n\n var methods = [];\n\n // Bind a closure on the target for every event type.\n events.split(\" \").forEach(function(eventName) {\n element.addEventListener(eventName, method, supportsPassive ? { passive: true } : false);\n methods.push([eventName, method]);\n });\n\n return methods;\n }\n\n // Provide a clean event with standardized offset values.\n function fixEvent(e, pageOffset, eventTarget) {\n // Filter the event to register the type, which can be\n // touch, mouse or pointer. Offset changes need to be\n // made on an event specific basis.\n var touch = e.type.indexOf(\"touch\") === 0;\n var mouse = e.type.indexOf(\"mouse\") === 0;\n var pointer = e.type.indexOf(\"pointer\") === 0;\n\n var x;\n var y;\n\n // IE10 implemented pointer events with a prefix;\n if (e.type.indexOf(\"MSPointer\") === 0) {\n pointer = true;\n }\n\n // The only thing one handle should be concerned about is the touches that originated on top of it.\n if (touch) {\n // Returns true if a touch originated on the target.\n var isTouchOnTarget = function(checkTouch) {\n return (\n checkTouch.target === eventTarget ||\n eventTarget.contains(checkTouch.target) ||\n (checkTouch.target.shadowRoot && checkTouch.target.shadowRoot.contains(eventTarget))\n );\n };\n\n // In the case of touchstart events, we need to make sure there is still no more than one\n // touch on the target so we look amongst all touches.\n if (e.type === \"touchstart\") {\n var targetTouches = Array.prototype.filter.call(e.touches, isTouchOnTarget);\n\n // Do not support more than one touch per handle.\n if (targetTouches.length > 1) {\n return false;\n }\n\n x = targetTouches[0].pageX;\n y = targetTouches[0].pageY;\n } else {\n // In the other cases, find on changedTouches is enough.\n var targetTouch = Array.prototype.find.call(e.changedTouches, isTouchOnTarget);\n\n // Cancel if the target touch has not moved.\n if (!targetTouch) {\n return false;\n }\n\n x = targetTouch.pageX;\n y = targetTouch.pageY;\n }\n }\n\n pageOffset = pageOffset || getPageOffset(scope_Document);\n\n if (mouse || pointer) {\n x = e.clientX + pageOffset.x;\n y = e.clientY + pageOffset.y;\n }\n\n e.pageOffset = pageOffset;\n e.points = [x, y];\n e.cursor = mouse || pointer; // Fix #435\n\n return e;\n }\n\n // Translate a coordinate in the document to a percentage on the slider\n function calcPointToPercentage(calcPoint) {\n var location = calcPoint - offset(scope_Base, options.ort);\n var proposal = (location * 100) / baseSize();\n\n // Clamp proposal between 0% and 100%\n // Out-of-bound coordinates may occur when .noUi-base pseudo-elements\n // are used (e.g. contained handles feature)\n proposal = limit(proposal);\n\n return options.dir ? 100 - proposal : proposal;\n }\n\n // Find handle closest to a certain percentage on the slider\n function getClosestHandle(clickedPosition) {\n var smallestDifference = 100;\n var handleNumber = false;\n\n scope_Handles.forEach(function(handle, index) {\n // Disabled handles are ignored\n if (isHandleDisabled(index)) {\n return;\n }\n\n var handlePosition = scope_Locations[index];\n var differenceWithThisHandle = Math.abs(handlePosition - clickedPosition);\n\n // Initial state\n var clickAtEdge = differenceWithThisHandle === 100 && smallestDifference === 100;\n\n // Difference with this handle is smaller than the previously checked handle\n var isCloser = differenceWithThisHandle < smallestDifference;\n var isCloserAfter = differenceWithThisHandle <= smallestDifference && clickedPosition > handlePosition;\n\n if (isCloser || isCloserAfter || clickAtEdge) {\n handleNumber = index;\n smallestDifference = differenceWithThisHandle;\n }\n });\n\n return handleNumber;\n }\n\n // Fire 'end' when a mouse or pen leaves the document.\n function documentLeave(event, data) {\n if (event.type === \"mouseout\" && event.target.nodeName === \"HTML\" && event.relatedTarget === null) {\n eventEnd(event, data);\n }\n }\n\n // Handle movement on document for handle and range drag.\n function eventMove(event, data) {\n // Fix #498\n // Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty).\n // https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero\n // IE9 has .buttons and .which zero on mousemove.\n // Firefox breaks the spec MDN defines.\n if (navigator.appVersion.indexOf(\"MSIE 9\") === -1 && event.buttons === 0 && data.buttonsProperty !== 0) {\n return eventEnd(event, data);\n }\n\n // Check if we are moving up or down\n var movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint);\n\n // Convert the movement into a percentage of the slider width/height\n var proposal = (movement * 100) / data.baseSize;\n\n moveHandles(movement > 0, proposal, data.locations, data.handleNumbers);\n }\n\n // Unbind move events on document, call callbacks.\n function eventEnd(event, data) {\n // The handle is no longer active, so remove the class.\n if (data.handle) {\n removeClass(data.handle, options.cssClasses.active);\n scope_ActiveHandlesCount -= 1;\n }\n\n // Unbind the move and end events, which are added on 'start'.\n data.listeners.forEach(function(c) {\n scope_DocumentElement.removeEventListener(c[0], c[1]);\n });\n\n if (scope_ActiveHandlesCount === 0) {\n // Remove dragging class.\n removeClass(scope_Target, options.cssClasses.drag);\n setZindex();\n\n // Remove cursor styles and text-selection events bound to the body.\n if (event.cursor) {\n scope_Body.style.cursor = \"\";\n scope_Body.removeEventListener(\"selectstart\", preventDefault);\n }\n }\n\n data.handleNumbers.forEach(function(handleNumber) {\n fireEvent(\"change\", handleNumber);\n fireEvent(\"set\", handleNumber);\n fireEvent(\"end\", handleNumber);\n });\n }\n\n // Bind move events on document.\n function eventStart(event, data) {\n // Ignore event if any handle is disabled\n if (data.handleNumbers.some(isHandleDisabled)) {\n return false;\n }\n\n var handle;\n\n if (data.handleNumbers.length === 1) {\n var handleOrigin = scope_Handles[data.handleNumbers[0]];\n\n handle = handleOrigin.children[0];\n scope_ActiveHandlesCount += 1;\n\n // Mark the handle as 'active' so it can be styled.\n addClass(handle, options.cssClasses.active);\n }\n\n // A drag should never propagate up to the 'tap' event.\n event.stopPropagation();\n\n // Record the event listeners.\n var listeners = [];\n\n // Attach the move and end events.\n var moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, {\n // The event target has changed so we need to propagate the original one so that we keep\n // relying on it to extract target touches.\n target: event.target,\n handle: handle,\n listeners: listeners,\n startCalcPoint: event.calcPoint,\n baseSize: baseSize(),\n pageOffset: event.pageOffset,\n handleNumbers: data.handleNumbers,\n buttonsProperty: event.buttons,\n locations: scope_Locations.slice()\n });\n\n var endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, {\n target: event.target,\n handle: handle,\n listeners: listeners,\n doNotReject: true,\n handleNumbers: data.handleNumbers\n });\n\n var outEvent = attachEvent(\"mouseout\", scope_DocumentElement, documentLeave, {\n target: event.target,\n handle: handle,\n listeners: listeners,\n doNotReject: true,\n handleNumbers: data.handleNumbers\n });\n\n // We want to make sure we pushed the listeners in the listener list rather than creating\n // a new one as it has already been passed to the event handlers.\n listeners.push.apply(listeners, moveEvent.concat(endEvent, outEvent));\n\n // Text selection isn't an issue on touch devices,\n // so adding cursor styles can be skipped.\n if (event.cursor) {\n // Prevent the 'I' cursor and extend the range-drag cursor.\n scope_Body.style.cursor = getComputedStyle(event.target).cursor;\n\n // Mark the target with a dragging state.\n if (scope_Handles.length > 1) {\n addClass(scope_Target, options.cssClasses.drag);\n }\n\n // Prevent text selection when dragging the handles.\n // In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move,\n // which is scroll blocking. The selectstart event is supported by FireFox starting from version 52,\n // meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there.\n // The 'cursor' flag is false.\n // See: http://caniuse.com/#search=selectstart\n scope_Body.addEventListener(\"selectstart\", preventDefault, false);\n }\n\n data.handleNumbers.forEach(function(handleNumber) {\n fireEvent(\"start\", handleNumber);\n });\n }\n\n // Move closest handle to tapped location.\n function eventTap(event) {\n // The tap event shouldn't propagate up\n event.stopPropagation();\n\n var proposal = calcPointToPercentage(event.calcPoint);\n var handleNumber = getClosestHandle(proposal);\n\n // Tackle the case that all handles are 'disabled'.\n if (handleNumber === false) {\n return false;\n }\n\n // Flag the slider as it is now in a transitional state.\n // Transition takes a configurable amount of ms (default 300). Re-enable the slider after that.\n if (!options.events.snap) {\n addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\n }\n\n setHandle(handleNumber, proposal, true, true);\n\n setZindex();\n\n fireEvent(\"slide\", handleNumber, true);\n fireEvent(\"update\", handleNumber, true);\n fireEvent(\"change\", handleNumber, true);\n fireEvent(\"set\", handleNumber, true);\n\n if (options.events.snap) {\n eventStart(event, { handleNumbers: [handleNumber] });\n }\n }\n\n // Fires a 'hover' event for a hovered mouse/pen position.\n function eventHover(event) {\n var proposal = calcPointToPercentage(event.calcPoint);\n\n var to = scope_Spectrum.getStep(proposal);\n var value = scope_Spectrum.fromStepping(to);\n\n Object.keys(scope_Events).forEach(function(targetEvent) {\n if (\"hover\" === targetEvent.split(\".\")[0]) {\n scope_Events[targetEvent].forEach(function(callback) {\n callback.call(scope_Self, value);\n });\n }\n });\n }\n\n // Handles keydown on focused handles\n // Don't move the document when pressing arrow keys on focused handles\n function eventKeydown(event, handleNumber) {\n if (isSliderDisabled() || isHandleDisabled(handleNumber)) {\n return false;\n }\n\n var horizontalKeys = [\"Left\", \"Right\"];\n var verticalKeys = [\"Down\", \"Up\"];\n var largeStepKeys = [\"PageDown\", \"PageUp\"];\n var edgeKeys = [\"Home\", \"End\"];\n\n if (options.dir && !options.ort) {\n // On an right-to-left slider, the left and right keys act inverted\n horizontalKeys.reverse();\n } else if (options.ort && !options.dir) {\n // On a top-to-bottom slider, the up and down keys act inverted\n verticalKeys.reverse();\n largeStepKeys.reverse();\n }\n\n // Strip \"Arrow\" for IE compatibility. https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key\n var key = event.key.replace(\"Arrow\", \"\");\n\n var isLargeDown = key === largeStepKeys[0];\n var isLargeUp = key === largeStepKeys[1];\n var isDown = key === verticalKeys[0] || key === horizontalKeys[0] || isLargeDown;\n var isUp = key === verticalKeys[1] || key === horizontalKeys[1] || isLargeUp;\n var isMin = key === edgeKeys[0];\n var isMax = key === edgeKeys[1];\n\n if (!isDown && !isUp && !isMin && !isMax) {\n return true;\n }\n\n event.preventDefault();\n\n var to;\n\n if (isUp || isDown) {\n var multiplier = 5;\n var direction = isDown ? 0 : 1;\n var steps = getNextStepsForHandle(handleNumber);\n var step = steps[direction];\n\n // At the edge of a slider, do nothing\n if (step === null) {\n return false;\n }\n\n // No step set, use the default of 10% of the sub-range\n if (step === false) {\n step = scope_Spectrum.getDefaultStep(scope_Locations[handleNumber], isDown, 10);\n }\n\n if (isLargeUp || isLargeDown) {\n step *= multiplier;\n }\n\n // Step over zero-length ranges (#948);\n step = Math.max(step, 0.0000001);\n\n // Decrement for down steps\n step = (isDown ? -1 : 1) * step;\n\n to = scope_Values[handleNumber] + step;\n } else if (isMax) {\n // End key\n to = options.spectrum.xVal[options.spectrum.xVal.length - 1];\n } else {\n // Home key\n to = options.spectrum.xVal[0];\n }\n\n setHandle(handleNumber, scope_Spectrum.toStepping(to), true, true);\n\n fireEvent(\"slide\", handleNumber);\n fireEvent(\"update\", handleNumber);\n fireEvent(\"change\", handleNumber);\n fireEvent(\"set\", handleNumber);\n\n return false;\n }\n\n // Attach events to several slider parts.\n function bindSliderEvents(behaviour) {\n // Attach the standard drag event to the handles.\n if (!behaviour.fixed) {\n scope_Handles.forEach(function(handle, index) {\n // These events are only bound to the visual handle\n // element, not the 'real' origin element.\n attachEvent(actions.start, handle.children[0], eventStart, {\n handleNumbers: [index]\n });\n });\n }\n\n // Attach the tap event to the slider base.\n if (behaviour.tap) {\n attachEvent(actions.start, scope_Base, eventTap, {});\n }\n\n // Fire hover events\n if (behaviour.hover) {\n attachEvent(actions.move, scope_Base, eventHover, {\n hover: true\n });\n }\n\n // Make the range draggable.\n if (behaviour.drag) {\n scope_Connects.forEach(function(connect, index) {\n if (connect === false || index === 0 || index === scope_Connects.length - 1) {\n return;\n }\n\n var handleBefore = scope_Handles[index - 1];\n var handleAfter = scope_Handles[index];\n var eventHolders = [connect];\n\n addClass(connect, options.cssClasses.draggable);\n\n // When the range is fixed, the entire range can\n // be dragged by the handles. The handle in the first\n // origin will propagate the start event upward,\n // but it needs to be bound manually on the other.\n if (behaviour.fixed) {\n eventHolders.push(handleBefore.children[0]);\n eventHolders.push(handleAfter.children[0]);\n }\n\n eventHolders.forEach(function(eventHolder) {\n attachEvent(actions.start, eventHolder, eventStart, {\n handles: [handleBefore, handleAfter],\n handleNumbers: [index - 1, index]\n });\n });\n });\n }\n }\n\n // Attach an event to this slider, possibly including a namespace\n function bindEvent(namespacedEvent, callback) {\n scope_Events[namespacedEvent] = scope_Events[namespacedEvent] || [];\n scope_Events[namespacedEvent].push(callback);\n\n // If the event bound is 'update,' fire it immediately for all handles.\n if (namespacedEvent.split(\".\")[0] === \"update\") {\n scope_Handles.forEach(function(a, index) {\n fireEvent(\"update\", index);\n });\n }\n }\n\n // Undo attachment of event\n function removeEvent(namespacedEvent) {\n var event = namespacedEvent && namespacedEvent.split(\".\")[0];\n var namespace = event && namespacedEvent.substring(event.length);\n\n Object.keys(scope_Events).forEach(function(bind) {\n var tEvent = bind.split(\".\")[0];\n var tNamespace = bind.substring(tEvent.length);\n\n if ((!event || event === tEvent) && (!namespace || namespace === tNamespace)) {\n delete scope_Events[bind];\n }\n });\n }\n\n // External event handling\n function fireEvent(eventName, handleNumber, tap) {\n Object.keys(scope_Events).forEach(function(targetEvent) {\n var eventType = targetEvent.split(\".\")[0];\n\n if (eventName === eventType) {\n scope_Events[targetEvent].forEach(function(callback) {\n callback.call(\n // Use the slider public API as the scope ('this')\n scope_Self,\n // Return values as array, so arg_1[arg_2] is always valid.\n scope_Values.map(options.format.to),\n // Handle index, 0 or 1\n handleNumber,\n // Un-formatted slider values\n scope_Values.slice(),\n // Event is fired by tap, true or false\n tap || false,\n // Left offset of the handle, in relation to the slider\n scope_Locations.slice(),\n // add the slider public API to an accessible parameter when this is unavailable\n scope_Self\n );\n });\n }\n });\n }\n\n // Split out the handle positioning logic so the Move event can use it, too\n function checkHandlePosition(reference, handleNumber, to, lookBackward, lookForward, getValue) {\n var distance;\n\n // For sliders with multiple handles, limit movement to the other handle.\n // Apply the margin option by adding it to the handle positions.\n if (scope_Handles.length > 1 && !options.events.unconstrained) {\n if (lookBackward && handleNumber > 0) {\n distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.margin, 0);\n to = Math.max(to, distance);\n }\n\n if (lookForward && handleNumber < scope_Handles.length - 1) {\n distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.margin, 1);\n to = Math.min(to, distance);\n }\n }\n\n // The limit option has the opposite effect, limiting handles to a\n // maximum distance from another. Limit must be > 0, as otherwise\n // handles would be unmovable.\n if (scope_Handles.length > 1 && options.limit) {\n if (lookBackward && handleNumber > 0) {\n distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.limit, 0);\n to = Math.min(to, distance);\n }\n\n if (lookForward && handleNumber < scope_Handles.length - 1) {\n distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.limit, 1);\n to = Math.max(to, distance);\n }\n }\n\n // The padding option keeps the handles a certain distance from the\n // edges of the slider. Padding must be > 0.\n if (options.padding) {\n if (handleNumber === 0) {\n distance = scope_Spectrum.getAbsoluteDistance(0, options.padding[0], 0);\n to = Math.max(to, distance);\n }\n\n if (handleNumber === scope_Handles.length - 1) {\n distance = scope_Spectrum.getAbsoluteDistance(100, options.padding[1], 1);\n to = Math.min(to, distance);\n }\n }\n\n to = scope_Spectrum.getStep(to);\n\n // Limit percentage to the 0 - 100 range\n to = limit(to);\n\n // Return false if handle can't move\n if (to === reference[handleNumber] && !getValue) {\n return false;\n }\n\n return to;\n }\n\n // Uses slider orientation to create CSS rules. a = base value;\n function inRuleOrder(v, a) {\n var o = options.ort;\n return (o ? a : v) + \", \" + (o ? v : a);\n }\n\n // Moves handle(s) by a percentage\n // (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...])\n function moveHandles(upward, proposal, locations, handleNumbers) {\n var proposals = locations.slice();\n\n var b = [!upward, upward];\n var f = [upward, !upward];\n\n // Copy handleNumbers so we don't change the dataset\n handleNumbers = handleNumbers.slice();\n\n // Check to see which handle is 'leading'.\n // If that one can't move the second can't either.\n if (upward) {\n handleNumbers.reverse();\n }\n\n // Step 1: get the maximum percentage that any of the handles can move\n if (handleNumbers.length > 1) {\n handleNumbers.forEach(function(handleNumber, o) {\n var to = checkHandlePosition(\n proposals,\n handleNumber,\n proposals[handleNumber] + proposal,\n b[o],\n f[o],\n false\n );\n\n // Stop if one of the handles can't move.\n if (to === false) {\n proposal = 0;\n } else {\n proposal = to - proposals[handleNumber];\n proposals[handleNumber] = to;\n }\n });\n }\n\n // If using one handle, check backward AND forward\n else {\n b = f = [true];\n }\n\n var state = false;\n\n // Step 2: Try to set the handles with the found percentage\n handleNumbers.forEach(function(handleNumber, o) {\n state = setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o]) || state;\n });\n\n // Step 3: If a handle moved, fire events\n if (state) {\n handleNumbers.forEach(function(handleNumber) {\n fireEvent(\"update\", handleNumber);\n fireEvent(\"slide\", handleNumber);\n });\n }\n }\n\n // Takes a base value and an offset. This offset is used for the connect bar size.\n // In the initial design for this feature, the origin element was 1% wide.\n // Unfortunately, a rounding bug in Chrome makes it impossible to implement this feature\n // in this manner: https://bugs.chromium.org/p/chromium/issues/detail?id=798223\n function transformDirection(a, b) {\n return options.dir ? 100 - a - b : a;\n }\n\n // Updates scope_Locations and scope_Values, updates visual state\n function updateHandlePosition(handleNumber, to) {\n // Update locations.\n scope_Locations[handleNumber] = to;\n\n // Convert the value to the slider stepping/range.\n scope_Values[handleNumber] = scope_Spectrum.fromStepping(to);\n\n var translation = 10 * (transformDirection(to, 0) - scope_DirOffset);\n var translateRule = \"translate(\" + inRuleOrder(translation + \"%\", \"0\") + \")\";\n\n scope_Handles[handleNumber].style[options.transformRule] = translateRule;\n\n updateConnect(handleNumber);\n updateConnect(handleNumber + 1);\n }\n\n // Handles before the slider middle are stacked later = higher,\n // Handles after the middle later is lower\n // [[7] [8] .......... | .......... [5] [4]\n function setZindex() {\n scope_HandleNumbers.forEach(function(handleNumber) {\n var dir = scope_Locations[handleNumber] > 50 ? -1 : 1;\n var zIndex = 3 + (scope_Handles.length + dir * handleNumber);\n scope_Handles[handleNumber].style.zIndex = zIndex;\n });\n }\n\n // Test suggested values and apply margin, step.\n function setHandle(handleNumber, to, lookBackward, lookForward) {\n to = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false);\n\n if (to === false) {\n return false;\n }\n\n updateHandlePosition(handleNumber, to);\n\n return true;\n }\n\n // Updates style attribute for connect nodes\n function updateConnect(index) {\n // Skip connects set to false\n if (!scope_Connects[index]) {\n return;\n }\n\n var l = 0;\n var h = 100;\n\n if (index !== 0) {\n l = scope_Locations[index - 1];\n }\n\n if (index !== scope_Connects.length - 1) {\n h = scope_Locations[index];\n }\n\n // We use two rules:\n // 'translate' to change the left/top offset;\n // 'scale' to change the width of the element;\n // As the element has a width of 100%, a translation of 100% is equal to 100% of the parent (.noUi-base)\n var connectWidth = h - l;\n var translateRule = \"translate(\" + inRuleOrder(transformDirection(l, connectWidth) + \"%\", \"0\") + \")\";\n var scaleRule = \"scale(\" + inRuleOrder(connectWidth / 100, \"1\") + \")\";\n\n scope_Connects[index].style[options.transformRule] = translateRule + \" \" + scaleRule;\n }\n\n // Parses value passed to .set method. Returns current value if not parse-able.\n function resolveToValue(to, handleNumber) {\n // Setting with null indicates an 'ignore'.\n // Inputting 'false' is invalid.\n if (to === null || to === false || to === undefined) {\n return scope_Locations[handleNumber];\n }\n\n // If a formatted number was passed, attempt to decode it.\n if (typeof to === \"number\") {\n to = String(to);\n }\n\n to = options.format.from(to);\n to = scope_Spectrum.toStepping(to);\n\n // If parsing the number failed, use the current value.\n if (to === false || isNaN(to)) {\n return scope_Locations[handleNumber];\n }\n\n return to;\n }\n\n // Set the slider value.\n function valueSet(input, fireSetEvent) {\n var values = asArray(input);\n var isInit = scope_Locations[0] === undefined;\n\n // Event fires by default\n fireSetEvent = fireSetEvent === undefined ? true : !!fireSetEvent;\n\n // Animation is optional.\n // Make sure the initial values were set before using animated placement.\n if (options.animate && !isInit) {\n addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\n }\n\n // First pass, without lookAhead but with lookBackward. Values are set from left to right.\n scope_HandleNumbers.forEach(function(handleNumber) {\n setHandle(handleNumber, resolveToValue(values[handleNumber], handleNumber), true, false);\n });\n\n var i = scope_HandleNumbers.length === 1 ? 0 : 1;\n\n // Secondary passes. Now that all base values are set, apply constraints.\n // Iterate all handles to ensure constraints are applied for the entire slider (Issue #1009)\n for (; i < scope_HandleNumbers.length; ++i) {\n scope_HandleNumbers.forEach(function(handleNumber) {\n setHandle(handleNumber, scope_Locations[handleNumber], true, true);\n });\n }\n\n setZindex();\n\n scope_HandleNumbers.forEach(function(handleNumber) {\n fireEvent(\"update\", handleNumber);\n\n // Fire the event only for handles that received a new value, as per #579\n if (values[handleNumber] !== null && fireSetEvent) {\n fireEvent(\"set\", handleNumber);\n }\n });\n }\n\n // Reset slider to initial values\n function valueReset(fireSetEvent) {\n valueSet(options.start, fireSetEvent);\n }\n\n // Set value for a single handle\n function valueSetHandle(handleNumber, value, fireSetEvent) {\n // Ensure numeric input\n handleNumber = Number(handleNumber);\n\n if (!(handleNumber >= 0 && handleNumber < scope_HandleNumbers.length)) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): invalid handle number, got: \" + handleNumber);\n }\n\n // Look both backward and forward, since we don't want this handle to \"push\" other handles (#960);\n setHandle(handleNumber, resolveToValue(value, handleNumber), true, true);\n\n fireEvent(\"update\", handleNumber);\n\n if (fireSetEvent) {\n fireEvent(\"set\", handleNumber);\n }\n }\n\n // Get the slider value.\n function valueGet() {\n var values = scope_Values.map(options.format.to);\n\n // If only one handle is used, return a single value.\n if (values.length === 1) {\n return values[0];\n }\n\n return values;\n }\n\n // Removes classes from the root and empties it.\n function destroy() {\n for (var key in options.cssClasses) {\n if (!options.cssClasses.hasOwnProperty(key)) {\n continue;\n }\n removeClass(scope_Target, options.cssClasses[key]);\n }\n\n while (scope_Target.firstChild) {\n scope_Target.removeChild(scope_Target.firstChild);\n }\n\n delete scope_Target.noUiSlider;\n }\n\n function getNextStepsForHandle(handleNumber) {\n var location = scope_Locations[handleNumber];\n var nearbySteps = scope_Spectrum.getNearbySteps(location);\n var value = scope_Values[handleNumber];\n var increment = nearbySteps.thisStep.step;\n var decrement = null;\n\n // If snapped, directly use defined step value\n if (options.snap) {\n return [\n value - nearbySteps.stepBefore.startValue || null,\n nearbySteps.stepAfter.startValue - value || null\n ];\n }\n\n // If the next value in this step moves into the next step,\n // the increment is the start of the next step - the current value\n if (increment !== false) {\n if (value + increment > nearbySteps.stepAfter.startValue) {\n increment = nearbySteps.stepAfter.startValue - value;\n }\n }\n\n // If the value is beyond the starting point\n if (value > nearbySteps.thisStep.startValue) {\n decrement = nearbySteps.thisStep.step;\n } else if (nearbySteps.stepBefore.step === false) {\n decrement = false;\n }\n\n // If a handle is at the start of a step, it always steps back into the previous step first\n else {\n decrement = value - nearbySteps.stepBefore.highestStep;\n }\n\n // Now, if at the slider edges, there is no in/decrement\n if (location === 100) {\n increment = null;\n } else if (location === 0) {\n decrement = null;\n }\n\n // As per #391, the comparison for the decrement step can have some rounding issues.\n var stepDecimals = scope_Spectrum.countStepDecimals();\n\n // Round per #391\n if (increment !== null && increment !== false) {\n increment = Number(increment.toFixed(stepDecimals));\n }\n\n if (decrement !== null && decrement !== false) {\n decrement = Number(decrement.toFixed(stepDecimals));\n }\n\n return [decrement, increment];\n }\n\n // Get the current step size for the slider.\n function getNextSteps() {\n return scope_HandleNumbers.map(getNextStepsForHandle);\n }\n\n // Updateable: margin, limit, padding, step, range, animate, snap\n function updateOptions(optionsToUpdate, fireSetEvent) {\n // Spectrum is created using the range, snap, direction and step options.\n // 'snap' and 'step' can be updated.\n // If 'snap' and 'step' are not passed, they should remain unchanged.\n var v = valueGet();\n\n var updateAble = [\n \"margin\",\n \"limit\",\n \"padding\",\n \"range\",\n \"animate\",\n \"snap\",\n \"step\",\n \"format\",\n \"pips\",\n \"tooltips\"\n ];\n\n // Only change options that we're actually passed to update.\n updateAble.forEach(function(name) {\n // Check for undefined. null removes the value.\n if (optionsToUpdate[name] !== undefined) {\n originalOptions[name] = optionsToUpdate[name];\n }\n });\n\n var newOptions = testOptions(originalOptions);\n\n // Load new options into the slider state\n updateAble.forEach(function(name) {\n if (optionsToUpdate[name] !== undefined) {\n options[name] = newOptions[name];\n }\n });\n\n scope_Spectrum = newOptions.spectrum;\n\n // Limit, margin and padding depend on the spectrum but are stored outside of it. (#677)\n options.margin = newOptions.margin;\n options.limit = newOptions.limit;\n options.padding = newOptions.padding;\n\n // Update pips, removes existing.\n if (options.pips) {\n pips(options.pips);\n } else {\n removePips();\n }\n\n // Update tooltips, removes existing.\n if (options.tooltips) {\n tooltips();\n } else {\n removeTooltips();\n }\n\n // Invalidate the current positioning so valueSet forces an update.\n scope_Locations = [];\n valueSet(optionsToUpdate.start || v, fireSetEvent);\n }\n\n // Initialization steps\n function setupSlider() {\n // Create the base element, initialize HTML and set classes.\n // Add handles and connect elements.\n scope_Base = addSlider(scope_Target);\n\n addElements(options.connect, scope_Base);\n\n // Attach user events.\n bindSliderEvents(options.events);\n\n // Use the public value method to set the start values.\n valueSet(options.start);\n\n if (options.pips) {\n pips(options.pips);\n }\n\n if (options.tooltips) {\n tooltips();\n }\n\n aria();\n }\n\n setupSlider();\n\n // noinspection JSUnusedGlobalSymbols\n scope_Self = {\n destroy: destroy,\n steps: getNextSteps,\n on: bindEvent,\n off: removeEvent,\n get: valueGet,\n set: valueSet,\n setHandle: valueSetHandle,\n reset: valueReset,\n // Exposed for unit testing, don't use this in your application.\n __moveHandles: function(a, b, c) {\n moveHandles(a, b, scope_Locations, c);\n },\n options: originalOptions, // Issue #600, #678\n updateOptions: updateOptions,\n target: scope_Target, // Issue #597\n removePips: removePips,\n removeTooltips: removeTooltips,\n getTooltips: function() {\n return scope_Tooltips;\n },\n getOrigins: function() {\n return scope_Handles;\n },\n pips: pips // Issue #594\n };\n\n return scope_Self;\n }\n\n // Run the standard initializer\n function initialize(target, originalOptions) {\n if (!target || !target.nodeName) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): create requires a single element, got: \" + target);\n }\n\n // Throw an error if the slider was already initialized.\n if (target.noUiSlider) {\n throw new Error(\"noUiSlider (\" + VERSION + \"): Slider was already initialized.\");\n }\n\n // Test the options and create the slider environment;\n var options = testOptions(originalOptions, target);\n var api = scope(target, options, originalOptions);\n\n target.noUiSlider = api;\n\n return api;\n }\n\n // Use an object instead of a function for future expandability;\n return {\n // Exposed for unit testing, don't use this in your application.\n __spectrum: Spectrum,\n version: VERSION,\n // A reference to the default classes, allows global changes.\n // Use the cssClasses option for changes to one slider.\n cssClasses: cssClasses,\n create: initialize\n };\n});\n","import noUiSlider from 'noUiSlider';\r\nimport { formatNumber } from '../utils/helpers';\r\n\r\nconst invalidClass = 'invalid';\r\n\r\n/**\r\n * Check validation of single form field\r\n * @param {HTMLElement | Object} field - Form field element or event object.\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction checkValidation(input) {\r\n let valid = true;\r\n let val = '';\r\n const field = input.target ? input.target : input;\r\n\r\n field.classList.remove(invalidClass);\r\n\r\n switch (field.nodeName) {\r\n case 'INPUT':\r\n case 'TEXTAREA':\r\n case 'SELECT':\r\n default:\r\n val = field.value;\r\n break;\r\n }\r\n\r\n if (field.type == 'checkbox' && !field.checked || val.trim() == '') {\r\n valid = false;\r\n field.classList.add(invalidClass);\r\n field.focus();\r\n }\r\n\r\n return valid;\r\n}\r\n\r\n/**\r\n * Runs [required] fields within form through validation function\r\n *\r\n * @param {HTMLElement} form - Form element to validate *\r\n * @returns {boolean}\r\n */\r\nexport function validateForm(form) {\r\n const requiredFields = form.querySelectorAll('[required]');\r\n let valid = true;\r\n\r\n for (let i = 0; i < requiredFields.length; i++) {\r\n const field = requiredFields[i];\r\n\r\n valid = checkValidation(field);\r\n if (!valid) {\r\n break;\r\n }\r\n }\r\n\r\n return valid;\r\n}\r\n\r\n/**\r\n * This is ment as an 'input' eventhandler set on textareas,\r\n * to auto increase it's height depending on the users text-input.\r\n */\r\nfunction textAreaAutoHeight() {\r\n this.style.height = ''; // Resets height, in case text is removed\r\n this.style.height = `${this.scrollHeight}px`;\r\n}\r\n\r\n/**\r\n * This set an inputs width to match its content,\r\n * handy, when you need a unit (ex. kr.) to lean right against the input.\r\n */\r\nfunction inputAutoWidth(e) {\r\n const input = e.target ? e.target : e;\r\n input.style.width = ''; // Resets height, in case text is removed\r\n input.style.width = `${input.scrollWidth}px`;\r\n}\r\n\r\n/**\r\n * Simply adds a class to target field if it has a value and removes it if not.\r\n *\r\n * @param {Object || HTMLElement} e - Event or field element\r\n */\r\nfunction checkFieldValue(e) {\r\n const field = e.target || e;\r\n field.value ? field.classList.add('has-text') : field.classList.remove('has-text');\r\n}\r\n\r\nfunction setupRangeSlider(form) {\r\n const container = form.querySelector('[data-action=\"noUiSlider\"]');\r\n\r\n if (container) {\r\n const target = container.getAttribute('data-target');\r\n const rangeSlider = target ? document.getElementById(target) : container;\r\n const inputs = container.querySelectorAll('input');\r\n const min = container.getAttribute('data-min') || 1000;\r\n const max = container.getAttribute('data-max') || 45000;\r\n let minDefault = 0;\r\n let maxDeafult = 100;\r\n\r\n if (inputs) {\r\n minDefault = inputs[0].value;\r\n maxDeafult = inputs[1].value;\r\n\r\n inputs[0].addEventListener('change', function () {\r\n const strippedValue = this.value.replace('.', '');\r\n rangeSlider.noUiSlider.set([strippedValue, null]);\r\n });\r\n inputs[1].addEventListener('change', function () {\r\n const strippedValue = this.value.replace('.', '');\r\n rangeSlider.noUiSlider.set([null, strippedValue]);\r\n });\r\n };\r\n\r\n noUiSlider.create(rangeSlider, {\r\n range: {\r\n min: parseInt(min),\r\n max: parseInt(max)\r\n },\r\n step: 150,\r\n start: [parseInt(minDefault), parseInt(maxDeafult)],\r\n connect: true,\r\n });\r\n\r\n rangeSlider.noUiSlider.on('update', function (values, handle) {\r\n if (inputs) {\r\n inputs[0].value = formatNumber(Math.round(values[0]));\r\n inputs[1].value = formatNumber(Math.round(values[1]));\r\n }\r\n });\r\n\r\n\r\n }\r\n}\r\n\r\n\r\nfunction setupFileupload(form) {\r\n const inputs = form.querySelectorAll('.inputfile');\r\n Array.prototype.forEach.call(inputs, function (input) {\r\n const label = input.nextElementSibling,\r\n labelVal = label.innerHTML;\r\n\r\n console.log('virker!');\r\n\r\n input.addEventListener('change', function (e) {\r\n let fileName = '';\r\n if (this.files && this.files.length > 1)\r\n fileName = (this.getAttribute('data-multiple-caption') || '').replace('{count}', this.files.length);\r\n else\r\n fileName = e.target.value.split('\\\\').pop();\r\n\r\n if (fileName)\r\n label.querySelector('span').innerHTML = fileName;\r\n else\r\n label.innerHTML = labelVal;\r\n });\r\n\r\n // // Firefox bug fix\r\n // input.addEventListener('focus', function () { input.classList.add('has-focus'); });\r\n // input.addEventListener('blur', function () { input.classList.remove('has-focus'); });\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 fields to validate\r\n */\r\n\r\nexport function watchFormFields(selector = '.form[data-action*=\"form\"]') {\r\n const forms = document.body.querySelectorAll(selector);\r\n\r\n if (forms) {\r\n for (let f = 0; f < forms.length; f++) {\r\n const fields = forms[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 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.hasAttribute('data-auto-width')) {\r\n inputAutoWidth(field);\r\n field.addEventListener('input', inputAutoWidth);\r\n } */\r\n }\r\n\r\n setupRangeSlider(forms[f]);\r\n setupFileupload(forms[f]);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Serializes form fields\r\n *\r\n * @param {HTMLElement} form - Form element to serialize *\r\n * @returns {string} - Returns querystring of fields names and values\r\n */\r\nexport function serialize(form) {\r\n if (!form || form.nodeName !== 'FORM') {\r\n return;\r\n }\r\n let i, j;\r\n const q = [];\r\n for (i = form.elements.length - 1; i >= 0; i = i - 1) {\r\n if (form.elements[i].name === '') {\r\n continue;\r\n }\r\n switch (form.elements[i].nodeName) {\r\n case 'INPUT':\r\n switch (form.elements[i].type) {\r\n case 'text':\r\n case 'tel':\r\n case 'email':\r\n case 'date':\r\n case 'number':\r\n case 'hidden':\r\n case 'password':\r\n case 'button':\r\n case 'reset':\r\n case 'submit':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n case 'checkbox':\r\n case 'radio':\r\n if (form.elements[i].checked) {\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n }\r\n break;\r\n case 'file':\r\n break;\r\n }\r\n break;\r\n case 'TEXTAREA':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n case 'SELECT':\r\n switch (form.elements[i].type) {\r\n case 'select-one':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n case 'select-multiple':\r\n for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {\r\n if (form.elements[i].options[j].selected) {\r\n q.push(\r\n `${form.elements[i].name}=${encodeURIComponent(form.elements[i].options[j].value)}`\r\n );\r\n }\r\n }\r\n break;\r\n }\r\n break;\r\n case 'BUTTON':\r\n switch (form.elements[i].type) {\r\n case 'reset':\r\n case 'submit':\r\n case 'button':\r\n q.push(`${form.elements[i].name}=${encodeURIComponent(form.elements[i].value)}`);\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n return q.join('&').replace(/%20/g, '+');\r\n}\r\n\r\n/**\r\n * Sets up Form submit eventhandler used when submitting form data through Mandrill\r\n *\r\n * @param {string} selector - querySelector string\r\n */\r\nexport function setupMandrilForms(selector = 'form[data-action*=\"form-mandrill\"]') {\r\n //mandrill forms\r\n const mandrillForms = document.querySelectorAll(selector);\r\n\r\n function mandrillFormSubmit(e) {\r\n e.preventDefault();\r\n\r\n const form = e.target;\r\n if (form !== null) {\r\n if (validateForm(form)) {\r\n form.classList.add('form--working');\r\n\r\n const dealerSelect = form.querySelector('select[name=dealer-mail]');\r\n\r\n if (dealerSelect) {\r\n const dealer = dealerSelect.querySelector(`option[value=\"${dealerSelect.value}\"]`);\r\n\r\n if (dealer && dealer.innerText !== 0) {\r\n form.querySelector('input[name=dealer-name]').value = dealer.innerText;\r\n }\r\n }\r\n\r\n const XHR = new XMLHttpRequest();\r\n const formData = serialize(form);\r\n\r\n // Define what happens\r\n XHR.onreadystatechange = function () {\r\n if (this.readyState === this.DONE) {\r\n if (XHR.onreadystatechange) {\r\n XHR.onreadystatechange = null;\r\n const json = JSON.parse(this.responseText);\r\n\r\n if (json.status !== 'ok') {\r\n const errorText = form.getAttribute('data-error-message');\r\n alert(errorText);\r\n window.console.warn(json);\r\n\r\n form.classList.remove('form--working');\r\n } else {\r\n window.location = form.getAttribute('data-confirmation-url');\r\n }\r\n }\r\n }\r\n };\r\n // Set up our request\r\n XHR.open('POST', '/umbraco/api/mail/sendmultinestedcontent', true);\r\n // Add the required HTTP header for form data POST requests\r\n XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n // Finally, send our data.\r\n XHR.send(formData);\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < mandrillForms.length; i++) {\r\n mandrillForms[i].addEventListener('submit', mandrillFormSubmit);\r\n }\r\n}\r\n","import { onReady } from './utils/onReady';\r\nimport { setupNav } from './components/nav';\r\nimport { setupAccordions } from './components/accordion';\r\nimport { setupVideos } from './components/video';\r\nimport { setupAnchorLinkScroll, scrollToUrlHash } from './components/anchors';\r\nimport { setupFilters } from './components/filter';\r\nimport { setupOverlay } from './components/overlay';\r\nimport { setupSliders } from './components/slider';\r\nimport { setupGallery } from './components/gallery';\r\n/* import lazySizes from 'lazysizes';\r\nimport 'lazysizes/plugins/unveilhooks/ls.unveilhooks'; */\r\nimport { extendStickyHeader } from './components/stickyHeader';\r\nimport { setupSimpleSteps } from './components/simple-steps';\r\nimport { watchFormFields } from './components/form';\r\nimport { scrollAnimations } from './utils/animation';\r\n\r\nfunction init() {\r\n document.body.classList.remove('standby');\r\n lazySizes.cfg.loadMode = 3;\r\n lazySizes.cfg.preloadAfterLoad = false;\r\n lazySizes.autoSizer.checkElems();\r\n\r\n scrollToUrlHash();\r\n setupAnchorLinkScroll();\r\n\r\n setupNav('.nav');\r\n\r\n onReady(() => {\r\n\r\n extendStickyHeader();\r\n\r\n setupOverlay();\r\n\r\n setupVideos();\r\n\r\n setupFilters();\r\n\r\n setupSliders();\r\n\r\n setupGallery();\r\n\r\n setupSimpleSteps();\r\n\r\n watchFormFields();\r\n\r\n setupAccordions();\r\n\r\n scrollAnimations();\r\n });\r\n\r\n\r\n document.addEventListener('readystatechange', () => {\r\n extendStickyHeader();\r\n });\r\n}\r\n\r\ninit();\r\n"],"names":["functionReferences","readyState","document","readyEventBound","emptyCallbackArrays","length","tempArray","slice","forEach","funcRef","onReady","functionReference","addEventListener","push","getElementScroll","element","window","Element","Document","Window","left","pageXOffset","documentElement","scrollLeft","top","pageYOffset","scrollTop","scrollX","scrollY","console","warn","className","scrollLocked","enableScrollLock","scrollPosition","htmlTag","scrollTo","classList","add","style","marginTop","position","width","body","overflowY","disableScrollLock","remove","overflow","removeAttribute","ticking","scrollFunctions","animate","scrollHandler","requestAnimationFrame","onScroll","handler","triggerNow","currentBreakpoint","resizeTimer","nav","breakpoints","breakpointKeys","Object","keys","currentWindowWidth","innerWidth","resizeFunctions","getWindowSizes","lastFoundWidth","key","index","resizeHandler","clearTimeout","setTimeout","onWindowResize","toggleMenuOpen","contains","lazyElements","querySelectorAll","i","lazyElement","setupNav","selector","sticky","querySelector","lastScrollPosition","scrollInPixels","goingUpClass","header","headerHeight","offsetHeight","windowScroll","stickyNavOnScroll","gsap","registerPlugin","ScrollTrigger","activeAccordion","transitionEndEventName","detectStyleDeclatationName","eventTypeName","transitions","transition","OTransition","MozTransition","WebkitTransition","el","createElement","t","undefined","cssAnimateNewHeight","container","newHeight","classTarget","classOnBoth","prevHeight","delayedClose","blur","removeEventListener","height","Accordion","trigger","dom","parentNode","nextElementSibling","settings","type","getAttribute","e","preventDefault","_this","setAttribute","ariaExpanded","setupAccordions","accordionContent","accordions","location","hash","indexOf","getElementById","replace","click","addPrefetch","kind","url","as","linkElem","rel","href","crossorigin","head","append","formatNumber","num","seperator","toString","easeInOutQuintic","currentTime","start","change","duration","time","ts","tc","to","callback","offsetTop","amount","val","scrollingElement","loadImage","path","newImage","Image","Promise","resolve","decode","then","image","src","Video","videoLink","devicePixelRatio","elem","roundedWidth","roundedHeight","id","controls","this","bg","byline","scrollto","match","extractVideoIdFromUrl","isVimeo","poster","getBoundingClientRect","Math","ceil","round","getContext","toDataURL","newImageTag","altText","appendChild","warmConnections","addIframe","once","videoUrl","iframe","_this2","preconnected","setupAnchorLinkScroll","triggerSelector","triggers","hashLink","pathname","activeOverlay","activeOverlayContent","activeOverlayCloseBtn","classNames","activeBtn","hiddenItem","Filter","filters","targetContainer","filterType","filter","itemCountReplace","tagName","filterHandler","replaceWithNumberOfItems","target","filterItems","isButton","filterValue","value","transitionItems","name","siblingRadios","r","deselectRadio","bind","item","itemFilterValues","split","cleanFilterValue","trim","toLowerCase","map","filterValues","getSetValues","showItem","cleanValue","sections","s","section","replaceValue","options","children","items","option","count","optionStr","innerText","checked","valArray","len","openClass","outsideClickListener","currentTarget","offsetWidth","getClientRects","overlayClose","overlayOpen","lockScroll","targetId","showCookieBanner","declaration","hideCookieBanner","global","factory","EvEmitter","proto","prototype","on","eventName","listener","events","_events","listeners","onceEvents","_onceEvents","off","splice","emitEvent","args","onceListeners","apply","allOff","module","exports","getStyleSize","parseFloat","isNaN","logError","message","error","measurements","measurementsLength","getStyle","getComputedStyle","isBoxSizeOuter","isSetup","getSize","div","padding","borderStyle","borderWidth","boxSizing","removeChild","nodeType","display","size","innerHeight","outerWidth","outerHeight","getZeroSize","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","matchesMethod","ElemProto","matches","matchesSelector","prefixes","method","utils","extend","a","b","prop","modulo","arraySlice","Array","makeArray","obj","isArray","call","removeFrom","ary","getParent","getQueryElement","handleEvent","event","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","methodName","threshold","timeoutName","timeout","arguments","docReady","toDashed","str","$1","$2","htmlInit","WidgetClass","namespace","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","concat","dataOptionsAttr","jQuery","attr","JSON","parse","instance","data","require$$0","fizzyUIUtils","Cell","parent","create","x","shift","destroy","unselect","side","originSide","setPosition","updateTarget","renderPosition","setDefaultTarget","marginProperty","cellAlign","getPositionValue","select","wrapShift","slideableWidth","Flickity","Slide","isOriginLeft","cells","addCell","cell","beginMargin","max","firstMargin","endMargin","lastCell","getLastCell","lastMargin","slideWidth","getCellElements","startAnimation","isAnimating","restingFrames","applyDragForce","applySelectedAttraction","previousX","integratePhysics","positionSlider","settle","wrapAround","shiftWrapCells","setTranslateX","dispatchScrollEvent","is3d","cursorPosition","rightToLeft","translateX","slider","transform","positionX","progress","firstSlide","slides","slidesWidth","dispatchEvent","positionSliderAtSelected","selectedSlide","velocity","percentPosition","isPointerDown","isFreeScrolling","selectedIndex","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","gap","cellShift","_unshiftCells","getFrictionFactor","applyForce","force","getRestingPosition","dragForce","isDraggable","dragX","selectedAttraction","animatePrototype","_Flickity","moveElements","toElem","GUID","instances","queryElement","flickityGUID","$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","startCell","cellX","updateSlides","_containSlides","slide","nextMargin","canCellFit","_getCanCellFit","updateSelectedSlide","groupCells","number","parseInt","percentMatch","percent","_init","reposition","setCellAlign","cellAlignShorthands","center","right","shorthand","adaptiveHeight","gapX","cellIndex","_getGapCells","increment","isRightToLeft","contentWidth","isContentSmaller","beginBound","endBound","contain","min","$event","jQEvent","emitArgs","Event","isWrap","isInstant","prevIndex","_wrapSelect","wrapIndex","delta","abs","backWrapDelta","forewardWrapDelta","isDragSelect","previous","next","unselectSelectedSlide","selectedCells","selectedElements","selectedCell","selectedElement","initialIndex","queryCell","selectCell","getCellSlideIndex","getCell","getCells","getParentCell","getAdjacentCellElements","adjCount","cellElems","slideIndex","uiChange","childUIPointerDown","focus","onresize","content","deactivate","onkeydown","isNotFocused","activeElement","keyboardHandlers","keyCode","37","leftMethod","39","rightMethod","prevScrollY","preventScroll","removeData","bridget","setJQuery","jq","require$$1","require$$2","require$$3","require$$4","require$$5","Unipointer","bindStartEvent","_bindStartEvent","unbindStartEvent","isAdd","bindMethod","startEvent","PointerEvent","getTouch","touches","touch","identifier","pointerIdentifier","onmousedown","button","_pointerDown","ontouchstart","changedTouches","onpointerdown","pointer","pointerId","pointerDown","_bindPostStartEvents","postStartEvents","mousedown","touchstart","pointerdown","_boundPointerEvents","_unbindPostStartEvents","onmousemove","_pointerMove","onpointermove","ontouchmove","pointerMove","onmouseup","_pointerUp","onpointerup","ontouchend","_pointerDone","pointerUp","_pointerReset","pointerDone","onpointercancel","_pointerCancel","ontouchcancel","pointerCancel","getPointerPoint","pageX","y","pageY","Unidragger","bindHandles","_bindHandles","unbindHandles","touchAction","_touchActionValue","handles","handle","okayPointerDown","pointerDownPointer","pointerDownBlur","cursorNodes","TEXTAREA","INPUT","SELECT","OPTION","clickTypes","radio","checkbox","submit","file","isCursorNode","nodeName","isClickType","isOkay","focused","moveVector","_dragPointerMove","_dragMove","isDragging","hasDragStarted","_dragStart","_dragPointerUp","_dragEnd","_staticClick","isPreventingClicks","dragStart","dragMove","dragEnd","onclick","isIgnoringMouseUp","staticClick","draggable","dragThreshold","isTouch","isTouchmoveScrollCanceled","_createDrag","onActivateDrag","_uiChangeDrag","onDeactivateDrag","updateDraggable","bindDrag","unbindDrag","_pointerDownPreventDefault","pointerDownFocus","pointerDownScroll","getScrollPosition","_pointerDownDefault","focusNodes","isTouchStart","isTouchPointer","pointerType","isFocusNode","isTouchScrolling","dragStartPosition","direction","originBound","previousDragX","dragMoveTime","Date","restingX","freeScroll","dragEndRestingSelect","dragEndBoostSelect","distance","getSlideDistance","positiveResting","_getClosestResting","negativeResting","minDistance","Infinity","condition","d","md","isWrapAround","wrap","floor","clickedCell","onscroll","scroll","scrollMoveX","scrollMoveY","svgURI","PrevNextButton","isEnabled","isPrevious","leftDirection","isLeft","disable","svg","createSVG","update","createElementNS","shape","pathMovements","arrowShape","x0","x1","y1","x2","y2","x3","enable","disabled","lastIndex","boundIndex","prevNextButtons","_createPrevNextButtons","prevButton","nextButton","activatePrevNextButtons","deactivatePrevNextButtons","PageDots","holder","dots","handleClick","onClick","setDots","addDots","removeDots","fragment","createDocumentFragment","newDots","dot","updateSelected","selectedDot","onTap","pageDots","_createPageDots","activatePageDots","updateSelectedPageDots","updatePageDots","deactivatePageDots","Player","state","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","play","hidden","tick","autoPlay","clear","stop","pause","unpause","pauseAutoPlayOnHover","_createPlayer","player","activatePlayer","stopPlayer","deactivatePlayer","playPlayer","pausePlayer","unpausePlayer","onmouseenter","onmouseleave","insert","isAppend","insertCellElement","endCells","insertBefore","cellChange","prepend","minCellIndex","cellSizeChange","changedCellIndex","isPositioningSlider","prevSelectedElem","LazyLoader","img","flickity","load","_createLazyload","lazyLoad","lazyImages","lazyCellImages","lazyloadAttr","srcAttr","srcsetAttr","imgs","getCellLazyImages","srcset","onload","complete","onerror","Slider","mobileMode","flkty","bindEvents","scope","navButtons","cellsButtonGroup","from","previousSelectedButton","selectedButton","Gallery","flktyGallery","previousButton","cellsButtons","extendStickyHeader","stickyHeader","stickyHeaderContent","SimpleSteps","simpleStepModal","stepsIds","simpleStepModalId","wait","p","stepId","currentStep","scrollId","deltaY","log","VERSION","isValidFormatter","entry","removeElement","parentElement","isSet","unique","array","closest","offset","orientation","rect","doc","ownerDocument","docElem","pageOffset","getPageOffset","test","navigator","userAgent","clientTop","clientLeft","isNumeric","isFinite","addClassFor","addClass","removeClass","limit","asArray","countDecimals","numStr","String","pieces","RegExp","join","hasClass","supportPageOffset","isCSS1Compat","compatMode","getActions","pointerEnabled","move","end","msPointerEnabled","getSupportsPassive","supportsPassive","defineProperty","get","getSupportsTouchActionNone","CSS","supports","subRangeRatio","pa","pb","fromPercentage","range","startRange","toPercentage","isPercentage","getJ","arr","j","toStepping","xVal","xPct","va","vb","fromStepping","getStep","xSteps","snap","handleEntryPoint","that","percentage","Error","xHighestCompleteStep","handleStepPoint","n","totalSteps","xNumSteps","highestStep","Number","toFixed","step","Spectrum","singleStep","ordered","hasOwnProperty","sort","getDistance","distances","getAbsoluteDistance","xPct_index","start_factor","rest_factor","rest_rel_distance","range_pct","rel_range_distance","abs_distance_counter","range_counter","getDefaultStep","isDown","getNearbySteps","stepBefore","startValue","thisStep","stepAfter","countStepDecimals","stepDecimals","convert","defaultFormatter","cssClasses","base","origin","handleLower","handleUpper","touchArea","horizontal","vertical","background","connect","connects","ltr","rtl","textDirectionLtr","textDirectionRtl","drag","tap","active","tooltip","pips","pipsHorizontal","pipsVertical","marker","markerHorizontal","markerVertical","markerNormal","markerLarge","markerSub","valueHorizontal","valueVertical","valueNormal","valueLarge","valueSub","validateFormat","testStep","parsed","testRange","spectrum","testStart","testSnap","testAnimate","testAnimationDuration","animationDuration","testConnect","testOrientation","ort","testMargin","margin","testLimit","testPadding","totalPadding","firstValue","lastValue","testDirection","dir","testBehaviour","fixed","hover","unconstrained","testTooltips","tooltips","formatter","testAriaFormat","ariaFormat","testFormat","format","testKeyboardSupport","keyboardSupport","testDocumentElement","testCssPrefix","cssPrefix","testCssClasses","testOptions","tests","behaviour","msPrefix","msTransform","noPrefix","transformRule","styles","originalOptions","actions","supportsTouchActionNone","scope_Target","scope_Base","scope_Handles","scope_Connects","scope_Pips","scope_Tooltips","scope_Spectrum","scope_Values","scope_Locations","scope_HandleNumbers","scope_ActiveHandlesCount","scope_Events","scope_Self","scope_Document","scope_DocumentElement","scope_Body","PIPS_NONE","PIPS_NO_VALUE","PIPS_LARGE_VALUE","PIPS_SMALL_VALUE","scope_DirOffset","addNodeTo","addTarget","addOrigin","handleNumber","eventKeydown","addConnect","addElements","connectOptions","connectBase","addSlider","textDirection","addTooltip","firstChild","isSliderDisabled","hasAttribute","isHandleDisabled","handleOrigin","removeTooltips","removeEvent","bindEvent","values","unencoded","formattedValue","innerHTML","aria","positions","checkHandlePosition","now","text","getGroup","mode","stepped","interval","spread","generateSpread","density","group","safeIncrement","indexes","firstInRange","lastInRange","ignoreFirst","ignoreLast","prevPct","unshift","current","q","low","high","newPct","pctDifference","pctPos","steps","realSteps","stepSize","isSteps","addMarking","filterFunc","valueSizeClasses","markerSizeClasses","valueOrientationClasses","markerOrientationClasses","getClasses","source","orientationClasses","sizeClasses","addSpread","node","removePips","grid","baseSize","alt","attachEvent","fixEvent","doNotReject","buttons","calcPoint","points","methods","passive","eventTarget","mouse","isTouchOnTarget","checkTouch","shadowRoot","targetTouches","targetTouch","find","clientX","clientY","cursor","calcPointToPercentage","proposal","getClosestHandle","clickedPosition","smallestDifference","handlePosition","differenceWithThisHandle","clickAtEdge","isCloser","isCloserAfter","documentLeave","relatedTarget","eventEnd","eventMove","appVersion","buttonsProperty","movement","startCalcPoint","moveHandles","locations","handleNumbers","c","setZindex","fireEvent","eventStart","some","stopPropagation","moveEvent","endEvent","outEvent","eventTap","setHandle","eventHover","targetEvent","horizontalKeys","verticalKeys","largeStepKeys","edgeKeys","reverse","isLargeDown","isLargeUp","isUp","isMin","isMax","multiplier","getNextStepsForHandle","bindSliderEvents","handleBefore","handleAfter","eventHolders","eventHolder","namespacedEvent","substring","tEvent","tNamespace","eventType","reference","lookBackward","lookForward","getValue","inRuleOrder","v","o","upward","proposals","f","transformDirection","updateHandlePosition","translation","translateRule","updateConnect","zIndex","l","h","connectWidth","scaleRule","resolveToValue","valueSet","input","fireSetEvent","isInit","valueReset","valueSetHandle","valueGet","noUiSlider","nearbySteps","decrement","getNextSteps","updateOptions","optionsToUpdate","updateAble","newOptions","setupSlider","set","reset","__moveHandles","getTooltips","getOrigins","initialize","api","__spectrum","version","invalidClass","checkValidation","valid","field","checkFieldValue","watchFormFields","form","inputs","forms","fields","rangeSlider","minDefault","maxDeafult","strippedValue","setupRangeSlider","label","labelVal","fileName","files","pop","lazySizes","cfg","loadMode","preloadAfterLoad","autoSizer","checkElems","overlayButtonOpen","setupOverlay","videos","setupVideos","filterContainers","setupFilters","sliders","setupSliders","galleries","setupGallery","simpleStepsSections","setupSimpleSteps","headerImg","headerElem","objectPosition","scale","ease","scrollTrigger","scrub","categoryImages","skipFirstCat","categoryOverview","stagger","videoContents","videoContent","video","fullCtas","fs","fullCtaTimeline","fullCtaElem","fullImg","timeline","paused","opacity","curtain","newsEntrence","textImages","ti","isReversed","tl","textImage","xPercent","refresh","scrollAnimations"],"mappings":"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"}