{"version":3,"sources":["webpack:///./src/_js/main.js","webpack:///./src/_js/partials/CardAnimation.js","webpack:///./src/_js/partials/ContentAnimation.js","webpack:///./src/_js/partials/ContentAnimationWeddings.js","webpack:///./src/_js/partials/FooterUtil.js","webpack:///./src/_js/partials/HeaderUtil.js","webpack:///./src/_js/partials/ScrollTo.js","webpack:///./src/_js/partials/StickyHeader.js","webpack:///./src/_js/partials/custom-matchheight.js","webpack:///./src/_js/partials/jquery-accessibleMegaMenu.js","webpack:///./src/_js/partials/lazyload.js","webpack:///./src/_js/partials/skrollr.js","webpack:///external \"jQuery\"","webpack:///external \"mobx\"","webpack:///external \"mobxReact\"","webpack:///external \"React\"","webpack:///external \"ReactDOM\"","webpack:///external \"ReactRedux\"","webpack:///external \"ReactRouter\"","webpack:///external \"ReactRouterDOM\"","webpack:///external \"ReactRouterRedux\"","webpack:///external \"Redux\""],"names":[],"mappings":"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","file":"main.js","sourcesContent":["\"use strict\";\r\n/**\r\n * Some useful packages (you can install by using npm)\r\n * 1. webfontloader = async font loaders\r\n * 2. slick-carousel = Simple, easy, responsive carousel (buggy centerMode - variableWidth - lazyMode)\r\n * 3. jquery-match-height = Use this to match the height of elements. Either use this or Equalizer from Foundation\r\n * 4. dropkickjs = if you need custom dropdown\r\n *\r\n * IMPORTANT:\r\n * To import async-ly, you need to wrap your codes in require.ensure([], () => { });\r\n * It's best not to async plugins, to leverage browser cache\r\n * Ref: https://webpack.github.io/docs/code-splitting.html\r\n *\r\n * NOTES:\r\n * This boilerplate uses CDN/external for jQuery package. Configured in gulp/webpack.js.\r\n * This to prevent the needs of jQuery from node_modules\r\n */\r\n\r\n///////////////\r\n// Libraries //\r\n///////////////\r\n// import wf from 'webfontloader';\r\nimport ssm from \"simplestatemanager\";\r\nimport svg4everybody from \"svg4everybody\";\r\nimport mh from \"jquery-match-height\";\r\nimport JSON5 from \"json5\";\r\n// import $script from 'scriptjs';\r\nimport \"waypoints/lib/jquery.waypoints\";\r\nimport LazyLoad from \"./partials/lazyload\";\r\nimport Cookies from \"js-cookie\";\r\nimport \"intersection-observer\"; //polyfill\r\n\r\nimport \"lazysizes/plugins/respimg/ls.respimg\";\r\nimport \"lazysizes/plugins/attrchange/ls.attrchange\";\r\nimport \"lazysizes/plugins/bgset/ls.bgset\";\r\nimport \"lazysizes/plugins/unveilhooks/ls.unveilhooks\";\r\nimport \"lazysizes\";\r\n\r\n// Note for lazysizes\r\n// Need to do \"mobile size first\"\r\n// If you define bgset=\"imageA sizeA, imageB sizeB\", then if the B is loaded first, the A won't load although it matches the size requirement\r\n// If you define bgset=\"imageA sizeA, imageB sizeB\", then if the A is loaded first, B will load if it matches the size requirement\r\n\r\n// To define with media query, do the ones that have mediaquery first, then the ones without\r\n// If you define with media query, it will load based on the set media query\r\nlazySizes.cfg.lazyClass = \"js-lazysizes\";\r\nlazySizes.cfg.loadedClass = \"is-lazysizes-loaded\";\r\nlazySizes.cfg.loadingClass = \"is-lazysizes-loading\";\r\n\r\n////////////////\r\n// Components //\r\n////////////////\r\nimport CardAnimation from \"./partials/CardAnimation\";\r\nimport ContentAnimation from \"./partials/ContentAnimation\";\r\nimport ContentAnimationWeddings from \"./partials/ContentAnimationWeddings\";\r\nimport ScrollTo from \"./partials/ScrollTo\";\r\nimport HeaderUtil from \"./partials/HeaderUtil\";\r\nimport FooterUtil from \"./partials/FooterUtil\";\r\n\r\nwindow.CardAnimation = CardAnimation;\r\n\r\nfunction getMobileOperatingSystem() {\r\n\tvar userAgent = navigator.userAgent || navigator.vendor || window.opera;\r\n\r\n\t// Windows Phone must come first because its UA also contains \"Android\"\r\n\tif (/windows phone/i.test(userAgent)) {\r\n\t\treturn \"Windows Phone\";\r\n\t}\r\n\r\n\tif (/android/i.test(userAgent)) {\r\n\t\treturn \"Android\";\r\n\t}\r\n\r\n\t// iOS detection from: http://stackoverflow.com/a/9039885/177710\r\n\tif (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {\r\n\t\treturn \"iOS\";\r\n\t}\r\n\r\n\treturn \"unknown\";\r\n}\r\n\r\n//////////////////\r\n// Bootstrap JS //\r\n//////////////////\r\n// Tab\r\nrequire(\"bootstrap-sass/assets/javascripts/bootstrap/tab\");\r\n// Collapse\r\nrequire(\"bootstrap-sass/assets/javascripts/bootstrap/collapse\");\r\n// Dropdown\r\nrequire(\"bootstrap-sass/assets/javascripts/bootstrap/dropdown\");\r\n// Transition\r\nrequire(\"bootstrap-sass/assets/javascripts/bootstrap/transition\");\r\n\r\n/////////////\r\n// Plugins //\r\n/////////////\r\nimport \"bootstrap-datepicker\";\r\n\r\n// Polyfill\r\nimport objectFitImages from \"object-fit-images\";\r\n\r\n// Setting Webpack public path dynamically so that it loads the partials\r\n// from the folder where the main.js is located\r\nvar bundleSrc = $('[src*=\"/main.js\"]').attr(\"src\");\r\n__webpack_public_path__ = bundleSrc.substr(0, bundleSrc.lastIndexOf(\"/\") + 1);\r\n\r\n$(() => {\r\n\t// Object-Fit Polyfill\r\n\tif ($(\"body\").hasClass(\"IE\")) {\r\n\t\tobjectFitImages();\r\n\t}\r\n\r\n\tconst mobileOs = getMobileOperatingSystem();\r\n\tconst $body = $(\"body\");\r\n\tswitch (mobileOs) {\r\n\t\tcase \"Android\":\r\n\t\t\t$(\"body\").addClass(\"is-android\");\r\n\t\t\tbreak;\r\n\t\tcase \"iOS\":\r\n\t\t\t$(\"body\").addClass(\"is-ios\");\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\t$(\"body\").addClass(\"is-non-androidios\");\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\t// Notification\r\n\tconst $closeNotif = $(\"[data-closenotifid]\").on(\"click\", function() {\r\n\t\tconst $this = $(this);\r\n\t\tconst notifId = $this.attr(\"data-closenotifid\");\r\n\t\tCookies.set(\"notifId\", notifId);\r\n\t});\r\n\tif ($closeNotif.attr(\"data-closenotifid\") != Cookies.get(\"notifId\")) {\r\n\t\t$closeNotif.closest(\".js-notif\").removeClass(\"hidden\");\r\n\t}\r\n\r\n\t////////////////////////////\r\n\t// For lazy-loaded images //\r\n\t////////////////////////////\r\n\tvar myLazyLoad = new LazyLoad({\r\n\t\telements_selector: \".js-lazy\"\r\n\t});\r\n\r\n\t//////////////////////\r\n\t// For external SVG //\r\n\t//////////////////////\r\n\tsvg4everybody();\r\n\r\n\t/////////////////////////////\r\n\t// Match Height Customized //\r\n\t/////////////////////////////\r\n\trequire(\"./partials/custom-matchheight\");\r\n\r\n\t//////////////////////\r\n\t// Hero parallax //\r\n\t//////////////////////\r\n\tif (\r\n\t\t!/Android|iPhone|iPad|iPod|BlackBerry|Windows Phone/i.test(\r\n\t\t\tnavigator.userAgent || navigator.vendor || window.opera\r\n\t\t)\r\n\t) {\r\n\t\trequire(\"./partials/skrollr\");\r\n\t\tskrollr.init({\r\n\t\t\tforceHeight: false,\r\n\t\t\tedgeStrategy: \"set\",\r\n\t\t\teasing: {\r\n\t\t\t\tWTF: Math.random,\r\n\t\t\t\tinverted: function(p) {\r\n\t\t\t\t\treturn 1 - p;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t////////////////\r\n\t// Mute Volume //\r\n\t////////////////\r\n\tlet $heroAudio = $(\".o-hero--parallax-audio\");\r\n\tif ($heroAudio.length) {\r\n\t\tvar getSoundClass = $(this);\r\n\t\tvar getSoundUrl = $(\".o-hero--parallax-audio source\").attr(\"src\");\r\n\t\tvar getSound = new Audio(getSoundUrl);\r\n\t\t$(getSound).bind(\"ended\", function() {\r\n\t\t\tgetSound.currentTime = 0;\r\n\t\t\tgetSound.play();\r\n\t\t});\r\n\t\tif ($(window).width() >= 768) {\r\n\t\t\tgetSound.play();\r\n\t\t}\r\n\t\t$(\"#btnsound\").on(\"click\", function(e) {\r\n\t\t\t$(this).toggleClass(\"muted\");\r\n\t\t\tif (getSound.paused == false) {\r\n\t\t\t\tgetSound.pause();\r\n\t\t\t} else {\r\n\t\t\t\tgetSound.play();\r\n\t\t\t}\r\n\t\t\te.preventDefault();\r\n\t\t});\r\n\t\t$(window).on(\"resize\", function() {\r\n\t\t\tif ($(window).width() <= 767) {\r\n\t\t\t\tgetSound.pause();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t////////////////\r\n\t// Scroll To //\r\n\t////////////////\r\n\tlet $scrollTo = $(\"[data-scrollto]\");\r\n\tif ($scrollTo.length) {\r\n\t\tnew ScrollTo($scrollTo);\r\n\t}\r\n\r\n\t///////////////\r\n\t// Triggerer //\r\n\t///////////////\r\n\tlet $jsTriggerer = $(\"[data-triggerer]\");\r\n\tif ($jsTriggerer.length) {\r\n\t\t$jsTriggerer.each(function() {\r\n\t\t\tlet $this = $(this);\r\n\t\t\tlet attr = $this.attr(\"data-triggerer\");\r\n\t\t\tif (attr) {\r\n\t\t\t\t// opts\r\n\t\t\t\t// opt.target = target (CSS string selector)\r\n\t\t\t\t// opt.sourceEvents = (str) default(click) - the events that trigger eventTriggers\r\n\t\t\t\t// opt.triggerEvents = (str) the events triggered on the target\r\n\t\t\t\tlet opt = JSON5.parse(attr);\r\n\r\n\t\t\t\t// if on enter\r\n\t\t\t\tlet isOnEnter = opt.sourceEvents == \"enter\";\r\n\r\n\t\t\t\tif (isOnEnter) {\r\n\t\t\t\t\topt.sourceEvents = \"keypress\";\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$this.on(opt.sourceEvents || \"click\", function(e) {\r\n\t\t\t\t\tif (isOnEnter) {\r\n\t\t\t\t\t\tif (e.which == 13) {\r\n\t\t\t\t\t\t\t$(opt.target).trigger(opt.triggerEvents);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$(opt.target).trigger(opt.triggerEvents);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/////////////\r\n\t// FocusOn //\r\n\t/////////////\r\n\tlet $focusOn = $(\"[data-focuson]\");\r\n\tif ($focusOn.length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\t() => {\r\n\t\t\t\tconst FocusOn = require(\"./partials/FocusOn\");\r\n\t\t\t\tnew FocusOn($focusOn);\r\n\t\t\t},\r\n\t\t\t\"focuson\"\r\n\t\t);\r\n\t}\r\n\r\n\t//////////////////\r\n\t// Init Toggler //\r\n\t//////////////////\r\n\tlet $jsVtoggle = $(\"[data-vtoggle]\");\r\n\t$jsVtoggle.each(function() {\r\n\t\tlet $this = $(this);\r\n\t\tlet {\r\n\t\t\tkey,\r\n\t\t\tselfClass,\r\n\t\t\tclass: cls,\r\n\t\t\ttarget,\r\n\t\t\tevent: ev,\r\n\t\t\ttransitionProperty,\r\n\t\t\tremoveClass,\r\n\t\t\tisAddClass\r\n\t\t} = JSON5.parse($this.attr(\"data-vtoggle\"));\r\n\r\n\t\t$this.on(ev || \"click\", function() {\r\n\t\t\tlet $this = $(this);\r\n\r\n\t\t\tif (cls) {\r\n\t\t\t\tlet $target = $(target);\r\n\t\t\t\tconst TRANSITION_EVENT =\r\n\t\t\t\t\t\"webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend\";\r\n\t\t\t\tconst LOADING_CLASS = `${cls}-is-loading`;\r\n\r\n\t\t\t\tif (!isAddClass) {\r\n\t\t\t\t\t$target.toggleClass(cls);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$target.addClass(cls);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (transitionProperty) {\r\n\t\t\t\t\t// Lister offcanvas exception\r\n\t\t\t\t\tif (key == \"lister-offcanvas\") {\r\n\t\t\t\t\t\t$(\".c-lister__offcanvas\").one(\r\n\t\t\t\t\t\t\tTRANSITION_EVENT,\r\n\t\t\t\t\t\t\tfunction(e) {\r\n\t\t\t\t\t\t\t\t// bug in chrome\r\n\t\t\t\t\t\t\t\t// if the child is on focus, the transition end is not on the parent (.c-lister__offcanvas) but it's on the\r\n\t\t\t\t\t\t\t\t// child instead. doesn't happen on FF and IE\r\n\t\t\t\t\t\t\t\t// temp solution: remove the class no matter what the originalEvent.property name is\r\n\t\t\t\t\t\t\t\t$target.removeClass(LOADING_CLASS);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\t$target.addClass(LOADING_CLASS);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$target\r\n\t\t\t\t\t\t\t.addClass(LOADING_CLASS)\r\n\t\t\t\t\t\t\t.one(TRANSITION_EVENT, function(e) {\r\n\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\ttransitionProperty ==\r\n\t\t\t\t\t\t\t\t\te.originalEvent.propertyName\r\n\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\tlet $this = $(this);\r\n\t\t\t\t\t\t\t\t\t$this.removeClass(LOADING_CLASS);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (removeClass) {\r\n\t\t\t\t\t$target.removeClass(removeClass);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (selfClass) {\r\n\t\t\t\t$this.toggleClass(selfClass);\r\n\t\t\t}\r\n\r\n\t\t\t// Lister view toggle\r\n\t\t\tif (key == \"lister-view-toggle\") {\r\n\t\t\t\tCardAnimation.initAnimations($(\".c-lister .o-card--feature\"));\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\r\n\t///////////////////\r\n\t// Slick Sliders //\r\n\t///////////////////\r\n\tlet $jsSlick = $(\"[data-slickjs]\");\r\n\tif (\r\n\t\t$jsSlick.length ||\r\n\t\t$(\"#map\").length ||\r\n\t\t$(\"[data-bluemountainmap]\").length\r\n\t) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\t() => {\r\n\t\t\t\trequire(\"./partials/slick-carousel\");\r\n\t\t\t\twindow.jsSlickOptions = {\r\n\t\t\t\t\tcontent: {\r\n\t\t\t\t\t\tinfinite: true,\r\n\t\t\t\t\t\tslidesToScroll: 4,\r\n\t\t\t\t\t\tslidesToShow: 4,\r\n\t\t\t\t\t\tresponsive: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tbreakpoint: 991,\r\n\t\t\t\t\t\t\t\tsettings: {\r\n\t\t\t\t\t\t\t\t\tslidesToScroll: 3,\r\n\t\t\t\t\t\t\t\t\tslidesToShow: 3\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tbreakpoint: 767,\r\n\t\t\t\t\t\t\t\tsettings: {\r\n\t\t\t\t\t\t\t\t\tslidesToScroll: 1,\r\n\t\t\t\t\t\t\t\t\tslidesToShow: 1\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tsetCounter(slick, onInit) {\r\n\t\t\t\t\t\t\tlet firstActiveSlideIndex = -1;\r\n\t\t\t\t\t\t\tlet lastActiveSlideIndex = -1;\r\n\t\t\t\t\t\t\tconst $parentOfSlider = $(slick.$slider).parent();\r\n\r\n\t\t\t\t\t\t\tif (onInit) {\r\n\t\t\t\t\t\t\t\t// set the total slide count\r\n\t\t\t\t\t\t\t\t$parentOfSlider\r\n\t\t\t\t\t\t\t\t\t.find(\".js-contentslider-slidetotal\")\r\n\t\t\t\t\t\t\t\t\t.html(slick.slideCount);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tslick.$slides.each((i, slide) => {\r\n\t\t\t\t\t\t\t\tif ($(slide).hasClass(\"slick-active\")) {\r\n\t\t\t\t\t\t\t\t\tfirstActiveSlideIndex =\r\n\t\t\t\t\t\t\t\t\t\tfirstActiveSlideIndex < 0\r\n\t\t\t\t\t\t\t\t\t\t\t? i\r\n\t\t\t\t\t\t\t\t\t\t\t: firstActiveSlideIndex;\r\n\t\t\t\t\t\t\t\t\tlastActiveSlideIndex =\r\n\t\t\t\t\t\t\t\t\t\tlastActiveSlideIndex < i\r\n\t\t\t\t\t\t\t\t\t\t\t? i\r\n\t\t\t\t\t\t\t\t\t\t\t: lastActiveSlideIndex;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\t// set current slide\r\n\t\t\t\t\t\t\t$parentOfSlider\r\n\t\t\t\t\t\t\t\t.find(\".js-contentslider-slidefrom\")\r\n\t\t\t\t\t\t\t\t.html(firstActiveSlideIndex + 1);\r\n\t\t\t\t\t\t\t$parentOfSlider\r\n\t\t\t\t\t\t\t\t.find(\".js-contentslider-slideto\")\r\n\t\t\t\t\t\t\t\t.html(lastActiveSlideIndex + 1);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tonInit(slick, $el, opt) {\r\n\t\t\t\t\t\t\topt.setCounter(slick, true);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tonAfterChange(slick, $el, currentSlide, opt) {\r\n\t\t\t\t\t\t\topt.setCounter(slick);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\tsimplemedia: {\r\n\t\t\t\t\t\tinfinite: true,\r\n\t\t\t\t\t\tslidesToScroll: 1,\r\n\t\t\t\t\t\tmobileFirst: true,\r\n\t\t\t\t\t\tresponsive: [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tbreakpoint: 992,\r\n\t\t\t\t\t\t\t\tsettings: {\r\n\t\t\t\t\t\t\t\t\tcenterMode: true,\r\n\t\t\t\t\t\t\t\t\tcenterPadding: \"258px\"\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tbreakpoint: 1920,\r\n\t\t\t\t\t\t\t\tsettings: {\r\n\t\t\t\t\t\t\t\t\tcenterMode: true,\r\n\t\t\t\t\t\t\t\t\tcenterPadding: \"600px\"\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tbreakpoint: 2560,\r\n\t\t\t\t\t\t\t\tsettings: {\r\n\t\t\t\t\t\t\t\t\tcenterMode: true,\r\n\t\t\t\t\t\t\t\t\tcenterPadding: \"800px\"\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t]\r\n\t\t\t\t\t},\r\n\t\t\t\t\tone: {\r\n\t\t\t\t\t\tinfinite: true,\r\n\t\t\t\t\t\tslidesToScroll: 1,\r\n\t\t\t\t\t\tslidesToShow: 1,\r\n\t\t\t\t\t\tdots: true,\r\n\t\t\t\t\t\tarrows: true,\r\n\t\t\t\t\t\tadaptiveHeight: true\r\n\t\t\t\t\t},\r\n\t\t\t\t\tblockquote: {\r\n\t\t\t\t\t\tautoplay: true,\r\n\t\t\t\t\t\tinfinite: true,\r\n\t\t\t\t\t\tslidesToScroll: 1,\r\n\t\t\t\t\t\tslidesToShow: 1,\r\n\t\t\t\t\t\tdots: true,\r\n\t\t\t\t\t\tarrows: false\r\n\t\t\t\t\t},\r\n\t\t\t\t\thome: {\r\n\t\t\t\t\t\tinfinite: true,\r\n\t\t\t\t\t\tslidesToScroll: 1,\r\n\t\t\t\t\t\tslidesToShow: 1,\r\n\t\t\t\t\t\tdots: true,\r\n\t\t\t\t\t\tarrows: false,\r\n\t\t\t\t\t\tautoplay: true,\r\n\t\t\t\t\t\tfade: true,\r\n\t\t\t\t\t\tspeed: 800,\r\n\t\t\t\t\t\tcssEase: \"linear\",\r\n\t\t\t\t\t\tautoplaySpeed: 5000,\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t$jsSlick.each(function() {\r\n\t\t\t\t\tlet $el = $(this);\r\n\t\t\t\t\tlet key = $el.data(\"slickjs\");\r\n\r\n\t\t\t\t\tif (key == \"simplemedia\") {\r\n\t\t\t\t\t\tif ($el.find(\".o-slider__item\").length < 3) {\r\n\t\t\t\t\t\t\tjsSlickOptions[key].responsive = [];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t$el.on(\"init\", function(ev, slick) {\r\n\t\t\t\t\t\tconst $this = $(this);\r\n\t\t\t\t\t\tif (jsSlickOptions[key] && jsSlickOptions[key].onInit) {\r\n\t\t\t\t\t\t\tjsSlickOptions[key].onInit(\r\n\t\t\t\t\t\t\t\tslick,\r\n\t\t\t\t\t\t\t\t$this,\r\n\t\t\t\t\t\t\t\tjsSlickOptions[key]\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tslick.$dots &&\r\n\t\t\t\t\t\t\tslick.$dots.toggleClass(\r\n\t\t\t\t\t\t\t\t\"hidden\",\r\n\t\t\t\t\t\t\t\tslick.slideCount < 2\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t})\r\n\t\t\t\t\t\t.on(\"breakpoint\", function(ev, slick) {\r\n\t\t\t\t\t\t\tslick.$dots &&\r\n\t\t\t\t\t\t\t\tslick.$dots.toggleClass(\r\n\t\t\t\t\t\t\t\t\t\"hidden\",\r\n\t\t\t\t\t\t\t\t\tslick.slideCount < 2\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.on(\"afterChange\", function(ev, slick, currentSlide) {\r\n\t\t\t\t\t\t\tconst $this = $(this);\r\n\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\tjsSlickOptions[key] &&\r\n\t\t\t\t\t\t\t\tjsSlickOptions[key].onAfterChange\r\n\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\tjsSlickOptions[key].onAfterChange(\r\n\t\t\t\t\t\t\t\t\tslick,\r\n\t\t\t\t\t\t\t\t\t$this,\r\n\t\t\t\t\t\t\t\t\tcurrentSlide,\r\n\t\t\t\t\t\t\t\t\tjsSlickOptions[key]\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.slick(jsSlickOptions[key] || {});\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\"sliders\"\r\n\t\t);\r\n\t}\r\n\r\n\t//////////////////\r\n\t// Royal Slider //\r\n\t//////////////////\r\n\tlet $jsRoyalSlider = $(\"[data-rs]\");\r\n\tif ($jsRoyalSlider.length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\t() => {\r\n\t\t\t\trequire(\"./partials/royalslider/dev/jquery.royalslider\");\r\n\t\t\t\trequire(\"./partials/royalslider/dev/modules/jquery.rs.thumbnails\");\r\n\t\t\t\trequire(\"./partials/royalslider/dev/modules/jquery.rs.fullscreen\");\r\n\t\t\t\trequire(\"./partials/royalslider/dev/modules/jquery.rs.auto-height\");\r\n\t\t\t\trequire(\"./partials/royalslider/dev/modules/jquery.rs.active-class\");\r\n\r\n\t\t\t\tconst $jsContentWrapper = $(\".js-content-wrapper\");\r\n\t\t\t\tlet scrollTop = 0;\r\n\t\t\t\tlet scrollLeft = 0;\r\n\r\n\t\t\t\tconst options = {\r\n\t\t\t\t\tgallery: {\r\n\t\t\t\t\t\tfullscreen: {\r\n\t\t\t\t\t\t\tenabled: true,\r\n\t\t\t\t\t\t\tnativeFS: true\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tcontrolNavigation: \"thumbnails\",\r\n\t\t\t\t\t\tthumbs: {\r\n\t\t\t\t\t\t\torientation: \"vertical\",\r\n\t\t\t\t\t\t\tpaddingBottom: 3,\r\n\t\t\t\t\t\t\tappendSpan: true\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\ttransitionType: \"fade\",\r\n\t\t\t\t\t\tautoHeight: true,\r\n\t\t\t\t\t\tautoScaleSlider: true,\r\n\t\t\t\t\t\tautoScaleSliderWidth: 1300,\r\n\t\t\t\t\t\tautoScaleSliderHeight: 657,\r\n\t\t\t\t\t\timageAlignCenter: false,\r\n\t\t\t\t\t\timageScalePadding: 13,\r\n\t\t\t\t\t\tloop: true,\r\n\t\t\t\t\t\tarrowsNav: false,\r\n\t\t\t\t\t\tkeyboardNavEnabled: true,\r\n\t\t\t\t\t\taddActiveClass: true,\r\n\r\n\t\t\t\t\t\tsetGalleryCounter($el, slider) {\r\n\t\t\t\t\t\t\tlet $galleryCounter = $el.find(\r\n\t\t\t\t\t\t\t\t\".o-gallery__counter\"\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tif (!$galleryCounter.length) {\r\n\t\t\t\t\t\t\t\t$el.find(\".rsOverflow\").append(\r\n\t\t\t\t\t\t\t\t\t``\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t$galleryCounter = $el.find(\r\n\t\t\t\t\t\t\t\t\t\".o-gallery__counter\"\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t$galleryCounter.html(\r\n\t\t\t\t\t\t\t\t\t`${slider.currSlideId + 1} of ${\r\n\t\t\t\t\t\t\t\t\t\tslider.numSlides\r\n\t\t\t\t\t\t\t\t\t}`\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\trsAfterSlideChange($el, slider, opt) {\r\n\t\t\t\t\t\t\topt.setGalleryCounter($el, slider);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\trsAfterContentSet($el, slider, opt) {\r\n\t\t\t\t\t\t\t$el.height(\"auto\");\r\n\t\t\t\t\t\t\topt.setGalleryCounter($el, slider);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\trsOnUpdateNav($el, slider) {\r\n\t\t\t\t\t\t\t$el.height(\"auto\");\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\trsEnterFullscreen($el, slider) {\r\n\t\t\t\t\t\t\t$jsContentWrapper.addClass(\"is-rs-fullscreen\");\r\n\t\t\t\t\t\t\t$(\".o-gallery__text\", $el).each(function() {\r\n\t\t\t\t\t\t\t\tconst $this = $(this);\r\n\t\t\t\t\t\t\t\t$this.css(\r\n\t\t\t\t\t\t\t\t\t\"margin-left\",\r\n\t\t\t\t\t\t\t\t\t$this\r\n\t\t\t\t\t\t\t\t\t\t.parent()\r\n\t\t\t\t\t\t\t\t\t\t.find(\".rsImg\")\r\n\t\t\t\t\t\t\t\t\t\t.css(\"margin-left\")\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\trsExitFullscreen($el, slider) {\r\n\t\t\t\t\t\t\t$jsContentWrapper.removeClass(\"is-rs-fullscreen\");\r\n\t\t\t\t\t\t\t$(\".o-gallery__text\", $el).css(\"margin-left\", \"\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t$jsRoyalSlider.each(function() {\r\n\t\t\t\t\tconst $this = $(this);\r\n\t\t\t\t\tconst key = $this.attr(\"data-rs\");\r\n\t\t\t\t\tconst slider = $this\r\n\t\t\t\t\t\t.on(\"rsAfterContentSet\", function() {\r\n\t\t\t\t\t\t\tif (options[key].rsAfterContentSet) {\r\n\t\t\t\t\t\t\t\toptions[key].rsAfterContentSet(\r\n\t\t\t\t\t\t\t\t\t$this,\r\n\t\t\t\t\t\t\t\t\tslider,\r\n\t\t\t\t\t\t\t\t\toptions[key]\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.royalSlider(options[key])\r\n\t\t\t\t\t\t.data(\"royalSlider\");\r\n\r\n\t\t\t\t\tslider.ev\r\n\t\t\t\t\t\t.on(\"rsEnterFullscreen\", function() {\r\n\t\t\t\t\t\t\tif (options[key].rsEnterFullscreen) {\r\n\t\t\t\t\t\t\t\toptions[key].rsEnterFullscreen(\r\n\t\t\t\t\t\t\t\t\t$this,\r\n\t\t\t\t\t\t\t\t\tslider,\r\n\t\t\t\t\t\t\t\t\toptions[key]\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.on(\"rsExitFullscreen\", function() {\r\n\t\t\t\t\t\t\tif (options[key].rsExitFullscreen) {\r\n\t\t\t\t\t\t\t\toptions[key].rsExitFullscreen(\r\n\t\t\t\t\t\t\t\t\t$this,\r\n\t\t\t\t\t\t\t\t\tslider,\r\n\t\t\t\t\t\t\t\t\toptions[key]\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.on(\"rsAfterSlideChange\", function() {\r\n\t\t\t\t\t\t\tif (options[key].rsAfterSlideChange) {\r\n\t\t\t\t\t\t\t\toptions[key].rsAfterSlideChange(\r\n\t\t\t\t\t\t\t\t\t$this,\r\n\t\t\t\t\t\t\t\t\tslider,\r\n\t\t\t\t\t\t\t\t\toptions[key]\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.on(\"rsOnUpdateNav\", function() {\r\n\t\t\t\t\t\t\tif (options[key].rsOnUpdateNav) {\r\n\t\t\t\t\t\t\t\toptions[key].rsOnUpdateNav(\r\n\t\t\t\t\t\t\t\t\t$this,\r\n\t\t\t\t\t\t\t\t\tslider,\r\n\t\t\t\t\t\t\t\t\toptions[key]\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// Maintain scroll position when exiting fullscreen\r\n\t\t\t\t$(document).on(\"click\", \".rsFullscreenBtn\", function() {\r\n\t\t\t\t\tlet $win = $(window);\r\n\t\t\t\t\tlet $isFullScreen = $(\".is-rs-fullscreen\");\r\n\t\t\t\t\tif ($isFullScreen.length) {\r\n\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\twindow.scrollTo(scrollLeft, scrollTop);\r\n\t\t\t\t\t\t}, 100);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tscrollLeft = $win.scrollLeft();\r\n\t\t\t\t\t\tscrollTop = $win.scrollTop();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\"gallery\"\r\n\t\t);\r\n\t}\r\n\r\n\t////////////\r\n\t// Sticky //\r\n\t////////////\r\n\tconst $jsSticky = $(\"[data-sticky]\");\r\n\tif ($jsSticky.length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\t() => {\r\n\t\t\t\tconst Sticky = require(\"./partials/Sticky\");\r\n\t\t\t\tnew Sticky($jsSticky);\r\n\t\t\t},\r\n\t\t\t\"sticky\"\r\n\t\t);\r\n\t}\r\n\r\n\t//////////////////////////\r\n\t// Bootstrap Datepicker //\r\n\t//////////////////////////\r\n\tconst $jsDatepicker = $(\"[data-jsdatepicker]\");\r\n\tif ($jsDatepicker.length) {\r\n\t\t$jsDatepicker.each(function() {\r\n\t\t\tconst $this = $(this);\r\n\r\n\t\t\t// Enforce to type=\"text\"\r\n\t\t\tif ($this.is(\"input\") && $this.attr(\"type\") != \"text\") {\r\n\t\t\t\t$this.attr(\"type\", \"text\");\r\n\t\t\t}\r\n\r\n\t\t\tconst options = {\r\n\t\t\t\trange: {\r\n\t\t\t\t\tcontainer: $this\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tlet attr = $this.attr(\"data-jsdatepicker\");\r\n\t\t\tlet opt = {\r\n\t\t\t\tformat: \"dd MM yyyy\",\r\n\t\t\t\ttodayHighlight: \"true\",\r\n\t\t\t\ttemplates: {\r\n\t\t\t\t\tleftArrow: ``,\r\n\t\t\t\t\trightArrow: ``,\r\n\t\t\t\t},\r\n\t\t\t\tcontainer: $this.closest(\".o-calendarinput\"),\r\n\t\t\t\tkey: \"\",\r\n\t\t\t\tmaxViewMode: 0, //days\r\n\t\t\t};\r\n\t\t\tif (attr) {\r\n\t\t\t\topt = $.extend(opt, JSON5.parse(attr));\r\n\r\n\t\t\t\tif (opt.key) {\r\n\t\t\t\t\topt = $.extend(opt, options[opt.key]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (\r\n\t\t\t\topt.datesDisabled &&\r\n\t\t\t\topt.datesDisabled.length &&\r\n\t\t\t\topt.container.length\r\n\t\t\t) {\r\n\t\t\t\topt.container.addClass(\"has-disabled\");\r\n\t\t\t}\r\n\r\n\t\t\t$this.datepicker(opt);\r\n\t\t});\r\n\t}\r\n\r\n\t////////////////////\r\n\t// Card Animation //\r\n\t////////////////////\r\n\tconst $jsCards = $(\".o-card--feature:not(.no-animation)\");\r\n\tif ($jsCards.length) {\r\n\t\t// if no-animation added, the only animation that works is the background-image on hover/focus\r\n\t\tCardAnimation.init($jsCards);\r\n\t}\r\n\r\n\t//////////////////////\r\n\t// ContentAnimation //\r\n\t//////////////////////\r\n\tconst $jsContentSection = $(\r\n\t\t\".c-content__section:not(.c-content__section--c-weddings)\"\r\n\t);\r\n\tif ($jsContentSection.length) {\r\n\t\tContentAnimation.init($jsContentSection);\r\n\t}\r\n\r\n\t///////////////////\r\n\t// Content Pager //\r\n\t///////////////////\r\n\tconst $contentPager = $(\".js-contentpager\");\r\n\tif ($contentPager.length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\t() => {\r\n\t\t\t\tconst ContentPager = require(\"./partials/ContentPager\");\r\n\t\t\t\tnew ContentPager($contentPager);\r\n\t\t\t},\r\n\t\t\t\"contentpager\"\r\n\t\t);\r\n\t}\r\n\r\n\tconst $socialStream = $(\"[data-socialstream]\");\r\n\tif ($socialStream.length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\t() => {\r\n\t\t\t\tconst SocialStream = require(\"./partials/SocialStream\");\r\n\t\t\t\t$socialStream.each(function() {\r\n\t\t\t\t\tconst ss = new SocialStream($(this));\r\n\t\t\t\t\tss.promise.then(function() {\r\n\t\t\t\t\t\tnew LazyLoad({ elements_selector: \".js-lazy\" });\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\"socialstream\"\r\n\t\t);\r\n\t}\r\n\r\n\t// Herbarium Progress\r\n\tconst $herbariumProgress = $(\"[data-herbariumprogress]\");\r\n\tif ($herbariumProgress.length) {\r\n\t\tconst config = {\r\n\t\t\tthreshold: 1\r\n\t\t};\r\n\t\tlet isLoaded;\r\n\r\n\t\tconst observer = new IntersectionObserver((entries, self) => {\r\n\t\t\tentries.forEach(entry => {\r\n\t\t\t\tif (!isLoaded && entry.isIntersecting) {\r\n\t\t\t\t\tself.unobserve($herbariumProgress[0]);\r\n\t\t\t\t\trequire.ensure(\r\n\t\t\t\t\t\t[],\r\n\t\t\t\t\t\t() => {\r\n\t\t\t\t\t\t\trequire(\"./modules/herbariumprogress\")(\r\n\t\t\t\t\t\t\t\t$herbariumProgress\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tisLoaded = true;\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"herbariumprogress\"\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}, config);\r\n\r\n\t\tobserver.observe($herbariumProgress[0]);\r\n\t}\r\n\r\n\tconst $herbariumGallery = $(\"[data-herbariumgallery]\");\r\n\tif ($herbariumGallery.length) {\r\n\t\tlet isLoaded;\r\n\r\n\t\tconst observer = new IntersectionObserver((entries, self) => {\r\n\t\t\tentries.forEach(entry => {\r\n\t\t\t\tif (!isLoaded && entry.isIntersecting) {\r\n\t\t\t\t\tself.unobserve($herbariumGallery[0]);\r\n\t\t\t\t\trequire.ensure(\r\n\t\t\t\t\t\t[],\r\n\t\t\t\t\t\t() => {\r\n\t\t\t\t\t\t\trequire(\"./modules/herbariumgallery\")(\r\n\t\t\t\t\t\t\t\t$herbariumGallery\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"herbariumgallery\"\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tobserver.observe($herbariumGallery[0]);\r\n\t}\r\n\r\n\t// Timepicker not accessible\r\n\t// const $timepicker = $(\"[data-timepicker]\");\r\n\t// if ($timepicker.length) {\r\n\t// \trequire.ensure(\r\n\t// \t\t[],\r\n\t// \t\t() => {\r\n\t// \t\t\trequire(\"./custom_vendors/wickedpicker/src/wickedpicker\");\r\n\t// \t\t\trequire(\"./custom_vendors/wickedpicker/stylesheets/wickedpicker.css\");\r\n\t// \t\t\t$timepicker.each(function() {\r\n\t// \t\t\t\tconst $this = $(this);\r\n\t// \t\t\t\t$this\r\n\t// \t\t\t\t\t.on(\"blur\", function() {\r\n\t// \t\t\t\t\t\t$this.wickedpicker(\"hide\");\r\n\t// \t\t\t\t\t})\r\n\t// \t\t\t\t\t.wickedpicker(\r\n\t// \t\t\t\t\t\tJSON5.parse($this.attr(\"data-timepicker\"))\r\n\t// \t\t\t\t\t);\r\n\t// \t\t\t});\r\n\t// \t\t},\r\n\t// \t\t\"timepicker\"\r\n\t// \t);\r\n\t// }\r\n\r\n\t//////////\r\n\t// Misc //\r\n\t//////////\r\n\tHeaderUtil.initMegamenu();\r\n\tHeaderUtil.initClearSearch();\r\n\tHeaderUtil.initSearchButtonClick();\r\n\tHeaderUtil.initCloseOffCanvas();\r\n\tFooterUtil.initGotopColorAdjuster();\r\n\r\n\t///////////////////////////////////////\r\n\t// Give title to the tabs navigation //\r\n\t///////////////////////////////////////\r\n\tconst $tabs = $(\".o-tabs\");\r\n\t$tabs.each(function(i, val) {\r\n\t\tlet $this = $(this);\r\n\t\t$this\r\n\t\t\t.find(\".o-tabs__nav-link\")\r\n\t\t\t.each(function(i) {\r\n\t\t\t\tlet $el = $(this);\r\n\t\t\t\t$el.text(\r\n\t\t\t\t\t$this\r\n\t\t\t\t\t\t.find(\"data-tab-title\")\r\n\t\t\t\t\t\t.eq(i)\r\n\t\t\t\t\t\t.attr(\"data-tab-title\")\r\n\t\t\t\t);\r\n\t\t\t})\r\n\t\t\t.on(\"click\", function(e) {\r\n\t\t\t\tconst $this = $(this);\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\tif ($this.hasClass(\"is-disabled\")) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t});\r\n\r\n\t//////////////\r\n\t// Main Map //\r\n\t//////////////\r\n\tif ($(\"#map\").length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\tfunction() {\r\n\t\t\t\tconst MapUtil = require(\"./partials/MapUtil\");\r\n\t\t\t\tMapUtil.init();\r\n\t\t\t},\r\n\t\t\t\"map\"\r\n\t\t);\r\n\t}\r\n\r\n\tconst $bluemountainMap = $(\"[data-bluemountainmap]\");\r\n\tif ($(\"[data-bluemountainmap]\").length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\tfunction() {\r\n\t\t\t\tconst bluemountainMap = require(\"./modules/bluemountainmap\");\r\n\t\t\t\tbluemountainMap(\r\n\t\t\t\t\t$bluemountainMap[0],\r\n\t\t\t\t\t$bluemountainMap,\r\n\t\t\t\t\tJSON5.parse($bluemountainMap.attr(\"data-bluemountainmap\"))\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\t\"bluemountainmap\"\r\n\t\t);\r\n\t}\r\n\r\n\t// Wingtags Map\r\n\tconst $wingtagsMap = $(\"#wingtags-map\");\r\n\tif ($wingtagsMap.length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\tfunction() {\r\n\t\t\t\tconst title = $wingtagsMap.data(\"title\");\r\n\t\t\t\tconst apiKey = $wingtagsMap.data(\"apiKey\");\r\n\t\t\t\tconst WingtagsMap = require(\"./components/WingtagsMap/WingtagsMap\");\r\n\t\t\t\tconst WingtagsMapStore = require(\"./store/WingtagsMapStore\");\r\n\t\t\t\tconst store = new WingtagsMapStore();\r\n\t\t\t\tReactDOM.render(\r\n\t\t\t\t\t,\r\n\t\t\t\t\t$wingtagsMap[0]\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\t\"wingtagsmap\"\r\n\t\t);\r\n\t}\r\n\r\n\t//////////////////////////////////////////////\r\n\t// LazyLoad Images on collapseList and Tabs //\r\n\t//////////////////////////////////////////////\r\n\t$(\".o-tabs, .o-collapselist\").on(\"shown.bs.tab shown.bs.collapse\", function(\r\n\t\te\r\n\t) {\r\n\t\tlet $activeView = $(e.target);\r\n\t\tif ($activeView.find(\".js-lazy\").length) {\r\n\t\t\tmyLazyLoad.update();\r\n\t\t}\r\n\t});\r\n\r\n\t//////////////////////\r\n\t// Responsive Table //\r\n\t//////////////////////\r\n\tlet $table = $(\".o-richtext table:not([class])\");\r\n\tif ($table.length) {\r\n\t\t$table.wrap('
');\r\n\t}\r\n\r\n\t/////////////////\r\n\t// Video Popup //\r\n\t/////////////////\r\n\tconst $videopopup = $(\".js-videopopup\").filter(function() {\r\n\t\treturn $(this)\r\n\t\t\t.attr(\"href\")\r\n\t\t\t.match(/^.+(youtube.com|vimeo.com)/gi);\r\n\t});\r\n\tconst $videopopupinline = $(\".js-videopopup-inline\");\r\n\tif ($videopopup.length || $videopopupinline) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\tfunction() {\r\n\t\t\t\trequire(\"magnific-popup\");\r\n\t\t\t\tconst wurl = require(\"wurl\");\r\n\t\t\t\t$videopopup.magnificPopup({\r\n\t\t\t\t\ttype: \"iframe\",\r\n\t\t\t\t\tiframe: {\r\n\t\t\t\t\t\tpatterns: {\r\n\t\t\t\t\t\t\tyoutube: {\r\n\t\t\t\t\t\t\t\tindex: \"youtube.com/\", // String that detects type of video (in this case YouTube). Simply via url.indexOf(index).\r\n\t\t\t\t\t\t\t\t// String that splits URL in a two parts, second part should be %id%\r\n\t\t\t\t\t\t\t\t// Or null - full URL will be returned\r\n\t\t\t\t\t\t\t\t// Or a function that should return %id%, for example:\r\n\t\t\t\t\t\t\t\tid: function(url) {\r\n\t\t\t\t\t\t\t\t\treturn wurl(\"?v\", url);\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tsrc: \"//www.youtube.com/embed/%id%?autoplay=1\" // URL that will be set as a source for iframe.\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tvimeo: {\r\n\t\t\t\t\t\t\t\tindex: \"vimeo.com/\",\r\n\t\t\t\t\t\t\t\tid: function(url) {\r\n\t\t\t\t\t\t\t\t\treturn wurl(\"1\", url);\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tsrc: \"//player.vimeo.com/video/%id%?autoplay=1\"\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// you may add here more sources\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\t$videopopupinline.magnificPopup({\r\n\t\t\t\t\ttype: \"inline\",\r\n\t\t\t\t\tmainClass: \"mfp-inline-video\"\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\"videopopup\"\r\n\t\t);\r\n\t}\r\n\r\n\t// Tab Nav Mobile Scroller\r\n\tconst $tabNavScrolller = $(\"[data-tabnavscroller]\");\r\n\tif ($tabNavScrolller.length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\t() => {\r\n\t\t\t\trequire(\"./partials/tabnavscroller\")($tabNavScrolller);\r\n\t\t\t},\r\n\t\t\t\"tabnavscroller\"\r\n\t\t);\r\n\t}\r\n\r\n\t//////////////////////\r\n\t// BizForm Checkbox //\r\n\t//////////////////////\r\n\t$('.bizform input[type=\"checkbox\"]').each(function() {\r\n\t\tconst $this = $(this);\r\n\t\tconst id = $this.attr(\"id\");\r\n\t\tconst $label = $this.next(`label[for=\"${id}\"]`).addClass(\"o-checkbox\");\r\n\t\tconst text = $label.html();\r\n\r\n\t\t// label\r\n\t\t$label.html(\r\n\t\t\t`${text}`\r\n\t\t);\r\n\r\n\t\t// append the checkbox to label\r\n\t\t$this.addClass(\"sr-only\").prependTo($label);\r\n\t});\r\n\r\n\t// Give offset to in-page link due to sticky header\r\n\t$('.o-richtext a[href^=\"#\"]:not([data-toggle])').on(\"click\", function(ev) {\r\n\t\tev.preventDefault();\r\n\t\t$.scrollTo($($(this).attr(\"href\")), {\r\n\t\t\toffset: { top: -$(\".c-header\").outerHeight() }\r\n\t\t});\r\n\t});\r\n\r\n\t// Flying Donor\r\n\tconst $flyingdonor = $(\"[data-flyingdonor]\");\r\n\tif ($flyingdonor.length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\t() => {\r\n\t\t\t\trequire(\"./modules/flyingdonor\")($flyingdonor);\r\n\t\t\t},\r\n\t\t\t\"flyingdonor\"\r\n\t\t);\r\n\t}\r\n\r\n\t// Weddings page\r\n\tconst $weddings = $(\"[data-weddings]\");\r\n\tif ($weddings.length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\t() => {\r\n\t\t\t\trequire(\"./modules/weddings\")($weddings);\r\n\t\t\t},\r\n\t\t\t\"weddings\"\r\n\t\t);\r\n\t}\r\n\r\n\t// const $donatepage = $('[data-donatepage]');\r\n\t// if($donatepage.length){\r\n\t// \trequire.ensure([], () => {\r\n\t// \t\trequire('./modules/donatepage')($donatepage, JSON5.parse($donatepage.attr('data-donatepage')));\r\n\t// \t}, 'donatepage')\r\n\t// }\r\n\r\n\r\n\tconst $homefeatures = $(\"[data-homefeatures]\");\r\n\tif($homefeatures.length) {\r\n\t\trequire.ensure(\r\n\t\t\t[],\r\n\t\t\t() => {\r\n\t\t\t\tconst fn = require(\"./modules/homefeatures\")\r\n\t\t\t\t$homefeatures.each(function() {\r\n\t\t\t\t\tconst $this = $(this)\r\n\t\t\t\t\tfn(this, $this, JSON5.parse($this.attr('data-homefeatures')))\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\"homefeatures\"\r\n\t\t);\r\n\t}\r\n\r\n\r\n\t// Dropdown Menu (close only click outside)\r\n\t$(document).on(\"click\", \".js-dropdown-menu--closeonclickoutside\", function (e) {\r\n\t\te.stopPropagation();\r\n\t});\r\n\r\n\t/////////\r\n\t// SSM //\r\n\t/////////\r\n\tssm.addStates([\r\n\t\t{\r\n\t\t\tid: \"xs\",\r\n\t\t\tquery: \"(max-width: 767px)\",\r\n\t\t\tonEnter: () => {\r\n\t\t\t\tconsole.info(\"enter <=767px\");\r\n\t\t\t\tskrollr.init().destroy();\r\n\t\t\t\t$(\".o-hero--parallax\").removeAttr(\"style\");\r\n\t\t\t},\r\n\t\t\tonLeave: () => {}\r\n\t\t},\r\n\t\t{\r\n\t\t\tid: \"sm\",\r\n\t\t\tquery: \"(max-width: 991px)\",\r\n\t\t\tonEnter: () => {\r\n\t\t\t\tconsole.info(\"enter <=991px\");\r\n\t\t\t},\r\n\t\t\tonLeave: () => {\r\n\t\t\t\tconsole.info(\"leave <=991px\");\r\n\t\t\t}\r\n\t\t},\r\n\t\t{\r\n\t\t\tid: \"md\",\r\n\t\t\tquery: \"(max-width: 1199px)\",\r\n\t\t\tonEnter: () => {\r\n\t\t\t\tconsole.info(\"enter <=1199px\");\r\n\t\t\t},\r\n\t\t\tonLeave: () => {\r\n\t\t\t\tconsole.info(\"leave <= 1199px\");\r\n\t\t\t}\r\n\t\t},\r\n\t\t{\r\n\t\t\tid: \"desktop\",\r\n\t\t\tquery: \"(min-width: 992px)\",\r\n\t\t\tonEnter: () => {\r\n\t\t\t\tconsole.info(\"enter >= 992px\");\r\n\t\t\t\t$(\".o-hero--parallax\").css(\"height\", window.innerHeight - 64);\r\n\t\t\t},\r\n\t\t\tonLeave: () => {}\r\n\t\t}\r\n\t]);\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/_js/main.js","'use strict';\r\nimport ssm from 'simplestatemanager';\r\nimport throttle from 'raf-throttle';\r\n\r\nexport default class CardAnimation {\r\n static init($els) {\r\n \tssm.addStates([{\r\n\t\t\tid: 'cardFeatureAnimation-smmax',\r\n\t\t\tquery: '(max-width: 991px)',\r\n\t\t\tonEnter: () => {\r\n\t\t\t\tthis.removeAnimations($els);\r\n\t\t\t}\r\n\t\t},\r\n\t\t{\r\n\t\t\tid: 'cardFeatureAnimation-md',\r\n\t\t\tquery: '(min-width: 992px) and (max-width: 1361px)',\r\n\t\t\tonEnter: () => {\r\n\t\t\t\tthis.initAnimations($els);\r\n\t\t\t}\r\n\t\t},\r\n\t\t{\r\n\t\t\tid: 'cardFeatureAnimation-lg',\r\n\t\t\tquery: '(min-width: 1362px)',\r\n\t\t\tonEnter: () => {\r\n\t\t\t\tthis.initAnimations($els);\r\n\t\t\t}\r\n\t\t}]);\r\n }\r\n\r\n static adjustSubtitleMaxWidth($els){\r\n \tif($els){\r\n \t\t$els.each(function(){\r\n \t\t\tconst $this = $(this);\r\n \t\t\tconst $cardSubtitle = $this.find('.o-card__subtitle');\r\n \t\t\t$cardSubtitle.css('max-width', '');\r\n \t\t\tif(window.innerWidth > 768){\r\n \t\t\t\t$cardSubtitle.css('max-width', $this.width());\r\n \t\t\t}\r\n \t\t});\r\n \t}\r\n }\r\n\r\n static initAnimations($els, isAdjustingSubtitle){\r\n \tif($els){\r\n \t\tconst that = this;\r\n \t\tconst featureInitiationHandler = function(e){\r\n \t\t\tlet $this = $(this);\r\n\t\t\t\te.stopImmediatePropagation();\r\n\t\t\t\tthat.setFeatureAnimation($this, e.type);\r\n\t\t\t};\r\n\r\n\t\t\tconst resetFeatureHandler = function(e){\r\n\t\t\t\tlet $this = $(this);\r\n\t\t\t\te.stopImmediatePropagation();\r\n\t\t\t\tthat.resetFeatureAnimation($this, e.type);\r\n\t\t\t};\r\n\r\n\t \tthis.removeAnimations($els);\r\n\t \t$els.addClass('no-animation');\r\n\r\n\t $('body')\r\n\t \t.off('mouseenter focusin', '.o-card--feature', featureInitiationHandler)\r\n\t\t\t\t.on('mouseenter focusin', '.o-card--feature', featureInitiationHandler)\r\n\t\t\t\t.off('mouseleave focusout', '.o-card--feature', resetFeatureHandler)\r\n\t\t\t\t.on('mouseleave focusout', '.o-card--feature', resetFeatureHandler);\r\n\r\n\r\n\t if(!!isAdjustingSubtitle){\r\n\t\t const adjustSubtitleMaxWidth = () => { this.adjustSubtitleMaxWidth($els); }\r\n\t\t $(window).on('resize', throttle(adjustSubtitleMaxWidth));\r\n\t\t this.adjustSubtitleMaxWidth($els);\r\n\t }\r\n \t}\r\n }\r\n\r\n static removeAnimations($els){\r\n \tconst that = this;\r\n \t$els.each(function() {\r\n const $this = $(this);\r\n\r\n if ($this.hasClass('o-card--feature')) {\r\n \tthat.removeAnimation($this);\r\n }\r\n });\r\n }\r\n\r\n static removeAnimation($el){\r\n \t$el.find('.o-card__body').removeAttr('style');\r\n\t\t$el.find('.o-card__desc').removeAttr('style');\r\n \t$el.removeClass('.no-animation');\r\n\t}\r\n\r\n\tstatic setEventType($el, eventType){\r\n\t\t$el.data(eventType.includes('focus') ? 'focusType' : 'mouseType', eventType);\r\n\t}\r\n\r\n\tstatic resetFeatureAnimation($el, eventType) {\r\n\t\tif (!$el.hasClass('no-animation') && !$el.hasClass('is-shortcontent') || window.innerWidth < 992) return;\r\n\r\n\t\tconst $oCardBody = $el.find('.o-card__body:not(.is-fakebody)')\r\n\t\tconst { top, right } = $oCardBody.data('initialPosition');\r\n\t\tconst mouseType = $el.data('mouseType');\r\n\t\tconst focusType = $el.data('focusType');\r\n\r\n\t\tif ((eventType == 'mouseleave' && mouseType == 'mouseenter' && focusType !== 'focusin') ||\r\n\t\t(eventType == 'focusout' && focusType == 'focusin' && mouseType !== 'mouseenter')){\r\n\t\t\t$oCardBody.attr('style', `top: ${top}px; right: ${right}px`);\r\n\t\t\t$el.removeClass('is-interacted');\r\n\t\t}\r\n\t\tthis.setEventType($el, eventType);\r\n\r\n\t}\r\n\r\n static setFeatureAnimation($el, eventType){\r\n \tconsole.log('setFeatureAnimation');\r\n\t\tthis.setEventType($el, eventType);\r\n\r\n \tif ((!$el.hasClass('no-animation') && !$el.hasClass('is-shortcontent')) || $el.hasClass('is-interacted') || window.innerWidth < 992) return;\r\n\r\n \tconst $oCardBody = $el.find('.o-card__body:not(.is-fakebody)').removeAttr('style');\r\n \tconst $oCardFakeBody = $el.find('.o-card__body.is-fakebody').removeAttr('style');\r\n\t\tconst $oCardBodyDesc = $el.find('.o-card__desc').removeAttr('style');\r\n\t\tconst oCardBody = $oCardBody[0];\r\n\t\tconst oCardBodyRect = oCardBody.getBoundingClientRect();\r\n\t\tconst oCardRect = $el[0].getBoundingClientRect();\r\n\t\tconst oCardBodyTop = oCardBodyRect.top - oCardRect.top;\r\n\t\tconst oCardBodyRight = oCardRect.width - oCardBodyRect.width;\r\n\r\n\t\t// set the position for all the card\r\n\t\tconst initialPosition = {top: oCardBodyTop, right: oCardBodyRight};\r\n\t\t$oCardBody.css(initialPosition);\r\n\t\tif(!$oCardBody.data('initialPosition')){\r\n\t\t\t$oCardBody.data('initialPosition',initialPosition);\r\n\t\t}\r\n\r\n\t\t$oCardBodyDesc.css({height: '100%', width: '100%'});\r\n\r\n\t\t//get the fake body height\r\n\t\tconst oCardFakeBodyHeight = $oCardFakeBody[0].getBoundingClientRect().height;\r\n\r\n\t\t//get the final body animated height\r\n\t\tconst finalyBodyAnimatedHeight = $el[0].getBoundingClientRect().height - 24;\r\n\r\n\t\t//if body height < the final body animated height\r\n\t\t//add fixed top !important\r\n\t\tif(oCardFakeBodyHeight < finalyBodyAnimatedHeight){\r\n\t\t\t// Min top value is 12px\r\n\t\t\toCardBody.style.setProperty('top', `${Math.max($oCardFakeBody[0].getBoundingClientRect().top - oCardRect.top, 12)}px`, 'important');\r\n\t\t\t$el.addClass('is-shortcontent');\r\n\t\t}\r\n\r\n\t\t// enable animation\r\n\t\tsetTimeout(function(){\r\n\t\t\t$el.addClass('is-interacted').removeClass('no-animation');\r\n\t\t}, 80);\r\n\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/_js/partials/CardAnimation.js","'use strict';\r\nimport 'waypoints/lib/shortcuts/inview';\r\nexport default class ContentAnimation{\r\n\tstatic init(){\r\n\t\tconst addDelayFn = function(i){\r\n\t\t\t$(this).css('animation-delay', `${i *.2}s`);\r\n\t\t};\r\n\r\n\t\t$('.is-card-stagger').each(function(){$(this).find('.o-card').each(addDelayFn);});\r\n\r\n\t\t$('.c-content__section--modest').each(function(){ $(this).find('.o-modest__col').each(addDelayFn); });\r\n\r\n\t\t$('.c-content__section').each(function(){\r\n\t\t\tconst $this = $(this)[0];\r\n\t\t\tnew Waypoint.Inview({\r\n\t\t\t\telement: $this,\r\n\t\t\t\tenter(dir){\r\n\t\t\t\t\tdir=='down' && $(this.element).addClass('animate');\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}); \r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/_js/partials/ContentAnimation.js","\"use strict\";\r\nimport \"waypoints/lib/shortcuts/inview\";\r\nexport default class ContentAnimationWeddings {\r\n\tstatic init(el) {\r\n\t\tel.each(function() {\r\n\t\t\t$(this)\r\n\t\t\t\t.find(\r\n\t\t\t\t\t\".o-card, .o-slider--blockquote.o-card-col .o-slider__slides\"\r\n\t\t\t\t)\r\n\t\t\t\t.filter(function() {\r\n\t\t\t\t\treturn !$(this).parent(\".item--not-active\").length;\r\n\t\t\t\t})\r\n\t\t\t\t.each(function(i) {\r\n\t\t\t\t\t$(this).css(\"animation-delay\", `${i * 0.2}s`);\r\n\t\t\t\t});\r\n\t\t});\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/_js/partials/ContentAnimationWeddings.js","'use strict';\r\n\r\nexport default class FooterUtil{\r\n\tstatic initGotopColorAdjuster(){\r\n\t\tconst goTopVpos = 74;\r\n\t\tconst $footer = $('.c-footer');\r\n\t\tconst $relatedContent = $('.c-content__section--related');\r\n\t\tconst $gotop = $('.o-gotop');\r\n\t\tconst vh = Waypoint.viewportHeight();\r\n\r\n\t\tconst downOffset = () => vh - goTopVpos;\r\n\t\tconst downHandler = function(dir){\r\n\t\t\tif(dir == 'down'){\r\n\t\t\t\t$gotop.addClass('is-light');\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst upOffset = () => vh;\r\n\r\n\t\t//////////\r\n\t\t// Down //\r\n\t\t//////////\r\n\t\t$footer.waypoint({\r\n\t\t\thandler: downHandler,\r\n\t\t\toffset: downOffset\r\n\t\t});\r\n\t\t$relatedContent.waypoint({\r\n\t\t\thandler: downHandler,\r\n\t\t\toffset: downOffset\r\n\t\t});\r\n\r\n\t\t////////\r\n\t\t// Up //\r\n\t\t////////\r\n\t\t$footer.waypoint({\r\n\t\t\thandler: function(dir){\r\n\t\t\t\tif(dir == 'up'){\r\n\t\t\t\t\tif(!$relatedContent.length){\r\n\t\t\t\t\t\t$gotop.removeClass('is-light');\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\toffset: function(){\r\n\t\t\t\t// vertical position of the gotop = 74\r\n\t\t\t\treturn vh;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$relatedContent.waypoint({\r\n\t\t\thandler: function(dir){\r\n\t\t\t\tif(dir == 'up'){\r\n\t\t\t\t\t$gotop.removeClass('is-light');\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\toffset: upOffset\r\n\t\t});\r\n\r\n\t\t$('.c-main').waypoint({\r\n\t\t\thandler: (dir)=>{\r\n\t\t\t\tif(dir == 'down'){\r\n\t\t\t\t\t$gotop.addClass('active').removeClass('is-light');\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$gotop.removeClass('active');\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/_js/partials/FooterUtil.js","'use strict';\r\nimport './jquery-accessibleMegaMenu';\r\nimport JSON5 from 'json5';\r\nrequire('./StickyHeader');\r\n\r\n\r\nfunction debounce(func, wait, immediate) {\r\n\tvar timeout;\r\n\treturn function() {\r\n\t\tvar context = this, args = arguments;\r\n\t\tvar later = function() {\r\n\t\t\ttimeout = null;\r\n\t\t\tif (!immediate) func.apply(context, args);\r\n\t\t};\r\n\t\tvar callNow = immediate && !timeout;\r\n\t\tclearTimeout(timeout);\r\n\t\ttimeout = setTimeout(later, wait);\r\n\t\tif (callNow) func.apply(context, args);\r\n\t};\r\n};\r\n\r\nexport default class HeaderUtil {\r\n static initMegamenu() {\r\n const options = {\r\n \"mainnav\": {\r\n /* prefix for generated unique id attributes, which are required\r\n \t to indicate aria-owns, aria-controls and aria-labelledby */\r\n uuidPrefix: \"mainnav-megamenu\",\r\n\r\n /* css class used to define the megamenu styling */\r\n menuClass: \"c-nav-main__menu\",\r\n\r\n /* css class for a top-level navigation item in the megamenu */\r\n topNavItemClass: \"c-nav-main__item\",\r\n\r\n /* css class for a megamenu panel */\r\n panelClass: \"c-nav-main__subnav\",\r\n\r\n /* css class for a group of items within a megamenu panel */\r\n panelGroupClass: \"c-nav-main__panel\",\r\n\r\n /* css class for the hover state */\r\n hoverClass: \"is-hover\",\r\n\r\n /* css class for the focus state */\r\n focusClass: \"is-focus\",\r\n\r\n /* css class for the open state */\r\n openClass: \"is-open\",\r\n\r\n // hover intent\r\n openDelay: 50\r\n }\r\n };\r\n\r\n $('[data-megamenu]').each(function() {\r\n let $this = $(this);\r\n let opt = options[$this.attr('data-megamenu')];\r\n if (opt) {\r\n $this.accessibleMegaMenu(opt);\r\n }\r\n });\r\n\r\n console.info('HeaderUtil: initMegamenu');\r\n }\r\n\r\n static initCloseOffCanvas() {\r\n let $wrapper = $('.js-content-wrapper');\r\n\r\n const closeHandler = function() {\r\n\r\n if ($wrapper.hasClass('is-menu-active')) {\r\n $('.js-mobilemenutoggle').trigger('click');\r\n } else if ($wrapper.hasClass('is-search-active')) {\r\n \t$wrapper[0].classList.remove(...[...$wrapper[0].classList].filter(x=> x.match(/is-search-.*active/)));\r\n } else if ($wrapper.hasClass('is-listeroffcanvas-active')) {\r\n $('.js-listeroffcanvastoggle').trigger('click');\r\n }\r\n }\r\n\r\n $('.js-closeoffcanvas').off('click').click(closeHandler);\r\n $wrapper.on('keydown.dismiss.offcanvas', $.proxy(function(e){\r\n \te.which == 27 && closeHandler();\r\n }, this));\r\n }\r\n\r\n static initClearSearch() {\r\n // data-clearsearch=\"[target]\"\r\n $('[data-clearsearch]').off('click').click(function() {\r\n $($(this).data('clearsearch')).val('');\r\n });\r\n }\r\n\r\n static initSearchButtonClick() {\r\n $('.js-mainsearchbtn').click(function() {\r\n document.location.href = '/search?q=' + $(this).siblings('.js-inputsearch').val();\r\n });\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/_js/partials/HeaderUtil.js","import JSON5 from 'json5';\r\nrequire('jquery.scrollto');\r\n\r\nexport default class ScrollTo{\r\n\tconstructor($el){\r\n let selector = $el.selector;\r\n\r\n let callback = (e) => {\r\n \te.stopPropagation();\r\n let $this = $(e.currentTarget);\r\n if($this.data('scrollto')){\r\n e.preventDefault();\r\n var opt = JSON5.parse($this.data('scrollto'));\r\n\r\n if(opt.delay){\r\n setTimeout(function(){\r\n $.scrollTo(opt.target, opt.duration || 800, opt.settings);\r\n }, opt.delay || 0);\r\n }\r\n $.scrollTo(opt.target, opt.duration || 800, opt.settings);\r\n $(opt.target).focus();\r\n }\r\n };\r\n\r\n if(selector){\r\n $(document).on('click touchstart', selector, callback);\r\n } else{\r\n $el.on('click touchstart', callback);\r\n }\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/_js/partials/ScrollTo.js","'use strict';\r\nconst StickyHeader = (function(window, document) {\r\n\r\n\t\t// version 3.0 - MJF @ websemantics.uk 2017\r\n\t\tconst stickyClass = 'c-header';\r\n\t\tconst header = document.querySelector('.' + stickyClass);\r\n\t\tconst hiddenClass = 'is-scrolling-down';\r\n\t\tconst scrollUpClass = 'is-scrolling-up';\r\n\r\n\t\t// The amount of downward movement before header is hidden\r\n\t\tconst downTolerance = 8;\r\n\t\tlet hasScrolled = false;\r\n\t\tlet lastScrollTop = 0;\r\n\r\n\t\tvar _redraw = function() {\r\n\r\n\t\t\t\t// This is costly to performance but unavoidable\r\n\t\t\t\tconst pageY = window.pageYOffset;\r\n\r\n\t\t\t\t// Put it away\r\n\t\t\t\tif (pageY > (lastScrollTop + downTolerance)) {\r\n\t\t\t\t\t\theader.classList.add(hiddenClass);\r\n\t\t\t\t\t\theader.classList.remove(scrollUpClass);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Pull em down\r\n\t\t\t\tif (pageY < lastScrollTop || pageY <= 0) {\r\n\t\t\t\t\t\theader.classList.remove(hiddenClass);\r\n\t\t\t\t\t\theader.classList.add(scrollUpClass);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlastScrollTop = pageY;\r\n\t\t\t\thasScrolled = false;\r\n\t\t};\r\n\r\n\t\t// Important: keep this function as performant as possible!\r\n\t\tvar _onScroll = function() {\r\n\t\t\t\tif (!hasScrolled) {\r\n\t\t\t\t\t\twindow.requestAnimationFrame(_redraw);\r\n\t\t\t\t}\r\n\t\t\t\thasScrolled = true;\r\n\t\t};\r\n\r\n\t\twindow.addEventListener('scroll', _onScroll, false);\r\n\r\n}(window, document));\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/_js/partials/StickyHeader.js","'use strict';\r\nimport mh from 'jquery-match-height';\r\nimport JSON5 from 'json5';\r\n\r\n//////////////////\r\n// Match Height //\r\n//////////////////\r\n\r\n/**\r\n * Standard Match Height with some customisation\r\n * IMPORTANT: don't use data-mh\r\n * \r\n * 1. It can be grouped using data-mh-group, same as data-mh\r\n * 2. but can also set the options using data attribute as well i.e. data-mh-options\r\n * \r\n * data-mh-group is different from data-mh data-mh can be used natively straight from matchHeight \r\n * data-mh-group (require data-mh-options if needed) should be used like data-mh-group='groupName' that will be used as a selector\r\n * data-mh-options will be used for the options of the match height\r\n */\r\n\r\nlet $jsMh = $('[data-mh-group]');\r\nif ($jsMh.length) {\r\n let groupArray = [];\r\n $jsMh.each(function(i, el) {\r\n let $el = $(el);\r\n let mhOptions = $el.attr('data-mh-options');\r\n let mhGroup = $el.attr('data-mh-group');\r\n let jsMhOptions = {};\r\n if (mhGroup) {\r\n if (mhOptions) {\r\n jsMhOptions = JSON5.parse(mhOptions);\r\n }\r\n\r\n if (!(groupArray.filter(item => item.group == mhGroup)).length) {\r\n groupArray.push({ group: mhGroup, options: jsMhOptions });\r\n }\r\n }\r\n });\r\n\r\n groupArray.forEach(function(obj) {\r\n // if nonFlexBrowserOnly is enabled, check whether the browser is > ie9 or not\r\n // if it's <= ie9, proceed\r\n if(!(obj.options.nonFlexBrowserOnly && $('.lt-ie10').length == 0)){\r\n $(`[data-mh-group=\"${obj.group}\"]`).matchHeight(obj.options);\r\n }\r\n });\r\n}\n\n\n// WEBPACK FOOTER //\n// ./src/_js/partials/custom-matchheight.js","/**\r\n * Modified by Vic\r\n *\r\n * Fixed the touchscreen devices\r\n * 1. If the menu has a sub navigation, the menu needs a .has-sub class\r\n * 2. So when there's no subnav, it will directly go to the link\r\n * 3. If there's a subnav, clicking once, will open the subnav. Clickin on the parent menu again, will go to the link\r\n */\r\n\r\n\r\n/*\r\nCopyright Ā© 2013 Adobe Systems Incorporated.\r\n\r\nLicensed under the Apache License, Version 2.0 (the ā€œLicenseā€);\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an ā€œAS ISā€ BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\n\r\n/**\r\n * See http://jquery.com.\r\n * @name jquery\r\n * @class\r\n * See the jQuery Library (http://jquery.com) for full details. This just\r\n * documents the function and classes that are added to jQuery by this plug-in.\r\n */\r\n\r\n/**\r\n * See http://jquery.com\r\n * @name fn\r\n * @class\r\n * See the jQuery Library (http://jquery.com) for full details. This just\r\n * documents the function and classes that are added to jQuery by this plug-in.\r\n * @memberOf jquery\r\n */\r\n\r\n/**\r\n * @fileOverview accessibleMegaMenu plugin\r\n *\r\n *

Licensed under the Apache License, Version 2.0 (the ā€œLicenseā€)\r\n *
Copyright Ā© 2013 Adobe Systems Incorporated.\r\n *
Project page https://github.com/adobe-accessibility/Accessible-Mega-Menu\r\n * @version 0.1\r\n * @author Michael Jordan\r\n * @requires jquery\r\n */\r\n\r\n/*jslint browser: true, devel: true, plusplus: true, nomen: true */\r\n/*global jQuery */\r\n(function ($, window, document) {\r\n \"use strict\";\r\n var pluginName = \"accessibleMegaMenu\",\r\n defaults = {\r\n uuidPrefix: \"accessible-megamenu\", // unique ID's are required to indicate aria-owns, aria-controls and aria-labelledby\r\n menuClass: \"accessible-megamenu\", // default css class used to define the megamenu styling\r\n topNavItemClass: \"accessible-megamenu-top-nav-item\", // default css class for a top-level navigation item in the megamenu\r\n panelClass: \"accessible-megamenu-panel\", // default css class for a megamenu panel\r\n panelGroupClass: \"accessible-megamenu-panel-group\", // default css class for a group of items within a megamenu panel\r\n hoverClass: \"hover\", // default css class for the hover state\r\n focusClass: \"focus\", // default css class for the focus state\r\n openClass: \"open\", // default css class for the open state\r\n openDelay: 0 // default open delay when opening menu via mouseover\r\n },\r\n Keyboard = {\r\n BACKSPACE: 8,\r\n COMMA: 188,\r\n DELETE: 46,\r\n DOWN: 40,\r\n END: 35,\r\n ENTER: 13,\r\n ESCAPE: 27,\r\n HOME: 36,\r\n LEFT: 37,\r\n PAGE_DOWN: 34,\r\n PAGE_UP: 33,\r\n PERIOD: 190,\r\n RIGHT: 39,\r\n SPACE: 32,\r\n TAB: 9,\r\n UP: 38,\r\n keyMap: {\r\n 48: \"0\",\r\n 49: \"1\",\r\n 50: \"2\",\r\n 51: \"3\",\r\n 52: \"4\",\r\n 53: \"5\",\r\n 54: \"6\",\r\n 55: \"7\",\r\n 56: \"8\",\r\n 57: \"9\",\r\n 59: \";\",\r\n 65: \"a\",\r\n 66: \"b\",\r\n 67: \"c\",\r\n 68: \"d\",\r\n 69: \"e\",\r\n 70: \"f\",\r\n 71: \"g\",\r\n 72: \"h\",\r\n 73: \"i\",\r\n 74: \"j\",\r\n 75: \"k\",\r\n 76: \"l\",\r\n 77: \"m\",\r\n 78: \"n\",\r\n 79: \"o\",\r\n 80: \"p\",\r\n 81: \"q\",\r\n 82: \"r\",\r\n 83: \"s\",\r\n 84: \"t\",\r\n 85: \"u\",\r\n 86: \"v\",\r\n 87: \"w\",\r\n 88: \"x\",\r\n 89: \"y\",\r\n 90: \"z\",\r\n 96: \"0\",\r\n 97: \"1\",\r\n 98: \"2\",\r\n 99: \"3\",\r\n 100: \"4\",\r\n 101: \"5\",\r\n 102: \"6\",\r\n 103: \"7\",\r\n 104: \"8\",\r\n 105: \"9\",\r\n 190: \".\"\r\n }\r\n };\r\n /**\r\n * @desc Creates a new accessible mega menu instance.\r\n * @param {jquery} element\r\n * @param {object} [options] Mega Menu options\r\n * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby\r\n * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling\r\n * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu\r\n * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel\r\n * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel\r\n * @param {string} [options.hoverClass=hover] - CSS class for the hover state\r\n * @param {string} [options.focusClass=focus] - CSS class for the focus state\r\n * @param {string} [options.openClass=open] - CSS class for the open state\r\n * @constructor\r\n */\r\n function AccessibleMegaMenu(element, options) {\r\n this.element = element;\r\n\r\n // merge optional settings and defaults into settings\r\n this.settings = $.extend({}, defaults, options);\r\n\r\n this._defaults = defaults;\r\n this._name = pluginName;\r\n\r\n this.mouseTimeoutID = null;\r\n this.focusTimeoutID = null;\r\n this.mouseFocused = false;\r\n this.justFocused = false;\r\n\r\n this.init();\r\n }\r\n\r\n AccessibleMegaMenu.prototype = (function () {\r\n\r\n /* private attributes and methods ------------------------ */\r\n var uuid = 0,\r\n keydownTimeoutDuration = 1000,\r\n keydownSearchString = \"\",\r\n isTouch = typeof window.hasOwnProperty === \"function\" && !!window.hasOwnProperty(\"ontouchstart\"),\r\n _getPlugin,\r\n _addUniqueId,\r\n _togglePanel,\r\n _clickHandler,\r\n _clickOutsideHandler,\r\n _DOMAttrModifiedHandler,\r\n _focusInHandler,\r\n _focusOutHandler,\r\n _keyDownHandler,\r\n _mouseDownHandler,\r\n _mouseOverHandler,\r\n _mouseOutHandler,\r\n _toggleExpandedEventHandlers;\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_getPlugin\r\n * @desc Returns the parent accessibleMegaMenu instance for a given element\r\n * @param {jQuery} element\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _getPlugin = function (element) {\r\n return $(element).closest(':data(plugin_' + pluginName + ')').data(\"plugin_\" + pluginName);\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_addUniqueId\r\n * @desc Adds a unique id and element.\r\n * The id string starts with the\r\n * string defined in settings.uuidPrefix.\r\n * @param {jQuery} element\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _addUniqueId = function (element) {\r\n element = $(element);\r\n var settings = this.settings;\r\n if (!element.attr(\"id\")) {\r\n element.attr(\"id\", settings.uuidPrefix + \"-\" + new Date().getTime() + \"-\" + (++uuid));\r\n }\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_togglePanel\r\n * @desc Toggle the display of mega menu panels in response to an event.\r\n * The optional boolean value 'hide' forces all panels to hide.\r\n * @param {event} event\r\n * @param {Boolean} [hide] Hide all mega menu panels when true\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _togglePanel = function (event, hide) {\r\n var target = $(event.target),\r\n that = this,\r\n settings = this.settings,\r\n menu = this.menu,\r\n topli = target.closest('.' + settings.topNavItemClass),\r\n panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass),\r\n newfocus;\r\n\r\n _toggleExpandedEventHandlers.call(this, true);\r\n\r\n if (hide) {\r\n topli = menu.find('.' + settings.topNavItemClass + ' .' + settings.openClass + ':first').closest('.' + settings.topNavItemClass);\r\n if (!(topli.is(event.relatedTarget) || topli.has(event.relatedTarget).length > 0)) {\r\n if ((event.type === 'mouseout' || event.type === 'focusout') && topli.has(document.activeElement).length > 0) {\r\n return;\r\n }\r\n topli.find('[aria-expanded]')\r\n .attr('aria-expanded', 'false')\r\n .removeClass(settings.openClass)\r\n .filter('.' + settings.panelClass)\r\n .attr('aria-hidden', 'true');\r\n if ((event.type === 'keydown' && event.keyCode === Keyboard.ESCAPE) || event.type === 'DOMAttrModified') {\r\n newfocus = topli.find(':tabbable:first');\r\n setTimeout(function () {\r\n menu.find('[aria-expanded].' + that.settings.panelClass).off('DOMAttrModified.accessible-megamenu');\r\n newfocus.focus();\r\n that.justFocused = false;\r\n }, 99);\r\n }\r\n } else if (topli.length === 0) {\r\n menu.find('[aria-expanded=true]')\r\n .attr('aria-expanded', 'false')\r\n .removeClass(settings.openClass)\r\n .filter('.' + settings.panelClass)\r\n .attr('aria-hidden', 'true');\r\n }\r\n } else {\r\n clearTimeout(that.focusTimeoutID);\r\n topli.siblings()\r\n .find('[aria-expanded]')\r\n .attr('aria-expanded', 'false')\r\n .removeClass(settings.openClass)\r\n .filter('.' + settings.panelClass)\r\n .attr('aria-hidden', 'true');\r\n topli.find('[aria-expanded]')\r\n .attr('aria-expanded', 'true')\r\n .addClass(settings.openClass)\r\n .filter('.' + settings.panelClass)\r\n .attr('aria-hidden', 'false');\r\n if (event.type === 'mouseover' && target.is(':tabbable') && topli.length === 1 && panel.length === 0 && menu.has(document.activeElement).length > 0) {\r\n target.focus();\r\n that.justFocused = false;\r\n }\r\n\r\n _toggleExpandedEventHandlers.call(that);\r\n }\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_clickHandler\r\n * @desc Handle click event on mega menu item\r\n * @param {event} Event object\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _clickHandler = function (event) {\r\n var target = $(event.target).closest(':tabbable'),\r\n topli = target.closest('.' + this.settings.topNavItemClass),\r\n panel = target.closest('.' + this.settings.panelClass);\r\n\r\n if (topli.length === 1\r\n && panel.length === 0\r\n && topli.find('.' + this.settings.panelClass).length === 1) {\r\n if (!target.hasClass(this.settings.openClass)) {\r\n if(target.closest('.has-sub').length){\r\n\t event.preventDefault();\r\n \t event.stopPropagation();\r\n \t\t_togglePanel.call(this, event);\r\n \t this.justFocused = false;\r\n }\r\n } else {\r\n if (this.justFocused) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.justFocused = false;\r\n } else if (isTouch) {\r\n // event.preventDefault();\r\n // event.stopPropagation();\r\n // _togglePanel.call(this, event, target.hasClass(this.settings.openClass));\r\n }\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_clickOutsideHandler\r\n * @desc Handle click event outside of a the megamenu\r\n * @param {event} Event object\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _clickOutsideHandler = function (event) {\r\n if ($(event.target).closest(this.menu).length === 0) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n _togglePanel.call(this, event, true);\r\n }\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_DOMAttrModifiedHandler\r\n * @desc Handle DOMAttrModified event on panel to respond to Windows 8 Narrator ExpandCollapse pattern\r\n * @param {event} Event object\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _DOMAttrModifiedHandler = function (event) {\r\n if (event.originalEvent.attrName === 'aria-expanded'\r\n && event.originalEvent.newValue === 'false'\r\n && $(event.target).hasClass(this.settings.openClass)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n _togglePanel.call(this, event, true);\r\n }\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_focusInHandler\r\n * @desc Handle focusin event on mega menu item.\r\n * @param {event} Event object\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _focusInHandler = function (event) {\r\n clearTimeout(this.focusTimeoutID);\r\n var target = $(event.target),\r\n panel = target.closest('.' + this.settings.panelClass);\r\n target\r\n .addClass(this.settings.focusClass)\r\n .on('click.accessible-megamenu', $.proxy(_clickHandler, this));\r\n this.justFocused = !this.mouseFocused;\r\n this.mouseFocused = false;\r\n if (this.panels.not(panel).filter('.' + this.settings.openClass).length) {\r\n _togglePanel.call(this, event);\r\n }\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_focusOutHandler\r\n * @desc Handle focusout event on mega menu item.\r\n * @param {event} Event object\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _focusOutHandler = function (event) {\r\n this.justFocused = false;\r\n var that = this,\r\n target = $(event.target),\r\n topli = target.closest('.' + this.settings.topNavItemClass),\r\n keepOpen = false;\r\n target\r\n .removeClass(this.settings.focusClass)\r\n .off('click.accessible-megamenu');\r\n\r\n if (window.cvox) {\r\n // If ChromeVox is running...\r\n that.focusTimeoutID = setTimeout(function () {\r\n window.cvox.Api.getCurrentNode(function (node) {\r\n if (topli.has(node).length) {\r\n // and the current node being voiced is in\r\n // the mega menu, clearTimeout,\r\n // so the panel stays open.\r\n clearTimeout(that.focusTimeoutID);\r\n } else {\r\n that.focusTimeoutID = setTimeout(function (scope, event, hide) {\r\n _togglePanel.call(scope, event, hide);\r\n }, 275, that, event, true);\r\n }\r\n });\r\n }, 25);\r\n } else {\r\n that.focusTimeoutID = setTimeout(function () {\r\n _togglePanel.call(that, event, true);\r\n }, 300);\r\n }\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_keyDownHandler\r\n * @desc Handle keydown event on mega menu.\r\n * @param {event} Event object\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _keyDownHandler = function (event) {\r\n var that = (this.constructor === AccessibleMegaMenu) ? this : _getPlugin(this), // determine the AccessibleMegaMenu plugin instance\r\n settings = that.settings,\r\n target = $($(this).is('.' + settings.hoverClass + ':tabbable') ? this : event.target), // if the element is hovered the target is this, otherwise, its the focused element\r\n menu = that.menu,\r\n topnavitems = that.topnavitems,\r\n topli = target.closest('.' + settings.topNavItemClass),\r\n tabbables = menu.find(':tabbable'),\r\n panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass),\r\n panelGroups = panel.find('.' + settings.panelGroupClass),\r\n currentPanelGroup = target.closest('.' + settings.panelGroupClass),\r\n next,\r\n keycode = event.keyCode || event.which,\r\n start,\r\n i,\r\n o,\r\n label,\r\n found = false,\r\n newString = Keyboard.keyMap[event.keyCode] || '',\r\n regex,\r\n isTopNavItem = (topli.length === 1 && panel.length === 0);\r\n\r\n if (target.is(\"input:focus, select:focus, textarea:focus, button:focus\")) {\r\n // if the event target is a form element we should handle keydown normally\r\n return;\r\n }\r\n\r\n if (target.is('.' + settings.hoverClass + ':tabbable')) {\r\n $('html').off('keydown.accessible-megamenu');\r\n }\r\n\r\n switch (keycode) {\r\n case Keyboard.ESCAPE:\r\n _togglePanel.call(that, event, true);\r\n break;\r\n case Keyboard.DOWN:\r\n event.preventDefault();\r\n if (isTopNavItem) {\r\n _togglePanel.call(that, event);\r\n found = (topli.find('.' + settings.panelClass + ' :tabbable:first').focus().length === 1);\r\n } else {\r\n found = (tabbables.filter(':gt(' + tabbables.index(target) + '):first').focus().length === 1);\r\n }\r\n\r\n if (!found && window.opera && opera.toString() === \"[object Opera]\" && (event.ctrlKey || event.metaKey)) {\r\n tabbables = $(':tabbable');\r\n i = tabbables.index(target);\r\n found = ($(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1);\r\n }\r\n break;\r\n case Keyboard.UP:\r\n event.preventDefault();\r\n if (isTopNavItem && target.hasClass(settings.openClass)) {\r\n _togglePanel.call(that, event, true);\r\n next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last');\r\n if (next.children('.' + settings.panelClass).length) {\r\n found = (next.children()\r\n .attr('aria-expanded', 'true')\r\n .addClass(settings.openClass)\r\n .filter('.' + settings.panelClass)\r\n .attr('aria-hidden', 'false')\r\n .find(':tabbable:last')\r\n .focus() === 1);\r\n }\r\n } else if (!isTopNavItem) {\r\n found = (tabbables.filter(':lt(' + tabbables.index(target) + '):last').focus().length === 1);\r\n }\r\n\r\n if (!found && window.opera && opera.toString() === \"[object Opera]\" && (event.ctrlKey || event.metaKey)) {\r\n tabbables = $(':tabbable');\r\n i = tabbables.index(target);\r\n found = ($(':tabbable:lt(' + $(':tabbable').index(target) + '):first').focus().length === 1);\r\n }\r\n break;\r\n case Keyboard.RIGHT:\r\n event.preventDefault();\r\n if (isTopNavItem) {\r\n found = (topnavitems.filter(':gt(' + topnavitems.index(topli) + '):first').find(':tabbable:first').focus().length === 1);\r\n } else {\r\n if (panelGroups.length && currentPanelGroup.length) {\r\n // if the current panel contains panel groups, and we are able to focus the first tabbable element of the next panel group\r\n found = (panelGroups.filter(':gt(' + panelGroups.index(currentPanelGroup) + '):first').find(':tabbable:first').focus().length === 1);\r\n }\r\n\r\n if (!found) {\r\n found = (topli.find(':tabbable:first').focus().length === 1);\r\n }\r\n }\r\n break;\r\n case Keyboard.LEFT:\r\n event.preventDefault();\r\n if (isTopNavItem) {\r\n found = (topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last').find(':tabbable:first').focus().length === 1);\r\n } else {\r\n if (panelGroups.length && currentPanelGroup.length) {\r\n // if the current panel contains panel groups, and we are able to focus the first tabbable element of the previous panel group\r\n found = (panelGroups.filter(':lt(' + panelGroups.index(currentPanelGroup) + '):last').find(':tabbable:first').focus().length === 1);\r\n }\r\n\r\n if (!found) {\r\n found = (topli.find(':tabbable:first').focus().length === 1);\r\n }\r\n }\r\n break;\r\n case Keyboard.TAB:\r\n i = tabbables.index(target);\r\n if (event.shiftKey && isTopNavItem && target.hasClass(settings.openClass)) {\r\n _togglePanel.call(that, event, true);\r\n next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last');\r\n if (next.children('.' + settings.panelClass).length) {\r\n found = next.children()\r\n .attr('aria-expanded', 'true')\r\n .addClass(settings.openClass)\r\n .filter('.' + settings.panelClass)\r\n .attr('aria-hidden', 'false')\r\n .find(':tabbable:last')\r\n .focus();\r\n }\r\n } else if (event.shiftKey && i > 0) {\r\n found = (tabbables.filter(':lt(' + i + '):last').focus().length === 1);\r\n } else if (!event.shiftKey && i < tabbables.length - 1) {\r\n found = (tabbables.filter(':gt(' + i + '):first').focus().length === 1);\r\n } else if (window.opera && opera.toString() === \"[object Opera]\") {\r\n tabbables = $(':tabbable');\r\n i = tabbables.index(target);\r\n if (event.shiftKey) {\r\n found = ($(':tabbable:lt(' + $(':tabbable').index(target) + '):last').focus().length === 1);\r\n } else {\r\n found = ($(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1);\r\n }\r\n }\r\n\r\n if (found) {\r\n event.preventDefault();\r\n }\r\n break;\r\n case Keyboard.SPACE:\r\n if (isTopNavItem) {\r\n event.preventDefault();\r\n _clickHandler.call(that, event);\r\n } else {\r\n return true;\r\n }\r\n break;\r\n case Keyboard.ENTER:\r\n return true;\r\n break;\r\n default:\r\n // alphanumeric filter\r\n clearTimeout(this.keydownTimeoutID);\r\n\r\n keydownSearchString += newString !== keydownSearchString ? newString : '';\r\n\r\n if (keydownSearchString.length === 0) {\r\n return;\r\n }\r\n\r\n this.keydownTimeoutID = setTimeout(function () {\r\n keydownSearchString = '';\r\n }, keydownTimeoutDuration);\r\n\r\n if (isTopNavItem && !target.hasClass(settings.openClass)) {\r\n tabbables = tabbables.filter(':not(.' + settings.panelClass + ' :tabbable)');\r\n } else {\r\n tabbables = topli.find(':tabbable');\r\n }\r\n\r\n if (event.shiftKey) {\r\n tabbables = $(tabbables.get()\r\n .reverse());\r\n }\r\n\r\n for (i = 0; i < tabbables.length; i++) {\r\n o = tabbables.eq(i);\r\n if (o.is(target)) {\r\n start = (keydownSearchString.length === 1) ? i + 1 : i;\r\n break;\r\n }\r\n }\r\n\r\n regex = new RegExp('^' + keydownSearchString.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&'), 'i');\r\n\r\n for (i = start; i < tabbables.length; i++) {\r\n o = tabbables.eq(i);\r\n label = $.trim(o.text());\r\n if (regex.test(label)) {\r\n found = true;\r\n o.focus();\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n for (i = 0; i < start; i++) {\r\n o = tabbables.eq(i);\r\n label = $.trim(o.text());\r\n if (regex.test(label)) {\r\n o.focus();\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n that.justFocused = false;\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_mouseDownHandler\r\n * @desc Handle mousedown event on mega menu.\r\n * @param {event} Event object\r\n * @memberof accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _mouseDownHandler = function (event) {\r\n if ($(event.target).is(this.settings.panelClass) || $(event.target).closest(\":focusable\").length) {\r\n this.mouseFocused = true;\r\n }\r\n clearTimeout(this.mouseTimeoutID);\r\n this.mouseTimeoutID = setTimeout(function () {\r\n clearTimeout(this.focusTimeoutID);\r\n }, 1);\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_mouseOverHandler\r\n * @desc Handle mouseover event on mega menu.\r\n * @param {event} Event object\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _mouseOverHandler = function (event) {\r\n clearTimeout(this.mouseTimeoutID);\r\n var that = this;\r\n this.mouseTimeoutID = setTimeout(function () {\r\n $(event.target).addClass(that.settings.hoverClass);\r\n _togglePanel.call(that, event);\r\n if ($(event.target).is(':tabbable')) {\r\n $('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target));\r\n }\r\n }, this.settings.openDelay);\r\n };\r\n\r\n /**\r\n * @name jQuery.fn.accessibleMegaMenu~_mouseOutHandler\r\n * @desc Handle mouseout event on mega menu.\r\n * @param {event} Event object\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @inner\r\n * @private\r\n */\r\n _mouseOutHandler = function (event) {\r\n clearTimeout(this.mouseTimeoutID);\r\n var that = this;\r\n $(event.target)\r\n .removeClass(that.settings.hoverClass);\r\n\r\n that.mouseTimeoutID = setTimeout(function () {\r\n _togglePanel.call(that, event, true);\r\n }, 250);\r\n if ($(event.target).is(':tabbable')) {\r\n $('html').off('keydown.accessible-megamenu');\r\n }\r\n };\r\n\r\n _toggleExpandedEventHandlers = function (hide) {\r\n var menu = this.menu;\r\n if (hide) {\r\n $('html').off('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu, pointerup.outside-accessible-megamenu');\r\n\r\n menu.find('[aria-expanded].' + this.settings.panelClass).off('DOMAttrModified.accessible-megamenu');\r\n } else {\r\n $('html').on('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu, pointerup.outside-accessible-megamenu', $.proxy(_clickOutsideHandler, this));\r\n\r\n /* Narrator in Windows 8 automatically toggles the aria-expanded property on double tap or click.\r\n To respond to the change to collapse the panel, we must add a listener for a DOMAttrModified event. */\r\n menu.find('[aria-expanded=true].' + this.settings.panelClass).on('DOMAttrModified.accessible-megamenu', $.proxy(_DOMAttrModifiedHandler, this));\r\n }\r\n };\r\n\r\n /* public attributes and methods ------------------------- */\r\n return {\r\n constructor: AccessibleMegaMenu,\r\n\r\n /**\r\n * @lends jQuery.fn.accessibleMegaMenu\r\n * @desc Initializes an instance of the accessibleMegaMenu plugins\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @instance\r\n */\r\n init: function () {\r\n var settings = this.settings,\r\n nav = $(this.element),\r\n menu = nav.children().first(),\r\n topnavitems = menu.children();\r\n this.start(settings, nav, menu, topnavitems);\r\n },\r\n\r\n start: function(settings, nav, menu, topnavitems) {\r\n var that = this;\r\n this.settings = settings;\r\n this.menu = menu;\r\n this.topnavitems = topnavitems;\r\n\r\n nav.attr(\"role\", \"navigation\");\r\n menu.addClass(settings.menuClass);\r\n topnavitems.each(function (i, topnavitem) {\r\n var topnavitemlink, topnavitempanel;\r\n topnavitem = $(topnavitem);\r\n topnavitem.addClass(settings.topNavItemClass);\r\n topnavitemlink = topnavitem.find(\":tabbable:first\");\r\n topnavitempanel = topnavitem.children(\":not(:tabbable):last\");\r\n _addUniqueId.call(that, topnavitemlink);\r\n if (topnavitempanel.length) {\r\n _addUniqueId.call(that, topnavitempanel);\r\n topnavitemlink.attr({\r\n // \"aria-haspopup\": true,\r\n \"aria-controls\": topnavitempanel.attr(\"id\"),\r\n \"aria-expanded\": false\r\n });\r\n\r\n topnavitempanel.attr({\r\n \"role\": \"region\",\r\n \"aria-expanded\": false,\r\n \"aria-hidden\": true\r\n })\r\n .addClass(settings.panelClass)\r\n .not(\"[aria-labelledby]\")\r\n .attr(\"aria-labelledby\", topnavitemlink.attr(\"id\"));\r\n }\r\n });\r\n\r\n this.panels = menu.find(\".\" + settings.panelClass);\r\n\r\n menu.on(\"focusin.accessible-megamenu\", \":focusable, .\" + settings.panelClass, $.proxy(_focusInHandler, this))\r\n .on(\"focusout.accessible-megamenu\", \":focusable, .\" + settings.panelClass, $.proxy(_focusOutHandler, this))\r\n .on(\"keydown.accessible-megamenu\", $.proxy(_keyDownHandler, this))\r\n .on(\"mouseover.accessible-megamenu\", $.proxy(_mouseOverHandler, this))\r\n .on(\"mouseout.accessible-megamenu\", $.proxy(_mouseOutHandler, this))\r\n .on(\"mousedown.accessible-megamenu\", $.proxy(_mouseDownHandler, this));\r\n\r\n if (isTouch) {\r\n menu.on(\"touchstart.accessible-megamenu\", $.proxy(_clickHandler, this));\r\n }\r\n\r\n menu.find(\"hr\").attr(\"role\", \"separator\");\r\n\r\n if ($(document.activeElement).closest(menu).length) {\r\n $(document.activeElement).trigger(\"focusin.accessible-megamenu\");\r\n }\r\n },\r\n\r\n /**\r\n * @desc Get default values\r\n * @example $(selector).accessibleMegaMenu(\"getDefaults\");\r\n * @return {object}\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @instance\r\n */\r\n getDefaults: function () {\r\n return this._defaults;\r\n },\r\n\r\n /**\r\n * @desc Get any option set to plugin using its name (as string)\r\n * @example $(selector).accessibleMegaMenu(\"getOption\", some_option);\r\n * @param {string} opt\r\n * @return {string}\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @instance\r\n */\r\n getOption: function (opt) {\r\n return this.settings[opt];\r\n },\r\n\r\n /**\r\n * @desc Get all options\r\n * @example $(selector).accessibleMegaMenu(\"getAllOptions\");\r\n * @return {object}\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @instance\r\n */\r\n getAllOptions: function () {\r\n return this.settings;\r\n },\r\n\r\n /**\r\n * @desc Set option\r\n * @example $(selector).accessibleMegaMenu(\"setOption\", \"option_name\", \"option_value\", reinitialize);\r\n * @param {string} opt - Option name\r\n * @param {string} val - Option value\r\n * @param {boolean} [reinitialize] - boolean to re-initialize the menu.\r\n * @memberof jQuery.fn.accessibleMegaMenu\r\n * @instance\r\n */\r\n setOption: function (opt, value, reinitialize) {\r\n this.settings[opt] = value;\r\n if (reinitialize) {\r\n this.init();\r\n }\r\n }\r\n };\r\n }());\r\n\r\n /* lightweight plugin wrapper around the constructor,\r\n to prevent against multiple instantiations */\r\n\r\n /**\r\n * @class accessibleMegaMenu\r\n * @memberOf jQuery.fn\r\n * @classdesc Implements an accessible mega menu as a jQuery plugin.\r\n *

The mega-menu It is modeled after the mega menu on {@link http://adobe.com|adobe.com} but has been simplified for use by others. A brief description of the interaction design choices can be found in a blog post at {@link http://blogs.adobe.com/accessibility/2013/05/adobe-com.html|Mega menu accessibility on adobe.com}.

\r\n *

Keyboard Accessibility

\r\n *

The accessible mega menu supports keyboard interaction modeled after the behavior described in the {@link http://www.w3.org/TR/wai-aria-practices/#menu|WAI-ARIA Menu or Menu bar (widget) design pattern}, however we also try to respect users' general expectations for the behavior of links in a global navigation. To this end, the accessible mega menu implementation permits tab focus on each of the six top-level menu items. When one of the menu items has focus, pressing the Enter key, Spacebar or Down arrow will open the submenu panel, and pressing the Left or Right arrow key will shift focus to the adjacent menu item. Links within the submenu panels are included in the tab order when the panel is open. They can also be navigated with the arrow keys or by typing the first character in the link name, which speeds up keyboard navigation considerably. Pressing the Escape key closes the submenu and restores focus to the parent menu item.

\r\n *

Screen Reader Accessibility

\r\n *

The accessible mega menu models its use of WAI-ARIA Roles, States, and Properties after those described in the {@link http://www.w3.org/TR/wai-aria-practices/#menu|WAI-ARIA Menu or Menu bar (widget) design pattern} with some notable exceptions, so that it behaves better with screen reader user expectations for global navigation. We don't use role=\"menu\" for the menu container and role=\"menuitem\" for each of the links therein, because if we do, assistive technology will no longer interpret the links as links, but instead, as menu items, and the links in our global navigation will no longer show up when a screen reader user executes a shortcut command to bring up a list of links in the page.

\r\n * @example

HTML


\r\n<nav>\r\n <ul class="nav-menu">\r\n <li class="nav-item">\r\n <a href="?movie">Movies</a>\r\n <div class="sub-nav">\r\n <ul class="sub-nav-group">\r\n <li><a href="?movie&genre=0">Action &amp; Adventure</a></li>\r\n <li><a href="?movie&genre=2">Children &amp; Family</a></li>\r\n <li>&#8230;</li>\r\n </ul>\r\n <ul class="sub-nav-group">\r\n <li><a href="?movie&genre=7">Dramas</a></li>\r\n <li><a href="?movie&genre=9">Foreign</a></li>\r\n <li>&#8230;</li>\r\n </ul>\r\n <ul class="sub-nav-group">\r\n <li><a href="?movie&genre=14">Musicals</a></li>\r\n <li><a href="?movie&genre=15">Romance</a></li>\r\n <li>&#8230;</li>\r\n </ul>\r\n </div>\r\n </li>\r\n <li class="nav-item">\r\n <a href="?tv">TV Shows</a>\r\n <div class="sub-nav">\r\n <ul class="sub-nav-group">\r\n <li><a href="?tv&genre=20">Classic TV</a></li>\r\n <li><a href="?tv&genre=21">Crime TV</a></li>\r\n <li>&#8230;</li>\r\n </ul>\r\n <ul class="sub-nav-group">\r\n <li><a href="?tv&genre=27">Reality TV</a></li>\r\n <li><a href="?tv&genre=30">TV Action</a></li>\r\n <li>&#8230;</li>\r\n </ul>\r\n <ul class="sub-nav-group">\r\n <li><a href="?tv&genre=33">TV Dramas</a></li>\r\n <li><a href="?tv&genre=34">TV Horror</a></li>\r\n <li>&#8230;</li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n</nav>\r\n * @example

CSS


\r\n/* Rudimentary mega menu CSS for demonstration */\r\n\r\n/* mega menu list */\r\n.nav-menu {\r\n display: block;\r\n position: relative;\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n z-index: 15;\r\n}\r\n\r\n/* a top level navigation item in the mega menu */\r\n.nav-item {\r\n list-style: none;\r\n display: inline-block;\r\n padding: 0;\r\n margin: 0;\r\n}\r\n\r\n/* first descendant link within a top level navigation item */\r\n.nav-item > a {\r\n position: relative;\r\n display: inline-block;\r\n padding: 0.5em 1em;\r\n margin: 0 0 -1px 0;\r\n border: 1px solid transparent;\r\n}\r\n\r\n/* focus/open states of first descendant link within a top level\r\n navigation item */\r\n.nav-item > a:focus,\r\n.nav-item > a.open {\r\n border: 1px solid #dedede;\r\n}\r\n\r\n/* open state of first descendant link within a top level\r\n navigation item */\r\n.nav-item > a.open {\r\n background-color: #fff;\r\n border-bottom: none;\r\n z-index: 1;\r\n}\r\n\r\n/* sub-navigation panel */\r\n.sub-nav {\r\n position: absolute;\r\n display: none;\r\n top: 2.2em;\r\n margin-top: -1px;\r\n padding: 0.5em 1em;\r\n border: 1px solid #dedede;\r\n background-color: #fff;\r\n}\r\n\r\n/* sub-navigation panel open state */\r\n.sub-nav.open {\r\n display: block;\r\n}\r\n\r\n/* list of items within sub-navigation panel */\r\n.sub-nav ul {\r\n display: inline-block;\r\n vertical-align: top;\r\n margin: 0 1em 0 0;\r\n padding: 0;\r\n}\r\n\r\n/* list item within sub-navigation panel */\r\n.sub-nav li {\r\n display: block;\r\n list-style-type: none;\r\n margin: 0;\r\n padding: 0;\r\n}\r\n * @example

JavaScript


\r\n<!-- include jquery -->\r\n<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>\r\n\r\n<!-- include the jquery-accessibleMegaMenu plugin script -->\r\n<script src="js/jquery-accessibleMegaMenu.js"></script>\r\n\r\n<!-- initialize a selector as an accessibleMegaMenu -->\r\n<script>\r\n $("nav:first").accessibleMegaMenu({\r\n /* prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby */\r\n uuidPrefix: "accessible-megamenu",\r\n\r\n /* css class used to define the megamenu styling */\r\n menuClass: "nav-menu",\r\n\r\n /* css class for a top-level navigation item in the megamenu */\r\n topNavItemClass: "nav-item",\r\n\r\n /* css class for a megamenu panel */\r\n panelClass: "sub-nav",\r\n\r\n /* css class for a group of items within a megamenu panel */\r\n panelGroupClass: "sub-nav-group",\r\n\r\n /* css class for the hover state */\r\n hoverClass: "hover",\r\n\r\n /* css class for the focus state */\r\n focusClass: "focus",\r\n\r\n /* css class for the open state */\r\n openClass: "open"\r\n });\r\n</script>\r\n * @param {object} [options] Mega Menu options\r\n * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby\r\n * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling\r\n * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu\r\n * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel\r\n * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel\r\n * @param {string} [options.hoverClass=hover] - CSS class for the hover state\r\n * @param {string} [options.focusClass=focus] - CSS class for the focus state\r\n * @param {string} [options.openClass=open] - CSS class for the open state\r\n * @param {string} [options.openDelay=0] - Open delay when opening menu via mouseover\r\n */\r\n $.fn[pluginName] = function (options) {\r\n return this.each(function () {\r\n if (!$.data(this, \"plugin_\" + pluginName)) {\r\n $.data(this, \"plugin_\" + pluginName, new $.fn[pluginName].AccessibleMegaMenu(this, options));\r\n }\r\n });\r\n };\r\n\r\n $.fn[pluginName].AccessibleMegaMenu = AccessibleMegaMenu;\r\n\r\n /* :focusable and :tabbable selectors from\r\n https://raw.github.com/jquery/jquery-ui/master/ui/jquery.ui.core.js */\r\n\r\n /**\r\n * @private\r\n */\r\n function visible(element) {\r\n return $.expr.filters.visible(element) && !$(element).parents().addBack().filter(function () {\r\n return $.css(this, \"visibility\") === \"hidden\";\r\n }).length;\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n function focusable(element, isTabIndexNotNaN) {\r\n var map, mapName, img,\r\n nodeName = element.nodeName.toLowerCase();\r\n if (\"area\" === nodeName) {\r\n map = element.parentNode;\r\n mapName = map.name;\r\n if (!element.href || !mapName || map.nodeName.toLowerCase() !== \"map\") {\r\n return false;\r\n }\r\n img = $(\"img[usemap=#\" + mapName + \"]\")[0];\r\n return !!img && visible(img);\r\n }\r\n return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled :\r\n \"a\" === nodeName ?\r\n element.href || isTabIndexNotNaN :\r\n isTabIndexNotNaN) &&\r\n // the element and all of its ancestors must be visible\r\n visible(element);\r\n }\r\n\r\n $.extend($.expr[\":\"], {\r\n data: $.expr.createPseudo ? $.expr.createPseudo(function (dataName) {\r\n return function (elem) {\r\n return !!$.data(elem, dataName);\r\n };\r\n }) : // support: jQuery <1.8\r\n function (elem, i, match) {\r\n return !!$.data(elem, match[3]);\r\n },\r\n\r\n focusable: function (element) {\r\n return focusable(element, !isNaN($.attr(element, \"tabindex\")));\r\n },\r\n\r\n tabbable: function (element) {\r\n var tabIndex = $.attr(element, \"tabindex\"),\r\n isTabIndexNaN = isNaN(tabIndex);\r\n return (isTabIndexNaN || tabIndex >= 0) && focusable(element, !isTabIndexNaN);\r\n }\r\n });\r\n}(jQuery, window, document));\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/_js/partials/jquery-accessibleMegaMenu.js","// Custom of https://github.com/verlok/lazyload\r\n// Since out of the box, verlok lazyload doesn't support ie9 and 10\r\n// https://github.com/servocoder/lazyload/blob/122d0de960f300813de9632f9e0cdae997ec7adc/dist/lazyload.js\r\n\r\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\r\n\r\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\r\n\r\n(function (global, factory) {\r\n\t(typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.LazyLoad = factory();\r\n})(this, function () {\r\n\t'use strict';\r\n\r\n\tvar defaultSettings = {\r\n\t\telements_selector: \"img\",\r\n\t\tcontainer: window,\r\n\t\tthreshold: 300,\r\n\t\tthrottle: 150,\r\n\t\tdata_src: \"original\",\r\n\t\tdata_srcset: \"originalSet\",\r\n\t\tclass_loading: \"loading\",\r\n\t\tclass_loaded: \"loaded\",\r\n\t\tclass_error: \"error\",\r\n\t\tclass_initial: \"initial\",\r\n\t\tskip_invisible: true,\r\n\t\tcallback_load: null,\r\n\t\tcallback_error: null,\r\n\t\tcallback_set: null,\r\n\t\tcallback_processed: null\r\n\t};\r\n\r\n\tvar isBot = !(\"onscroll\" in window) || /glebot/.test(navigator.userAgent);\r\n\r\n\tvar callCallback = function callCallback(callback, argument) {\r\n\t\tif (callback) {\r\n\t\t\tcallback(argument);\r\n\t\t}\r\n\t};\r\n\r\n\tvar getTopOffset = function getTopOffset(element) {\r\n\t\treturn element.getBoundingClientRect().top + window.pageYOffset - element.ownerDocument.documentElement.clientTop;\r\n\t};\r\n\r\n\tvar isBelowViewport = function isBelowViewport(element, container, threshold) {\r\n\t\tvar fold = container === window ? window.innerHeight + window.pageYOffset : getTopOffset(container) + container.offsetHeight;\r\n\t\treturn fold <= getTopOffset(element) - threshold;\r\n\t};\r\n\r\n\tvar getLeftOffset = function getLeftOffset(element) {\r\n\t\treturn element.getBoundingClientRect().left + window.pageXOffset - element.ownerDocument.documentElement.clientLeft;\r\n\t};\r\n\r\n\tvar isAtRightOfViewport = function isAtRightOfViewport(element, container, threshold) {\r\n\t\tvar documentWidth = window.innerWidth;\r\n\t\tvar fold = container === window ? documentWidth + window.pageXOffset : getLeftOffset(container) + documentWidth;\r\n\t\treturn fold <= getLeftOffset(element) - threshold;\r\n\t};\r\n\r\n\tvar isAboveViewport = function isAboveViewport(element, container, threshold) {\r\n\t\tvar fold = container === window ? window.pageYOffset : getTopOffset(container);\r\n\t\treturn fold >= getTopOffset(element) + threshold + element.offsetHeight;\r\n\t};\r\n\r\n\tvar isAtLeftOfViewport = function isAtLeftOfViewport(element, container, threshold) {\r\n\t\tvar fold = container === window ? window.pageXOffset : getLeftOffset(container);\r\n\t\treturn fold >= getLeftOffset(element) + threshold + element.offsetWidth;\r\n\t};\r\n\r\n\tvar isInsideViewport = function isInsideViewport(element, container, threshold) {\r\n\t\treturn !isBelowViewport(element, container, threshold) && !isAboveViewport(element, container, threshold) && !isAtRightOfViewport(element, container, threshold) && !isAtLeftOfViewport(element, container, threshold);\r\n\t};\r\n\r\n\t/* Creates instance and notifies it through the window element */\r\n\tvar createInstance = function createInstance(classObj, options) {\r\n\t\tvar instance = new classObj(options);\r\n\t\tvar event = new CustomEvent(\"LazyLoad::Initialized\", { detail: { instance: instance } });\r\n\t\twindow.dispatchEvent(event);\r\n\t};\r\n\r\n\t/* Auto initialization of one or more instances of lazyload, depending on the\r\n\t\toptions passed in (plain object or an array) */\r\n\tvar autoInitialize = function autoInitialize(classObj, options) {\r\n\t\tvar optsLength = options.length;\r\n\t\tif (!optsLength) {\r\n\t\t\t// Plain object\r\n\t\t\tcreateInstance(classObj, options);\r\n\t\t} else {\r\n\t\t\t// Array of objects\r\n\t\t\tfor (var i = 0; i < optsLength; i++) {\r\n\t\t\t\tcreateInstance(classObj, options[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tvar setSourcesForPicture = function setSourcesForPicture(element, srcsetDataAttribute) {\r\n\t\tvar parent = element.parentElement;\r\n\t\tif (parent.tagName !== \"PICTURE\") {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tfor (var i = 0; i < parent.children.length; i++) {\r\n\t\t\tvar pictureChild = parent.children[i];\r\n\t\t\tif (pictureChild.tagName === \"SOURCE\") {\r\n\t\t\t\tvar sourceSrcset = getData(pictureChild, srcsetDataAttribute);\r\n\t\t\t\tif (sourceSrcset) {\r\n\t\t\t\t\tpictureChild.setAttribute(\"srcset\", sourceSrcset);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tvar setSources = function setSources(element, srcsetDataAttribute, srcDataAttribute) {\r\n\t\tvar tagName = element.tagName;\r\n\t\tvar elementSrc = getData(element, srcDataAttribute);\r\n\t\tif (tagName === \"IMG\") {\r\n\t\t\tsetSourcesForPicture(element, srcsetDataAttribute);\r\n\t\t\tvar imgSrcset = getData(element, srcsetDataAttribute);\r\n\t\t\tif (imgSrcset) {\r\n\t\t\t\telement.setAttribute(\"srcset\", imgSrcset);\r\n\t\t\t}\r\n\t\t\tif (elementSrc) {\r\n\t\t\t\telement.setAttribute(\"src\", elementSrc);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (tagName === \"IFRAME\") {\r\n\t\t\tif (elementSrc) {\r\n\t\t\t\telement.setAttribute(\"src\", elementSrc);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (elementSrc) {\r\n\t\t\telement.style.backgroundImage = 'url(\"' + elementSrc + '\")';\r\n\t\t}\r\n\t};\r\n\r\n\tfunction setData(element, key, value) {\r\n\t\twindow.jQuery ? $(element).data(key, value) : element.dataset[key] = value;\r\n\t}\r\n\r\n\tfunction getData(element, key) {\r\n\t\treturn window.jQuery ? $(element).data(key) : element.dataset[key];\r\n\t}\r\n\r\n\tfunction removeClass(element, className) {\r\n\t\twindow.jQuery ? $(element).removeClass(className) : element.classList.remove(className);\r\n\t}\r\n\r\n\tfunction addClass(element, className) {\r\n\t\twindow.jQuery ? $(element).addClass(className) : element.classList.add(className);\r\n\t}\r\n\r\n\t/*\r\n\t * Constructor\r\n\t */\r\n\r\n\tvar LazyLoad = function LazyLoad(instanceSettings) {\r\n\t\tthis._settings = _extends({}, defaultSettings, instanceSettings);\r\n\t\tthis._queryOriginNode = this._settings.container === window ? document : this._settings.container;\r\n\r\n\t\tthis._previousLoopTime = 0;\r\n\t\tthis._loopTimeout = null;\r\n\t\tthis._boundHandleScroll = this.handleScroll.bind(this);\r\n\r\n\t\tthis._isFirstLoop = true;\r\n\t\twindow.addEventListener(\"resize\", this._boundHandleScroll);\r\n\t\tthis.update();\r\n\t};\r\n\r\n\tLazyLoad.prototype = {\r\n\r\n\t\t/*\r\n\t\t * Private methods\r\n\t\t */\r\n\r\n\t\t_reveal: function _reveal(element) {\r\n\t\t\tvar settings = this._settings;\r\n\r\n\t\t\tvar errorCallback = function errorCallback() {\r\n\t\t\t\t/* As this method is asynchronous, it must be protected against external destroy() calls */\r\n\t\t\t\tif (!settings) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\telement.removeEventListener(\"load\", loadCallback);\r\n\t\t\t\telement.removeEventListener(\"error\", errorCallback);\r\n\t\t\t\tremoveClass(element, settings.class_loading);\r\n\t\t\t\taddClass(element, settings.class_error);\r\n\t\t\t\tcallCallback(settings.callback_error, element);\r\n\t\t\t};\r\n\r\n\t\t\tvar loadCallback = function loadCallback() {\r\n\t\t\t\t/* As this method is asynchronous, it must be protected against external destroy() calls */\r\n\t\t\t\tif (!settings) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tremoveClass(element, settings.class_loading);\r\n\t\t\t\taddClass(element, settings.class_loaded);\r\n\t\t\t\telement.removeEventListener(\"load\", loadCallback);\r\n\t\t\t\telement.removeEventListener(\"error\", errorCallback);\r\n\t\t\t\t/* Calling LOAD callback */\r\n\t\t\t\tcallCallback(settings.callback_load, element);\r\n\t\t\t};\r\n\r\n\t\t\tif (element.tagName === \"IMG\" || element.tagName === \"IFRAME\") {\r\n\t\t\t\telement.addEventListener(\"load\", loadCallback);\r\n\t\t\t\telement.addEventListener(\"error\", errorCallback);\r\n\t\t\t\taddClass(element, settings.class_loading);\r\n\t\t\t}\r\n\r\n\t\t\tsetSources(element, settings.data_srcset, settings.data_src);\r\n\t\t\t/* Calling SET callback */\r\n\t\t\tcallCallback(settings.callback_set, element);\r\n\t\t},\r\n\r\n\t\t_loopThroughElements: function _loopThroughElements() {\r\n\t\t\tvar settings = this._settings,\r\n\t\t\t\telements = this._elements,\r\n\t\t\t\telementsLength = !elements ? 0 : elements.length;\r\n\t\t\tvar i = void 0,\r\n\t\t\t\tprocessedIndexes = [],\r\n\t\t\t\tfirstLoop = this._isFirstLoop;\r\n\r\n\t\t\tfor (i = 0; i < elementsLength; i++) {\r\n\t\t\t\tvar element = elements[i];\r\n\t\t\t\t/* If must skip_invisible and element is invisible, skip it */\r\n\t\t\t\tif (settings.skip_invisible && element.offsetParent === null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isBot || isInsideViewport(element, settings.container, settings.threshold)) {\r\n\t\t\t\t\tif (firstLoop) {\r\n\t\t\t\t\t\taddClass(element, settings.class_initial);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t/* Start loading the image */\r\n\t\t\t\t\tthis._reveal(element);\r\n\t\t\t\t\t/* Marking the element as processed. */\r\n\t\t\t\t\tprocessedIndexes.push(i);\r\n\t\t\t\t\tsetData(element, 'wasProcessed', true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t/* Removing processed elements from this._elements. */\r\n\t\t\twhile (processedIndexes.length) {\r\n\t\t\t\telements.splice(processedIndexes.pop(), 1);\r\n\t\t\t\t/* Calling the end loop callback */\r\n\t\t\t\tcallCallback(settings.callback_processed, elements.length);\r\n\t\t\t}\r\n\t\t\t/* Stop listening to scroll event when 0 elements remains */\r\n\t\t\tif (elementsLength === 0) {\r\n\t\t\t\tthis._stopScrollHandler();\r\n\t\t\t}\r\n\t\t\t/* Sets isFirstLoop to false */\r\n\t\t\tif (firstLoop) {\r\n\t\t\t\tthis._isFirstLoop = false;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_purgeElements: function _purgeElements() {\r\n\t\t\tvar elements = this._elements,\r\n\t\t\t\telementsLength = elements.length;\r\n\t\t\tvar i = void 0,\r\n\t\t\t\telementsToPurge = [];\r\n\r\n\t\t\tfor (i = 0; i < elementsLength; i++) {\r\n\t\t\t\tvar element = elements[i];\r\n\t\t\t\t/* If the element has already been processed, skip it */\r\n\t\t\t\tif (getData(element, 'wasProcessed')) {\r\n\t\t\t\t\telementsToPurge.push(i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t/* Removing elements to purge from this._elements. */\r\n\t\t\twhile (elementsToPurge.length > 0) {\r\n\t\t\t\telements.splice(elementsToPurge.pop(), 1);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_startScrollHandler: function _startScrollHandler() {\r\n\t\t\tif (!this._isHandlingScroll) {\r\n\t\t\t\tthis._isHandlingScroll = true;\r\n\t\t\t\tthis._settings.container.addEventListener(\"scroll\", this._boundHandleScroll);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_stopScrollHandler: function _stopScrollHandler() {\r\n\t\t\tif (this._isHandlingScroll) {\r\n\t\t\t\tthis._isHandlingScroll = false;\r\n\t\t\t\tthis._settings.container.removeEventListener(\"scroll\", this._boundHandleScroll);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/*\r\n\t\t * Public methods\r\n\t\t */\r\n\r\n\t\thandleScroll: function handleScroll() {\r\n\t\t\tvar throttle = this._settings.throttle;\r\n\r\n\t\t\tif (throttle !== 0) {\r\n\t\t\t\tvar now = Date.now();\r\n\t\t\t\tvar remainingTime = throttle - (now - this._previousLoopTime);\r\n\t\t\t\tif (remainingTime <= 0 || remainingTime > throttle) {\r\n\t\t\t\t\tif (this._loopTimeout) {\r\n\t\t\t\t\t\tclearTimeout(this._loopTimeout);\r\n\t\t\t\t\t\tthis._loopTimeout = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis._previousLoopTime = now;\r\n\t\t\t\t\tthis._loopThroughElements();\r\n\t\t\t\t} else if (!this._loopTimeout) {\r\n\t\t\t\t\tthis._loopTimeout = setTimeout(function () {\r\n\t\t\t\t\t\tthis._previousLoopTime = Date.now();\r\n\t\t\t\t\t\tthis._loopTimeout = null;\r\n\t\t\t\t\t\tthis._loopThroughElements();\r\n\t\t\t\t\t}.bind(this), remainingTime);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tthis._loopThroughElements();\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tupdate: function update() {\r\n\t\t\t// Converts to array the nodeset obtained querying the DOM from _queryOriginNode with elements_selector\r\n\t\t\tthis._elements = Array.prototype.slice.call(this._queryOriginNode.querySelectorAll(this._settings.elements_selector));\r\n\t\t\tthis._purgeElements();\r\n\t\t\tthis._loopThroughElements();\r\n\t\t\tthis._startScrollHandler();\r\n\t\t},\r\n\r\n\t\tdestroy: function destroy() {\r\n\t\t\twindow.removeEventListener(\"resize\", this._boundHandleScroll);\r\n\t\t\tif (this._loopTimeout) {\r\n\t\t\t\tclearTimeout(this._loopTimeout);\r\n\t\t\t\tthis._loopTimeout = null;\r\n\t\t\t}\r\n\t\t\tthis._stopScrollHandler();\r\n\t\t\tthis._elements = null;\r\n\t\t\tthis._queryOriginNode = null;\r\n\t\t\tthis._settings = null;\r\n\t\t}\r\n\t};\r\n\r\n\t/* Automatic instances creation if required (useful for async script loading!) */\r\n\tvar autoInitOptions = window.lazyLoadOptions;\r\n\tif (autoInitOptions) {\r\n\t\tautoInitialize(LazyLoad, autoInitOptions);\r\n\t}\r\n\r\n\treturn LazyLoad;\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/_js/partials/lazyload.js","/*!\r\n * skrollr core\r\n *\r\n * Alexander Prinzhorn - https://github.com/Prinzhorn/skrollr\r\n *\r\n * Free to use under terms of MIT license\r\n */\r\n(function(window, document, undefined) {\r\n\t'use strict';\r\n\r\n\t//Minify optimization.\r\n\tvar hasProp = Object.prototype.hasOwnProperty;\r\n\tvar getStyle = window.getComputedStyle;\r\n\r\n\t/*\r\n\t * Global api.\r\n\t */\r\n\tvar skrollr = window.skrollr = {\r\n\t\tget: function() {\r\n\t\t\treturn _instance;\r\n\t\t},\r\n\t\t//Main entry point.\r\n\t\tinit: function(options) {\r\n\t\t\treturn _instance || new Skrollr(options);\r\n\t\t},\r\n\t\tVERSION: '0.6.17'\r\n\t};\r\n\r\n\t//They will be filled when skrollr gets initialized.\r\n\tvar documentElement;\r\n\tvar body;\r\n\r\n\tvar EVENT_TOUCHSTART = 'touchstart';\r\n\tvar EVENT_TOUCHMOVE = 'touchmove';\r\n\tvar EVENT_TOUCHCANCEL = 'touchcancel';\r\n\tvar EVENT_TOUCHEND = 'touchend';\r\n\r\n\tvar SKROLLABLE_CLASS = 'skrollable';\r\n\tvar SKROLLABLE_BEFORE_CLASS = SKROLLABLE_CLASS + '-before';\r\n\tvar SKROLLABLE_BETWEEN_CLASS = SKROLLABLE_CLASS + '-between';\r\n\tvar SKROLLABLE_AFTER_CLASS = SKROLLABLE_CLASS + '-after';\r\n\r\n\tvar SKROLLR_CLASS = 'skrollr';\r\n\tvar NO_SKROLLR_CLASS = 'no-' + SKROLLR_CLASS;\r\n\tvar SKROLLR_DESKTOP_CLASS = SKROLLR_CLASS + '-desktop';\r\n\tvar SKROLLR_MOBILE_CLASS = SKROLLR_CLASS + '-mobile';\r\n\r\n\tvar DEFAULT_EASING = 'linear';\r\n\tvar DEFAULT_DURATION = 1000;//ms\r\n\tvar DEFAULT_MOBILE_DECELERATION = 0.004;//pixel/msĀ²\r\n\r\n\tvar DEFAULT_SMOOTH_SCROLLING_DURATION = 200;//ms\r\n\r\n\tvar ANCHOR_START = 'start';\r\n\tvar ANCHOR_END = 'end';\r\n\tvar ANCHOR_CENTER = 'center';\r\n\tvar ANCHOR_BOTTOM = 'bottom';\r\n\r\n\t//The property which will be added to the DOM element to hold the ID of the skrollable.\r\n\tvar SKROLLABLE_ID_DOM_PROPERTY = '___skrollable_id';\r\n\r\n\tvar rxTouchIgnoreTags = /^(?:input|textarea|button|select)$/i;\r\n\r\n\tvar rxTrim = /^\\s+|\\s+$/g;\r\n\r\n\t//Find all data-attributes. data-[_constant]-[offset]-[anchor]-[anchor].\r\n\tvar rxKeyframeAttribute = /^data(?:-(_\\w+))?(?:-?(-?\\d*\\.?\\d+p?))?(?:-?(start|end|top|center|bottom))?(?:-?(top|center|bottom))?$/;\r\n\r\n\tvar rxPropValue = /\\s*([\\w\\-\\[\\]]+)\\s*:\\s*(.+?)\\s*(?:;|$)/gi;\r\n\r\n\t//Easing function names follow the property in square brackets.\r\n\tvar rxPropEasing = /^([a-z\\-]+)\\[(\\w+)\\]$/;\r\n\r\n\tvar rxCamelCase = /-([a-z])/g;\r\n\tvar rxCamelCaseFn = function(str, letter) {\r\n\t\treturn letter.toUpperCase();\r\n\t};\r\n\r\n\t//Numeric values with optional sign.\r\n\tvar rxNumericValue = /[\\-+]?[\\d]*\\.?[\\d]+/g;\r\n\r\n\t//Used to replace occurences of {?} with a number.\r\n\tvar rxInterpolateString = /\\{\\?\\}/g;\r\n\r\n\t//Finds rgb(a) colors, which don't use the percentage notation.\r\n\tvar rxRGBAIntegerColor = /rgba?\\(\\s*-?\\d+\\s*,\\s*-?\\d+\\s*,\\s*-?\\d+/g;\r\n\r\n\t//Finds all gradients.\r\n\tvar rxGradient = /[a-z\\-]+-gradient/g;\r\n\r\n\t//Vendor prefix. Will be set once skrollr gets initialized.\r\n\tvar theCSSPrefix = '';\r\n\tvar theDashedCSSPrefix = '';\r\n\r\n\t//Will be called once (when skrollr gets initialized).\r\n\tvar detectCSSPrefix = function() {\r\n\t\t//Only relevant prefixes. May be extended.\r\n\t\t//Could be dangerous if there will ever be a CSS property which actually starts with \"ms\". Don't hope so.\r\n\t\tvar rxPrefixes = /^(?:O|Moz|webkit|ms)|(?:-(?:o|moz|webkit|ms)-)/;\r\n\r\n\t\t//Detect prefix for current browser by finding the first property using a prefix.\r\n\t\tif(!getStyle) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar style = getStyle(body, null);\r\n\r\n\t\tfor(var k in style) {\r\n\t\t\t//We check the key and if the key is a number, we check the value as well, because safari's getComputedStyle returns some weird array-like thingy.\r\n\t\t\ttheCSSPrefix = (k.match(rxPrefixes) || (+k == k && style[k].match(rxPrefixes)));\r\n\r\n\t\t\tif(theCSSPrefix) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//Did we even detect a prefix?\r\n\t\tif(!theCSSPrefix) {\r\n\t\t\ttheCSSPrefix = theDashedCSSPrefix = '';\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttheCSSPrefix = theCSSPrefix[0];\r\n\r\n\t\t//We could have detected either a dashed prefix or this camelCaseish-inconsistent stuff.\r\n\t\tif(theCSSPrefix.slice(0,1) === '-') {\r\n\t\t\ttheDashedCSSPrefix = theCSSPrefix;\r\n\r\n\t\t\t//There's no logic behind these. Need a look up.\r\n\t\t\ttheCSSPrefix = ({\r\n\t\t\t\t'-webkit-': 'webkit',\r\n\t\t\t\t'-moz-': 'Moz',\r\n\t\t\t\t'-ms-': 'ms',\r\n\t\t\t\t'-o-': 'O'\r\n\t\t\t})[theCSSPrefix];\r\n\t\t} else {\r\n\t\t\ttheDashedCSSPrefix = '-' + theCSSPrefix.toLowerCase() + '-';\r\n\t\t}\r\n\t};\r\n\r\n\tvar polyfillRAF = function() {\r\n\t\tvar requestAnimFrame = window.requestAnimationFrame || window[theCSSPrefix.toLowerCase() + 'RequestAnimationFrame'];\r\n\r\n\t\tvar lastTime = _now();\r\n\r\n\t\tif(_isMobile || !requestAnimFrame) {\r\n\t\t\trequestAnimFrame = function(callback) {\r\n\t\t\t\t//How long did it take to render?\r\n\t\t\t\tvar deltaTime = _now() - lastTime;\r\n\t\t\t\tvar delay = Math.max(0, 1000 / 60 - deltaTime);\r\n\r\n\t\t\t\treturn window.setTimeout(function() {\r\n\t\t\t\t\tlastTime = _now();\r\n\t\t\t\t\tcallback();\r\n\t\t\t\t}, delay);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn requestAnimFrame;\r\n\t};\r\n\r\n\tvar polyfillCAF = function() {\r\n\t\tvar cancelAnimFrame = window.cancelAnimationFrame || window[theCSSPrefix.toLowerCase() + 'CancelAnimationFrame'];\r\n\r\n\t\tif(_isMobile || !cancelAnimFrame) {\r\n\t\t\tcancelAnimFrame = function(timeout) {\r\n\t\t\t\treturn window.clearTimeout(timeout);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn cancelAnimFrame;\r\n\t};\r\n\r\n\t//Built-in easing functions.\r\n\tvar easings = {\r\n\t\tbegin: function() {\r\n\t\t\treturn 0;\r\n\t\t},\r\n\t\tend: function() {\r\n\t\t\treturn 1;\r\n\t\t},\r\n\t\tlinear: function(p) {\r\n\t\t\treturn p;\r\n\t\t},\r\n\t\tquadratic: function(p) {\r\n\t\t\treturn p * p;\r\n\t\t},\r\n\t\tcubic: function(p) {\r\n\t\t\treturn p * p * p;\r\n\t\t},\r\n\t\tswing: function(p) {\r\n\t\t\treturn (-Math.cos(p * Math.PI) / 2) + 0.5;\r\n\t\t},\r\n\t\tsqrt: function(p) {\r\n\t\t\treturn Math.sqrt(p);\r\n\t\t},\r\n\t\toutCubic: function(p) {\r\n\t\t\treturn (Math.pow((p - 1), 3) + 1);\r\n\t\t},\r\n\t\t//see https://www.desmos.com/calculator/tbr20s8vd2 for how I did this\r\n\t\tbounce: function(p) {\r\n\t\t\tvar a;\r\n\r\n\t\t\tif(p <= 0.5083) {\r\n\t\t\t\ta = 3;\r\n\t\t\t} else if(p <= 0.8489) {\r\n\t\t\t\ta = 9;\r\n\t\t\t} else if(p <= 0.96208) {\r\n\t\t\t\ta = 27;\r\n\t\t\t} else if(p <= 0.99981) {\r\n\t\t\t\ta = 91;\r\n\t\t\t} else {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\r\n\t\t\treturn 1 - Math.abs(3 * Math.cos(p * a * 1.028) / a);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Constructor.\r\n\t */\r\n\tfunction Skrollr(options) {\r\n\t\tdocumentElement = document.documentElement;\r\n\t\tbody = document.body;\r\n\r\n\t\tdetectCSSPrefix();\r\n\r\n\t\t_instance = this;\r\n\r\n\t\toptions = options || {};\r\n\r\n\t\t_constants = options.constants || {};\r\n\r\n\t\t//We allow defining custom easings or overwrite existing.\r\n\t\tif(options.easing) {\r\n\t\t\tfor(var e in options.easing) {\r\n\t\t\t\teasings[e] = options.easing[e];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t_edgeStrategy = options.edgeStrategy || 'set';\r\n\r\n\t\t_listeners = {\r\n\t\t\t//Function to be called right before rendering.\r\n\t\t\tbeforerender: options.beforerender,\r\n\r\n\t\t\t//Function to be called right after finishing rendering.\r\n\t\t\trender: options.render\r\n\t\t};\r\n\r\n\t\t//forceHeight is true by default\r\n\t\t_forceHeight = options.forceHeight !== false;\r\n\r\n\t\tif(_forceHeight) {\r\n\t\t\t_scale = options.scale || 1;\r\n\t\t}\r\n\r\n\t\t_mobileDeceleration = options.mobileDeceleration || DEFAULT_MOBILE_DECELERATION;\r\n\r\n\t\t_smoothScrollingEnabled = options.smoothScrolling !== false;\r\n\t\t_smoothScrollingDuration = options.smoothScrollingDuration || DEFAULT_SMOOTH_SCROLLING_DURATION;\r\n\r\n\t\t//Dummy object. Will be overwritten in the _render method when smooth scrolling is calculated.\r\n\t\t_smoothScrolling = {\r\n\t\t\ttargetTop: _instance.getScrollTop()\r\n\t\t};\r\n\r\n\t\t//A custom check function may be passed.\r\n\t\t_isMobile = ((options.mobileCheck || function() {\r\n\t\t\treturn (/Android|iPhone|iPad|iPod|BlackBerry|Windows Phone/i).test(navigator.userAgent || navigator.vendor || window.opera);\r\n\t\t})());\r\n\r\n\t\tif(_isMobile) {\r\n\t\t\t_skrollrBody = document.getElementById('skrollr-body');\r\n\r\n\t\t\t//Detect 3d transform if there's a skrollr-body (only needed for #skrollr-body).\r\n\t\t\tif(_skrollrBody) {\r\n\t\t\t\t_detect3DTransforms();\r\n\t\t\t}\r\n\r\n\t\t\t_initMobile();\r\n\t\t\t_updateClass(documentElement, [SKROLLR_CLASS, SKROLLR_MOBILE_CLASS], [NO_SKROLLR_CLASS]);\r\n\t\t} else {\r\n\t\t\t_updateClass(documentElement, [SKROLLR_CLASS, SKROLLR_DESKTOP_CLASS], [NO_SKROLLR_CLASS]);\r\n\t\t}\r\n\r\n\t\t//Triggers parsing of elements and a first reflow.\r\n\t\t_instance.refresh();\r\n\r\n\t\t_addEvent(window, 'resize orientationchange', function() {\r\n\t\t\tvar width = documentElement.clientWidth;\r\n\t\t\tvar height = documentElement.clientHeight;\r\n\r\n\t\t\t//Only reflow if the size actually changed (#271).\r\n\t\t\tif(height !== _lastViewportHeight || width !== _lastViewportWidth) {\r\n\t\t\t\t_lastViewportHeight = height;\r\n\t\t\t\t_lastViewportWidth = width;\r\n\r\n\t\t\t\t_requestReflow = true;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tvar requestAnimFrame = polyfillRAF();\r\n\r\n\t\t//Let's go.\r\n\t\t(function animloop(){\r\n\t\t\t_render();\r\n\t\t\t_animFrame = requestAnimFrame(animloop);\r\n\t\t}());\r\n\r\n\t\treturn _instance;\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)parses some or all elements.\r\n\t */\r\n\tSkrollr.prototype.refresh = function(elements) {\r\n\t\tvar elementIndex;\r\n\t\tvar elementsLength;\r\n\t\tvar ignoreID = false;\r\n\r\n\t\t//Completely reparse anything without argument.\r\n\t\tif(elements === undefined) {\r\n\t\t\t//Ignore that some elements may already have a skrollable ID.\r\n\t\t\tignoreID = true;\r\n\r\n\t\t\t_skrollables = [];\r\n\t\t\t_skrollableIdCounter = 0;\r\n\r\n\t\t\telements = document.getElementsByTagName('*');\r\n\t\t} else {\r\n\t\t\t//We accept a single element or an array of elements.\r\n\t\t\telements = [].concat(elements);\r\n\t\t}\r\n\r\n\t\telementIndex = 0;\r\n\t\telementsLength = elements.length;\r\n\r\n\t\tfor(; elementIndex < elementsLength; elementIndex++) {\r\n\t\t\tvar el = elements[elementIndex];\r\n\t\t\tvar anchorTarget = el;\r\n\t\t\tvar keyFrames = [];\r\n\r\n\t\t\t//If this particular element should be smooth scrolled.\r\n\t\t\tvar smoothScrollThis = _smoothScrollingEnabled;\r\n\r\n\t\t\t//The edge strategy for this particular element.\r\n\t\t\tvar edgeStrategy = _edgeStrategy;\r\n\r\n\t\t\tif(!el.attributes) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t//Iterate over all attributes and search for key frame attributes.\r\n\t\t\tvar attributeIndex = 0;\r\n\t\t\tvar attributesLength = el.attributes.length;\r\n\r\n\t\t\tfor (; attributeIndex < attributesLength; attributeIndex++) {\r\n\t\t\t\tvar attr = el.attributes[attributeIndex];\r\n\r\n\t\t\t\tif(attr.name === 'data-anchor-target') {\r\n\t\t\t\t\tanchorTarget = document.querySelector(attr.value);\r\n\r\n\t\t\t\t\tif(anchorTarget === null) {\r\n\t\t\t\t\t\tthrow 'Unable to find anchor target \"' + attr.value + '\"';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//Global smooth scrolling can be overridden by the element attribute.\r\n\t\t\t\tif(attr.name === 'data-smooth-scrolling') {\r\n\t\t\t\t\tsmoothScrollThis = attr.value !== 'off';\r\n\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//Global edge strategy can be overridden by the element attribute.\r\n\t\t\t\tif(attr.name === 'data-edge-strategy') {\r\n\t\t\t\t\tedgeStrategy = attr.value;\r\n\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar match = attr.name.match(rxKeyframeAttribute);\r\n\r\n\t\t\t\tif(match === null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar kf = {\r\n\t\t\t\t\tprops: attr.value,\r\n\t\t\t\t\t//Point back to the element as well.\r\n\t\t\t\t\telement: el\r\n\t\t\t\t};\r\n\r\n\t\t\t\tkeyFrames.push(kf);\r\n\r\n\t\t\t\tvar constant = match[1];\r\n\r\n\t\t\t\t//If there is a constant, get it's value or fall back to 0.\r\n\t\t\t\tconstant = constant && _constants[constant.substr(1)] || 0;\r\n\r\n\t\t\t\t//Parse key frame offset. If undefined will be casted to 0.\r\n\t\t\t\tvar offset = match[2];\r\n\r\n\t\t\t\t//Is it a percentage offset?\r\n\t\t\t\tif(/p$/.test(offset)) {\r\n\t\t\t\t\tkf.isPercentage = true;\r\n\t\t\t\t\tkf.offset = ((offset.slice(0, -1) | 0) + constant) / 100;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tkf.offset = (offset | 0) + constant;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar anchor1 = match[3];\r\n\r\n\t\t\t\t//If second anchor is not set, the first will be taken for both.\r\n\t\t\t\tvar anchor2 = match[4] || anchor1;\r\n\r\n\t\t\t\t//\"absolute\" (or \"classic\") mode, where numbers mean absolute scroll offset.\r\n\t\t\t\tif(!anchor1 || anchor1 === ANCHOR_START || anchor1 === ANCHOR_END) {\r\n\t\t\t\t\tkf.mode = 'absolute';\r\n\r\n\t\t\t\t\t//data-end needs to be calculated after all key frames are known.\r\n\t\t\t\t\tif(anchor1 === ANCHOR_END) {\r\n\t\t\t\t\t\tkf.isEnd = true;\r\n\t\t\t\t\t} else if(!kf.isPercentage) {\r\n\t\t\t\t\t\t//For data-start we can already set the key frame w/o calculations.\r\n\t\t\t\t\t\t//#59: \"scale\" options should only affect absolute mode.\r\n\t\t\t\t\t\tkf.frame = kf.offset * _scale;\r\n\r\n\t\t\t\t\t\tdelete kf.offset;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t//\"relative\" mode, where numbers are relative to anchors.\r\n\t\t\t\telse {\r\n\t\t\t\t\tkf.mode = 'relative';\r\n\t\t\t\t\tkf.anchors = [anchor1, anchor2];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//Does this element have key frames?\r\n\t\t\tif(!keyFrames.length) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t//Will hold the original style and class attributes before we controlled the element (see #80).\r\n\t\t\tvar styleAttr, classAttr;\r\n\r\n\t\t\tvar id;\r\n\r\n\t\t\tif(!ignoreID && SKROLLABLE_ID_DOM_PROPERTY in el) {\r\n\t\t\t\t//We already have this element under control. Grab the corresponding skrollable id.\r\n\t\t\t\tid = el[SKROLLABLE_ID_DOM_PROPERTY];\r\n\t\t\t\tstyleAttr = _skrollables[id].styleAttr;\r\n\t\t\t\tclassAttr = _skrollables[id].classAttr;\r\n\t\t\t} else {\r\n\t\t\t\t//It's an unknown element. Asign it a new skrollable id.\r\n\t\t\t\tid = (el[SKROLLABLE_ID_DOM_PROPERTY] = _skrollableIdCounter++);\r\n\t\t\t\tstyleAttr = el.style.cssText;\r\n\t\t\t\tclassAttr = _getClass(el);\r\n\t\t\t}\r\n\r\n\t\t\t_skrollables[id] = {\r\n\t\t\t\telement: el,\r\n\t\t\t\tstyleAttr: styleAttr,\r\n\t\t\t\tclassAttr: classAttr,\r\n\t\t\t\tanchorTarget: anchorTarget,\r\n\t\t\t\tkeyFrames: keyFrames,\r\n\t\t\t\tsmoothScrolling: smoothScrollThis,\r\n\t\t\t\tedgeStrategy: edgeStrategy\r\n\t\t\t};\r\n\r\n\t\t\t_updateClass(el, [SKROLLABLE_CLASS], []);\r\n\t\t}\r\n\r\n\t\t//Reflow for the first time.\r\n\t\t_reflow();\r\n\r\n\t\t//Now that we got all key frame numbers right, actually parse the properties.\r\n\t\telementIndex = 0;\r\n\t\telementsLength = elements.length;\r\n\r\n\t\tfor(; elementIndex < elementsLength; elementIndex++) {\r\n\t\t\tvar sk = _skrollables[elements[elementIndex][SKROLLABLE_ID_DOM_PROPERTY]];\r\n\r\n\t\t\tif(sk === undefined) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t//Parse the property string to objects\r\n\t\t\t_parseProps(sk);\r\n\r\n\t\t\t//Fill key frames with missing properties from left and right\r\n\t\t\t_fillProps(sk);\r\n\t\t}\r\n\r\n\t\treturn _instance;\r\n\t};\r\n\r\n\t/**\r\n\t * Transform \"relative\" mode to \"absolute\" mode.\r\n\t * That is, calculate anchor position and offset of element.\r\n\t */\r\n\tSkrollr.prototype.relativeToAbsolute = function(element, viewportAnchor, elementAnchor) {\r\n\t\tvar viewportHeight = documentElement.clientHeight;\r\n\t\tvar box = element.getBoundingClientRect();\r\n\t\tvar absolute = box.top;\r\n\r\n\t\t//#100: IE doesn't supply \"height\" with getBoundingClientRect.\r\n\t\tvar boxHeight = box.bottom - box.top;\r\n\r\n\t\tif(viewportAnchor === ANCHOR_BOTTOM) {\r\n\t\t\tabsolute -= viewportHeight;\r\n\t\t} else if(viewportAnchor === ANCHOR_CENTER) {\r\n\t\t\tabsolute -= viewportHeight / 2;\r\n\t\t}\r\n\r\n\t\tif(elementAnchor === ANCHOR_BOTTOM) {\r\n\t\t\tabsolute += boxHeight;\r\n\t\t} else if(elementAnchor === ANCHOR_CENTER) {\r\n\t\t\tabsolute += boxHeight / 2;\r\n\t\t}\r\n\r\n\t\t//Compensate scrolling since getBoundingClientRect is relative to viewport.\r\n\t\tabsolute += _instance.getScrollTop();\r\n\r\n\t\treturn (absolute + 0.5) | 0;\r\n\t};\r\n\r\n\t/**\r\n\t * Animates scroll top to new position.\r\n\t */\r\n\tSkrollr.prototype.animateTo = function(top, options) {\r\n\t\toptions = options || {};\r\n\r\n\t\tvar now = _now();\r\n\t\tvar scrollTop = _instance.getScrollTop();\r\n\r\n\t\t//Setting this to a new value will automatically cause the current animation to stop, if any.\r\n\t\t_scrollAnimation = {\r\n\t\t\tstartTop: scrollTop,\r\n\t\t\ttopDiff: top - scrollTop,\r\n\t\t\ttargetTop: top,\r\n\t\t\tduration: options.duration || DEFAULT_DURATION,\r\n\t\t\tstartTime: now,\r\n\t\t\tendTime: now + (options.duration || DEFAULT_DURATION),\r\n\t\t\teasing: easings[options.easing || DEFAULT_EASING],\r\n\t\t\tdone: options.done\r\n\t\t};\r\n\r\n\t\t//Don't queue the animation if there's nothing to animate.\r\n\t\tif(!_scrollAnimation.topDiff) {\r\n\t\t\tif(_scrollAnimation.done) {\r\n\t\t\t\t_scrollAnimation.done.call(_instance, false);\r\n\t\t\t}\r\n\r\n\t\t\t_scrollAnimation = undefined;\r\n\t\t}\r\n\r\n\t\treturn _instance;\r\n\t};\r\n\r\n\t/**\r\n\t * Stops animateTo animation.\r\n\t */\r\n\tSkrollr.prototype.stopAnimateTo = function() {\r\n\t\tif(_scrollAnimation && _scrollAnimation.done) {\r\n\t\t\t_scrollAnimation.done.call(_instance, true);\r\n\t\t}\r\n\r\n\t\t_scrollAnimation = undefined;\r\n\t};\r\n\r\n\t/**\r\n\t * Returns if an animation caused by animateTo is currently running.\r\n\t */\r\n\tSkrollr.prototype.isAnimatingTo = function() {\r\n\t\treturn !!_scrollAnimation;\r\n\t};\r\n\r\n\tSkrollr.prototype.setScrollTop = function(top, force) {\r\n\t\t_forceRender = (force === true);\r\n\r\n\t\tif(_isMobile) {\r\n\t\t\t_mobileOffset = Math.min(Math.max(top, 0), _maxKeyFrame);\r\n\t\t} else {\r\n\t\t\twindow.scrollTo(0, top);\r\n\t\t}\r\n\r\n\t\treturn _instance;\r\n\t};\r\n\r\n\tSkrollr.prototype.getScrollTop = function() {\r\n\t\tif(_isMobile) {\r\n\t\t\treturn _mobileOffset;\r\n\t\t} else {\r\n\t\t\treturn window.pageYOffset || documentElement.scrollTop || body.scrollTop || 0;\r\n\t\t}\r\n\t};\r\n\r\n\tSkrollr.prototype.getMaxScrollTop = function() {\r\n\t\treturn _maxKeyFrame;\r\n\t};\r\n\r\n\tSkrollr.prototype.on = function(name, fn) {\r\n\t\t_listeners[name] = fn;\r\n\r\n\t\treturn _instance;\r\n\t};\r\n\r\n\tSkrollr.prototype.off = function(name) {\r\n\t\tdelete _listeners[name];\r\n\r\n\t\treturn _instance;\r\n\t};\r\n\r\n\tSkrollr.prototype.destroy = function() {\r\n\t\tvar cancelAnimFrame = polyfillCAF();\r\n\t\tcancelAnimFrame(_animFrame);\r\n\t\t_removeAllEvents();\r\n\r\n\t\t_updateClass(documentElement, [NO_SKROLLR_CLASS], [SKROLLR_CLASS, SKROLLR_DESKTOP_CLASS, SKROLLR_MOBILE_CLASS]);\r\n\r\n\t\tvar skrollableIndex = 0;\r\n\t\tvar skrollablesLength = _skrollables.length;\r\n\r\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\r\n\t\t\t_reset(_skrollables[skrollableIndex].element);\r\n\t\t}\r\n\r\n\t\tdocumentElement.style.overflow = body.style.overflow = 'auto';\r\n\t\tdocumentElement.style.height = body.style.height = 'auto';\r\n\r\n\t\tif(_skrollrBody) {\r\n\t\t\tskrollr.setStyle(_skrollrBody, 'transform', 'none');\r\n\t\t}\r\n\r\n\t\t_instance = undefined;\r\n\t\t_skrollrBody = undefined;\r\n\t\t_listeners = undefined;\r\n\t\t_forceHeight = undefined;\r\n\t\t_maxKeyFrame = 0;\r\n\t\t_scale = 1;\r\n\t\t_constants = undefined;\r\n\t\t_mobileDeceleration = undefined;\r\n\t\t_direction = 'down';\r\n\t\t_lastTop = -1;\r\n\t\t_lastViewportWidth = 0;\r\n\t\t_lastViewportHeight = 0;\r\n\t\t_requestReflow = false;\r\n\t\t_scrollAnimation = undefined;\r\n\t\t_smoothScrollingEnabled = undefined;\r\n\t\t_smoothScrollingDuration = undefined;\r\n\t\t_smoothScrolling = undefined;\r\n\t\t_forceRender = undefined;\r\n\t\t_skrollableIdCounter = 0;\r\n\t\t_edgeStrategy = undefined;\r\n\t\t_isMobile = false;\r\n\t\t_mobileOffset = 0;\r\n\t\t_translateZ = undefined;\r\n\t};\r\n\r\n\t/*\r\n\t\tPrivate methods.\r\n\t*/\r\n\r\n\tvar _initMobile = function() {\r\n\t\tvar initialElement;\r\n\t\tvar initialTouchY;\r\n\t\tvar initialTouchX;\r\n\t\tvar currentElement;\r\n\t\tvar currentTouchY;\r\n\t\tvar currentTouchX;\r\n\t\tvar lastTouchY;\r\n\t\tvar deltaY;\r\n\r\n\t\tvar initialTouchTime;\r\n\t\tvar currentTouchTime;\r\n\t\tvar lastTouchTime;\r\n\t\tvar deltaTime;\r\n\r\n\t\t_addEvent(documentElement, [EVENT_TOUCHSTART, EVENT_TOUCHMOVE, EVENT_TOUCHCANCEL, EVENT_TOUCHEND].join(' '), function(e) {\r\n\t\t\tvar touch = e.changedTouches[0];\r\n\r\n\t\t\tcurrentElement = e.target;\r\n\r\n\t\t\t//We don't want text nodes.\r\n\t\t\twhile(currentElement.nodeType === 3) {\r\n\t\t\t\tcurrentElement = currentElement.parentNode;\r\n\t\t\t}\r\n\r\n\t\t\tcurrentTouchY = touch.clientY;\r\n\t\t\tcurrentTouchX = touch.clientX;\r\n\t\t\tcurrentTouchTime = e.timeStamp;\r\n\r\n\t\t\tif(!rxTouchIgnoreTags.test(currentElement.tagName)) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\tswitch(e.type) {\r\n\t\t\t\tcase EVENT_TOUCHSTART:\r\n\t\t\t\t\t//The last element we tapped on.\r\n\t\t\t\t\tif(initialElement) {\r\n\t\t\t\t\t\tinitialElement.blur();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t_instance.stopAnimateTo();\r\n\r\n\t\t\t\t\tinitialElement = currentElement;\r\n\r\n\t\t\t\t\tinitialTouchY = lastTouchY = currentTouchY;\r\n\t\t\t\t\tinitialTouchX = currentTouchX;\r\n\t\t\t\t\tinitialTouchTime = currentTouchTime;\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase EVENT_TOUCHMOVE:\r\n\t\t\t\t\tdeltaY = currentTouchY - lastTouchY;\r\n\t\t\t\t\tdeltaTime = currentTouchTime - lastTouchTime;\r\n\r\n\t\t\t\t\t_instance.setScrollTop(_mobileOffset - deltaY, true);\r\n\r\n\t\t\t\t\tlastTouchY = currentTouchY;\r\n\t\t\t\t\tlastTouchTime = currentTouchTime;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\tcase EVENT_TOUCHCANCEL:\r\n\t\t\t\tcase EVENT_TOUCHEND:\r\n\t\t\t\t\tvar distanceY = initialTouchY - currentTouchY;\r\n\t\t\t\t\tvar distanceX = initialTouchX - currentTouchX;\r\n\t\t\t\t\tvar distance2 = distanceX * distanceX + distanceY * distanceY;\r\n\r\n\t\t\t\t\t//Check if it was more like a tap (moved less than 7px).\r\n\t\t\t\t\tif(distance2 < 49) {\r\n\t\t\t\t\t\tif(!rxTouchIgnoreTags.test(initialElement.tagName)) {\r\n\t\t\t\t\t\t\tinitialElement.focus();\r\n\r\n\t\t\t\t\t\t\t//It was a tap, click the element.\r\n\t\t\t\t\t\t\tvar clickEvent = document.createEvent('MouseEvents');\r\n\t\t\t\t\t\t\tclickEvent.initMouseEvent('click', true, true, e.view, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, 0, null);\r\n\t\t\t\t\t\t\tinitialElement.dispatchEvent(clickEvent);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tinitialElement = undefined;\r\n\r\n\t\t\t\t\tvar speed = deltaY / deltaTime;\r\n\r\n\t\t\t\t\t//Cap speed at 3 pixel/ms.\r\n\t\t\t\t\tspeed = Math.max(Math.min(speed, 3), -3);\r\n\r\n\t\t\t\t\tvar duration = Math.abs(speed / _mobileDeceleration);\r\n\t\t\t\t\tvar targetOffset = speed * duration + 0.5 * _mobileDeceleration * duration * duration;\r\n\t\t\t\t\tvar targetTop = _instance.getScrollTop() - targetOffset;\r\n\r\n\t\t\t\t\t//Relative duration change for when scrolling above bounds.\r\n\t\t\t\t\tvar targetRatio = 0;\r\n\r\n\t\t\t\t\t//Change duration proportionally when scrolling would leave bounds.\r\n\t\t\t\t\tif(targetTop > _maxKeyFrame) {\r\n\t\t\t\t\t\ttargetRatio = (_maxKeyFrame - targetTop) / targetOffset;\r\n\r\n\t\t\t\t\t\ttargetTop = _maxKeyFrame;\r\n\t\t\t\t\t} else if(targetTop < 0) {\r\n\t\t\t\t\t\ttargetRatio = -targetTop / targetOffset;\r\n\r\n\t\t\t\t\t\ttargetTop = 0;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tduration = duration * (1 - targetRatio);\r\n\r\n\t\t\t\t\t_instance.animateTo((targetTop + 0.5) | 0, {easing: 'outCubic', duration: duration});\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t//Just in case there has already been some native scrolling, reset it.\r\n\t\twindow.scrollTo(0, 0);\r\n\t\tdocumentElement.style.overflow = body.style.overflow = 'hidden';\r\n\t};\r\n\r\n\t/**\r\n\t * Updates key frames which depend on others.\r\n\t * That is \"end\" in \"absolute\" mode and all key frames in \"relative\" mode.\r\n\t */\r\n\tvar _updateDependentKeyFrames = function() {\r\n\t\tvar skrollable;\r\n\t\tvar element;\r\n\t\tvar anchorTarget;\r\n\t\tvar keyFrames;\r\n\t\tvar keyFrameIndex;\r\n\t\tvar keyFramesLength;\r\n\t\tvar kf;\r\n\t\tvar skrollableIndex;\r\n\t\tvar skrollablesLength;\r\n\r\n\t\t//First process all relative-mode elements and find the max key frame.\r\n\t\tskrollableIndex = 0;\r\n\t\tskrollablesLength = _skrollables.length;\r\n\r\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\r\n\t\t\tskrollable = _skrollables[skrollableIndex];\r\n\t\t\telement = skrollable.element;\r\n\t\t\tanchorTarget = skrollable.anchorTarget;\r\n\t\t\tkeyFrames = skrollable.keyFrames;\r\n\r\n\t\t\tkeyFrameIndex = 0;\r\n\t\t\tkeyFramesLength = keyFrames.length;\r\n\r\n\t\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\r\n\t\t\t\tkf = keyFrames[keyFrameIndex];\r\n\r\n\t\t\t\tvar offset = kf.offset;\r\n\r\n\t\t\t\tif(kf.isPercentage) {\r\n\t\t\t\t\t//Convert the offset to percentage of the viewport height.\r\n\t\t\t\t\toffset = offset * documentElement.clientHeight;\r\n\r\n\t\t\t\t\t//Absolute + percentage mode.\r\n\t\t\t\t\tkf.frame = offset;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(kf.mode === 'relative') {\r\n\t\t\t\t\t_reset(element);\r\n\r\n\t\t\t\t\tkf.frame = _instance.relativeToAbsolute(anchorTarget, kf.anchors[0], kf.anchors[1]) - offset;\r\n\r\n\t\t\t\t\t_reset(element, true);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//Only search for max key frame when forceHeight is enabled.\r\n\t\t\t\tif(_forceHeight) {\r\n\t\t\t\t\t//Find the max key frame, but don't use one of the data-end ones for comparison.\r\n\t\t\t\t\tif(!kf.isEnd && kf.frame > _maxKeyFrame) {\r\n\t\t\t\t\t\t_maxKeyFrame = kf.frame;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//#133: The document can be larger than the maxKeyFrame we found.\r\n\t\t_maxKeyFrame = Math.max(_maxKeyFrame, _getDocumentHeight());\r\n\r\n\t\t//Now process all data-end keyframes.\r\n\t\tskrollableIndex = 0;\r\n\t\tskrollablesLength = _skrollables.length;\r\n\r\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\r\n\t\t\tskrollable = _skrollables[skrollableIndex];\r\n\t\t\tkeyFrames = skrollable.keyFrames;\r\n\r\n\t\t\tkeyFrameIndex = 0;\r\n\t\t\tkeyFramesLength = keyFrames.length;\r\n\r\n\t\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\r\n\t\t\t\tkf = keyFrames[keyFrameIndex];\r\n\r\n\t\t\t\tif(kf.isEnd) {\r\n\t\t\t\t\tkf.frame = _maxKeyFrame - kf.offset;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tskrollable.keyFrames.sort(_keyFrameComparator);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Calculates and sets the style properties for the element at the given frame.\r\n\t * @param fakeFrame The frame to render at when smooth scrolling is enabled.\r\n\t * @param actualFrame The actual frame we are at.\r\n\t */\r\n\tvar _calcSteps = function(fakeFrame, actualFrame) {\r\n\t\t//Iterate over all skrollables.\r\n\t\tvar skrollableIndex = 0;\r\n\t\tvar skrollablesLength = _skrollables.length;\r\n\r\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\r\n\t\t\tvar skrollable = _skrollables[skrollableIndex];\r\n\t\t\tvar element = skrollable.element;\r\n\t\t\tvar frame = skrollable.smoothScrolling ? fakeFrame : actualFrame;\r\n\t\t\tvar frames = skrollable.keyFrames;\r\n\t\t\tvar firstFrame = frames[0].frame;\r\n\t\t\tvar lastFrame = frames[frames.length - 1].frame;\r\n\t\t\tvar beforeFirst = frame < firstFrame;\r\n\t\t\tvar afterLast = frame > lastFrame;\r\n\t\t\tvar firstOrLastFrame = frames[beforeFirst ? 0 : frames.length - 1];\r\n\t\t\tvar key;\r\n\t\t\tvar value;\r\n\r\n\t\t\t//If we are before/after the first/last frame, set the styles according to the given edge strategy.\r\n\t\t\tif(beforeFirst || afterLast) {\r\n\t\t\t\t//Check if we already handled this edge case last time.\r\n\t\t\t\t//Note: using setScrollTop it's possible that we jumped from one edge to the other.\r\n\t\t\t\tif(beforeFirst && skrollable.edge === -1 || afterLast && skrollable.edge === 1) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//Add the skrollr-before or -after class.\r\n\t\t\t\t_updateClass(element, [beforeFirst ? SKROLLABLE_BEFORE_CLASS : SKROLLABLE_AFTER_CLASS], [SKROLLABLE_BEFORE_CLASS, SKROLLABLE_BETWEEN_CLASS, SKROLLABLE_AFTER_CLASS]);\r\n\r\n\t\t\t\t//Remember that we handled the edge case (before/after the first/last keyframe).\r\n\t\t\t\tskrollable.edge = beforeFirst ? -1 : 1;\r\n\r\n\t\t\t\tswitch(skrollable.edgeStrategy) {\r\n\t\t\t\t\tcase 'reset':\r\n\t\t\t\t\t\t_reset(element);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\tcase 'ease':\r\n\t\t\t\t\t\t//Handle this case like it would be exactly at first/last keyframe and just pass it on.\r\n\t\t\t\t\t\tframe = firstOrLastFrame.frame;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\tcase 'set':\r\n\t\t\t\t\t\tvar props = firstOrLastFrame.props;\r\n\r\n\t\t\t\t\t\tfor(key in props) {\r\n\t\t\t\t\t\t\tif(hasProp.call(props, key)) {\r\n\t\t\t\t\t\t\t\tvalue = _interpolateString(props[key].value);\r\n\r\n\t\t\t\t\t\t\t\tskrollr.setStyle(element, key, value);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t//Did we handle an edge last time?\r\n\t\t\t\tif(skrollable.edge !== 0) {\r\n\t\t\t\t\t_updateClass(element, [SKROLLABLE_CLASS, SKROLLABLE_BETWEEN_CLASS], [SKROLLABLE_BEFORE_CLASS, SKROLLABLE_AFTER_CLASS]);\r\n\t\t\t\t\tskrollable.edge = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//Find out between which two key frames we are right now.\r\n\t\t\tvar keyFrameIndex = 0;\r\n\t\t\tvar framesLength = frames.length - 1;\r\n\r\n\t\t\tfor(; keyFrameIndex < framesLength; keyFrameIndex++) {\r\n\t\t\t\tif(frame >= frames[keyFrameIndex].frame && frame <= frames[keyFrameIndex + 1].frame) {\r\n\t\t\t\t\tvar left = frames[keyFrameIndex];\r\n\t\t\t\t\tvar right = frames[keyFrameIndex + 1];\r\n\r\n\t\t\t\t\tfor(key in left.props) {\r\n\t\t\t\t\t\tif(hasProp.call(left.props, key)) {\r\n\t\t\t\t\t\t\tvar progress = (frame - left.frame) / (right.frame - left.frame);\r\n\r\n\t\t\t\t\t\t\t//Transform the current progress using the given easing function.\r\n\t\t\t\t\t\t\tprogress = left.props[key].easing(progress);\r\n\r\n\t\t\t\t\t\t\t//Interpolate between the two values\r\n\t\t\t\t\t\t\tvalue = _calcInterpolation(left.props[key].value, right.props[key].value, progress);\r\n\r\n\t\t\t\t\t\t\tvalue = _interpolateString(value);\r\n\r\n\t\t\t\t\t\t\tskrollr.setStyle(element, key, value);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Renders all elements.\r\n\t */\r\n\tvar _render = function() {\r\n\t\tif(_requestReflow) {\r\n\t\t\t_requestReflow = false;\r\n\t\t\t_reflow();\r\n\t\t}\r\n\r\n\t\t//We may render something else than the actual scrollbar position.\r\n\t\tvar renderTop = _instance.getScrollTop();\r\n\r\n\t\t//If there's an animation, which ends in current render call, call the callback after rendering.\r\n\t\tvar afterAnimationCallback;\r\n\t\tvar now = _now();\r\n\t\tvar progress;\r\n\r\n\t\t//Before actually rendering handle the scroll animation, if any.\r\n\t\tif(_scrollAnimation) {\r\n\t\t\t//It's over\r\n\t\t\tif(now >= _scrollAnimation.endTime) {\r\n\t\t\t\trenderTop = _scrollAnimation.targetTop;\r\n\t\t\t\tafterAnimationCallback = _scrollAnimation.done;\r\n\t\t\t\t_scrollAnimation = undefined;\r\n\t\t\t} else {\r\n\t\t\t\t//Map the current progress to the new progress using given easing function.\r\n\t\t\t\tprogress = _scrollAnimation.easing((now - _scrollAnimation.startTime) / _scrollAnimation.duration);\r\n\r\n\t\t\t\trenderTop = (_scrollAnimation.startTop + progress * _scrollAnimation.topDiff) | 0;\r\n\t\t\t}\r\n\r\n\t\t\t_instance.setScrollTop(renderTop, true);\r\n\t\t}\r\n\t\t//Smooth scrolling only if there's no animation running and if we're not forcing the rendering.\r\n\t\telse if(!_forceRender) {\r\n\t\t\tvar smoothScrollingDiff = _smoothScrolling.targetTop - renderTop;\r\n\r\n\t\t\t//The user scrolled, start new smooth scrolling.\r\n\t\t\tif(smoothScrollingDiff) {\r\n\t\t\t\t_smoothScrolling = {\r\n\t\t\t\t\tstartTop: _lastTop,\r\n\t\t\t\t\ttopDiff: renderTop - _lastTop,\r\n\t\t\t\t\ttargetTop: renderTop,\r\n\t\t\t\t\tstartTime: _lastRenderCall,\r\n\t\t\t\t\tendTime: _lastRenderCall + _smoothScrollingDuration\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\t//Interpolate the internal scroll position (not the actual scrollbar).\r\n\t\t\tif(now <= _smoothScrolling.endTime) {\r\n\t\t\t\t//Map the current progress to the new progress using easing function.\r\n\t\t\t\tprogress = easings.sqrt((now - _smoothScrolling.startTime) / _smoothScrollingDuration);\r\n\r\n\t\t\t\trenderTop = (_smoothScrolling.startTop + progress * _smoothScrolling.topDiff) | 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//That's were we actually \"scroll\" on mobile.\r\n\t\tif(_isMobile && _skrollrBody) {\r\n\t\t\t//Set the transform (\"scroll it\").\r\n\t\t\tskrollr.setStyle(_skrollrBody, 'transform', 'translate(0, ' + -(_mobileOffset) + 'px) ' + _translateZ);\r\n\t\t}\r\n\r\n\t\t//Did the scroll position even change?\r\n\t\tif(_forceRender || _lastTop !== renderTop) {\r\n\t\t\t//Remember in which direction are we scrolling?\r\n\t\t\t_direction = (renderTop > _lastTop) ? 'down' : (renderTop < _lastTop ? 'up' : _direction);\r\n\r\n\t\t\t_forceRender = false;\r\n\r\n\t\t\tvar listenerParams = {\r\n\t\t\t\tcurTop: renderTop,\r\n\t\t\t\tlastTop: _lastTop,\r\n\t\t\t\tmaxTop: _maxKeyFrame,\r\n\t\t\t\tdirection: _direction\r\n\t\t\t};\r\n\r\n\t\t\t//Tell the listener we are about to render.\r\n\t\t\tvar continueRendering = _listeners.beforerender && _listeners.beforerender.call(_instance, listenerParams);\r\n\r\n\t\t\t//The beforerender listener function is able the cancel rendering.\r\n\t\t\tif(continueRendering !== false) {\r\n\t\t\t\t//Now actually interpolate all the styles.\r\n\t\t\t\t_calcSteps(renderTop, _instance.getScrollTop());\r\n\r\n\t\t\t\t//Remember when we last rendered.\r\n\t\t\t\t_lastTop = renderTop;\r\n\r\n\t\t\t\tif(_listeners.render) {\r\n\t\t\t\t\t_listeners.render.call(_instance, listenerParams);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(afterAnimationCallback) {\r\n\t\t\t\tafterAnimationCallback.call(_instance, false);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t_lastRenderCall = now;\r\n\t};\r\n\r\n\t/**\r\n\t * Parses the properties for each key frame of the given skrollable.\r\n\t */\r\n\tvar _parseProps = function(skrollable) {\r\n\t\t//Iterate over all key frames\r\n\t\tvar keyFrameIndex = 0;\r\n\t\tvar keyFramesLength = skrollable.keyFrames.length;\r\n\r\n\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\r\n\t\t\tvar frame = skrollable.keyFrames[keyFrameIndex];\r\n\t\t\tvar easing;\r\n\t\t\tvar value;\r\n\t\t\tvar prop;\r\n\t\t\tvar props = {};\r\n\r\n\t\t\tvar match;\r\n\r\n\t\t\twhile((match = rxPropValue.exec(frame.props)) !== null) {\r\n\t\t\t\tprop = match[1];\r\n\t\t\t\tvalue = match[2];\r\n\r\n\t\t\t\teasing = prop.match(rxPropEasing);\r\n\r\n\t\t\t\t//Is there an easing specified for this prop?\r\n\t\t\t\tif(easing !== null) {\r\n\t\t\t\t\tprop = easing[1];\r\n\t\t\t\t\teasing = easing[2];\r\n\t\t\t\t} else {\r\n\t\t\t\t\teasing = DEFAULT_EASING;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//Exclamation point at first position forces the value to be taken literal.\r\n\t\t\t\tvalue = value.indexOf('!') ? _parseProp(value) : [value.slice(1)];\r\n\r\n\t\t\t\t//Save the prop for this key frame with his value and easing function\r\n\t\t\t\tprops[prop] = {\r\n\t\t\t\t\tvalue: value,\r\n\t\t\t\t\teasing: easings[easing]\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tframe.props = props;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Parses a value extracting numeric values and generating a format string\r\n\t * for later interpolation of the new values in old string.\r\n\t *\r\n\t * @param val The CSS value to be parsed.\r\n\t * @return Something like [\"rgba(?%,?%, ?%,?)\", 100, 50, 0, .7]\r\n\t * where the first element is the format string later used\r\n\t * and all following elements are the numeric value.\r\n\t */\r\n\tvar _parseProp = function(val) {\r\n\t\tvar numbers = [];\r\n\r\n\t\t//One special case, where floats don't work.\r\n\t\t//We replace all occurences of rgba colors\r\n\t\t//which don't use percentage notation with the percentage notation.\r\n\t\trxRGBAIntegerColor.lastIndex = 0;\r\n\t\tval = val.replace(rxRGBAIntegerColor, function(rgba) {\r\n\t\t\treturn rgba.replace(rxNumericValue, function(n) {\r\n\t\t\t\treturn n / 255 * 100 + '%';\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t//Handle prefixing of \"gradient\" values.\r\n\t\t//For now only the prefixed value will be set. Unprefixed isn't supported anyway.\r\n\t\tif(theDashedCSSPrefix) {\r\n\t\t\trxGradient.lastIndex = 0;\r\n\t\t\tval = val.replace(rxGradient, function(s) {\r\n\t\t\t\treturn theDashedCSSPrefix + s;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t//Now parse ANY number inside this string and create a format string.\r\n\t\tval = val.replace(rxNumericValue, function(n) {\r\n\t\t\tnumbers.push(+n);\r\n\t\t\treturn '{?}';\r\n\t\t});\r\n\r\n\t\t//Add the formatstring as first value.\r\n\t\tnumbers.unshift(val);\r\n\r\n\t\treturn numbers;\r\n\t};\r\n\r\n\t/**\r\n\t * Fills the key frames with missing left and right hand properties.\r\n\t * If key frame 1 has property X and key frame 2 is missing X,\r\n\t * but key frame 3 has X again, then we need to assign X to key frame 2 too.\r\n\t *\r\n\t * @param sk A skrollable.\r\n\t */\r\n\tvar _fillProps = function(sk) {\r\n\t\t//Will collect the properties key frame by key frame\r\n\t\tvar propList = {};\r\n\t\tvar keyFrameIndex;\r\n\t\tvar keyFramesLength;\r\n\r\n\t\t//Iterate over all key frames from left to right\r\n\t\tkeyFrameIndex = 0;\r\n\t\tkeyFramesLength = sk.keyFrames.length;\r\n\r\n\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\r\n\t\t\t_fillPropForFrame(sk.keyFrames[keyFrameIndex], propList);\r\n\t\t}\r\n\r\n\t\t//Now do the same from right to fill the last gaps\r\n\r\n\t\tpropList = {};\r\n\r\n\t\t//Iterate over all key frames from right to left\r\n\t\tkeyFrameIndex = sk.keyFrames.length - 1;\r\n\r\n\t\tfor(; keyFrameIndex >= 0; keyFrameIndex--) {\r\n\t\t\t_fillPropForFrame(sk.keyFrames[keyFrameIndex], propList);\r\n\t\t}\r\n\t};\r\n\r\n\tvar _fillPropForFrame = function(frame, propList) {\r\n\t\tvar key;\r\n\r\n\t\t//For each key frame iterate over all right hand properties and assign them,\r\n\t\t//but only if the current key frame doesn't have the property by itself\r\n\t\tfor(key in propList) {\r\n\t\t\t//The current frame misses this property, so assign it.\r\n\t\t\tif(!hasProp.call(frame.props, key)) {\r\n\t\t\t\tframe.props[key] = propList[key];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//Iterate over all props of the current frame and collect them\r\n\t\tfor(key in frame.props) {\r\n\t\t\tpropList[key] = frame.props[key];\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Calculates the new values for two given values array.\r\n\t */\r\n\tvar _calcInterpolation = function(val1, val2, progress) {\r\n\t\tvar valueIndex;\r\n\t\tvar val1Length = val1.length;\r\n\r\n\t\t//They both need to have the same length\r\n\t\tif(val1Length !== val2.length) {\r\n\t\t\tthrow 'Can\\'t interpolate between \"' + val1[0] + '\" and \"' + val2[0] + '\"';\r\n\t\t}\r\n\r\n\t\t//Add the format string as first element.\r\n\t\tvar interpolated = [val1[0]];\r\n\r\n\t\tvalueIndex = 1;\r\n\r\n\t\tfor(; valueIndex < val1Length; valueIndex++) {\r\n\t\t\t//That's the line where the two numbers are actually interpolated.\r\n\t\t\tinterpolated[valueIndex] = val1[valueIndex] + ((val2[valueIndex] - val1[valueIndex]) * progress);\r\n\t\t}\r\n\r\n\t\treturn interpolated;\r\n\t};\r\n\r\n\t/**\r\n\t * Interpolates the numeric values into the format string.\r\n\t */\r\n\tvar _interpolateString = function(val) {\r\n\t\tvar valueIndex = 1;\r\n\r\n\t\trxInterpolateString.lastIndex = 0;\r\n\r\n\t\treturn val[0].replace(rxInterpolateString, function() {\r\n\t\t\treturn val[valueIndex++];\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * Resets the class and style attribute to what it was before skrollr manipulated the element.\r\n\t * Also remembers the values it had before reseting, in order to undo the reset.\r\n\t */\r\n\tvar _reset = function(elements, undo) {\r\n\t\t//We accept a single element or an array of elements.\r\n\t\telements = [].concat(elements);\r\n\r\n\t\tvar skrollable;\r\n\t\tvar element;\r\n\t\tvar elementsIndex = 0;\r\n\t\tvar elementsLength = elements.length;\r\n\r\n\t\tfor(; elementsIndex < elementsLength; elementsIndex++) {\r\n\t\t\telement = elements[elementsIndex];\r\n\t\t\tskrollable = _skrollables[element[SKROLLABLE_ID_DOM_PROPERTY]];\r\n\r\n\t\t\t//Couldn't find the skrollable for this DOM element.\r\n\t\t\tif(!skrollable) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif(undo) {\r\n\t\t\t\t//Reset class and style to the \"dirty\" (set by skrollr) values.\r\n\t\t\t\telement.style.cssText = skrollable.dirtyStyleAttr;\r\n\t\t\t\t_updateClass(element, skrollable.dirtyClassAttr);\r\n\t\t\t} else {\r\n\t\t\t\t//Remember the \"dirty\" (set by skrollr) class and style.\r\n\t\t\t\tskrollable.dirtyStyleAttr = element.style.cssText;\r\n\t\t\t\tskrollable.dirtyClassAttr = _getClass(element);\r\n\r\n\t\t\t\t//Reset class and style to what it originally was.\r\n\t\t\t\telement.style.cssText = skrollable.styleAttr;\r\n\t\t\t\t_updateClass(element, skrollable.classAttr);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Detects support for 3d transforms by applying it to the skrollr-body.\r\n\t */\r\n\tvar _detect3DTransforms = function() {\r\n\t\t_translateZ = 'translateZ(0)';\r\n\t\tskrollr.setStyle(_skrollrBody, 'transform', _translateZ);\r\n\r\n\t\tvar computedStyle = getStyle(_skrollrBody);\r\n\t\tvar computedTransform = computedStyle.getPropertyValue('transform');\r\n\t\tvar computedTransformWithPrefix = computedStyle.getPropertyValue(theDashedCSSPrefix + 'transform');\r\n\t\tvar has3D = (computedTransform && computedTransform !== 'none') || (computedTransformWithPrefix && computedTransformWithPrefix !== 'none');\r\n\r\n\t\tif(!has3D) {\r\n\t\t\t_translateZ = '';\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Set the CSS property on the given element. Sets prefixed properties as well.\r\n\t */\r\n\tskrollr.setStyle = function(el, prop, val) {\r\n\t\tvar style = el.style;\r\n\r\n\t\t//Camel case.\r\n\t\tprop = prop.replace(rxCamelCase, rxCamelCaseFn).replace('-', '');\r\n\r\n\t\t//Make sure z-index gets a .\r\n\t\t//This is the only case we need to handle.\r\n\t\tif(prop === 'zIndex') {\r\n\t\t\tif(isNaN(val)) {\r\n\t\t\t\t//If it's not a number, don't touch it.\r\n\t\t\t\t//It could for example be \"auto\" (#351).\r\n\t\t\t\tstyle[prop] = val;\r\n\t\t\t} else {\r\n\t\t\t\t//Floor the number.\r\n\t\t\t\tstyle[prop] = '' + (val | 0);\r\n\t\t\t}\r\n\t\t}\r\n\t\t//#64: \"float\" can't be set across browsers. Needs to use \"cssFloat\" for all except IE.\r\n\t\telse if(prop === 'float') {\r\n\t\t\tstyle.styleFloat = style.cssFloat = val;\r\n\t\t}\r\n\t\telse {\r\n\t\t\t//Need try-catch for old IE.\r\n\t\t\ttry {\r\n\t\t\t\t//Set prefixed property if there's a prefix.\r\n\t\t\t\tif(theCSSPrefix) {\r\n\t\t\t\t\tstyle[theCSSPrefix + prop.slice(0,1).toUpperCase() + prop.slice(1)] = val;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//Set unprefixed.\r\n\t\t\t\tstyle[prop] = val;\r\n\t\t\t} catch(ignore) {}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Cross browser event handling.\r\n\t */\r\n\tvar _addEvent = skrollr.addEvent = function(element, names, callback) {\r\n\t\tvar intermediate = function(e) {\r\n\t\t\t//Normalize IE event stuff.\r\n\t\t\te = e || window.event;\r\n\r\n\t\t\tif(!e.target) {\r\n\t\t\t\te.target = e.srcElement;\r\n\t\t\t}\r\n\r\n\t\t\tif(!e.preventDefault) {\r\n\t\t\t\te.preventDefault = function() {\r\n\t\t\t\t\te.returnValue = false;\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\treturn callback.call(this, e);\r\n\t\t};\r\n\r\n\t\tnames = names.split(' ');\r\n\r\n\t\tvar name;\r\n\t\tvar nameCounter = 0;\r\n\t\tvar namesLength = names.length;\r\n\r\n\t\tfor(; nameCounter < namesLength; nameCounter++) {\r\n\t\t\tname = names[nameCounter];\r\n\r\n\t\t\tif(element.addEventListener) {\r\n\t\t\t\telement.addEventListener(name, callback, false);\r\n\t\t\t} else {\r\n\t\t\t\telement.attachEvent('on' + name, intermediate);\r\n\t\t\t}\r\n\r\n\t\t\t//Remember the events to be able to flush them later.\r\n\t\t\t_registeredEvents.push({\r\n\t\t\t\telement: element,\r\n\t\t\t\tname: name,\r\n\t\t\t\tlistener: callback\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tvar _removeEvent = skrollr.removeEvent = function(element, names, callback) {\r\n\t\tnames = names.split(' ');\r\n\r\n\t\tvar nameCounter = 0;\r\n\t\tvar namesLength = names.length;\r\n\r\n\t\tfor(; nameCounter < namesLength; nameCounter++) {\r\n\t\t\tif(element.removeEventListener) {\r\n\t\t\t\telement.removeEventListener(names[nameCounter], callback, false);\r\n\t\t\t} else {\r\n\t\t\t\telement.detachEvent('on' + names[nameCounter], callback);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tvar _removeAllEvents = function() {\r\n\t\tvar eventData;\r\n\t\tvar eventCounter = 0;\r\n\t\tvar eventsLength = _registeredEvents.length;\r\n\r\n\t\tfor(; eventCounter < eventsLength; eventCounter++) {\r\n\t\t\teventData = _registeredEvents[eventCounter];\r\n\r\n\t\t\t_removeEvent(eventData.element, eventData.name, eventData.listener);\r\n\t\t}\r\n\r\n\t\t_registeredEvents = [];\r\n\t};\r\n\r\n\tvar _reflow = function() {\r\n\t\tvar pos = _instance.getScrollTop();\r\n\r\n\t\t//Will be recalculated by _updateDependentKeyFrames.\r\n\t\t_maxKeyFrame = 0;\r\n\r\n\t\tif(_forceHeight && !_isMobile) {\r\n\t\t\t//un-\"force\" the height to not mess with the calculations in _updateDependentKeyFrames (#216).\r\n\t\t\tbody.style.height = 'auto';\r\n\t\t}\r\n\r\n\t\t_updateDependentKeyFrames();\r\n\r\n\t\tif(_forceHeight && !_isMobile) {\r\n\t\t\t//\"force\" the height.\r\n\t\t\tbody.style.height = (_maxKeyFrame + documentElement.clientHeight) + 'px';\r\n\t\t}\r\n\r\n\t\t//The scroll offset may now be larger than needed (on desktop the browser/os prevents scrolling farther than the bottom).\r\n\t\tif(_isMobile) {\r\n\t\t\t_instance.setScrollTop(Math.min(_instance.getScrollTop(), _maxKeyFrame));\r\n\t\t} else {\r\n\t\t\t//Remember and reset the scroll pos (#217).\r\n\t\t\t_instance.setScrollTop(pos, true);\r\n\t\t}\r\n\r\n\t\t_forceRender = true;\r\n\t};\r\n\r\n\t/*\r\n\t * Returns the height of the document.\r\n\t */\r\n\tvar _getDocumentHeight = function() {\r\n\t\tvar skrollrBodyHeight = (_skrollrBody && _skrollrBody.offsetHeight || 0);\r\n\t\tvar bodyHeight = Math.max(skrollrBodyHeight, body.scrollHeight, body.offsetHeight, documentElement.scrollHeight, documentElement.offsetHeight, documentElement.clientHeight);\r\n\r\n\t\treturn bodyHeight - documentElement.clientHeight;\r\n\t};\r\n\r\n\t/**\r\n\t * Returns a string of space separated classnames for the current element.\r\n\t * Works with SVG as well.\r\n\t */\r\n\tvar _getClass = function(element) {\r\n\t\tvar prop = 'className';\r\n\r\n\t\t//SVG support by using className.baseVal instead of just className.\r\n\t\tif(window.SVGElement && element instanceof window.SVGElement) {\r\n\t\t\telement = element[prop];\r\n\t\t\tprop = 'baseVal';\r\n\t\t}\r\n\r\n\t\treturn element[prop];\r\n\t};\r\n\r\n\t/**\r\n\t * Adds and removes a CSS classes.\r\n\t * Works with SVG as well.\r\n\t * add and remove are arrays of strings,\r\n\t * or if remove is ommited add is a string and overwrites all classes.\r\n\t */\r\n\tvar _updateClass = function(element, add, remove) {\r\n\t\tvar prop = 'className';\r\n\r\n\t\t//SVG support by using className.baseVal instead of just className.\r\n\t\tif(window.SVGElement && element instanceof window.SVGElement) {\r\n\t\t\telement = element[prop];\r\n\t\t\tprop = 'baseVal';\r\n\t\t}\r\n\r\n\t\t//When remove is ommited, we want to overwrite/set the classes.\r\n\t\tif(remove === undefined) {\r\n\t\t\telement[prop] = add;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t//Cache current classes. We will work on a string before passing back to DOM.\r\n\t\tvar val = element[prop];\r\n\r\n\t\t//All classes to be removed.\r\n\t\tvar classRemoveIndex = 0;\r\n\t\tvar removeLength = remove.length;\r\n\r\n\t\tfor(; classRemoveIndex < removeLength; classRemoveIndex++) {\r\n\t\t\tval = _untrim(val).replace(_untrim(remove[classRemoveIndex]), ' ');\r\n\t\t}\r\n\r\n\t\tval = _trim(val);\r\n\r\n\t\t//All classes to be added.\r\n\t\tvar classAddIndex = 0;\r\n\t\tvar addLength = add.length;\r\n\r\n\t\tfor(; classAddIndex < addLength; classAddIndex++) {\r\n\t\t\t//Only add if el not already has class.\r\n\t\t\tif(_untrim(val).indexOf(_untrim(add[classAddIndex])) === -1) {\r\n\t\t\t\tval += ' ' + add[classAddIndex];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telement[prop] = _trim(val);\r\n\t};\r\n\r\n\tvar _trim = function(a) {\r\n\t\treturn a.replace(rxTrim, '');\r\n\t};\r\n\r\n\t/**\r\n\t * Adds a space before and after the string.\r\n\t */\r\n\tvar _untrim = function(a) {\r\n\t\treturn ' ' + a + ' ';\r\n\t};\r\n\r\n\tvar _now = Date.now || function() {\r\n\t\treturn +new Date();\r\n\t};\r\n\r\n\tvar _keyFrameComparator = function(a, b) {\r\n\t\treturn a.frame - b.frame;\r\n\t};\r\n\r\n\t/*\r\n\t * Private variables.\r\n\t */\r\n\r\n\t//Singleton\r\n\tvar _instance;\r\n\r\n\t/*\r\n\t\tA list of all elements which should be animated associated with their the metadata.\r\n\t\tExmaple skrollable with two key frames animating from 100px width to 20px:\r\n\r\n\t\tskrollable = {\r\n\t\t\telement: ,\r\n\t\t\tstyleAttr: