{"version":3,"file":"289.b41f22c5a6d9edf38418.js","mappings":"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","sources":["webpack://iflyworld.web/./wwwroot/app/src/js/header-search.js","webpack://iflyworld.web/./wwwroot/app/src/js/keyboard-accessibility-check.js","webpack://iflyworld.web/./wwwroot/app/src/js/main-navigation.js","webpack://iflyworld.web/./node_modules/tornis/src/tornis.js","webpack://iflyworld.web/./wwwroot/app/src/js/scrolling.js"],"sourcesContent":["// ***************************\r\n// ***** Header search *****\r\n// ***************************\r\n\r\nexport const headerSearch = {\r\n active: false\r\n};\r\n\r\nclass HeaderSearchSystem {\r\n\r\n constructor(showBtn, wrapper, closeBtn, searchField) {\r\n this.showBtn = showBtn;\r\n this.wrapper = wrapper;\r\n this.closeBtn = closeBtn;\r\n this.searchField = searchField;\r\n this.active = false;\r\n // remove 'hidden' attribute\r\n this.wrapper.removeAttribute('hidden');\r\n // triggers\r\n this.showBtn.onclick = () => {\r\n if(!this.active) this.show();\r\n };\r\n this.closeBtn.onclick = () => {\r\n if(this.active) this.hide();\r\n };\r\n // ESC key closes search\r\n this.wrapper.addEventListener('keydown', (e) => {\r\n switch (e.key) {\r\n // ESCAPE jumps out a level\r\n case 'Escape':\r\n if(this.active) {\r\n e.preventDefault();\r\n this.hide(true);\r\n }\r\n break;\r\n }\r\n });\r\n // loop the tabbing if search area is active\r\n this.closeBtn.addEventListener('keydown', (e) => {\r\n switch (e.key) {\r\n // TAB\r\n case 'Tab':\r\n if(this.active) {\r\n e.preventDefault();\r\n this.searchField.focus();\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n\r\n show() {\r\n this.wrapper.ontransitionend = null;\r\n this.wrapper.setAttribute('aria-hidden', false);\r\n this.showBtn.setAttribute('aria-expanded', true);\r\n this.active = true;\r\n headerSearch.active = true;\r\n window.requestAnimationFrame(() => {\r\n this.wrapper.classList.add('search-form--active');\r\n this.searchField.focus();\r\n });\r\n }\r\n\r\n hide(doFocus = false) {\r\n this.showBtn.setAttribute('aria-expanded', false);\r\n this.active = false;\r\n headerSearch.active = false;\r\n this.wrapper.classList.remove('search-form--active');\r\n this.wrapper.ontransitionend = (e) => {\r\n if(e.target == this.wrapper) this.transitionEnd(doFocus);\r\n };\r\n }\r\n\r\n transitionEnd(doFocus = false) {\r\n this.wrapper.setAttribute('aria-hidden', true);\r\n this.wrapper.ontransitionend = null;\r\n if(doFocus) this.showBtn.focus();\r\n }\r\n}\r\n\r\nconst headerSearchShownBtn = document.querySelector('#header--search-show-btn'),\r\n headerSearchWrapper = document.querySelector('#header--search-wrapper'),\r\n headerSearchCloseBtn = document.querySelector('#header--search-close-btn'),\r\n headerSearchField = headerSearchWrapper !== null ? headerSearchWrapper.querySelector('input[type=\"search\"]') : null;\r\n\r\nif(headerSearchShownBtn != null && headerSearchWrapper != null && headerSearchCloseBtn != null && headerSearchField != null) {\r\n new HeaderSearchSystem(headerSearchShownBtn, headerSearchWrapper, headerSearchCloseBtn, headerSearchField);\r\n}","// keyboard control detection\r\n\r\nexport const keyboardControl = {\r\n active: false\r\n}\r\n\r\nlet accessibilityTimeout = null;\r\nconst toggleAccessibilityClass = (mode) => {\r\n clearTimeout(accessibilityTimeout);\r\n accessibilityTimeout = setTimeout(() => {\r\n document.body.classList.toggle('keyboard-control', mode);\r\n keyboardControl.active = mode;\r\n }, 100);\r\n}\r\ndocument.body.addEventListener('keydown', function(e) {\r\n switch (e.key) {\r\n case 'Escape':\r\n case 'Up':\r\n case 'ArrowUp':\r\n case 'Down':\r\n case 'ArrowDown':\r\n case 'Left':\r\n case 'ArrowLeft':\r\n case 'Tab':\r\n case 'Right':\r\n case 'ArrowRight':\r\n case 'PageUp':\r\n case 'PageDown':\r\n case 'Spacebar':\r\n case ' ':\r\n case 'Enter':\r\n case 'Return':\r\n toggleAccessibilityClass(true);\r\n break;\r\n }\r\n});\r\ndocument.body.addEventListener('mousedown', function() {\r\n toggleAccessibilityClass(false);\r\n});\r\ndocument.body.addEventListener('touchstart', function() {\r\n toggleAccessibilityClass(false);\r\n});","// *****************************\r\n// ***** Main Navigation *****\r\n// *****************************\r\nimport { breakPoint } from './config';\r\nimport { keyboardControl } from './keyboard-accessibility-check';\r\n\r\nconst $html = document.querySelector('html');\r\nlet isMobile = true,\r\n resizeRequested = false;\r\n\r\nexport const mobileNavigation = {\r\n active: false\r\n}\r\nexport const desktopNavigation = {\r\n active: false\r\n}\r\n\r\nclass menu {\r\n\r\n constructor(wrapper, toggleButton, ul) {\r\n this.wrapper = wrapper;\r\n this.desktopSubmenuIndicator = wrapper.querySelector('.submenu--menu-indicator');\r\n this.navContent = wrapper.querySelector('nav');\r\n this.mobileToggle = toggleButton;\r\n this.ul = ul;\r\n this.expanded = false;\r\n this.hideTimeout = null;\r\n this.hideDelay = 500;\r\n this.activeItemIndex = -1;\r\n this.activeSubmenuItemIndex = -1;\r\n this.items = [];\r\n [...this.ul.querySelectorAll('.header--menu > nav > ul > li')].forEach(i => {\r\n let x = this.items.length;\r\n this.items[x] = new menuItem(x, i, 1);\r\n });\r\n }\r\n\r\n show() {\r\n // make menu semantically visible in both mobile and desktop versions\r\n this.expanded = true;\r\n this.wrapper.setAttribute('aria-hidden', false);\r\n if(isMobile) {\r\n // mobile - animate in the menu element\r\n this.mobileToggle.setAttribute('aria-expanded', true);\r\n $html.classList.add('mobile-menu-fading');\r\n mobileNavigation.active = true;\r\n window.requestAnimationFrame(() => {\r\n $html.classList.add('mobile-menu-active');\r\n this.wrapper.ontransitionend = () => {\r\n this.transitionEnd(true);\r\n this.update(true, 0, -1);\r\n };\r\n });\r\n } else {\r\n // desktop resets\r\n mobileNavigation.active = false;\r\n window.requestAnimationFrame(() => {\r\n $html.classList.remove('mobile-menu-active');\r\n });\r\n }\r\n }\r\n\r\n hide() {\r\n if(isMobile && mobileNavigation.active) {\r\n // mobile - animate out menu element\r\n this.expanded = false;\r\n mobileNavigation.active = false;\r\n this.mobileToggle.setAttribute('aria-expanded', false);\r\n $html.classList.add('mobile-menu-fading');\r\n $html.classList.remove('mobile-menu-active');\r\n this.wrapper.ontransitionend = () => {\r\n this.transitionEnd(false);\r\n };\r\n } else {\r\n // hide menu semantically in both mobile and desktop versions\r\n this.expanded = false;\r\n this.wrapper.setAttribute('aria-hidden', true);\r\n }\r\n }\r\n\r\n transitionEnd(mode) {\r\n if(!mode) {\r\n // menu has hidden\r\n this.wrapper.setAttribute('aria-hidden', true);\r\n }\r\n $html.classList.remove('mobile-menu-fading');\r\n this.wrapper.ontransitionend = null;\r\n }\r\n\r\n storeTriggerPositions() {\r\n for(let x = 0, l = this.items.length; x < l; x++) {\r\n if(this.items[x].button != null) {\r\n let b = this.items[x].button.getBoundingClientRect();\r\n this.items[x].buttonX = Math.floor((b.left + b.right) / 2);\r\n }\r\n }\r\n if(this.desktopSubmenuIndicator != null && this.activeItemIndex > -1) this.desktopSubmenuIndicator.style.left = `${this.items[this.activeItemIndex].buttonX - 16}px`;\r\n }\r\n\r\n update(setFocus = false, itemIndex = -1, submenuItemIndex = -1) {\r\n if(!isMobile) this.storeTriggerPositions();\r\n if (itemIndex > -1 && submenuItemIndex > -1) {\r\n\r\n // FOCUS TARGET IS SUBMENU MENU ITEM\r\n\r\n if (isMobile && !this.expanded) this.show();\r\n // close old submenu without animation?\r\n if (this.activeItemIndex > -1 && this.activeSubmenuItemIndex > -1 && itemIndex != this.activeItemIndex && this.items[this.activeItemIndex].submenu.expanded) this.items[this.activeItemIndex].submenu.hide(false);\r\n // desktop - update submenu indicator\r\n if(this.desktopSubmenuIndicator != null) this.desktopSubmenuIndicator.style.left = `${this.items[itemIndex].buttonX - 15}px`;\r\n // open new submenu\r\n if (!this.items[itemIndex].submenu.expanded) this.items[itemIndex].submenu.show(this.activeSubmenuItemIndex == -1);\r\n // focus on item\r\n if (keyboardControl.active && setFocus) this.items[itemIndex].submenu.items[submenuItemIndex].focus();\r\n\r\n } else if (itemIndex > -1) {\r\n\r\n // FOCUS TARGET IS TOP-LEVEL MENU ITEM\r\n\r\n if (isMobile && !this.expanded) this.show();\r\n // close old submenu with animation?\r\n if (this.activeItemIndex > -1 && this.items[this.activeItemIndex].hasSubmenu) {\r\n if (this.items[this.activeItemIndex].submenu.expanded) this.items[this.activeItemIndex].submenu.hide(true);\r\n }\r\n // focus on item\r\n if (keyboardControl.active && setFocus) {\r\n if (this.items[itemIndex].hasSubmenu) {\r\n this.items[itemIndex].submenu.toggle.focus();\r\n } else {\r\n this.items[itemIndex].link.focus();\r\n }\r\n }\r\n\r\n } else {\r\n if (this.activeItemIndex > -1 && this.activeSubmenuItemIndex > -1 && this.items[this.activeItemIndex].submenu.expanded) this.items[this.activeItemIndex].submenu.hide(!isMobile);\r\n if (isMobile && this.expanded) {\r\n this.hide();\r\n if (keyboardControl.active && setFocus) this.mobileToggle.focus();\r\n }\r\n }\r\n // update tabIndex setting\r\n if (this.activeItemIndex != itemIndex) {\r\n if (this.activeItemIndex > -1) {\r\n if (this.items[this.activeItemIndex].hasSubmenu) {\r\n this.items[this.activeItemIndex].submenu.toggle.setAttribute('tabindex', '-1');\r\n } else {\r\n this.items[this.activeItemIndex].link.setAttribute('tabindex', '-1');\r\n }\r\n }\r\n let nextTabIndex = itemIndex;\r\n if (!isMobile && nextTabIndex == -1) nextTabIndex = 0;\r\n if (nextTabIndex > -1) {\r\n if (this.items[nextTabIndex].hasSubmenu) {\r\n this.items[nextTabIndex].submenu.toggle.setAttribute('tabindex', '0');\r\n } else {\r\n this.items[nextTabIndex].link.setAttribute('tabindex', '0');\r\n }\r\n }\r\n }\r\n // store new values\r\n this.activeItemIndex = itemIndex;\r\n this.activeSubmenuItemIndex = submenuItemIndex;\r\n }\r\n}\r\n\r\nclass menuItem {\r\n constructor(itemIndex, obj, level) {\r\n this.level = level;\r\n this.index = itemIndex;\r\n this.li = obj;\r\n this.button = obj.querySelector('button.submenu--toggle');\r\n this.buttonX = 0;\r\n let sub = obj.querySelector('div.submenu');\r\n if (this.button && sub) {\r\n this.hasSubmenu = true;\r\n this.submenu = new subMenu(sub, this.button, level);\r\n } else {\r\n this.hasSubmenu = false;\r\n this.link = obj.querySelector('a');\r\n }\r\n }\r\n}\r\n\r\nclass subMenu {\r\n constructor(sub, button, level) {\r\n this.expanded = false;\r\n this.toggle = button;\r\n this.wrapper = sub;\r\n this.level = level;\r\n this.closeBtn = this.wrapper.querySelector('.submenu--close');\r\n this.inner = this.wrapper.querySelector('.submenu--content-area');\r\n this.items = [];\r\n [...this.inner.querySelectorAll('a, button')].forEach(i => {\r\n this.items.push(i);\r\n });\r\n }\r\n show(animate) {\r\n this.expanded = true;\r\n this.wrapper.setAttribute('aria-hidden', false);\r\n this.toggle.setAttribute('aria-expanded', true);\r\n if(isMobile) {\r\n this.wrapper.style.maxHeight = this.inner.offsetHeight + 'px';\r\n if (animate) {\r\n this.wrapper.classList.add('animate');\r\n this.wrapper.ontransitionend = () => {\r\n this.wrapper.classList.remove('animate');\r\n if (this.level > 1 || isMobile) {\r\n this.wrapper.style.maxHeight = 'none';\r\n this.wrapper.ontransitionend = null;\r\n }\r\n };\r\n } else {\r\n this.wrapper.style.maxHeight = 'none';\r\n }\r\n } else {\r\n this.wrapper.style.maxHeight = 'none';\r\n desktopNavigation.active = true;\r\n if (animate) {\r\n window.requestAnimationFrame(() => {\r\n $html.classList.add('desktop-menu-fading');\r\n window.requestAnimationFrame(() => {\r\n $html.classList.add('desktop-menu-active');\r\n this.wrapper.ontransitionend = () => {\r\n $html.classList.remove('desktop-menu-fading');\r\n this.wrapper.ontransitionend = null;\r\n };\r\n });\r\n });\r\n } else {\r\n $html.classList.add('desktop-menu-active');\r\n }\r\n }\r\n }\r\n hide(animate) {\r\n this.expanded = false;\r\n if (isMobile) {\r\n this.wrapper.setAttribute('aria-hidden', true);\r\n this.toggle.setAttribute('aria-expanded', false);\r\n this.wrapper.style.maxHeight = this.inner.offsetHeight + 'px';\r\n window.requestAnimationFrame(() => {\r\n this.wrapper.style.maxHeight = 0;\r\n });\r\n if (animate) {\r\n this.wrapper.classList.add('animate');\r\n this.wrapper.ontransitionend = (e) => {\r\n if(e.target == this.wrapper) this.wrapper.classList.remove('animate');\r\n };\r\n }\r\n } else {\r\n desktopNavigation.active = false;\r\n if (animate) {\r\n $html.classList.add('desktop-menu-fading');\r\n $html.classList.remove('desktop-menu-active');\r\n this.wrapper.ontransitionend = () => {\r\n this.wrapper.ontransitionend = null;\r\n $html.classList.remove('desktop-menu-fading');\r\n this.wrapper.setAttribute('aria-hidden', true);\r\n this.toggle.setAttribute('aria-expanded', false);\r\n };\r\n } else {\r\n $html.classList.remove('desktop-menu-active');\r\n this.wrapper.setAttribute('aria-hidden', true);\r\n this.toggle.setAttribute('aria-expanded', false);\r\n }\r\n }\r\n }\r\n}\r\n\r\n// create instance of menu\r\n\r\nif(document.querySelector('.header--menu') != null) {\r\n const m = new menu(document.querySelector('.header--menu'), document.querySelector('.header--mobile-menu-toggle button'), document.querySelector('.header--menu > nav > ul'));\r\n\r\n\r\n // mobile 'whole menu toggle' functionality\r\n\r\n m.mobileToggle.addEventListener('click', () => {\r\n if (isMobile) {\r\n if (m.expanded) {\r\n // close\r\n m.hide();\r\n } else {\r\n // open\r\n m.show();\r\n }\r\n }\r\n });\r\n\r\n // close menu if user focus moves outside\r\n\r\n const bodyClickTouch = (t) => {\r\n if (!isMobile && m.activeSubmenuItemIndex > -1) {\r\n let inMenu = false;\r\n while (t != document.body) {\r\n if (t == m.wrapper) {\r\n inMenu = true;\r\n break\r\n }\r\n t = t.parentNode;\r\n }\r\n if (!inMenu) {\r\n m.update();\r\n }\r\n }\r\n }\r\n document.body.addEventListener('click', (e) => {\r\n bodyClickTouch(e.target);\r\n });\r\n\r\n // add menu item listeners\r\n\r\n for (let x = 0, l = m.items.length; x < l; x++) {\r\n let o = m.items[x];\r\n if (o.hasSubmenu) {\r\n\r\n o.submenu.toggle.addEventListener('click', () => {\r\n if (o.submenu.expanded) {\r\n m.update(true, o.index);\r\n } else {\r\n m.update(true, o.index, 0);\r\n }\r\n });\r\n\r\n o.submenu.toggle.addEventListener('focus', () => {\r\n if (m.expanded && m.activeItemIndex != o.index) {\r\n m.update(true, o.index);\r\n }\r\n });\r\n\r\n // add submenu expander listeners if required\r\n\r\n for (let xx = 0, ll = o.submenu.items.length; xx < ll; xx++) {\r\n let oo = o.submenu.items[xx];\r\n if (oo.hasSubmenu) {\r\n oo.submenu.toggle.addEventListener('click', () => {\r\n m.update(true, o.index, oo.index);\r\n });\r\n }\r\n }\r\n\r\n // desktop only - submenu close button\r\n\r\n o.submenu.closeBtn.addEventListener('click', () => {\r\n if (o.submenu.expanded) m.update(true, o.index);\r\n });\r\n }\r\n }\r\n\r\n // add keyboard accessibility\r\n m.ul.addEventListener('keydown', (e) => {\r\n switch (e.key) {\r\n // ESCAPE jumps out a level\r\n case 'Escape':\r\n e.preventDefault();\r\n if (m.activeSubmenuItemIndex > -1) {\r\n m.update(true, m.activeItemIndex);\r\n } else {\r\n m.update(true);\r\n }\r\n break;\r\n // DOWN / RIGHT to move through items at current level\r\n case 'Down':\r\n case 'ArrowDown':\r\n case 'Right':\r\n case 'ArrowRight':\r\n e.preventDefault();\r\n if (m.activeSubmenuItemIndex > -1) {\r\n let next = m.activeSubmenuItemIndex + 1,\r\n list = m.items[m.activeItemIndex].submenu.items;\r\n if (next >= (isMobile ? list.length - 1 : list.length)) next = 0; // don't include submenu close button in mobile mode\r\n m.update(true, m.activeItemIndex, next);\r\n } else {\r\n let next = m.activeItemIndex + 1,\r\n list = m.items;\r\n if (next >= list.length) next = 0;\r\n m.update(true, next);\r\n }\r\n break;\r\n // UP / LEFT to move backwards through items at current level\r\n case 'Up':\r\n case 'ArrowUp':\r\n case 'Left':\r\n case 'ArrowLeft':\r\n e.preventDefault();\r\n if (m.activeSubmenuItemIndex > -1) {\r\n let next = m.activeSubmenuItemIndex - 1,\r\n list = m.items[m.activeItemIndex].submenu.items;\r\n if (next < 0) next = isMobile ? list.length - 2 : list.length - 1; // don't include submenu close button in mobile mode\r\n m.update(true, m.activeItemIndex, next);\r\n } else {\r\n let next = m.activeItemIndex - 1,\r\n list = m.items;\r\n if (next < 0) next = list.length - 1;\r\n m.update(true, next);\r\n }\r\n break;\r\n // TAB close menu (if open) and move to next tab element\r\n case 'Tab':\r\n if(isMobile) {\r\n if (!m.hasSearch && m.activeItemIndex > -1) {\r\n m.hide();\r\n }\r\n } else {\r\n m.update();\r\n }\r\n break;\r\n // SPACE/ENTER/RETURN to click a item\r\n case 'Spacebar':\r\n case ' ':\r\n case 'Enter':\r\n case 'Return':\r\n e.preventDefault();\r\n if (m.activeSubmenuItemIndex > -1) {\r\n m.items[m.activeItemIndex].submenu.items[m.activeSubmenuItemIndex].click();\r\n } else {\r\n if (m.items[m.activeItemIndex].hasSubmenu) {\r\n m.items[m.activeItemIndex].submenu.toggle.click();\r\n } else {\r\n m.items[m.activeItemIndex].link.click();\r\n }\r\n }\r\n break;\r\n }\r\n });\r\n\r\n // define and trigger resize check\r\n\r\n const resize = () => {\r\n let prev = isMobile;\r\n isMobile = window.innerWidth < breakPoint.LG;\r\n if(!isMobile) m.storeTriggerPositions();\r\n if(isMobile !== prev) {\r\n if(!isMobile) m.show();\r\n m.update();\r\n mobileNavigation.active = false;\r\n desktopNavigation.active = false;\r\n $html.classList.remove('mobile-menu-active');\r\n $html.classList.remove('desktop-menu-active');\r\n }\r\n };\r\n\r\n resize();\r\n window.addEventListener('resize', () => {\r\n if(!resizeRequested) {\r\n resizeRequested = true;\r\n setTimeout(() => {\r\n resize();\r\n resizeRequested = false;\r\n }, 200);\r\n }\r\n });\r\n\r\n}\r\n","// Check if the module is initialised during server-side rendering\nconst isSSR = typeof window === 'undefined';\n\n/**\n * Simple throttling helper that limits a \n * function to only run once every {delay}ms\n * @param {Number} delay The delay in ms\n * @param {Function} fn the function to throttle\n */\nfunction throttled(delay, fn) {\n let lastCall = 0;\n return function(...args) {\n const now = new Date().getTime();\n if (now - lastCall < delay) {\n return;\n }\n lastCall = now;\n return fn(...args);\n };\n}\n\n/**\n * Calculates the mean value in an array\n * @param {Array} arr The array to average\n */\nfunction getMean(arr) {\n return Math.floor(arr.reduce((acc, curr) => {\n return acc + curr;\n }, 0) / arr.length);\n}\n\n/**\n * Main Tornis singleton class\n */\nclass Tornis {\n // set a whole load of initial values\n constructor() {\n\n // Exit out if this is running server-side\n if (isSSR) return;\n\n this.lastX = 0;\n this.lastY = 0;\n this.lastWidth = window.innerWidth;\n this.lastHeight = window.innerHeight;\n this.lastMouseX = 0;\n this.lastMouseY = 0;\n this.lastWindowX = window.screenX;\n this.lastWindowY = window.screenY;\n\n // device orientation\n this.lastAlpha = 0;\n this.lastBeta = 0;\n this.lastGamma = 0;\n this.currAlpha = 0;\n this.currBeta = 0;\n this.currGamma = 0;\n\n this.scrollHeight = document.body.scrollHeight;\n\n this.scrollChange = false;\n this.sizeChange = false;\n this.mouseChange = false;\n this.positionChange = false;\n this.orientationChange = false;\n this.devicePixelRatioChange = false;\n\n this.currX = 0;\n this.currY = 0;\n this.currWidth = window.innerWidth;\n this.currHeight = window.innerHeight;\n this.currMouseX = 0;\n this.currMouseY = 0;\n this.currWindowX = 0;\n \n // device pixel ratio (where able)\n this.currDevicePixelRatio = this.lastDevicePixelRatio = Math.max( window.devicePixelRatio || 1.0, 1.0 );\n \n // initialise array buffers for mouse velocity\n this.mouseXVelocity = [];\n this.mouseYVelocity = [];\n this.lastMouseXVelocity = 0;\n this.lastMouseYVelocity = 0;\n\n // initialise array buffers for window velocity\n this.windowXVelocity = [];\n this.windowYVelocity = [];\n this.lastWindowXVelocity = 0;\n this.lastWindowYVelocity = 0;\n\n\n // flag to limit rAF renders\n this.updating = false;\n\n // initialise the watched function queue\n this.callbacks = [];\n\n // bind this to ease class methods\n this.update = this.update.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleMouse = this.handleMouse.bind(this);\n this.handleOrientation = this.handleOrientation.bind(this);\n this.recalibrateOrientation = this.recalibrateOrientation.bind(this);\n this.formatData = this.formatData.bind(this);\n this.watch = this.watch.bind(this);\n this.unwatch = this.unwatch.bind(this);\n\n // throttled event handlers\n this.handleResize = throttled(110, this.handleResize); // resize is brutal, so throttle it more\n this.handleMouse = throttled(75, this.handleMouse);\n\n // bind event handlers to the window\n window.addEventListener('resize', this.handleResize);\n window.addEventListener('mousemove', this.handleMouse);\n window.addEventListener('deviceorientation', this.handleOrientation);\n\n // begin the update loop\n requestAnimationFrame(this.update);\n }\n\n /**\n * Event handler to capture screen size\n */\n handleResize(e) {\n this.currWidth = window.innerWidth;\n this.currHeight = window.innerHeight;\n }\n\n /**\n * Event handler to capture mouse position\n */\n handleMouse(e) {\n this.currMouseX = e.clientX;\n this.currMouseY = e.clientY;\n }\n\n /**\n * Event handler to capture device orientation\n */\n handleOrientation(e) {\n // cache initial position for calibration\n if (!this.initialAlpha) { this.initialAlpha = e.alpha; }\n if (!this.initialBeta) { this.initialBeta = e.beta; }\n if (!this.initialGamma) { this.initialGamma = e.gamma; }\n \n this.currAlpha = e.alpha;\n this.currBeta = e.beta;\n this.currGamma = e.gamma;\n }\n\n /** \n * Allow initial orientation to be reset to the last recorded values\n */\n recalibrateOrientation() {\n // cache the old values\n const calibration = {\n prev: {\n alpha: this.initialAlpha,\n beta: this.initialBeta,\n gamma: this.initialGamma,\n }\n };\n\n // reset the values to the last recorded position\n this.initialAlpha = this.lastAlpha;\n this.initialBeta = this.lastBeta;\n this.initialGamma = this.lastGamma;\n \n // add the new values to the cached calibration data\n calibration.current = {\n alpha: this.initialAlpha,\n beta: this.initialBeta,\n gamma: this.initialGamma,\n };\n\n return calibration;\n }\n\n /**\n * Returns a copy of the store data, formatted for public use\n */\n formatData() {\n return {\n scroll: {\n changed: this.scrollChange,\n left: Math.floor(this.lastX),\n right: Math.floor(this.lastX + this.lastWidth),\n top: Math.floor(this.lastY),\n bottom: Math.floor(this.lastY + this.lastHeight),\n velocity: {\n x: Math.floor(this.scrollXVelocity) || 0,\n y: Math.floor(this.scrollYVelocity) || 0\n }\n },\n size: {\n changed: this.sizeChange,\n x: Math.floor(this.lastWidth),\n y: Math.floor(this.lastHeight),\n docY: Math.floor(this.scrollHeight)\n },\n mouse: {\n changed: this.mouseChange,\n x: Math.floor(this.lastMouseX),\n y: Math.floor(this.lastMouseY),\n velocity: {\n x: Math.floor(this.lastMouseXVelocity) || 0,\n y: Math.floor(this.lastMouseYVelocity) || 0\n }\n },\n position: {\n changed: this.positionChange,\n left: Math.floor(this.lastWindowX),\n right: Math.floor(this.lastWindowX + this.lastWidth),\n top: Math.floor(this.lastWindowY),\n bottom: Math.floor(this.lastWindowY + this.lastHeight),\n velocity: {\n x: Math.floor(this.lastWindowXVelocity) || 0,\n y: Math.floor(this.lastWindowYVelocity) || 0\n }\n },\n orientation: {\n changed: this.orientationChange,\n // These values are relative to the first calibrated value\n alpha: Math.floor(this.lastAlpha - this.initialAlpha) || 0,\n beta: Math.floor(this.lastBeta - this.initialBeta) || 0,\n gamma: Math.floor(this.lastGamma - this.initialGamma) || 0\n },\n devicePixelRatio: {\n changed: this.devicePixelRatioChange,\n ratio: this.currDevicePixelRatio\n }\n };\n }\n\n /**\n * Update function to be looped by requestAnimationFrame\n */\n update() {\n const {\n currWidth,\n currHeight,\n currMouseX,\n currMouseY,\n currAlpha,\n currBeta,\n currGamma,\n currDevicePixelRatio\n } = this;\n if (this.updating) return false;\n\n // reset the flags\n this.scrollChange = this.sizeChange = this.mouseChange = this.positionChange = this.orientationChange = this.devicePixelRatioChange = false;\n\n // we need to grab a buffer of the last five values and average them\n if (this.windowXVelocity.length > 5) { this.windowXVelocity.shift(); }\n this.windowXVelocity.push(window.screenX - this.lastWindowX);\n\n // see if the average velocity changed\n if (getMean(this.windowXVelocity) != this.lastWindowXVelocity) {\n this.lastWindowXVelocity = getMean(this.windowXVelocity);\n this.positionChange = true;\n }\n\n // check window X position\n if (window.screenX != this.lastWindowX) {\n this.positionChange = true;\n this.lastWindowX = window.screenX;\n }\n\n // we need to grab a buffer of the last five values and average them\n if (this.windowYVelocity.length > 5) { this.windowYVelocity.shift(); }\n this.windowYVelocity.push(window.screenY - this.lastWindowY);\n\n // see if the average velocity changed\n if (getMean(this.windowYVelocity) != this.lastWindowYVelocity) {\n this.lastWindowYVelocity = getMean(this.windowYVelocity);\n this.positionChange = true;\n }\n\n // check window Y position\n if (window.screenY != this.lastWindowY) {\n this.positionChange = true;\n this.lastWindowY = window.screenY;\n }\n \n\n // reset scroll X velocity\n if (window.pageXOffset == this.lastX && this.scrollXVelocity != 0) {\n this.scrollXVelocity = 0;\n this.scrollChange = true;\n }\n\n // reset scroll Y velocity\n if (window.pageYOffset == this.lastY && this.scrollYVelocity != 0) {\n this.scrollYVelocity = 0;\n this.scrollChange = true;\n }\n \n // check scroll X\n if (window.pageXOffset != this.lastX) {\n this.scrollChange = true;\n this.scrollXVelocity = Math.floor(window.pageXOffset - this.lastX);\n this.lastX = window.pageXOffset;\n }\n \n // check scroll Y\n if (window.pageYOffset != this.lastY) {\n this.scrollChange = true;\n this.scrollYVelocity = Math.floor(window.pageYOffset - this.lastY);\n this.lastY = window.pageYOffset;\n }\n\n // check width\n if (currWidth != this.lastWidth) {\n this.lastWidth = currWidth;\n this.scrollHeight = document.body.scrollHeight;\n this.sizeChange = true;\n }\n\n // check height\n if (currHeight != this.lastHeight) {\n this.lastHeight = currHeight;\n this.sizeChange = true;\n }\n\n // Mouse input is throttled so in order to capture the velocity\n // we need to grab a buffer of the last five values and average them\n if (this.mouseXVelocity.length > 5) { this.mouseXVelocity.shift(); }\n this.mouseXVelocity.push(currMouseX - this.lastMouseX);\n\n // see if the average velocity changed\n if (getMean(this.mouseXVelocity) != this.lastMouseXVelocity) {\n this.lastMouseXVelocity = getMean(this.mouseXVelocity);\n this.mouseChange = true;\n }\n \n // check mouse X\n if (currMouseX != this.lastMouseX) {\n this.lastMouseX = currMouseX;\n this.mouseChange = true;\n }\n\n // grab the mouse Y velocity\n if (this.mouseYVelocity.length > 5) { this.mouseYVelocity.shift(); }\n this.mouseYVelocity.push(currMouseY - this.lastMouseY);\n\n // see if the average velocity changed\n if (getMean(this.mouseYVelocity) != this.lastMouseYVelocity) {\n this.lastMouseYVelocity = getMean(this.mouseYVelocity);\n this.mouseChange = true;\n }\n \n // check mouse y\n if (currMouseY != this.lastMouseY || getMean(this.mouseYVelocity) != 0) {\n this.lastMouseY = currMouseY;\n this.mouseChange = true;\n }\n\n // orientation\n if (currAlpha != this.lastAlpha) {\n this.lastAlpha = currAlpha;\n this.orientationChange = true;\n }\n\n if (currBeta != this.lastBeta) {\n this.lastBeta = currBeta;\n this.orientationChange = true;\n }\n\n if (currGamma != this.lastGamma) {\n this.lastGamma = currGamma;\n this.orientationChange = true;\n }\n \n // device pixel ratio, but only if the window has moved\n if ( this.positionChange || this.sizeChange )\n {\n this.currDevicePixelRatio = Math.max( window.devicePixelRatio || 1, 1 );\n \n if ( this.currDevicePixelRatio !== this.lastDevicePixelRatio )\n {\n this.devicePixelRatioChange = true;\n this.lastDevicePixelRatio = this.currDevicePixelRatio;\n }\n }\n\n // Finally, we can invoke the callbacks, but if something has changed\n if (\n this.scrollChange ||\n this.sizeChange ||\n this.mouseChange ||\n this.positionChange ||\n this.orientationChange ||\n this.devicePixelRatioChange\n ) {\n // pass the formatted data into each watched function\n this.callbacks.forEach(cb => cb(this.formatData()));\n }\n\n // reset and loop this method\n this.updating = false;\n requestAnimationFrame(this.update);\n }\n\n /**\n * Subscribes a function to the 'watched functions' list.\n * Watched functions will be automatically called on update\n * @param {Function} callback The function to call on update\n * @param {Boolean} callOnWatch Call the function on subscribe? defaults to true\n */\n watch(callback, callOnWatch = true) {\n if (typeof callback !== 'function') {\n throw new Error('Value passed to Watch is not a function');\n }\n\n // Exit out if this is running server-side\n if (isSSR) return;\n\n if (callOnWatch) {\n // get a copy of the store\n const firstRunData = this.formatData();\n\n // Most watch functions will have guard clauses that check for change\n // To cicumvent this, we simulate that all values have changed on first run\n firstRunData.scroll.changed = true;\n firstRunData.mouse.changed = true;\n firstRunData.size.changed = true;\n firstRunData.position.changed = true;\n firstRunData.orientation.changed = true;\n firstRunData.devicePixelRatio.changed = true;\n \n // run the callback using the simulated data\n callback(firstRunData);\n }\n\n // push the callback to the queue to ensure it runs on future updates\n this.callbacks.push(callback);\n }\n\n /**\n * Unsubscribe a function from the 'watched functions' list\n * @param {Function} callback The function to be removed\n */\n unwatch(callback) {\n if (typeof callback !== 'function') {\n throw new Error('The value passed to unwatch is not a function');\n }\n\n // Exit out if this is running server-side\n if (isSSR) return;\n\n // remove the callback from the list\n this.callbacks = this.callbacks.filter(cb => cb !== callback);\n }\n\n}\n\n\n// Create a singleton instance of Tornis\nconst TORNIS = new Tornis();\n\nif (!isSSR) {\n // Expose a limited set of functions to a global, in order to allow access for basic script usage with