{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"jQuery\"","webpack:///./../node_modules/foundation-sites/js/foundation.core.utils.js","webpack:///./../node_modules/fizzy-ui-utils/utils.js","webpack:///./../node_modules/flickity/js/flickity.js","webpack:///./../node_modules/lodash.debounce/index.js","webpack:///./../node_modules/foundation-sites/js/foundation.util.mediaQuery.js","webpack:///./../node_modules/flickity/js/index.js","webpack:///./../node_modules/foundation-sites/js/foundation.core.plugin.js","webpack:///./../node_modules/js-cookie/src/js.cookie.js","webpack:///(webpack)/buildin/global.js","webpack:///./../node_modules/ev-emitter/ev-emitter.js","webpack:///./../node_modules/unipointer/unipointer.js","webpack:///./../node_modules/foundation-sites/js/foundation.util.keyboard.js","webpack:///./../node_modules/foundation-sites/js/foundation.util.motion.js","webpack:///./../node_modules/foundation-sites/js/foundation.util.triggers.js","webpack:///./../node_modules/foundation-sites/js/foundation.util.imageLoader.js","webpack:///./../node_modules/get-size/get-size.js","webpack:///./Scripts/app.js","webpack:///./../SharedSiteCode/Scripts/shared.js","webpack:///./Styles/sass/style.scss","webpack:///./../node_modules/scrollMonitor/scrollMonitor.js","webpack:///(webpack)/buildin/module.js","webpack:///./../SharedSiteCode/Scripts/foundation-setup.js","webpack:///./../node_modules/foundation-sites/js/foundation.core.js","webpack:///./../node_modules/foundation-sites/js/foundation.reveal.js","webpack:///./../node_modules/foundation-sites/js/foundation.util.touch.js","webpack:///./../node_modules/foundation-sites/js/foundation.accordion.js","webpack:///./../node_modules/foundation-sites/js/foundation.equalizer.js","webpack:///./../node_modules/foundation-sites/js/foundation.interchange.js","webpack:///./../SharedSiteCode/Components/Widgets/News/news.js","webpack:///./../SharedSiteCode/Components/Widgets/Testimonials/testimonials.js","webpack:///./../node_modules/desandro-matches-selector/matches-selector.js","webpack:///./../node_modules/flickity/js/cell.js","webpack:///./../node_modules/flickity/js/slide.js","webpack:///./../node_modules/flickity/js/animate.js","webpack:///./../node_modules/flickity/js/drag.js","webpack:///./../node_modules/unidragger/unidragger.js","webpack:///./../node_modules/flickity/js/prev-next-button.js","webpack:///./../node_modules/flickity/js/page-dots.js","webpack:///./../node_modules/flickity/js/player.js","webpack:///./../node_modules/flickity/js/add-remove-cell.js","webpack:///./../node_modules/flickity/js/lazyload.js","webpack:///./../SharedSiteCode/Components/Widgets/ReviewList/review-list.js","webpack:///./../SharedSiteCode/Components/Widgets/VerticalForm/vertical-form.js","webpack:///./../node_modules/stickybits/dist/stickybits.es.js","webpack:///./../SharedSiteCode/Components/Widgets/WrongsWeRightSlider/wrongsWeRightSlider.js","webpack:///./../SharedSiteCode/Components/Widgets/PhotoCarousel/photoCarousel.js","webpack:///./../SharedSiteCode/Components/Widgets/UniqueSellingPropositions/uniqueSellingPropositions.js","webpack:///./../SharedSiteCode/Components/Widgets/NewsLogosLinked/news-logos.js","webpack:///./../SharedSiteCode/Components/Widgets/VideoTestimonials/video-testimonials.js","webpack:///./Components/Widgets/Hero/hero.js","webpack:///./Components/Widgets/ComparisonTable/comparison-table.js","webpack:///./FormComponents/form-fields.js","webpack:///./Components/Widgets/VideoCallout/video-modal.js","webpack:///./Components/Widgets/ZipCheckIBuyer/zip-check.js"],"names":["rtl","GetYoDigits","length","namespace","str","chars","charsLength","i","Math","RegExpEscape","transitionend","transitions","elem","document","end","setTimeout","$elem","onLoad","didLoad","eventType","cb","e","ignoreMousedisappear","ignoreLeaveWindow","ignoreReappear","rest","callback","handler","eLeave","eReenter","r","define","utils","a","arraySlice","Array","obj","index","ary","method","event","this","elems","ffElems","childElems","threshold","_class","timeoutName","methodName","timeout","clearTimeout","args","_this","readyState","$1","console","window","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","jQuery","attr","options","JSON","instance","toElem","queryElement","element","instances","$element","constructor","option","_create","getComputedStyle","GUID","Flickity","cellAlign","freeScrollFriction","friction","selectedAttraction","setGallerySize","proto","EvEmitter","id","guid","t","selectedIndex","restingFrames","x","velocity","originSide","rightToLeft","viewport","className","_createSlider","resize","listener","on","watchCSS","activate","isActive","classList","add","getSize","moveElements","_filterFindCellElements","appendChild","reloadCells","tabIndex","addEventListener","emitEvent","selectInitialIndex","isInitActivated","dispatchEvent","slider","cells","_makeCells","positionCells","_getWrapShiftCells","slides","_sizeCells","_positionCells","maxCellHeight","cellX","startCell","len","cell","slideableWidth","updateSlides","_containSlides","slidesWidth","getLastSlide","target","slide","push","nextMargin","isOriginLeft","canCellFit","forEach","slideWidth","updateSelectedSlide","groupCells","number","parseInt","percentMatch","percent","size","innerWidth","positionSliderAtSelected","setCellAlign","cursorPosition","cellAlignShorthands","center","left","right","shorthand","height","adaptiveHeight","selectedSlide","style","_unshiftCells","gapX","cellIndex","beforeShiftCells","_getGapCells","afterShiftCells","isRightToLeft","beginMargin","endMargin","contentWidth","getLastCell","isContentSmaller","beginBound","endBound","emitArgs","type","namespaceJQueryEvents","jQEvent","$event","trigger","_wrapSelect","prevIndex","startAnimation","wrapAround","wrapIndex","delta","backWrapDelta","forewardWrapDelta","select","unselectSelectedSlide","selectedCells","selectedElements","selectedCell","selectedElement","unselect","initialIndex","adjCount","cellElems","slideIndex","selector","focus","selectCell","afterContent","deactivate","isNotFocused","37","leftMethod","uiChange","39","rightMethod","prevScrollY","remove","removeChild","removeAttribute","removeEventListener","allOff","isObjectLike","objectToString","other","value","isObject","isBinary","reIsBinary","reIsOctal","freeParseInt","reIsBadHex","FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","freeGlobal","global","freeSelf","self","root","Function","Object","nativeMax","nativeMin","now","module","lastArgs","lastInvokeTime","result","func","timerId","leading","timeSinceLastCall","lastCallTime","maxing","time","isInvoking","lastThis","v","wait","toNumber","maxWait","trailing","debounced","trailingEdge","styleMedia","info","script","matchMedium","text","matches","media","MediaQuery","queries","current","isInitialized","extractedStyles","namedQueries","styleObject","parts","param","key","val","ret","_watcher","_init","query","nextSize","p","bpModifier","queryIndex","findIndex","nextQuery","n","matched","newSize","currentSize","hyphenate","Plugin","_setup","pluginName","getPluginName","uuid","data","_destroy","registeredInModuleLoader","OldCookies","api","arguments","attributes","s","path","Date","converter","encodeURIComponent","stringifiedAttributes","jar","cookies","cookie","name","decode","set","expires","init","g","events","_events","listeners","onceEvents","_onceEvents","onceListeners","off","Unipointer","_bindStartEvent","bindMethod","isAdd","startEvent","touches","touch","button","_pointerDown","isPointerDown","pointerIdentifier","pointer","pointerDown","_bindPostStartEvents","postStartEvents","mousedown","touchstart","pointerdown","_boundPointerEvents","_pointerMove","getTouch","pointerMove","_pointerUp","_pointerDone","pointerUp","_pointerReset","_unbindPostStartEvents","pointerDone","_pointerCancel","pointerCancel","y","pageY","keyCodes","String","9","13","27","32","35","36","38","40","commands","Keyboard","keys","k","commandList","keyCode","fn","$","cmds","command","returnValue","functions","$focusable","$firstFocusable","$lastFocusable","parseKey","initClass","isIn","initClasses","activeClass","activeClasses","reset","requestAnimationFrame","Move","start","duration","anim","prog","Motion","animateIn","animate","animateOut","timer","debounce","MutationObserver","prefixes","triggers","el","Triggers","Listeners","Basic","Global","Initializers","openListener","closeListener","toggleListener","closeableListener","animation","toggleFocusListener","resizeListener","$nodes","scrollListener","closeMeListener","plugin","plugins","yetiBoxes","plugNames","debounceGlobalListener","listeningElementsMutation","$target","mutationRecordsList","elementObserver","attributeFilter","$document","Foundation","onImagesLoaded","unloaded","images","complete","singleImageLoaded","image","num","logError","isSetup","div","body","isBoxSizeOuter","getStyleSize","setup","width","innerHeight","outerWidth","outerHeight","isBorderBox","measurement","paddingWidth","paddingHeight","marginWidth","marginHeight","borderWidth","borderHeight","isBorderBoxSizeOuter","styleWidth","styleHeight","measurements","measurementsLength","vars","pair","componentRestrictions","country","input","autocomplete","google","place","j","stnum","stname","city","state","zipcode","street","localStorage","destUrl","ParseAddressEsri","address","usStates","st","stateName","getCodeFromStateName","postalCode","tokens","singleLineaddressString","lastToken","potentialState","stateNameParts","cityNameParts","streetNameParts","class","targetElementSelector","targetElement","scrollMonitor","initAddrAutosuggest","getQueryVariable","Cookies","nextPage","$btn","blogInfo","categoriesURL","categories","postHtml","month","day","year","enterYourAddressAutosuggest","setupLeadFormAutoSuggest","abbreviation","exports","loaded","top","bottom","c","h","l","u","w","defineProperty","get","d","capture","passive","f","o","item","watchers","viewportTop","viewportBottom","documentHeight","viewportHeight","DOMListener","containerWatcher","update","recalculateLocations","attachEvent","destroy","detachEvent","setStateFromDOM","setState","latestEvent","updateAndTriggerWatchers","E","watchItem","offsets","callbacks","locked","triggerCallbacks","isInViewport","isFullyInViewport","isAboveViewport","m","b","I","recalculateLocation","display","container","isOne","one","recalculateSize","offsetHeight","isBelowViewport","indexOf","splice","lock","unlock","call","mediaQuery","require","imageLoader","Reveal","Equalizer","Accordion","Interchange","results","_plugins","_uuids","attrName","registerPlugin","functionName","unregisterPlugin","reInit","isJQ","plgs","fns","reflow","$el","opts","opt","isNaN","parseValue","addToJquery","foundation","$noJS","plugClass","each","throttle","context","vendors","vp","test","lastTime","nextTime","aArgs","fToBind","fNOP","fBound","Touch","cached","mq","$anchor","fullScreen","hasClass","overlay","$overlay","_makeOverlay","detach","appendTo","addClass","deepLink","onLoadListener","additionalOverlayClasses","css","margin","open","bind","toggle","closeOnClick","_handleState","close","scrollTop","hash","$activeAnchor","_updatePosition","_disableScroll","show","_addGlobalClasses","_addGlobalListeners","updateScrollbarClass","focusableElements","is","hide","finishUp","html","urlWithoutHash","animationIn","animationOut","showDelay","hideDelay","vOffset","hOffset","tapEvent","isMoving","didMoved","dx","elapsedTime","dir","onTouchEnd","startPosX","startPosY","startTime","SpotSwipe","version","enabled","preventDefault","moveThreshold","timeThreshold","handleTouch","first","touchmove","touchend","simulatedEvent","clientY","_isInitializing","$tabs","children","$content","linkId","$initActive","find","_initialAnchor","_openSingleTab","_checkDeepLink","anchor","$link","offset","$tabContent","next","$a","previous","handled","up","down","history","$targetItem","$othersItems","_closeTab","$activeContents","_openTab","targetContentId","$activeTabs","stop","slideSpeed","deepLinkSmudgeDelay","deepLinkSmudgeOffset","updateHistory","eqId","$watched","hasNested","isNested","isOn","_bindHandler","onResizeMeBound","_onResizeMe","onPostEqualizedBound","_onPostEqualized","imgs","tooSmall","_checkMQ","_reflow","_pauseEvents","getHeightsByRow","applyHeightByRow","getHeights","applyHeight","getBoundingClientRect","heights","lastElTopOffset","groups","group","elOffsetTop","ln","max","groupsILength","equalizeOn","rules","currentPath","_parseOptions","_addBreakpoints","_generateRules","rule","match","replace","types","rulesList","$this","speed","animSpeed","tallestHeight","flktyInstances","setUniformSlideHeight","flkty","draggable","parentCarousel","initializeFlickity","flktyInstance","matchesMethod","ElemProto","parent","create","Cell","position","setAttribute","shift","side","updateTarget","renderPosition","marginProperty","parentNode","Slide","firstMargin","lastCell","lastMargin","isAnimating","applyDragForce","applySelectedAttraction","previousX","integratePhysics","positionSlider","settle","shiftWrapCells","setTranslateX","dispatchScrollEvent","translateX","transform","is3d","firstSlide","positionX","progress","beforeGap","_shiftCells","afterGap","cellShift","gap","isFreeScrolling","dragForce","dragX","applyForce","isDraggable","dragDown","force","pageYOffset","dragThreshold","Unidragger","isTouch","isTouchmoveScrollCanceled","handles","bindHandles","updateDraggable","unbindHandles","_pointerDownPreventDefault","pointerDownFocus","pointerDownBlur","pointerDownScroll","_pointerDownDefault","pointerDownPointer","pageX","focusNodes","SELECT","isTouchStart","isTouchPointer","isFocusNode","moveVector","_dragPointerUp","dragStartPosition","_dragMove","previousDragX","direction","originBound","dragMoveTime","freeScroll","restingX","isDragSelect","distance","getSlideDistance","positiveResting","_getClosestResting","negativeResting","minDistance","condition","contain","isWrapAround","wrap","clickedCell","getParentCell","cellElem","scroll","scrollMoveX","scrollMoveY","_bindHandles","touchAction","handle","cursorNodes","OPTION","clickTypes","file","isCursorNode","isClickType","isOkay","focused","_dragStart","_dragEnd","_staticClick","isDragging","isPreventingClicks","dragStart","dragMove","dragEnd","isIgnoringMouseUp","staticClick","svgURI","PrevNextButton","isEnabled","isPrevious","leftDirection","isLeft","disable","svg","childUIPointerDown","bindStartEvent","unbindStartEvent","pathMovements","shape","getArrowMovements","disabled","lastIndex","boundIndex","arrowShape","x0","x1","y1","x2","y2","x3","prevButton","nextButton","PageDots","holder","dots","handleClick","onClick","setDots","addDots","removeDots","fragment","newDots","dot","selectedDot","pageDots","updateSelected","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","Player","tick","clear","play","isPageHidden","pauseAutoPlayOnHover","player","pause","unpause","minCellIndex","isAppend","insertCellElement","insertBefore","endCells","concat","cellChange","insert","prevSelectedElem","lazyloadAttr","srcAttr","srcsetAttr","img","flickity","load","lazyLoad","lazyImages","lazyCellImages","LazyLoader","src","getAttribute","srcset","cellSizeChange","$reviewListingWidget","reviewListingAvg","convertNumberToWord","wholeNumber","decimalWord","wholeNumberWord","scrollToReview","$list","parentElement","totalCountElm","currLocationElm","newLocation","inElm","page_num","api_url","verifiedSellerBadge","response","Number","ratingCount","percentage","updateTotalRatingAvg","locStr","lastName","charAt","getFormattedDate","$listItems","verifiedSellerPanel","headerHeight","reInitPagination","starRating","date","selectedPage","totalPages","handleChange","$label","$select","$selectedOption","loadMore","scrollUp","filteredRating","filteredElm","$opt","$pageLIs","requestedPage","$pagination","newTab","currentTab","selectedValue","activePageNum","ellipsisHtml","isXXLarge","isXLarge","isDesktop","isLarge","isMobile","leftHandRange","rightHandRange","hero","heroHeight","$verticalLeadFormV2","tabindex","wideMinWidth","updateVerticalLeadFormV2","_extends","Stickybits","userAgent","props","customStickyChangeNumber","noStyles","stickyBitStickyOffset","parentClass","scrollEl","stickyClass","stuckClass","stickyChangeClass","useStickyClasses","useFixed","useGetBoundingClientRect","verticalPosition","applyStyle","positionVal","definePosition","_this$props","verticalPositionStyle","positionStyle","els","addInstance","styles","_styles","classes","_proto","stickyProp","prefix","_this2","isWin","se","getClosestParent","computeScrollOffsets","toggleClasses","topPosition","it","isCustom","isTop","scrollElOffset","getTopPosition","stickyStart","stickyChangeOffset","parentBottom","cArray","rItem","_this3","stateChange","change","pv","sticky","stickyChange","stuck","aS","ns","rAFStub","rAF","isStickyChange","stateStyles","_styles2","_classes","default","_styles3","_extends2","_classes2","_style$classes","_ref","stl","idx","_this4","updatedProps","_styles4","_classes3","removeInstance","manageState","stickybits","maxHeight","slideHeight","$slider","$img","$triggerEl","hT","hH","wH","newsLogosElements","wrapper","newsLogos","logosContainer","loadedImages","checkAndApplyAnimation","debouncedCheck","tryInitialize","$iframe","$videoWrapper","$parent","$newIframe","ytPlayer","vmPlayer","setupVimeoPlayer","loadVimeoAPI","iframe","Vimeo","$thumbnail","vimeoScript","YT","youtubeScript","firstScriptTag","$card","$container","fullHeight","containerTop","containerBottom","windowHeight","topPercentage","randomDelay","isFirstTime","setContainerHeights","mutations","mutation","observer","$carousel","$pageDots","carouselWidth","destroyPlayers","isCarouselNeeded","$clickedElement","$activeCard","pauseVideos","setupYoutubePlayer","loadYoutubeAPI","initYoutubePlayer","initVimeoPlayer","pauseTimeout","cardMaxHeight","openCardsOnScroll","setInterval","prevAll","span","requiredFieldCount","requiredFieldsWithContent","checkRequiredFields","tag","videoID","playerVars","rel","iframeID","allowedChars","formAllowed","inputZip"],"mappings":"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","file":"js/app.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/css\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 17);\n","module.exports = jQuery;","\"use strict\";\n\nimport $ from 'jquery';\n\n// Core Foundation Utilities, utilized in a number of places.\n\n /**\n * Returns a boolean for RTL support\n */\nfunction rtl() {\n return $('html').attr('dir') === 'rtl';\n}\n\n/**\n * returns a random base-36 uid with namespacing\n * @function\n * @param {Number} length - number of random base-36 digits desired. Increase for more random strings.\n * @param {String} namespace - name of plugin to be incorporated in uid, optional.\n * @default {String} '' - if no plugin name is provided, nothing is appended to the uid.\n * @returns {String} - unique id\n */\nfunction GetYoDigits(length = 6, namespace){\n let str = '';\n const chars = '0123456789abcdefghijklmnopqrstuvwxyz';\n const charsLength = chars.length;\n for (let i = 0; i < length; i++) {\n str += chars[Math.floor(Math.random() * charsLength)];\n }\n return namespace ? `${str}-${namespace}` : str;\n}\n\n/**\n * Escape a string so it can be used as a regexp pattern\n * @function\n * @see https://stackoverflow.com/a/9310752/4317384\n *\n * @param {String} str - string to escape.\n * @returns {String} - escaped string\n */\nfunction RegExpEscape(str){\n return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n}\n\nfunction transitionend($elem){\n var transitions = {\n 'transition': 'transitionend',\n 'WebkitTransition': 'webkitTransitionEnd',\n 'MozTransition': 'transitionend',\n 'OTransition': 'otransitionend'\n };\n var elem = document.createElement('div'),\n end;\n\n for (let transition in transitions){\n if (typeof elem.style[transition] !== 'undefined'){\n end = transitions[transition];\n }\n }\n if (end) {\n return end;\n } else {\n setTimeout(function(){\n $elem.triggerHandler('transitionend', [$elem]);\n }, 1);\n return 'transitionend';\n }\n}\n\n/**\n * Return an event type to listen for window load.\n *\n * If `$elem` is passed, an event will be triggered on `$elem`. If window is already loaded, the event will still be triggered.\n * If `handler` is passed, attach it to the event on `$elem`.\n * Calling `onLoad` without handler allows you to get the event type that will be triggered before attaching the handler by yourself.\n * @function\n *\n * @param {Object} [] $elem - jQuery element on which the event will be triggered if passed.\n * @param {Function} [] handler - function to attach to the event.\n * @returns {String} - event type that should or will be triggered.\n */\nfunction onLoad($elem, handler) {\n const didLoad = document.readyState === 'complete';\n const eventType = (didLoad ? '_didLoad' : 'load') + '.zf.util.onLoad';\n const cb = () => $elem.triggerHandler(eventType);\n\n if ($elem) {\n if (handler) $elem.one(eventType, handler);\n\n if (didLoad)\n setTimeout(cb);\n else\n $(window).one('load', cb);\n }\n\n return eventType;\n}\n\n/**\n * Retuns an handler for the `mouseleave` that ignore disappeared mouses.\n *\n * If the mouse \"disappeared\" from the document (like when going on a browser UI element, See https://git.io/zf-11410),\n * the event is ignored.\n * - If the `ignoreLeaveWindow` is `true`, the event is ignored when the user actually left the window\n * (like by switching to an other window with [Alt]+[Tab]).\n * - If the `ignoreReappear` is `true`, the event will be ignored when the mouse will reappear later on the document\n * outside of the element it left.\n *\n * @function\n *\n * @param {Function} [] handler - handler for the filtered `mouseleave` event to watch.\n * @param {Object} [] options - object of options:\n * - {Boolean} [false] ignoreLeaveWindow - also ignore when the user switched windows.\n * - {Boolean} [false] ignoreReappear - also ignore when the mouse reappeared outside of the element it left.\n * @returns {Function} - filtered handler to use to listen on the `mouseleave` event.\n */\nfunction ignoreMousedisappear(handler, { ignoreLeaveWindow = false, ignoreReappear = false } = {}) {\n return function leaveEventHandler(eLeave, ...rest) {\n const callback = handler.bind(this, eLeave, ...rest);\n\n // The mouse left: call the given callback if the mouse entered elsewhere\n if (eLeave.relatedTarget !== null) {\n return callback();\n }\n\n // Otherwise, check if the mouse actually left the window.\n // In firefox if the user switched between windows, the window sill have the focus by the time\n // the event is triggered. We have to debounce the event to test this case.\n setTimeout(function leaveEventDebouncer() {\n if (!ignoreLeaveWindow && document.hasFocus && !document.hasFocus()) {\n return callback();\n }\n\n // Otherwise, wait for the mouse to reeapear outside of the element,\n if (!ignoreReappear) {\n $(document).one('mouseenter', function reenterEventHandler(eReenter) {\n if (!$(eLeave.currentTarget).has(eReenter.target).length) {\n // Fill where the mouse finally entered.\n eLeave.relatedTarget = eReenter.target;\n callback();\n }\n });\n }\n\n }, 0);\n };\n}\n\n\nexport { rtl, GetYoDigits, RegExpEscape, transitionend, onLoad, ignoreMousedisappear };\n","/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'desandro-matches-selector/matches-selector'\n ], function( matchesSelector ) {\n return factory( window, matchesSelector );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) {\n return [];\n }\n\n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n clearTimeout( timeout );\n\n var args = arguments;\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n","// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter',\n 'get-size/get-size',\n 'fizzy-ui-utils/utils',\n './cell',\n './slide',\n './animate',\n ], function( EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n return factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./cell'),\n require('./slide'),\n require('./animate')\n );\n } else {\n // browser global\n var _Flickity = window.Flickity;\n\n window.Flickity = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n _Flickity.Cell,\n _Flickity.Slide,\n _Flickity.animatePrototype\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize,\n utils, Cell, Slide, animatePrototype ) {\n\n/* eslint-enable max-params */\n'use strict';\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n elems = utils.makeArray( elems );\n while ( elems.length ) {\n toElem.appendChild( elems.shift() );\n }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // do not initialize twice on same element\n if ( this.element.flickityGUID ) {\n var instance = instances[ this.element.flickityGUID ];\n if ( instance ) instance.option( options );\n return instance;\n }\n\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // kick things off\n this._create();\n}\n\nFlickity.defaults = {\n accessibility: true,\n // adaptiveHeight: false,\n cellAlign: 'center',\n // cellSelector: undefined,\n // contain: false,\n freeScrollFriction: 0.075, // friction when free-scrolling\n friction: 0.28, // friction when selecting\n namespaceJQueryEvents: true,\n // initialIndex: 0,\n percentPosition: true,\n resize: true,\n selectedAttraction: 0.025,\n setGallerySize: true,\n // watchCSS: false,\n // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n // add id for Flickity.data\n var id = this.guid = ++GUID;\n this.element.flickityGUID = id; // expando\n instances[ id ] = this; // associate via id\n // initial properties\n this.selectedIndex = 0;\n // how many frames slider has been in same position\n this.restingFrames = 0;\n // initial physics properties\n this.x = 0;\n this.velocity = 0;\n this.originSide = this.options.rightToLeft ? 'right' : 'left';\n // create viewport & slider\n this.viewport = document.createElement('div');\n this.viewport.className = 'flickity-viewport';\n this._createSlider();\n\n if ( this.options.resize || this.options.watchCSS ) {\n window.addEventListener( 'resize', this );\n }\n\n // add listeners from on option\n for ( var eventName in this.options.on ) {\n var listener = this.options.on[ eventName ];\n this.on( eventName, listener );\n }\n\n Flickity.createMethods.forEach( function( method ) {\n this[ method ]();\n }, this );\n\n if ( this.options.watchCSS ) {\n this.watchCSS();\n } else {\n this.activate();\n }\n\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n if ( this.isActive ) {\n return;\n }\n this.isActive = true;\n this.element.classList.add('flickity-enabled');\n if ( this.options.rightToLeft ) {\n this.element.classList.add('flickity-rtl');\n }\n\n this.getSize();\n // move initial cell elements so they can be loaded as cells\n var cellElems = this._filterFindCellElements( this.element.children );\n moveElements( cellElems, this.slider );\n this.viewport.appendChild( this.slider );\n this.element.appendChild( this.viewport );\n // get cells from children\n this.reloadCells();\n\n if ( this.options.accessibility ) {\n // allow element to focusable\n this.element.tabIndex = 0;\n // listen for key presses\n this.element.addEventListener( 'keydown', this );\n }\n\n this.emitEvent('activate');\n this.selectInitialIndex();\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n // slider element does all the positioning\n var slider = document.createElement('div');\n slider.className = 'flickity-slider';\n slider.style[ this.originSide ] = 0;\n this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n // collection of item elements\n this.cells = this._makeCells( this.slider.children );\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n var cellElems = this._filterFindCellElements( elems );\n\n // create new Flickity for collection\n var cells = cellElems.map( function( cellElem ) {\n return new Cell( cellElem, this );\n }, this );\n\n return cells;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n // size all cells\n this._sizeCells( this.cells );\n // position all cells\n this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n index = index || 0;\n // also measure maxCellHeight\n // start 0 if positioning all cells\n this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n var cellX = 0;\n // get cellX\n if ( index > 0 ) {\n var startCell = this.cells[ index - 1 ];\n cellX = startCell.x + startCell.size.outerWidth;\n }\n var len = this.cells.length;\n for ( var i = index; i < len; i++ ) {\n var cell = this.cells[i];\n cell.setPosition( cellX );\n cellX += cell.size.outerWidth;\n this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n }\n // keep track of cellX for wrap-around\n this.slideableWidth = cellX;\n // slides\n this.updateSlides();\n // contain slides target\n this._containSlides();\n // update slidesWidth\n this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n cells.forEach( function( cell ) {\n cell.getSize();\n } );\n};\n\n// -------------------------- -------------------------- //\n\nproto.updateSlides = function() {\n this.slides = [];\n if ( !this.cells.length ) {\n return;\n }\n\n var slide = new Slide( this );\n this.slides.push( slide );\n var isOriginLeft = this.originSide == 'left';\n var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n var canCellFit = this._getCanCellFit();\n\n this.cells.forEach( function( cell, i ) {\n // just add cell if first cell in slide\n if ( !slide.cells.length ) {\n slide.addCell( cell );\n return;\n }\n\n var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n if ( canCellFit.call( this, i, slideWidth ) ) {\n slide.addCell( cell );\n } else {\n // doesn't fit, new slide\n slide.updateTarget();\n\n slide = new Slide( this );\n this.slides.push( slide );\n slide.addCell( cell );\n }\n }, this );\n // last slide\n slide.updateTarget();\n // update .selectedSlide\n this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n var groupCells = this.options.groupCells;\n if ( !groupCells ) {\n return function() {\n return false;\n };\n } else if ( typeof groupCells == 'number' ) {\n // group by number. 3 -> [0,1,2], [3,4,5], ...\n var number = parseInt( groupCells, 10 );\n return function( i ) {\n return ( i % number ) !== 0;\n };\n }\n // default, group by width of slide\n // parse '75%\n var percentMatch = typeof groupCells == 'string' &&\n groupCells.match( /^(\\d+)%$/ );\n var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n return function( i, slideWidth ) {\n /* eslint-disable-next-line no-invalid-this */\n return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n // cell align, then based on origin side\n center: {\n left: 0.5,\n right: 0.5,\n },\n left: {\n left: 0,\n right: 1,\n },\n right: {\n right: 0,\n left: 1,\n },\n};\n\nproto.setCellAlign = function() {\n var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n if ( this.options.setGallerySize ) {\n var height = this.options.adaptiveHeight && this.selectedSlide ?\n this.selectedSlide.height : this.maxCellHeight;\n this.viewport.style.height = height + 'px';\n }\n};\n\nproto._getWrapShiftCells = function() {\n // only for wrap-around\n if ( !this.options.wrapAround ) {\n return;\n }\n // unshift previous cells\n this._unshiftCells( this.beforeShiftCells );\n this._unshiftCells( this.afterShiftCells );\n // get before cells\n // initial gap\n var gapX = this.cursorPosition;\n var cellIndex = this.cells.length - 1;\n this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n // get after cells\n // ending gap between last cell and end of gallery viewport\n gapX = this.size.innerWidth - this.cursorPosition;\n // start cloning at first cell, working forwards\n this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n // keep adding cells until the cover the initial gap\n var cells = [];\n while ( gapX > 0 ) {\n var cell = this.cells[ cellIndex ];\n if ( !cell ) {\n break;\n }\n cells.push( cell );\n cellIndex += increment;\n gapX -= cell.size.outerWidth;\n }\n return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n return;\n }\n var isRightToLeft = this.options.rightToLeft;\n var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n // content is less than gallery size\n var isContentSmaller = contentWidth < this.size.innerWidth;\n // bounds\n var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n // contain each cell target\n this.slides.forEach( function( slide ) {\n if ( isContentSmaller ) {\n // all cells fit inside gallery\n slide.target = contentWidth * this.cellAlign;\n } else {\n // contain to bounds\n slide.target = Math.max( slide.target, beginBound );\n slide.target = Math.min( slide.target, endBound );\n }\n }, this );\n};\n\n// ----- ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery && this.$element ) {\n // default trigger with type if no event\n type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n var $event = type;\n if ( event ) {\n // create jQuery event\n var jQEvent = new jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n if ( !this.isActive ) {\n return;\n }\n index = parseInt( index, 10 );\n this._wrapSelect( index );\n\n if ( this.options.wrapAround || isWrap ) {\n index = utils.modulo( index, this.slides.length );\n }\n // bail if invalid index\n if ( !this.slides[ index ] ) {\n return;\n }\n var prevIndex = this.selectedIndex;\n this.selectedIndex = index;\n this.updateSelectedSlide();\n if ( isInstant ) {\n this.positionSliderAtSelected();\n } else {\n this.startAnimation();\n }\n if ( this.options.adaptiveHeight ) {\n this.setGallerySize();\n }\n // events\n this.dispatchEvent( 'select', null, [ index ] );\n // change event if new index\n if ( index != prevIndex ) {\n this.dispatchEvent( 'change', null, [ index ] );\n }\n // old v1 event name, remove in v3\n this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n var len = this.slides.length;\n var isWrapping = this.options.wrapAround && len > 1;\n if ( !isWrapping ) {\n return index;\n }\n var wrapIndex = utils.modulo( index, len );\n // go to shortest\n var delta = Math.abs( wrapIndex - this.selectedIndex );\n var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n if ( !this.isDragSelect && backWrapDelta < delta ) {\n index += len;\n } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n index -= len;\n }\n // wrap position so slider is within normal area\n if ( index < 0 ) {\n this.x -= this.slideableWidth;\n } else if ( index >= len ) {\n this.x += this.slideableWidth;\n }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n var slide = this.slides[ this.selectedIndex ];\n // selectedIndex could be outside of slides, if triggered before resize()\n if ( !slide ) {\n return;\n }\n // unselect previous selected slide\n this.unselectSelectedSlide();\n // update new selected slide\n this.selectedSlide = slide;\n slide.select();\n this.selectedCells = slide.cells;\n this.selectedElements = slide.getCellElements();\n // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n // Remove in v3?\n this.selectedCell = slide.cells[0];\n this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) {\n this.selectedSlide.unselect();\n }\n};\n\nproto.selectInitialIndex = function() {\n var initialIndex = this.options.initialIndex;\n // already activated, select previous selectedIndex\n if ( this.isInitActivated ) {\n this.select( this.selectedIndex, false, true );\n return;\n }\n // select with selector string\n if ( initialIndex && typeof initialIndex == 'string' ) {\n var cell = this.queryCell( initialIndex );\n if ( cell ) {\n this.selectCell( initialIndex, false, true );\n return;\n }\n }\n\n var index = 0;\n // select with number\n if ( initialIndex && this.slides[ initialIndex ] ) {\n index = initialIndex;\n }\n // select instantly\n this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n // get cell\n var cell = this.queryCell( value );\n if ( !cell ) {\n return;\n }\n\n var index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n // get index of slides that has cell\n for ( var i = 0; i < this.slides.length; i++ ) {\n var slide = this.slides[i];\n var index = slide.cells.indexOf( cell );\n if ( index != -1 ) {\n return i;\n }\n }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n // loop through cells to get the one that matches\n for ( var i = 0; i < this.cells.length; i++ ) {\n var cell = this.cells[i];\n if ( cell.element == elem ) {\n return cell;\n }\n }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n elems = utils.makeArray( elems );\n var cells = [];\n elems.forEach( function( elem ) {\n var cell = this.getCell( elem );\n if ( cell ) {\n cells.push( cell );\n }\n }, this );\n return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n } );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n // first check if elem is cell\n var cell = this.getCell( elem );\n if ( cell ) {\n return cell;\n }\n // try to get parent cell elem\n elem = utils.getParent( elem, '.flickity-slider > *' );\n return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n if ( !adjCount ) {\n return this.selectedSlide.getCellElements();\n }\n index = index === undefined ? this.selectedIndex : index;\n\n var len = this.slides.length;\n if ( 1 + ( adjCount * 2 ) >= len ) {\n return this.getCellElements();\n }\n\n var cellElems = [];\n for ( var i = index - adjCount; i <= index + adjCount; i++ ) {\n var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n var slide = this.slides[ slideIndex ];\n if ( slide ) {\n cellElems = cellElems.concat( slide.getCellElements() );\n }\n }\n return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n if ( typeof selector == 'string' ) {\n // do not select invalid selectors from hash: #123, #/. #791\n if ( selector.match( /^[#.]?[\\d/]/ ) ) {\n return;\n }\n // use string as selector, get element\n selector = this.element.querySelector( selector );\n }\n // get cell from element\n return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.childUIPointerDown = function( event ) {\n // HACK iOS does not allow touch events to bubble up?!\n if ( event.type != 'touchstart' ) {\n event.preventDefault();\n }\n this.focus();\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n this.watchCSS();\n this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n if ( !this.isActive ) {\n return;\n }\n this.getSize();\n // wrap values\n if ( this.options.wrapAround ) {\n this.x = utils.modulo( this.x, this.slideableWidth );\n }\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n this.emitEvent('resize');\n // update selected index for group slides, instant\n // TODO: position can be lost between groups of various numbers\n var selectedElement = this.selectedElements && this.selectedElements[0];\n this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n var watchOption = this.options.watchCSS;\n if ( !watchOption ) {\n return;\n }\n\n var afterContent = getComputedStyle( this.element, ':after' ).content;\n // activate if :after { content: 'flickity' }\n if ( afterContent.indexOf('flickity') != -1 ) {\n this.activate();\n } else {\n this.deactivate();\n }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n // only work if element is in focus\n var isNotFocused = document.activeElement && document.activeElement != this.element;\n if ( !this.options.accessibility || isNotFocused ) {\n return;\n }\n\n var handler = Flickity.keyboardHandlers[ event.keyCode ];\n if ( handler ) {\n handler.call( this );\n }\n};\n\nFlickity.keyboardHandlers = {\n // left arrow\n 37: function() {\n var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this.uiChange();\n this[ leftMethod ]();\n },\n // right arrow\n 39: function() {\n var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this.uiChange();\n this[ rightMethod ]();\n },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n // TODO remove scrollTo once focus options gets more support\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus ...\n // #Browser_compatibility\n var prevScrollY = window.pageYOffset;\n this.element.focus({ preventScroll: true });\n // hack to fix scroll jump after focus, #76\n if ( window.pageYOffset != prevScrollY ) {\n window.scrollTo( window.pageXOffset, prevScrollY );\n }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n if ( !this.isActive ) {\n return;\n }\n this.element.classList.remove('flickity-enabled');\n this.element.classList.remove('flickity-rtl');\n this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( function( cell ) {\n cell.destroy();\n } );\n this.element.removeChild( this.viewport );\n // move child elements back into element\n moveElements( this.slider.children, this.element );\n if ( this.options.accessibility ) {\n this.element.removeAttribute('tabIndex');\n this.element.removeEventListener( 'keydown', this );\n }\n // set flags\n this.isActive = false;\n this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n this.deactivate();\n window.removeEventListener( 'resize', this );\n this.allOff();\n this.emitEvent('destroy');\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'flickity' );\n }\n delete this.element.flickityGUID;\n delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.flickityGUID;\n return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","'use strict';\n\nimport $ from 'jquery';\n\n// Default set of media queries\nconst defaultQueries = {\n 'default' : 'only screen',\n landscape : 'only screen and (orientation: landscape)',\n portrait : 'only screen and (orientation: portrait)',\n retina : 'only screen and (-webkit-min-device-pixel-ratio: 2),' +\n 'only screen and (min--moz-device-pixel-ratio: 2),' +\n 'only screen and (-o-min-device-pixel-ratio: 2/1),' +\n 'only screen and (min-device-pixel-ratio: 2),' +\n 'only screen and (min-resolution: 192dpi),' +\n 'only screen and (min-resolution: 2dppx)'\n };\n\n\n// matchMedia() polyfill - Test a CSS media type/query in JS.\n// Authors & copyright Β© 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. MIT license\n/* eslint-disable */\nwindow.matchMedia || (window.matchMedia = (function () {\n \"use strict\";\n\n // For browsers that support matchMedium api such as IE 9 and webkit\n var styleMedia = (window.styleMedia || window.media);\n\n // For those that don't support matchMedium\n if (!styleMedia) {\n var style = document.createElement('style'),\n script = document.getElementsByTagName('script')[0],\n info = null;\n\n style.type = 'text/css';\n style.id = 'matchmediajs-test';\n\n if (!script) {\n document.head.appendChild(style);\n } else {\n script.parentNode.insertBefore(style, script);\n }\n\n // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers\n info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;\n\n styleMedia = {\n matchMedium: function (media) {\n var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';\n\n // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers\n if (style.styleSheet) {\n style.styleSheet.cssText = text;\n } else {\n style.textContent = text;\n }\n\n // Test if media query is true or false\n return info.width === '1px';\n }\n };\n }\n\n return function(media) {\n return {\n matches: styleMedia.matchMedium(media || 'all'),\n media: media || 'all'\n };\n };\n})());\n/* eslint-enable */\n\nvar MediaQuery = {\n queries: [],\n\n current: '',\n\n /**\n * Initializes the media query helper, by extracting the breakpoint list from the CSS and activating the breakpoint watcher.\n * @function\n * @private\n */\n _init() {\n\n // make sure the initialization is only done once when calling _init() several times\n if (this.isInitialized === true) {\n return;\n } else {\n this.isInitialized = true;\n }\n\n var self = this;\n var $meta = $('meta.foundation-mq');\n if(!$meta.length){\n $('').appendTo(document.head);\n }\n\n var extractedStyles = $('.foundation-mq').css('font-family');\n var namedQueries;\n\n namedQueries = parseStyleToObject(extractedStyles);\n\n self.queries = []; // reset\n\n for (var key in namedQueries) {\n if(namedQueries.hasOwnProperty(key)) {\n self.queries.push({\n name: key,\n value: `only screen and (min-width: ${namedQueries[key]})`\n });\n }\n }\n\n this.current = this._getCurrentSize();\n\n this._watcher();\n },\n\n /**\n * Reinitializes the media query helper.\n * Useful if your CSS breakpoint configuration has just been loaded or has changed since the initialization.\n * @function\n * @private\n */\n _reInit() {\n this.isInitialized = false;\n this._init();\n },\n\n /**\n * Checks if the screen is at least as wide as a breakpoint.\n * @function\n * @param {String} size - Name of the breakpoint to check.\n * @returns {Boolean} `true` if the breakpoint matches, `false` if it's smaller.\n */\n atLeast(size) {\n var query = this.get(size);\n\n if (query) {\n return window.matchMedia(query).matches;\n }\n\n return false;\n },\n\n /**\n * Checks if the screen is within the given breakpoint.\n * If smaller than the breakpoint of larger than its upper limit it returns false.\n * @function\n * @param {String} size - Name of the breakpoint to check.\n * @returns {Boolean} `true` if the breakpoint matches, `false` otherwise.\n */\n only(size) {\n return size === this._getCurrentSize();\n },\n\n /**\n * Checks if the screen is within a breakpoint or smaller.\n * @function\n * @param {String} size - Name of the breakpoint to check.\n * @returns {Boolean} `true` if the breakpoint matches, `false` if it's larger.\n */\n upTo(size) {\n const nextSize = this.next(size);\n\n // If the next breakpoint does not match, the screen is smaller than\n // the upper limit of this breakpoint.\n if (nextSize) {\n return !this.atLeast(nextSize);\n }\n\n // If there is no next breakpoint, the \"size\" breakpoint does not have\n // an upper limit and the screen will always be within it or smaller.\n return true;\n },\n\n /**\n * Checks if the screen matches to a breakpoint.\n * @function\n * @param {String} size - Name of the breakpoint to check, either 'small only' or 'small'. Omitting 'only' falls back to using atLeast() method.\n * @returns {Boolean} `true` if the breakpoint matches, `false` if it does not.\n */\n is(size) {\n const parts = size.trim().split(' ').filter(p => !!p.length);\n const [bpSize, bpModifier = ''] = parts;\n\n // Only the breakpont\n if (bpModifier === 'only') {\n return this.only(bpSize);\n }\n // At least the breakpoint (included)\n if (!bpModifier || bpModifier === 'up') {\n return this.atLeast(bpSize);\n }\n // Up to the breakpoint (included)\n if (bpModifier === 'down') {\n return this.upTo(bpSize);\n }\n\n throw new Error(`\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like \" \", got \"${size}\".\n `);\n },\n\n /**\n * Gets the media query of a breakpoint.\n * @function\n * @param {String} size - Name of the breakpoint to get.\n * @returns {String|null} - The media query of the breakpoint, or `null` if the breakpoint doesn't exist.\n */\n get(size) {\n for (var i in this.queries) {\n if(this.queries.hasOwnProperty(i)) {\n var query = this.queries[i];\n if (size === query.name) return query.value;\n }\n }\n\n return null;\n },\n\n /**\n * Get the breakpoint following the given breakpoint.\n * @function\n * @param {String} size - Name of the breakpoint.\n * @returns {String|null} - The name of the following breakpoint, or `null` if the passed breakpoint was the last one.\n */\n next(size) {\n const queryIndex = this.queries.findIndex((q) => this._getQueryName(q) === size);\n if (queryIndex === -1) {\n throw new Error(`\n Unknown breakpoint \"${size}\" passed to MediaQuery.next().\n Ensure it is present in your Sass \"$breakpoints\" setting.\n `);\n }\n\n const nextQuery = this.queries[queryIndex + 1];\n return nextQuery ? nextQuery.name : null;\n },\n\n /**\n * Returns the name of the breakpoint related to the given value.\n * @function\n * @private\n * @param {String|Object} value - Breakpoint name or query object.\n * @returns {String} Name of the breakpoint.\n */\n _getQueryName(value) {\n if (typeof value === 'string')\n return value;\n if (typeof value === 'object')\n return value.name;\n throw new TypeError(`\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got \"${value}\" (${typeof value})\n `);\n },\n\n /**\n * Gets the current breakpoint name by testing every breakpoint and returning the last one to match (the biggest one).\n * @function\n * @private\n * @returns {String} Name of the current breakpoint.\n */\n _getCurrentSize() {\n var matched;\n\n for (var i = 0; i < this.queries.length; i++) {\n var query = this.queries[i];\n\n if (window.matchMedia(query.value).matches) {\n matched = query;\n }\n }\n\n return matched && this._getQueryName(matched);\n },\n\n /**\n * Activates the breakpoint watcher, which fires an event on the window whenever the breakpoint changes.\n * @function\n * @private\n */\n _watcher() {\n $(window).off('resize.zf.mediaquery').on('resize.zf.mediaquery', () => {\n var newSize = this._getCurrentSize(), currentSize = this.current;\n\n if (newSize !== currentSize) {\n // Change the current media query\n this.current = newSize;\n\n // Broadcast the media query change on the window\n $(window).trigger('changed.zf.mediaquery', [newSize, currentSize]);\n }\n });\n }\n};\n\n\n\n// Thank you: https://github.com/sindresorhus/query-string\nfunction parseStyleToObject(str) {\n var styleObject = {};\n\n if (typeof str !== 'string') {\n return styleObject;\n }\n\n str = str.trim().slice(1, -1); // browsers re-quote string style values\n\n if (!str) {\n return styleObject;\n }\n\n styleObject = str.split('&').reduce(function(ret, param) {\n var parts = param.replace(/\\+/g, ' ').split('=');\n var key = parts[0];\n var val = parts[1];\n key = decodeURIComponent(key);\n\n // missing `=` should be `null`:\n // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n val = typeof val === 'undefined' ? null : decodeURIComponent(val);\n\n if (!ret.hasOwnProperty(key)) {\n ret[key] = val;\n } else if (Array.isArray(ret[key])) {\n ret[key].push(val);\n } else {\n ret[key] = [ret[key], val];\n }\n return ret;\n }, {});\n\n return styleObject;\n}\n\nexport {MediaQuery};\n","/*!\n * Flickity v2.2.2\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2021 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n './drag',\n './prev-next-button',\n './page-dots',\n './player',\n './add-remove-cell',\n './lazyload',\n ], factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./flickity'),\n require('./drag'),\n require('./prev-next-button'),\n require('./page-dots'),\n require('./player'),\n require('./add-remove-cell'),\n require('./lazyload')\n );\n }\n\n} )( window, function factory( Flickity ) {\n return Flickity;\n} );\n","'use strict';\n\nimport $ from 'jquery';\nimport { GetYoDigits } from './foundation.core.utils';\n\n// Abstract class for providing lifecycle hooks. Expect plugins to define AT LEAST\n// {function} _setup (replaces previous constructor),\n// {function} _destroy (replaces previous destroy)\nclass Plugin {\n\n constructor(element, options) {\n this._setup(element, options);\n var pluginName = getPluginName(this);\n this.uuid = GetYoDigits(6, pluginName);\n\n if(!this.$element.attr(`data-${pluginName}`)){ this.$element.attr(`data-${pluginName}`, this.uuid); }\n if(!this.$element.data('zfPlugin')){ this.$element.data('zfPlugin', this); }\n /**\n * Fires when the plugin has initialized.\n * @event Plugin#init\n */\n this.$element.trigger(`init.zf.${pluginName}`);\n }\n\n destroy() {\n this._destroy();\n var pluginName = getPluginName(this);\n this.$element.removeAttr(`data-${pluginName}`).removeData('zfPlugin')\n /**\n * Fires when the plugin has been destroyed.\n * @event Plugin#destroyed\n */\n .trigger(`destroyed.zf.${pluginName}`);\n for(var prop in this){\n this[prop] = null;//clean up script to prep for garbage collection.\n }\n }\n}\n\n// Convert PascalCase to kebab-case\n// Thank you: http://stackoverflow.com/a/8955580\nfunction hyphenate(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\nfunction getPluginName(obj) {\n return hyphenate(obj.className);\n}\n\nexport {Plugin};\n","/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t// character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice(0);\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( var i=0; i < listeners.length; i++ ) {\n var listener = listeners[i]\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n","/*!\n * Unipointer v2.3.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*global define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter'\n ], function( EvEmitter ) {\n return factory( window, EvEmitter );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter')\n );\n } else {\n // browser global\n window.Unipointer = factory(\n window,\n window.EvEmitter\n );\n }\n\n}( window, function factory( window, EvEmitter ) {\n\n'use strict';\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n this._bindStartEvent( elem, false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n // default to mouse events\n var startEvent = 'mousedown';\n if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n } else if ( 'ontouchstart' in window ) {\n // Touch Events. iOS Safari\n startEvent = 'touchstart';\n }\n elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n for ( var i=0; i < touches.length; i++ ) {\n var touch = touches[i];\n if ( touch.identifier == this.pointerIdentifier ) {\n return touch;\n }\n }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n // dismiss clicks from right or middle buttons\n var button = event.button;\n if ( button && ( button !== 0 && button !== 1 ) ) {\n return;\n }\n this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n // dismiss right click and other pointers\n // button = 0 is okay, 1-4 not\n if ( event.button || this.isPointerDown ) {\n return;\n }\n\n this.isPointerDown = true;\n // save pointer identifier to match up touch events\n this.pointerIdentifier = pointer.pointerId !== undefined ?\n // pointerId for pointer events, touch.indentifier for touch events\n pointer.pointerId : pointer.identifier;\n\n this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n mousedown: [ 'mousemove', 'mouseup' ],\n touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n if ( !event ) {\n return;\n }\n // get proper events to match start event\n var events = postStartEvents[ event.type ];\n // bind events to node\n events.forEach( function( eventName ) {\n window.addEventListener( eventName, this );\n }, this );\n // save these arguments\n this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n if ( !this._boundPointerEvents ) {\n return;\n }\n this._boundPointerEvents.forEach( function( eventName ) {\n window.removeEventListener( eventName, this );\n }, this );\n\n delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerMove( event, event );\n }\n};\n\nproto.ontouchmove = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerMove( event, touch );\n }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerUp( event, event );\n }\n};\n\nproto.ontouchend = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerUp( event, touch );\n }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n this._pointerDone();\n this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n this._pointerReset();\n this._unbindPostStartEvents();\n this.pointerDone();\n};\n\nproto._pointerReset = function() {\n // reset properties\n this.isPointerDown = false;\n delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerCancel( event, event );\n }\n};\n\nproto.ontouchcancel = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerCancel( event, touch );\n }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n this._pointerDone();\n this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n return {\n x: pointer.pageX,\n y: pointer.pageY\n };\n};\n\n// ----- ----- //\n\nreturn Unipointer;\n\n}));\n","/*******************************************\n * *\n * This util was created by Marius Olbertz *\n * Please thank Marius on GitHub /owlbertz *\n * or the web http://www.mariusolbertz.de/ *\n * *\n ******************************************/\n\n'use strict';\n\nimport $ from 'jquery';\nimport { rtl as Rtl } from './foundation.core.utils';\n\nconst keyCodes = {\n 9: 'TAB',\n 13: 'ENTER',\n 27: 'ESCAPE',\n 32: 'SPACE',\n 35: 'END',\n 36: 'HOME',\n 37: 'ARROW_LEFT',\n 38: 'ARROW_UP',\n 39: 'ARROW_RIGHT',\n 40: 'ARROW_DOWN'\n}\n\nvar commands = {}\n\n// Functions pulled out to be referenceable from internals\nfunction findFocusable($element) {\n if(!$element) {return false; }\n return $element.find('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]').filter(function() {\n if (!$(this).is(':visible') || $(this).attr('tabindex') < 0) { return false; } //only have visible elements and those that have a tabindex greater or equal 0\n return true;\n });\n}\n\nfunction parseKey(event) {\n var key = keyCodes[event.which || event.keyCode] || String.fromCharCode(event.which).toUpperCase();\n\n // Remove un-printable characters, e.g. for `fromCharCode` calls for CTRL only events\n key = key.replace(/\\W+/, '');\n\n if (event.shiftKey) key = `SHIFT_${key}`;\n if (event.ctrlKey) key = `CTRL_${key}`;\n if (event.altKey) key = `ALT_${key}`;\n\n // Remove trailing underscore, in case only modifiers were used (e.g. only `CTRL_ALT`)\n key = key.replace(/_$/, '');\n\n return key;\n}\n\nvar Keyboard = {\n keys: getKeyCodes(keyCodes),\n\n /**\n * Parses the (keyboard) event and returns a String that represents its key\n * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE\n * @param {Event} event - the event generated by the event handler\n * @return String key - String that represents the key pressed\n */\n parseKey: parseKey,\n\n /**\n * Handles the given (keyboard) event\n * @param {Event} event - the event generated by the event handler\n * @param {String} component - Foundation component's name, e.g. Slider or Reveal\n * @param {Objects} functions - collection of functions that are to be executed\n */\n handleKey(event, component, functions) {\n var commandList = commands[component],\n keyCode = this.parseKey(event),\n cmds,\n command,\n fn;\n\n if (!commandList) return console.warn('Component not defined!');\n\n // Ignore the event if it was already handled\n if (event.zfIsKeyHandled === true) return;\n\n // This component does not differentiate between ltr and rtl\n if (typeof commandList.ltr === 'undefined') {\n cmds = commandList; // use plain list\n } else { // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa\n if (Rtl()) cmds = $.extend({}, commandList.ltr, commandList.rtl);\n\n else cmds = $.extend({}, commandList.rtl, commandList.ltr);\n }\n command = cmds[keyCode];\n\n fn = functions[command];\n // Execute the handler if found\n if (fn && typeof fn === 'function') {\n var returnValue = fn.apply();\n\n // Mark the event as \"handled\" to prevent future handlings\n event.zfIsKeyHandled = true;\n\n // Execute function when event was handled\n if (functions.handled || typeof functions.handled === 'function') {\n functions.handled(returnValue);\n }\n } else {\n // Execute function when event was not handled\n if (functions.unhandled || typeof functions.unhandled === 'function') {\n functions.unhandled();\n }\n }\n },\n\n /**\n * Finds all focusable elements within the given `$element`\n * @param {jQuery} $element - jQuery object to search within\n * @return {jQuery} $focusable - all focusable elements within `$element`\n */\n\n findFocusable: findFocusable,\n\n /**\n * Returns the component name name\n * @param {Object} component - Foundation component, e.g. Slider or Reveal\n * @return String componentName\n */\n\n register(componentName, cmds) {\n commands[componentName] = cmds;\n },\n\n\n // TODO9438: These references to Keyboard need to not require global. Will 'this' work in this context?\n //\n /**\n * Traps the focus in the given element.\n * @param {jQuery} $element jQuery object to trap the foucs into.\n */\n trapFocus($element) {\n var $focusable = findFocusable($element),\n $firstFocusable = $focusable.eq(0),\n $lastFocusable = $focusable.eq(-1);\n\n $element.on('keydown.zf.trapfocus', function(event) {\n if (event.target === $lastFocusable[0] && parseKey(event) === 'TAB') {\n event.preventDefault();\n $firstFocusable.focus();\n }\n else if (event.target === $firstFocusable[0] && parseKey(event) === 'SHIFT_TAB') {\n event.preventDefault();\n $lastFocusable.focus();\n }\n });\n },\n /**\n * Releases the trapped focus from the given element.\n * @param {jQuery} $element jQuery object to release the focus for.\n */\n releaseFocus($element) {\n $element.off('keydown.zf.trapfocus');\n }\n}\n\n/*\n * Constants for easier comparing.\n * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE\n */\nfunction getKeyCodes(kcs) {\n var k = {};\n for (var kc in kcs) k[kcs[kc]] = kcs[kc];\n return k;\n}\n\nexport {Keyboard};\n","'use strict';\n\nimport $ from 'jquery';\nimport { transitionend } from './foundation.core.utils';\n\n/**\n * Motion module.\n * @module foundation.motion\n */\n\nconst initClasses = ['mui-enter', 'mui-leave'];\nconst activeClasses = ['mui-enter-active', 'mui-leave-active'];\n\nconst Motion = {\n animateIn: function(element, animation, cb) {\n animate(true, element, animation, cb);\n },\n\n animateOut: function(element, animation, cb) {\n animate(false, element, animation, cb);\n }\n}\n\nfunction Move(duration, elem, fn){\n var anim, prog, start = null;\n // console.log('called');\n\n if (duration === 0) {\n fn.apply(elem);\n elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);\n return;\n }\n\n function move(ts){\n if(!start) start = ts;\n // console.log(start, ts);\n prog = ts - start;\n fn.apply(elem);\n\n if(prog < duration){ anim = window.requestAnimationFrame(move, elem); }\n else{\n window.cancelAnimationFrame(anim);\n elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);\n }\n }\n anim = window.requestAnimationFrame(move);\n}\n\n/**\n * Animates an element in or out using a CSS transition class.\n * @function\n * @private\n * @param {Boolean} isIn - Defines if the animation is in or out.\n * @param {Object} element - jQuery or HTML object to animate.\n * @param {String} animation - CSS class to use.\n * @param {Function} cb - Callback to run when animation is finished.\n */\nfunction animate(isIn, element, animation, cb) {\n element = $(element).eq(0);\n\n if (!element.length) return;\n\n var initClass = isIn ? initClasses[0] : initClasses[1];\n var activeClass = isIn ? activeClasses[0] : activeClasses[1];\n\n // Set up the animation\n reset();\n\n element\n .addClass(animation)\n .css('transition', 'none');\n\n requestAnimationFrame(() => {\n element.addClass(initClass);\n if (isIn) element.show();\n });\n\n // Start the animation\n requestAnimationFrame(() => {\n // will trigger the browser to synchronously calculate the style and layout\n // also called reflow or layout thrashing\n // see https://gist.github.com/paulirish/5d52fb081b3570c81e3a\n element[0].offsetWidth;\n element\n .css('transition', '')\n .addClass(activeClass);\n });\n\n // Clean up the animation when it finishes\n element.one(transitionend(element), finish);\n\n // Hides the element (for out animations), resets the element, and runs a callback\n function finish() {\n if (!isIn) element.hide();\n reset();\n if (cb) cb.apply(element);\n }\n\n // Resets transitions and removes motion-specific classes\n function reset() {\n element[0].style.transitionDuration = 0;\n element.removeClass(`${initClass} ${activeClass} ${animation}`);\n }\n}\n\nexport { Move, Motion };\n\n","'use strict';\n\nimport $ from 'jquery';\nimport { onLoad } from './foundation.core.utils';\nimport { Motion } from './foundation.util.motion';\n\nconst MutationObserver = (function () {\n var prefixes = ['WebKit', 'Moz', 'O', 'Ms', ''];\n for (var i=0; i < prefixes.length; i++) {\n if (`${prefixes[i]}MutationObserver` in window) {\n return window[`${prefixes[i]}MutationObserver`];\n }\n }\n return false;\n}());\n\nconst triggers = (el, type) => {\n el.data(type).split(' ').forEach(id => {\n $(`#${id}`)[ type === 'close' ? 'trigger' : 'triggerHandler'](`${type}.zf.trigger`, [el]);\n });\n};\n\nvar Triggers = {\n Listeners: {\n Basic: {},\n Global: {}\n },\n Initializers: {}\n}\n\nTriggers.Listeners.Basic = {\n openListener: function() {\n triggers($(this), 'open');\n },\n closeListener: function() {\n let id = $(this).data('close');\n if (id) {\n triggers($(this), 'close');\n }\n else {\n $(this).trigger('close.zf.trigger');\n }\n },\n toggleListener: function() {\n let id = $(this).data('toggle');\n if (id) {\n triggers($(this), 'toggle');\n } else {\n $(this).trigger('toggle.zf.trigger');\n }\n },\n closeableListener: function(e) {\n let animation = $(this).data('closable');\n\n // Only close the first closable element. See https://git.io/zf-7833\n e.stopPropagation();\n\n if(animation !== ''){\n Motion.animateOut($(this), animation, function() {\n $(this).trigger('closed.zf');\n });\n }else{\n $(this).fadeOut().trigger('closed.zf');\n }\n },\n toggleFocusListener: function() {\n let id = $(this).data('toggle-focus');\n $(`#${id}`).triggerHandler('toggle.zf.trigger', [$(this)]);\n }\n};\n\n// Elements with [data-open] will reveal a plugin that supports it when clicked.\nTriggers.Initializers.addOpenListener = ($elem) => {\n $elem.off('click.zf.trigger', Triggers.Listeners.Basic.openListener);\n $elem.on('click.zf.trigger', '[data-open]', Triggers.Listeners.Basic.openListener);\n}\n\n// Elements with [data-close] will close a plugin that supports it when clicked.\n// If used without a value on [data-close], the event will bubble, allowing it to close a parent component.\nTriggers.Initializers.addCloseListener = ($elem) => {\n $elem.off('click.zf.trigger', Triggers.Listeners.Basic.closeListener);\n $elem.on('click.zf.trigger', '[data-close]', Triggers.Listeners.Basic.closeListener);\n}\n\n// Elements with [data-toggle] will toggle a plugin that supports it when clicked.\nTriggers.Initializers.addToggleListener = ($elem) => {\n $elem.off('click.zf.trigger', Triggers.Listeners.Basic.toggleListener);\n $elem.on('click.zf.trigger', '[data-toggle]', Triggers.Listeners.Basic.toggleListener);\n}\n\n// Elements with [data-closable] will respond to close.zf.trigger events.\nTriggers.Initializers.addCloseableListener = ($elem) => {\n $elem.off('close.zf.trigger', Triggers.Listeners.Basic.closeableListener);\n $elem.on('close.zf.trigger', '[data-closeable], [data-closable]', Triggers.Listeners.Basic.closeableListener);\n}\n\n// Elements with [data-toggle-focus] will respond to coming in and out of focus\nTriggers.Initializers.addToggleFocusListener = ($elem) => {\n $elem.off('focus.zf.trigger blur.zf.trigger', Triggers.Listeners.Basic.toggleFocusListener);\n $elem.on('focus.zf.trigger blur.zf.trigger', '[data-toggle-focus]', Triggers.Listeners.Basic.toggleFocusListener);\n}\n\n\n\n// More Global/complex listeners and triggers\nTriggers.Listeners.Global = {\n resizeListener: function($nodes) {\n if(!MutationObserver){//fallback for IE 9\n $nodes.each(function(){\n $(this).triggerHandler('resizeme.zf.trigger');\n });\n }\n //trigger all listening elements and signal a resize event\n $nodes.attr('data-events', \"resize\");\n },\n scrollListener: function($nodes) {\n if(!MutationObserver){//fallback for IE 9\n $nodes.each(function(){\n $(this).triggerHandler('scrollme.zf.trigger');\n });\n }\n //trigger all listening elements and signal a scroll event\n $nodes.attr('data-events', \"scroll\");\n },\n closeMeListener: function(e, pluginId){\n let plugin = e.namespace.split('.')[0];\n let plugins = $(`[data-${plugin}]`).not(`[data-yeti-box=\"${pluginId}\"]`);\n\n plugins.each(function(){\n let _this = $(this);\n _this.triggerHandler('close.zf.trigger', [_this]);\n });\n }\n}\n\n// Global, parses whole document.\nTriggers.Initializers.addClosemeListener = function(pluginName) {\n var yetiBoxes = $('[data-yeti-box]'),\n plugNames = ['dropdown', 'tooltip', 'reveal'];\n\n if(pluginName){\n if(typeof pluginName === 'string'){\n plugNames.push(pluginName);\n }else if(typeof pluginName === 'object' && typeof pluginName[0] === 'string'){\n plugNames = plugNames.concat(pluginName);\n }else{\n console.error('Plugin names must be strings');\n }\n }\n if(yetiBoxes.length){\n let listeners = plugNames.map((name) => {\n return `closeme.zf.${name}`;\n }).join(' ');\n\n $(window).off(listeners).on(listeners, Triggers.Listeners.Global.closeMeListener);\n }\n}\n\nfunction debounceGlobalListener(debounce, trigger, listener) {\n let timer, args = Array.prototype.slice.call(arguments, 3);\n $(window).off(trigger).on(trigger, function(e) {\n if (timer) { clearTimeout(timer); }\n timer = setTimeout(function(){\n listener.apply(null, args);\n }, debounce || 10);//default time to emit scroll event\n });\n}\n\nTriggers.Initializers.addResizeListener = function(debounce){\n let $nodes = $('[data-resize]');\n if($nodes.length){\n debounceGlobalListener(debounce, 'resize.zf.trigger', Triggers.Listeners.Global.resizeListener, $nodes);\n }\n}\n\nTriggers.Initializers.addScrollListener = function(debounce){\n let $nodes = $('[data-scroll]');\n if($nodes.length){\n debounceGlobalListener(debounce, 'scroll.zf.trigger', Triggers.Listeners.Global.scrollListener, $nodes);\n }\n}\n\nTriggers.Initializers.addMutationEventsListener = function($elem) {\n if(!MutationObserver){ return false; }\n let $nodes = $elem.find('[data-resize], [data-scroll], [data-mutate]');\n\n //element callback\n var listeningElementsMutation = function (mutationRecordsList) {\n var $target = $(mutationRecordsList[0].target);\n\n //trigger the event handler for the element depending on type\n switch (mutationRecordsList[0].type) {\n case \"attributes\":\n if ($target.attr(\"data-events\") === \"scroll\" && mutationRecordsList[0].attributeName === \"data-events\") {\n $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]);\n }\n if ($target.attr(\"data-events\") === \"resize\" && mutationRecordsList[0].attributeName === \"data-events\") {\n $target.triggerHandler('resizeme.zf.trigger', [$target]);\n }\n if (mutationRecordsList[0].attributeName === \"style\") {\n $target.closest(\"[data-mutate]\").attr(\"data-events\",\"mutate\");\n $target.closest(\"[data-mutate]\").triggerHandler('mutateme.zf.trigger', [$target.closest(\"[data-mutate]\")]);\n }\n break;\n\n case \"childList\":\n $target.closest(\"[data-mutate]\").attr(\"data-events\",\"mutate\");\n $target.closest(\"[data-mutate]\").triggerHandler('mutateme.zf.trigger', [$target.closest(\"[data-mutate]\")]);\n break;\n\n default:\n return false;\n //nothing\n }\n };\n\n if ($nodes.length) {\n //for each element that needs to listen for resizing, scrolling, or mutation add a single observer\n for (var i = 0; i <= $nodes.length - 1; i++) {\n var elementObserver = new MutationObserver(listeningElementsMutation);\n elementObserver.observe($nodes[i], { attributes: true, childList: true, characterData: false, subtree: true, attributeFilter: [\"data-events\", \"style\"] });\n }\n }\n}\n\nTriggers.Initializers.addSimpleListeners = function() {\n let $document = $(document);\n\n Triggers.Initializers.addOpenListener($document);\n Triggers.Initializers.addCloseListener($document);\n Triggers.Initializers.addToggleListener($document);\n Triggers.Initializers.addCloseableListener($document);\n Triggers.Initializers.addToggleFocusListener($document);\n\n}\n\nTriggers.Initializers.addGlobalListeners = function() {\n let $document = $(document);\n Triggers.Initializers.addMutationEventsListener($document);\n Triggers.Initializers.addResizeListener();\n Triggers.Initializers.addScrollListener();\n Triggers.Initializers.addClosemeListener();\n}\n\n\nTriggers.init = function ($, Foundation) {\n onLoad($(window), function () {\n if ($.triggersInitialized !== true) {\n Triggers.Initializers.addSimpleListeners();\n Triggers.Initializers.addGlobalListeners();\n $.triggersInitialized = true;\n }\n });\n\n if(Foundation) {\n Foundation.Triggers = Triggers;\n // Legacy included to be backwards compatible for now.\n Foundation.IHearYou = Triggers.Initializers.addGlobalListeners\n }\n}\n\nexport {Triggers};\n","'use strict';\n\nimport $ from 'jquery';\n\n/**\n * Runs a callback function when images are fully loaded.\n * @param {Object} images - Image(s) to check if loaded.\n * @param {Func} callback - Function to execute when image is fully loaded.\n */\nfunction onImagesLoaded(images, callback){\n var self = this,\n unloaded = images.length;\n\n if (unloaded === 0) {\n callback();\n }\n\n images.each(function(){\n // Check if image is loaded\n if (this.complete && typeof this.naturalWidth !== 'undefined') {\n singleImageLoaded();\n }\n else {\n // If the above check failed, simulate loading on detached element.\n var image = new Image();\n // Still count image as loaded if it finalizes with an error.\n var events = \"load.zf.images error.zf.images\";\n $(image).one(events, function me(event){\n // Unbind the event listeners. We're using 'one' but only one of the two events will have fired.\n $(this).off(events, me);\n singleImageLoaded();\n });\n image.src = $(this).attr('src');\n }\n });\n\n function singleImageLoaded() {\n unloaded--;\n if (unloaded === 0) {\n callback();\n }\n }\n}\n\nexport { onImagesLoaded };\n","/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n /* jshint strict: false */ /* globals define, module */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See https://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n","import \"../Styles/sass/style.scss\";\r\n\r\nimport $ from \"jquery\";\r\nimport \"../../SharedSiteCode/Scripts/shared\";\r\n\r\nimport \"../Components/Widgets/Hero/hero\";\r\nimport \"../Components/Widgets/ComparisonTable/comparison-table\";\r\nimport \"../FormComponents/form-fields\";\r\nimport \"../Components/Widgets/VideoCallout/video-modal\";\r\nimport \"../Components/Widgets/ZipCheckIBuyer/zip-check\";\r\n\r\nif (module.hot) module.hot.accept();\r\n","import scrollMonitor from \"scrollMonitor\";\r\nimport Cookies from \"js-cookie\"\r\nimport deBounce from 'lodash.debounce'\r\n\r\nimport 'jquery';\r\nimport './foundation-setup';\r\n\r\nimport '../Components/Widgets/News/news';\r\nimport '../Components/Widgets/Testimonials/testimonials';\r\nimport '../Components/Widgets/ReviewList/review-list';\r\nimport '../Components/Widgets/VerticalForm/vertical-form';\r\nimport '../Components/Widgets/WrongsWeRightSlider/wrongsWeRightSlider';\r\nimport '../Components/Widgets/PhotoCarousel/photoCarousel';\r\nimport '../Components/Widgets/UniqueSellingPropositions/uniqueSellingPropositions';\r\nimport '../Components/Widgets/NewsLogosLinked/news-logos';\r\nimport '../Components/Widgets/VideoTestimonials/video-testimonials';\r\n\r\njQuery(document).ready(function ($) {\r\n // mobile menu and sticky header desktop memu\r\n $(document).on(\"click\", \".hamburger\", function () {\r\n $(this).toggleClass('is-active');\r\n if ($(this).hasClass('is-active')) {\r\n $('#hamburger-menu').addClass('is-active');\r\n } else {\r\n $('#hamburger-menu').removeClass('is-active');\r\n }\r\n\r\n if ($(this).parents(\"header\").length) {\r\n $(\"#hamburger-menu\").addClass(\"mobile-menu\");\r\n } else {\r\n $(\"#hamburger-menu\").removeClass(\"mobile-menu\");\r\n }\r\n });\r\n $(window).resize(deBounce(function () {\r\n // cleanup and reset menus on resize\r\n $('#hamburger-menu, .hamburger').removeClass('is-active');\r\n }, 100));\r\n\r\n $(document).on(\"click\", \".market-hamburger\", function () {\r\n $(this).toggleClass(\"is-active\");\r\n $(\"#market-sub-nav-hamburger-menu\").toggleClass(\"is-active\");\r\n });\r\n\r\n $('#hamburger-menu li').on('click', '.submenu-header, .submenu-arrow', function (e) {\r\n if ($(this).closest('.mobile-menu.is-active').length) {\r\n e.preventDefault();\r\n $(this).closest('li').toggleClass('open');\r\n }\r\n });\r\n\r\n // add repeat of submenu header link to submenu for mobile menu\r\n $('.submenu-header').each(function () {\r\n $('
  • ', { class: 'mobile-only' })\r\n .append($(this).clone().removeAttr('class'))\r\n .prependTo($(this).next('ul.submenu-list'));\r\n });\r\n\r\n // sticky header if lead form is not on page\r\n if (!$('#lead-form').length) {\r\n let targetElementSelector = $(\".hero #lead-address\").length ? \".hero #lead-address\" : \"header.module\";\r\n let targetElement = scrollMonitor.create(document.querySelector(targetElementSelector));\r\n\r\n targetElement.enterViewport(() => {\r\n $(\"#header-form\").removeClass(\"is-active\");\r\n $(\"#hamburger-menu, .hamburger\").removeClass(\"is-active\");\r\n });\r\n\r\n targetElement.exitViewport(() => {\r\n $(\"#header-form\").addClass(\"is-active\");\r\n });\r\n }\r\n\r\n // ensure google maps api is loaded when user clicks in address box\r\n $('#lead-address, #lead-address2').on('focus', loadAddrAutosuggest);\r\n function loadAddrAutosuggest() {\r\n // only do this once: remove event listener\r\n $('#lead-address, #lead-address2').off('focus', loadAddrAutosuggest);\r\n\r\n if ($('script[src*=\"maps.googleapis.com\"]').length == 0) {\r\n $('').appendTo('head');\r\n }\r\n else {\r\n // maps API is already loaded (likely on locations page)\r\n initAddrAutosuggest();\r\n }\r\n }\r\n\r\n\r\n // save any UTM data for later submission\r\n if (getQueryVariable('utm_medium'))\r\n Cookies.set('utm_medium', getQueryVariable('utm_medium'));\r\n if (getQueryVariable('utm_source'))\r\n Cookies.set('utm_source', getQueryVariable('utm_source'));\r\n if (getQueryVariable('utm_campaign'))\r\n Cookies.set('utm_campaign', getQueryVariable('utm_campaign'));\r\n if (getQueryVariable('utm_content'))\r\n Cookies.set('utm_content', getQueryVariable('utm_content'));\r\n if (getQueryVariable('ttdclid'))\r\n Cookies.set('ttdclid', getQueryVariable('ttdclid'));\r\n if (getQueryVariable('msclid'))\r\n Cookies.set('msclid', getQueryVariable('msclid'));\r\n if (getQueryVariable('gclid'))\r\n Cookies.set('gclid', getQueryVariable('gclid'));\r\n if (getQueryVariable('msclkid'))\r\n Cookies.set('msclkid', getQueryVariable('msclkid'));\r\n if (getQueryVariable('fbclid'))\r\n Cookies.set('fbclid', getQueryVariable('fbclid'));\r\n if (getQueryVariable('utm_term'))\r\n Cookies.set('utm_term', getQueryVariable('utm_term'));\r\n\r\n\r\n // blog Load More button\r\n if ($('#load-more-blogs').length) {\r\n let nextPage;\r\n if (getQueryVariable('page'))\r\n nextPage = parseInt(getQueryVariable('page')) + 1;\r\n else\r\n nextPage = 2;\r\n\r\n $('#load-more-blogs').on('click', function () {\r\n let $btn = $(this);\r\n\r\n $.get(\r\n window.location.pathname + \"?ajax=true&page=\" + nextPage,\r\n function (blogInfo) {\r\n $.each(blogInfo.blogs, function () {\r\n let options = {\r\n month: \"long\",\r\n day: \"numeric\",\r\n year: \"numeric\",\r\n };\r\n const categoriesURL = this.categories[0].url;\r\n let postHtml = `\r\n
    \r\n

    ${this.title}

    \r\n
    \r\n Posted in ${this.categories[0].text\r\n } on ${new Date(this.date).toLocaleDateString(\r\n undefined,\r\n options\r\n )} \r\n
    \r\n

    ${this.excerpt}

    \r\n Read More\r\n
    `;\r\n $(postHtml).insertBefore($btn);\r\n });\r\n\r\n // prepare next page or hide button\r\n if (blogInfo.hasMorePages) nextPage++;\r\n else $btn.hide();\r\n }\r\n );\r\n });\r\n }\r\n\r\n}); // end document.ready\r\n\r\n\r\nfunction getQueryVariable(variable) {\r\n var query = window.location.search.substring(1);\r\n var vars = query.split(\"&\");\r\n for (var i = 0; i < vars.length; i++) {\r\n var pair = vars[i].split(\"=\");\r\n if (pair[0] == variable)\r\n return pair[1];\r\n }\r\n return (false);\r\n}\r\n\r\nwindow.initAddrAutosuggest = function () {\r\n enterYourAddressAutosuggest();\r\n if ($('form.autosuggest').length)\r\n setupLeadFormAutoSuggest();\r\n\r\n};\r\n\r\nfunction enterYourAddressAutosuggest() {\r\n //Set up the address autosuggest \r\n var options = {\r\n componentRestrictions: { country: \"US\" }\r\n };\r\n\r\n $('#lead-address, #lead-address2').each(function () {\r\n var input = this;\r\n\r\n var autocomplete = new google.maps.places.Autocomplete(input, options);\r\n\r\n // store address when selected from dropdown\r\n autocomplete.addListener('place_changed', function () {\r\n\r\n var place = autocomplete.getPlace();\r\n\r\n $(input).siblings('.lead-form-button').html('Loading');\r\n\r\n var stnum, stname, city, state, zipcode;\r\n\r\n for (var i = 0; i < place.address_components.length; i++) {\r\n\r\n for (var j = 0; j < place.address_components[i].types.length; j++) {\r\n\r\n if (place.address_components[i].types[j] == \"street_number\") stnum = place.address_components[i]['short_name'];\r\n\r\n if (place.address_components[i].types[j] == \"route\") stname = place.address_components[i]['short_name'];\r\n\r\n if (place.address_components[i].types[j] == \"locality\") city = place.address_components[i]['short_name'];\r\n\r\n if (place.address_components[i].types[j] == \"administrative_area_level_1\") state = place.address_components[i]['short_name'];\r\n\r\n if (place.address_components[i].types[j] == \"postal_code\") zipcode = place.address_components[i]['short_name'];\r\n\r\n }\r\n\r\n }\r\n\r\n var street = \"\";\r\n if (typeof (stnum) !== 'undefined') street += stnum + \" \";\r\n if (typeof (stname) !== 'undefined') street += stname;\r\n\r\n localStorage.setItem(\"street_address\", street);\r\n localStorage.setItem(\"city\", city);\r\n localStorage.setItem(\"state\", state);\r\n localStorage.setItem(\"zip\", zipcode);\r\n\r\n var destUrl = $(input).closest('form').attr('action');\r\n window.location.href = destUrl;\r\n\r\n });\r\n\r\n // store address when submitted without using dropdown\r\n $(this).closest('form').on('submit', function () {\r\n let address;\r\n if ($('#lead-address').val() != '')\r\n address = ParseAddressEsri($('#lead-address').val());\r\n else\r\n address = ParseAddressEsri($('#lead-address2').val());\r\n\r\n if (address.state.length > 2)\r\n address.state = getCodeFromStateName(address.state);\r\n\r\n localStorage.setItem(\"street_address\", address.street);\r\n localStorage.setItem(\"city\", address.city);\r\n localStorage.setItem(\"state\", address.state);\r\n localStorage.setItem(\"zip\", address.postalCode);\r\n });\r\n });\r\n}\r\n\r\n$(window).on('pageshow', function () {\r\n $('input#lead-address2').siblings('.lead-form-button').html('GET A CASH OFFER');\r\n});\r\n\r\n\r\n// function from https://stackoverflow.com/questions/11160192/how-to-parse-freeform-street-postal-address-out-of-text-and-into-components#answer-49307309\r\n// is not perfect, but we allow user to correct\r\nfunction ParseAddressEsri(singleLineaddressString) {\r\n var address = {\r\n street: \"\",\r\n city: \"\",\r\n state: \"\",\r\n postalCode: \"\"\r\n };\r\n\r\n // tokenize by space (retain commas in tokens)\r\n var tokens = singleLineaddressString.split(/[\\s]+/);\r\n var tokenCount = tokens.length;\r\n var lastToken = tokens.pop();\r\n if (\r\n // if numeric assume postal code (ignore length, for now)\r\n !isNaN(lastToken) ||\r\n // if hyphenated assume long zip code, ignore whether numeric, for now\r\n lastToken.split(\"-\").length - 1 === 1) {\r\n address.postalCode = lastToken;\r\n lastToken = tokens.pop();\r\n }\r\n\r\n if (lastToken && isNaN(lastToken)) {\r\n\r\n var potentialState = lastToken.replace(',', '').toLowerCase();\r\n for (var i = 0; i < usStates.length; i++) {\r\n if (usStates[i].abbreviation.toLowerCase() == potentialState) {\r\n address.state = usStates[i].abbreviation;\r\n lastToken = tokens.pop();\r\n break;\r\n }\r\n }\r\n\r\n if (address.state.length === 0) {\r\n // check for special case: might have State name instead of State Code.\r\n var stateNameParts = [lastToken.endsWith(\",\") ? lastToken.substring(0, lastToken.length - 1) : lastToken];\r\n\r\n // check remaining tokens from right-to-left for the first comma\r\n while (2 + 2 != 5) {\r\n lastToken = tokens.pop();\r\n if (!lastToken) break;\r\n else if (lastToken.endsWith(\",\")) {\r\n // found separator, ignore stuff on left side\r\n tokens.push(lastToken); // put it back\r\n break;\r\n } else {\r\n stateNameParts.unshift(lastToken);\r\n }\r\n }\r\n\r\n for (var i = 0; i < usStates.length; i++) {\r\n if (usStates[i].name.toLowerCase() == stateNameParts.join(' ').toLowerCase()) {\r\n address.state = usStates[i].abbreviation;\r\n lastToken = tokens.pop();\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (lastToken) {\r\n // here is where it gets trickier:\r\n if (address.state.length) {\r\n // if there is a state, then assume there is also a city and street.\r\n // PROBLEM: city may be multiple words (spaces)\r\n // but we can pretty safely assume next-from-last token is at least PART of the city name\r\n // most cities are single-name. It would be very helpful if we knew more context, like\r\n // the name of the city user is in. But ignore that for now.\r\n // ideally would have zip code service or lookup to give city name for the zip code.\r\n var cityNameParts = [lastToken.endsWith(\",\") ? lastToken.substring(0, lastToken.length - 1) : lastToken];\r\n\r\n // assumption / RULE: street and city must have comma delimiter\r\n // addresses that do not follow this rule will be wrong only if city has space\r\n // but don't care because Esri formats put comma before City\r\n var streetNameParts = [];\r\n\r\n // check remaining tokens from right-to-left for the first comma\r\n while (2 + 2 != 5) {\r\n lastToken = tokens.pop();\r\n if (!lastToken) break;\r\n else if (lastToken.endsWith(\",\")) {\r\n // found end of street address (may include building, etc. - don't care right now)\r\n // add token back to end, but remove trailing comma (it did its job)\r\n tokens.push(lastToken.endsWith(\",\") ? lastToken.substring(0, lastToken.length - 1) : lastToken);\r\n streetNameParts = tokens;\r\n break;\r\n } else {\r\n cityNameParts.unshift(lastToken);\r\n }\r\n }\r\n address.city = cityNameParts.join(' ');\r\n address.street = streetNameParts.join(' ');\r\n } else {\r\n // if there is NO state, then assume there is NO city also, just street! (easy)\r\n // reasoning: city names are not very original (Portland, OR and Portland, ME) so if user wants city they need to store state also (but if you are only ever in Portlan, OR, you don't care about city/state)\r\n // put last token back in list, then rejoin on space\r\n tokens.push(lastToken);\r\n address.street = tokens.join(' ');\r\n }\r\n }\r\n // when parsing right-to-left hard to know if street only vs street + city/state\r\n // hack fix for now is to shift stuff around.\r\n // assumption/requirement: will always have at least street part; you will never just get \"city, state\" \r\n // could possibly tweak this with options or more intelligent parsing&sniffing\r\n if (!address.city && address.state) {\r\n address.city = address.state;\r\n address.state = '';\r\n }\r\n if (!address.street) {\r\n address.street = address.city;\r\n address.city = '';\r\n }\r\n\r\n return address;\r\n}\r\n\r\nfunction getCodeFromStateName(stateName) {\r\n\r\n usStates.forEach(function (st) {\r\n if (st.name.toLowerCase() == stateName.toLowerCase())\r\n return st.abbreviation;\r\n });\r\n return '';\r\n}\r\n\r\nvar usStates = [\r\n { name: 'ALABAMA', abbreviation: 'AL' },\r\n { name: 'ALASKA', abbreviation: 'AK' },\r\n { name: 'AMERICAN SAMOA', abbreviation: 'AS' },\r\n { name: 'ARIZONA', abbreviation: 'AZ' },\r\n { name: 'ARKANSAS', abbreviation: 'AR' },\r\n { name: 'CALIFORNIA', abbreviation: 'CA' },\r\n { name: 'COLORADO', abbreviation: 'CO' },\r\n { name: 'CONNECTICUT', abbreviation: 'CT' },\r\n { name: 'DELAWARE', abbreviation: 'DE' },\r\n { name: 'DISTRICT OF COLUMBIA', abbreviation: 'DC' },\r\n { name: 'FEDERATED STATES OF MICRONESIA', abbreviation: 'FM' },\r\n { name: 'FLORIDA', abbreviation: 'FL' },\r\n { name: 'GEORGIA', abbreviation: 'GA' },\r\n { name: 'GUAM', abbreviation: 'GU' },\r\n { name: 'HAWAII', abbreviation: 'HI' },\r\n { name: 'IDAHO', abbreviation: 'ID' },\r\n { name: 'ILLINOIS', abbreviation: 'IL' },\r\n { name: 'INDIANA', abbreviation: 'IN' },\r\n { name: 'IOWA', abbreviation: 'IA' },\r\n { name: 'KANSAS', abbreviation: 'KS' },\r\n { name: 'KENTUCKY', abbreviation: 'KY' },\r\n { name: 'LOUISIANA', abbreviation: 'LA' },\r\n { name: 'MAINE', abbreviation: 'ME' },\r\n { name: 'MARSHALL ISLANDS', abbreviation: 'MH' },\r\n { name: 'MARYLAND', abbreviation: 'MD' },\r\n { name: 'MASSACHUSETTS', abbreviation: 'MA' },\r\n { name: 'MICHIGAN', abbreviation: 'MI' },\r\n { name: 'MINNESOTA', abbreviation: 'MN' },\r\n { name: 'MISSISSIPPI', abbreviation: 'MS' },\r\n { name: 'MISSOURI', abbreviation: 'MO' },\r\n { name: 'MONTANA', abbreviation: 'MT' },\r\n { name: 'NEBRASKA', abbreviation: 'NE' },\r\n { name: 'NEVADA', abbreviation: 'NV' },\r\n { name: 'NEW HAMPSHIRE', abbreviation: 'NH' },\r\n { name: 'NEW JERSEY', abbreviation: 'NJ' },\r\n { name: 'NEW MEXICO', abbreviation: 'NM' },\r\n { name: 'NEW YORK', abbreviation: 'NY' },\r\n { name: 'NORTH CAROLINA', abbreviation: 'NC' },\r\n { name: 'NORTH DAKOTA', abbreviation: 'ND' },\r\n { name: 'NORTHERN MARIANA ISLANDS', abbreviation: 'MP' },\r\n { name: 'OHIO', abbreviation: 'OH' },\r\n { name: 'OKLAHOMA', abbreviation: 'OK' },\r\n { name: 'OREGON', abbreviation: 'OR' },\r\n { name: 'PALAU', abbreviation: 'PW' },\r\n { name: 'PENNSYLVANIA', abbreviation: 'PA' },\r\n { name: 'PUERTO RICO', abbreviation: 'PR' },\r\n { name: 'RHODE ISLAND', abbreviation: 'RI' },\r\n { name: 'SOUTH CAROLINA', abbreviation: 'SC' },\r\n { name: 'SOUTH DAKOTA', abbreviation: 'SD' },\r\n { name: 'TENNESSEE', abbreviation: 'TN' },\r\n { name: 'TEXAS', abbreviation: 'TX' },\r\n { name: 'UTAH', abbreviation: 'UT' },\r\n { name: 'VERMONT', abbreviation: 'VT' },\r\n { name: 'VIRGIN ISLANDS', abbreviation: 'VI' },\r\n { name: 'VIRGINIA', abbreviation: 'VA' },\r\n { name: 'WASHINGTON', abbreviation: 'WA' },\r\n { name: 'WEST VIRGINIA', abbreviation: 'WV' },\r\n { name: 'WISCONSIN', abbreviation: 'WI' },\r\n { name: 'WYOMING', abbreviation: 'WY' }\r\n];","// extracted by mini-css-extract-plugin","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(\"scrollMonitor\",[],e):\"object\"==typeof exports?exports.scrollMonitor=e():t.scrollMonitor=e()}(this,function(){return function(t){function e(o){if(i[o])return i[o].exports;var s=i[o]={exports:{},id:o,loaded:!1};return t[o].call(s.exports,s,s.exports,e),s.loaded=!0,s.exports}var i={};return e.m=t,e.c=i,e.p=\"\",e(0)}([function(t,e,i){\"use strict\";var o=i(1),s=o.isInBrowser,n=i(2),r=new n(s?document.body:null);r.setStateFromDOM(null),r.listenToDOM(),s&&(window.scrollMonitor=r),t.exports=r},function(t,e){\"use strict\";e.VISIBILITYCHANGE=\"visibilityChange\",e.ENTERVIEWPORT=\"enterViewport\",e.FULLYENTERVIEWPORT=\"fullyEnterViewport\",e.EXITVIEWPORT=\"exitViewport\",e.PARTIALLYEXITVIEWPORT=\"partiallyExitViewport\",e.LOCATIONCHANGE=\"locationChange\",e.STATECHANGE=\"stateChange\",e.eventTypes=[e.VISIBILITYCHANGE,e.ENTERVIEWPORT,e.FULLYENTERVIEWPORT,e.EXITVIEWPORT,e.PARTIALLYEXITVIEWPORT,e.LOCATIONCHANGE,e.STATECHANGE],e.isOnServer=\"undefined\"==typeof window,e.isInBrowser=!e.isOnServer,e.defaultOffsets={top:0,bottom:0}},function(t,e,i){\"use strict\";function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function s(t){return c?0:t===document.body?window.innerHeight||document.documentElement.clientHeight:t.clientHeight}function n(t){return c?0:t===document.body?Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.documentElement.clientHeight):t.scrollHeight}function r(t){return c?0:t===document.body?window.pageYOffset||document.documentElement&&document.documentElement.scrollTop||document.body.scrollTop:t.scrollTop}var h=i(1),c=h.isOnServer,a=h.isInBrowser,l=h.eventTypes,p=i(3),u=!1;if(a)try{var w=Object.defineProperty({},\"passive\",{get:function(){u=!0}});window.addEventListener(\"test\",null,w)}catch(t){}var d=!!u&&{capture:!1,passive:!0},f=function(){function t(e,i){function h(){if(a.viewportTop=r(e),a.viewportBottom=a.viewportTop+a.viewportHeight,a.documentHeight=n(e),a.documentHeight!==p){for(u=a.watchers.length;u--;)a.watchers[u].recalculateLocation();p=a.documentHeight}}function c(){for(w=a.watchers.length;w--;)a.watchers[w].update();for(w=a.watchers.length;w--;)a.watchers[w].triggerCallbacks()}o(this,t);var a=this;this.item=e,this.watchers=[],this.viewportTop=null,this.viewportBottom=null,this.documentHeight=n(e),this.viewportHeight=s(e),this.DOMListener=function(){t.prototype.DOMListener.apply(a,arguments)},this.eventTypes=l,i&&(this.containerWatcher=i.create(e));var p,u,w;this.update=function(){h(),c()},this.recalculateLocations=function(){this.documentHeight=0,this.update()}}return t.prototype.listenToDOM=function(){a&&(window.addEventListener?(this.item===document.body?window.addEventListener(\"scroll\",this.DOMListener,d):this.item.addEventListener(\"scroll\",this.DOMListener,d),window.addEventListener(\"resize\",this.DOMListener)):(this.item===document.body?window.attachEvent(\"onscroll\",this.DOMListener):this.item.attachEvent(\"onscroll\",this.DOMListener),window.attachEvent(\"onresize\",this.DOMListener)),this.destroy=function(){window.addEventListener?(this.item===document.body?(window.removeEventListener(\"scroll\",this.DOMListener,d),this.containerWatcher.destroy()):this.item.removeEventListener(\"scroll\",this.DOMListener,d),window.removeEventListener(\"resize\",this.DOMListener)):(this.item===document.body?(window.detachEvent(\"onscroll\",this.DOMListener),this.containerWatcher.destroy()):this.item.detachEvent(\"onscroll\",this.DOMListener),window.detachEvent(\"onresize\",this.DOMListener))})},t.prototype.destroy=function(){},t.prototype.DOMListener=function(t){this.setStateFromDOM(t)},t.prototype.setStateFromDOM=function(t){var e=r(this.item),i=s(this.item),o=n(this.item);this.setState(e,i,o,t)},t.prototype.setState=function(t,e,i,o){var s=e!==this.viewportHeight||i!==this.contentHeight;if(this.latestEvent=o,this.viewportTop=t,this.viewportHeight=e,this.viewportBottom=t+e,this.contentHeight=i,s)for(var n=this.watchers.length;n--;)this.watchers[n].recalculateLocation();this.updateAndTriggerWatchers(o)},t.prototype.updateAndTriggerWatchers=function(t){for(var e=this.watchers.length;e--;)this.watchers[e].update();for(e=this.watchers.length;e--;)this.watchers[e].triggerCallbacks(t)},t.prototype.createCustomContainer=function(){return new t},t.prototype.createContainer=function(e){\"string\"==typeof e?e=document.querySelector(e):e&&e.length>0&&(e=e[0]);var i=new t(e,this);return i.setStateFromDOM(),i.listenToDOM(),i},t.prototype.create=function(t,e){\"string\"==typeof t?t=document.querySelector(t):t&&t.length>0&&(t=t[0]);var i=new p(this,t,e);return this.watchers.push(i),i},t.prototype.beget=function(t,e){return this.create(t,e)},t}();t.exports=f},function(t,e,i){\"use strict\";function o(t,e,i){function o(t,e){if(0!==t.length)for(E=t.length;E--;)y=t[E],y.callback.call(s,e,s),y.isOne&&t.splice(E,1)}var s=this;this.watchItem=e,this.container=t,i?i===+i?this.offsets={top:i,bottom:i}:this.offsets={top:i.top||w.top,bottom:i.bottom||w.bottom}:this.offsets=w,this.callbacks={};for(var d=0,f=u.length;d0?this.top=this.bottom=this.watchItem:this.top=this.bottom=this.container.documentHeight-this.watchItem:(this.top=this.watchItem.top,this.bottom=this.watchItem.bottom);this.top-=this.offsets.top,this.bottom+=this.offsets.bottom,this.height=this.bottom-this.top,void 0===t&&void 0===e||this.top===t&&this.bottom===e||o(this.callbacks[l],null)}},this.recalculateLocation(),this.update(),m=this.isInViewport,v=this.isFullyInViewport,b=this.isAboveViewport,I=this.isBelowViewport}var s=i(1),n=s.VISIBILITYCHANGE,r=s.ENTERVIEWPORT,h=s.FULLYENTERVIEWPORT,c=s.EXITVIEWPORT,a=s.PARTIALLYEXITVIEWPORT,l=s.LOCATIONCHANGE,p=s.STATECHANGE,u=s.eventTypes,w=s.defaultOffsets;o.prototype={on:function(t,e,i){switch(!0){case t===n&&!this.isInViewport&&this.isAboveViewport:case t===r&&this.isInViewport:case t===h&&this.isFullyInViewport:case t===c&&this.isAboveViewport&&!this.isInViewport:case t===a&&this.isInViewport&&this.isAboveViewport:if(e.call(this,this.container.latestEvent,this),i)return}if(!this.callbacks[t])throw new Error(\"Tried to add a scroll monitor listener of type \"+t+\". Your options are: \"+u.join(\", \"));this.callbacks[t].push({callback:e,isOne:i||!1})},off:function(t,e){if(!this.callbacks[t])throw new Error(\"Tried to remove a scroll monitor listener of type \"+t+\". Your options are: \"+u.join(\", \"));for(var i,o=0;i=this.callbacks[t][o];o++)if(i.callback===e){this.callbacks[t].splice(o,1);break}},one:function(t,e){this.on(t,e,!0)},recalculateSize:function(){this.height=this.watchItem.offsetHeight+this.offsets.top+this.offsets.bottom,this.bottom=this.top+this.height},update:function(){this.isAboveViewport=this.topthis.container.viewportBottom,this.isInViewport=this.topthis.container.viewportTop,this.isFullyInViewport=this.top>=this.container.viewportTop&&this.bottom<=this.container.viewportBottom||this.isAboveViewport&&this.isBelowViewport},destroy:function(){var t=this.container.watchers.indexOf(this),e=this;this.container.watchers.splice(t,1);for(var i=0,o=u.length;i {\r\n if ($('[data-equalizer]').length) {\r\n Foundation.reInit('Equalizer');\r\n }\r\n }, 100));\r\n\r\n // make equalizer run again after Interchange or other lazy-load solution runs\r\n // TODO: probably a more efficient way to do this\r\n $('[data-equalizer] img').on('load', function () {\r\n Foundation.reInit('Equalizer');\r\n });\r\n\r\n // if(Foundation.mediaQuery.MediaQuery.current == 'medium') {\r\n // var outerContent = $('.scroll');\r\n // var innerContent = $('.module--cta-scroller');\r\n // outerContent.scrollLeft((innerContent.width() - outerContent.width()) / 2);\r\n // } else if(Foundation.mediaQuery.MediaQuery.current == 'large') {\r\n // var outerContent = $('.scroll');\r\n // var innerContent = $('.module--cta-scroller');\r\n // outerContent.scrollLeft((innerContent.width() - outerContent.width()) / 2);\r\n // } else {\r\n // outerContent.scrollLeft(0);\r\n // }\r\n\r\n})","\"use strict\";\n\nimport $ from 'jquery';\nimport { GetYoDigits } from './foundation.core.utils';\nimport { MediaQuery } from './foundation.util.mediaQuery';\n\nvar FOUNDATION_VERSION = '6.6.3';\n\n// Global Foundation object\n// This is attached to the window, or used as a module for AMD/Browserify\nvar Foundation = {\n version: FOUNDATION_VERSION,\n\n /**\n * Stores initialized plugins.\n */\n _plugins: {},\n\n /**\n * Stores generated unique ids for plugin instances\n */\n _uuids: [],\n\n /**\n * Defines a Foundation plugin, adding it to the `Foundation` namespace and the list of plugins to initialize when reflowing.\n * @param {Object} plugin - The constructor of the plugin.\n */\n plugin: function(plugin, name) {\n // Object key to use when adding to global Foundation object\n // Examples: Foundation.Reveal, Foundation.OffCanvas\n var className = (name || functionName(plugin));\n // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin\n // Examples: data-reveal, data-off-canvas\n var attrName = hyphenate(className);\n\n // Add to the Foundation object and the plugins list (for reflowing)\n this._plugins[attrName] = this[className] = plugin;\n },\n /**\n * @function\n * Populates the _uuids array with pointers to each individual plugin instance.\n * Adds the `zfPlugin` data-attribute to programmatically created plugins to allow use of $(selector).foundation(method) calls.\n * Also fires the initialization event for each plugin, consolidating repetitive code.\n * @param {Object} plugin - an instance of a plugin, usually `this` in context.\n * @param {String} name - the name of the plugin, passed as a camelCased string.\n * @fires Plugin#init\n */\n registerPlugin: function(plugin, name){\n var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase();\n plugin.uuid = GetYoDigits(6, pluginName);\n\n if(!plugin.$element.attr(`data-${pluginName}`)){ plugin.$element.attr(`data-${pluginName}`, plugin.uuid); }\n if(!plugin.$element.data('zfPlugin')){ plugin.$element.data('zfPlugin', plugin); }\n /**\n * Fires when the plugin has initialized.\n * @event Plugin#init\n */\n plugin.$element.trigger(`init.zf.${pluginName}`);\n\n this._uuids.push(plugin.uuid);\n\n return;\n },\n /**\n * @function\n * Removes the plugins uuid from the _uuids array.\n * Removes the zfPlugin data attribute, as well as the data-plugin-name attribute.\n * Also fires the destroyed event for the plugin, consolidating repetitive code.\n * @param {Object} plugin - an instance of a plugin, usually `this` in context.\n * @fires Plugin#destroyed\n */\n unregisterPlugin: function(plugin){\n var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor));\n\n this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1);\n plugin.$element.removeAttr(`data-${pluginName}`).removeData('zfPlugin')\n /**\n * Fires when the plugin has been destroyed.\n * @event Plugin#destroyed\n */\n .trigger(`destroyed.zf.${pluginName}`);\n for(var prop in plugin){\n plugin[prop] = null;//clean up script to prep for garbage collection.\n }\n return;\n },\n\n /**\n * @function\n * Causes one or more active plugins to re-initialize, resetting event listeners, recalculating positions, etc.\n * @param {String} plugins - optional string of an individual plugin key, attained by calling `$(element).data('pluginName')`, or string of a plugin class i.e. `'dropdown'`\n * @default If no argument is passed, reflow all currently active plugins.\n */\n reInit: function(plugins){\n var isJQ = plugins instanceof $;\n try{\n if(isJQ){\n plugins.each(function(){\n $(this).data('zfPlugin')._init();\n });\n }else{\n var type = typeof plugins,\n _this = this,\n fns = {\n 'object': function(plgs){\n plgs.forEach(function(p){\n p = hyphenate(p);\n $('[data-'+ p +']').foundation('_init');\n });\n },\n 'string': function(){\n plugins = hyphenate(plugins);\n $('[data-'+ plugins +']').foundation('_init');\n },\n 'undefined': function(){\n this['object'](Object.keys(_this._plugins));\n }\n };\n fns[type](plugins);\n }\n }catch(err){\n console.error(err);\n }finally{\n return plugins;\n }\n },\n\n /**\n * Initialize plugins on any elements within `elem` (and `elem` itself) that aren't already initialized.\n * @param {Object} elem - jQuery object containing the element to check inside. Also checks the element itself, unless it's the `document` object.\n * @param {String|Array} plugins - A list of plugins to initialize. Leave this out to initialize everything.\n */\n reflow: function(elem, plugins) {\n\n // If plugins is undefined, just grab everything\n if (typeof plugins === 'undefined') {\n plugins = Object.keys(this._plugins);\n }\n // If plugins is a string, convert it to an array with one item\n else if (typeof plugins === 'string') {\n plugins = [plugins];\n }\n\n var _this = this;\n\n // Iterate through each plugin\n $.each(plugins, function(i, name) {\n // Get the current plugin\n var plugin = _this._plugins[name];\n\n // Localize the search to all elements inside elem, as well as elem itself, unless elem === document\n var $elem = $(elem).find('[data-'+name+']').addBack('[data-'+name+']').filter(function () {\n return typeof $(this).data(\"zfPlugin\") === 'undefined';\n });\n\n // For each plugin found, initialize it\n $elem.each(function() {\n var $el = $(this),\n opts = { reflow: true };\n\n if($el.attr('data-options')){\n $el.attr('data-options').split(';').forEach(function(option, _index){\n var opt = option.split(':').map(function(el){ return el.trim(); });\n if(opt[0]) opts[opt[0]] = parseValue(opt[1]);\n });\n }\n try{\n $el.data('zfPlugin', new plugin($(this), opts));\n }catch(er){\n console.error(er);\n }finally{\n return;\n }\n });\n });\n },\n getFnName: functionName,\n\n addToJquery: function($) {\n // TODO: consider not making this a jQuery function\n // TODO: need way to reflow vs. re-initialize\n /**\n * The Foundation jQuery method.\n * @param {String|Array} method - An action to perform on the current jQuery object.\n */\n var foundation = function(method) {\n var type = typeof method,\n $noJS = $('.no-js');\n\n if($noJS.length){\n $noJS.removeClass('no-js');\n }\n\n if(type === 'undefined'){//needs to initialize the Foundation object, or an individual plugin.\n MediaQuery._init();\n Foundation.reflow(this);\n }else if(type === 'string'){//an individual method to invoke on a plugin or group of plugins\n var args = Array.prototype.slice.call(arguments, 1);//collect all the arguments, if necessary\n var plugClass = this.data('zfPlugin');//determine the class of plugin\n\n if(typeof plugClass !== 'undefined' && typeof plugClass[method] !== 'undefined'){//make sure both the class and method exist\n if(this.length === 1){//if there's only one, call it directly.\n plugClass[method].apply(plugClass, args);\n }else{\n this.each(function(i, el){//otherwise loop through the jQuery collection and invoke the method on each\n plugClass[method].apply($(el).data('zfPlugin'), args);\n });\n }\n }else{//error for no class or no method\n throw new ReferenceError(\"We're sorry, '\" + method + \"' is not an available method for \" + (plugClass ? functionName(plugClass) : 'this element') + '.');\n }\n }else{//error for invalid argument type\n throw new TypeError(`We're sorry, ${type} is not a valid parameter. You must use a string representing the method you wish to invoke.`);\n }\n return this;\n };\n $.fn.foundation = foundation;\n return $;\n }\n};\n\nFoundation.util = {\n /**\n * Function for applying a debounce effect to a function call.\n * @function\n * @param {Function} func - Function to be called at end of timeout.\n * @param {Number} delay - Time in ms to delay the call of `func`.\n * @returns function\n */\n throttle: function (func, delay) {\n var timer = null;\n\n return function () {\n var context = this, args = arguments;\n\n if (timer === null) {\n timer = setTimeout(function () {\n func.apply(context, args);\n timer = null;\n }, delay);\n }\n };\n }\n};\n\nwindow.Foundation = Foundation;\n\n// Polyfill for requestAnimationFrame\n(function() {\n if (!Date.now || !window.Date.now)\n window.Date.now = Date.now = function() { return new Date().getTime(); };\n\n var vendors = ['webkit', 'moz'];\n for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {\n var vp = vendors[i];\n window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];\n window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']\n || window[vp+'CancelRequestAnimationFrame']);\n }\n if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent)\n || !window.requestAnimationFrame || !window.cancelAnimationFrame) {\n var lastTime = 0;\n window.requestAnimationFrame = function(callback) {\n var now = Date.now();\n var nextTime = Math.max(lastTime + 16, now);\n return setTimeout(function() { callback(lastTime = nextTime); },\n nextTime - now);\n };\n window.cancelAnimationFrame = clearTimeout;\n }\n /**\n * Polyfill for performance.now, required by rAF\n */\n if(!window.performance || !window.performance.now){\n window.performance = {\n start: Date.now(),\n now: function(){ return Date.now() - this.start; }\n };\n }\n})();\nif (!Function.prototype.bind) {\n Function.prototype.bind = function(oThis) {\n if (typeof this !== 'function') {\n // closest thing possible to the ECMAScript 5\n // internal IsCallable function\n throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');\n }\n\n var aArgs = Array.prototype.slice.call(arguments, 1),\n fToBind = this,\n fNOP = function() {},\n fBound = function() {\n return fToBind.apply(this instanceof fNOP\n ? this\n : oThis,\n aArgs.concat(Array.prototype.slice.call(arguments)));\n };\n\n if (this.prototype) {\n // native functions don't have a prototype\n fNOP.prototype = this.prototype;\n }\n fBound.prototype = new fNOP();\n\n return fBound;\n };\n}\n// Polyfill to get the name of a function in IE9\nfunction functionName(fn) {\n if (typeof Function.prototype.name === 'undefined') {\n var funcNameRegex = /function\\s([^(]{1,})\\(/;\n var results = (funcNameRegex).exec((fn).toString());\n return (results && results.length > 1) ? results[1].trim() : \"\";\n }\n else if (typeof fn.prototype === 'undefined') {\n return fn.constructor.name;\n }\n else {\n return fn.prototype.constructor.name;\n }\n}\nfunction parseValue(str){\n if ('true' === str) return true;\n else if ('false' === str) return false;\n else if (!isNaN(str * 1)) return parseFloat(str);\n return str;\n}\n// Convert PascalCase to kebab-case\n// Thank you: http://stackoverflow.com/a/8955580\nfunction hyphenate(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\nexport {Foundation};\n","'use strict';\n\nimport $ from 'jquery';\nimport { Plugin } from './foundation.core.plugin';\nimport { onLoad } from './foundation.core.utils';\nimport { Keyboard } from './foundation.util.keyboard';\nimport { MediaQuery } from './foundation.util.mediaQuery';\nimport { Motion } from './foundation.util.motion';\nimport { Triggers } from './foundation.util.triggers';\nimport { Touch } from './foundation.util.touch'\n\n/**\n * Reveal module.\n * @module foundation.reveal\n * @requires foundation.util.keyboard\n * @requires foundation.util.touch\n * @requires foundation.util.triggers\n * @requires foundation.util.mediaQuery\n * @requires foundation.util.motion if using animations\n */\n\nclass Reveal extends Plugin {\n /**\n * Creates a new instance of Reveal.\n * @class\n * @name Reveal\n * @param {jQuery} element - jQuery object to use for the modal.\n * @param {Object} options - optional parameters.\n */\n _setup(element, options) {\n this.$element = element;\n this.options = $.extend({}, Reveal.defaults, this.$element.data(), options);\n this.className = 'Reveal'; // ie9 back compat\n this._init();\n\n // Touch and Triggers init are idempotent, just need to make sure they are initialized\n Touch.init($);\n Triggers.init($);\n\n Keyboard.register('Reveal', {\n 'ESCAPE': 'close',\n });\n }\n\n /**\n * Initializes the modal by adding the overlay and close buttons, (if selected).\n * @private\n */\n _init() {\n MediaQuery._init();\n this.id = this.$element.attr('id');\n this.isActive = false;\n this.cached = {mq: MediaQuery.current};\n\n this.$anchor = $(`[data-open=\"${this.id}\"]`).length ? $(`[data-open=\"${this.id}\"]`) : $(`[data-toggle=\"${this.id}\"]`);\n this.$anchor.attr({\n 'aria-controls': this.id,\n 'aria-haspopup': true,\n 'tabindex': 0\n });\n\n if (this.options.fullScreen || this.$element.hasClass('full')) {\n this.options.fullScreen = true;\n this.options.overlay = false;\n }\n if (this.options.overlay && !this.$overlay) {\n this.$overlay = this._makeOverlay(this.id);\n }\n\n this.$element.attr({\n 'role': 'dialog',\n 'aria-hidden': true,\n 'data-yeti-box': this.id,\n 'data-resize': this.id\n });\n\n if(this.$overlay) {\n this.$element.detach().appendTo(this.$overlay);\n } else {\n this.$element.detach().appendTo($(this.options.appendTo));\n this.$element.addClass('without-overlay');\n }\n this._events();\n if (this.options.deepLink && window.location.hash === ( `#${this.id}`)) {\n this.onLoadListener = onLoad($(window), () => this.open());\n }\n }\n\n /**\n * Creates an overlay div to display behind the modal.\n * @private\n */\n _makeOverlay() {\n var additionalOverlayClasses = '';\n\n if (this.options.additionalOverlayClasses) {\n additionalOverlayClasses = ' ' + this.options.additionalOverlayClasses;\n }\n\n return $('
    ')\n .addClass('reveal-overlay' + additionalOverlayClasses)\n .appendTo(this.options.appendTo);\n }\n\n /**\n * Updates position of modal\n * TODO: Figure out if we actually need to cache these values or if it doesn't matter\n * @private\n */\n _updatePosition() {\n var width = this.$element.outerWidth();\n var outerWidth = $(window).width();\n var height = this.$element.outerHeight();\n var outerHeight = $(window).height();\n var left, top = null;\n if (this.options.hOffset === 'auto') {\n left = parseInt((outerWidth - width) / 2, 10);\n } else {\n left = parseInt(this.options.hOffset, 10);\n }\n if (this.options.vOffset === 'auto') {\n if (height > outerHeight) {\n top = parseInt(Math.min(100, outerHeight / 10), 10);\n } else {\n top = parseInt((outerHeight - height) / 4, 10);\n }\n } else if (this.options.vOffset !== null) {\n top = parseInt(this.options.vOffset, 10);\n }\n\n if (top !== null) {\n this.$element.css({top: top + 'px'});\n }\n\n // only worry about left if we don't have an overlay or we have a horizontal offset,\n // otherwise we're perfectly in the middle\n if (!this.$overlay || (this.options.hOffset !== 'auto')) {\n this.$element.css({left: left + 'px'});\n this.$element.css({margin: '0px'});\n }\n\n }\n\n /**\n * Adds event handlers for the modal.\n * @private\n */\n _events() {\n var _this = this;\n\n this.$element.on({\n 'open.zf.trigger': this.open.bind(this),\n 'close.zf.trigger': (event, $element) => {\n if ((event.target === _this.$element[0]) ||\n ($(event.target).parents('[data-closable]')[0] === $element)) { // only close reveal when it's explicitly called\n return this.close.apply(this);\n }\n },\n 'toggle.zf.trigger': this.toggle.bind(this),\n 'resizeme.zf.trigger': function() {\n _this._updatePosition();\n }\n });\n\n if (this.options.closeOnClick && this.options.overlay) {\n this.$overlay.off('.zf.reveal').on('click.zf.dropdown tap.zf.dropdown', function(e) {\n if (e.target === _this.$element[0] ||\n $.contains(_this.$element[0], e.target) ||\n !$.contains(document, e.target)) {\n return;\n }\n _this.close();\n });\n }\n if (this.options.deepLink) {\n $(window).on(`hashchange.zf.reveal:${this.id}`, this._handleState.bind(this));\n }\n }\n\n /**\n * Handles modal methods on back/forward button clicks or any other event that triggers hashchange.\n * @private\n */\n _handleState(e) {\n if(window.location.hash === ( '#' + this.id) && !this.isActive){ this.open(); }\n else{ this.close(); }\n }\n\n /**\n * Disables the scroll when Reveal is shown to prevent the background from shifting\n * @param {number} scrollTop - Scroll to visually apply, window current scroll by default\n */\n _disableScroll(scrollTop) {\n scrollTop = scrollTop || $(window).scrollTop();\n if ($(document).height() > $(window).height()) {\n $(\"html\")\n .css(\"top\", -scrollTop);\n }\n }\n\n /**\n * Reenables the scroll when Reveal closes\n * @param {number} scrollTop - Scroll to restore, html \"top\" property by default (as set by `_disableScroll`)\n */\n _enableScroll(scrollTop) {\n scrollTop = scrollTop || parseInt($(\"html\").css(\"top\"));\n if ($(document).height() > $(window).height()) {\n $(\"html\")\n .css(\"top\", \"\");\n $(window).scrollTop(-scrollTop);\n }\n }\n\n\n /**\n * Opens the modal controlled by `this.$anchor`, and closes all others by default.\n * @function\n * @fires Reveal#closeme\n * @fires Reveal#open\n */\n open() {\n // either update or replace browser history\n const hash = `#${this.id}`;\n if (this.options.deepLink && window.location.hash !== hash) {\n\n if (window.history.pushState) {\n if (this.options.updateHistory) {\n window.history.pushState({}, '', hash);\n } else {\n window.history.replaceState({}, '', hash);\n }\n } else {\n window.location.hash = hash;\n }\n }\n\n // Remember anchor that opened it to set focus back later, have general anchors as fallback\n this.$activeAnchor = $(document.activeElement).is(this.$anchor) ? $(document.activeElement) : this.$anchor;\n\n this.isActive = true;\n\n // Make elements invisible, but remove display: none so we can get size and positioning\n this.$element\n .css({ 'visibility': 'hidden' })\n .show()\n .scrollTop(0);\n if (this.options.overlay) {\n this.$overlay.css({'visibility': 'hidden'}).show();\n }\n\n this._updatePosition();\n\n this.$element\n .hide()\n .css({ 'visibility': '' });\n\n if(this.$overlay) {\n this.$overlay.css({'visibility': ''}).hide();\n if(this.$element.hasClass('fast')) {\n this.$overlay.addClass('fast');\n } else if (this.$element.hasClass('slow')) {\n this.$overlay.addClass('slow');\n }\n }\n\n\n if (!this.options.multipleOpened) {\n /**\n * Fires immediately before the modal opens.\n * Closes any other modals that are currently open\n * @event Reveal#closeme\n */\n this.$element.trigger('closeme.zf.reveal', this.id);\n }\n\n if ($('.reveal:visible').length === 0) {\n this._disableScroll();\n }\n\n var _this = this;\n\n // Motion UI method of reveal\n if (this.options.animationIn) {\n function afterAnimation(){\n _this.$element\n .attr({\n 'aria-hidden': false,\n 'tabindex': -1\n })\n .focus();\n _this._addGlobalClasses();\n Keyboard.trapFocus(_this.$element);\n }\n if (this.options.overlay) {\n Motion.animateIn(this.$overlay, 'fade-in');\n }\n Motion.animateIn(this.$element, this.options.animationIn, () => {\n if(this.$element) { // protect against object having been removed\n this.focusableElements = Keyboard.findFocusable(this.$element);\n afterAnimation();\n }\n });\n }\n // jQuery method of reveal\n else {\n if (this.options.overlay) {\n this.$overlay.show(0);\n }\n this.$element.show(this.options.showDelay);\n }\n\n // handle accessibility\n this.$element\n .attr({\n 'aria-hidden': false,\n 'tabindex': -1\n })\n .focus();\n Keyboard.trapFocus(this.$element);\n\n this._addGlobalClasses();\n\n this._addGlobalListeners();\n\n /**\n * Fires when the modal has successfully opened.\n * @event Reveal#open\n */\n this.$element.trigger('open.zf.reveal');\n }\n\n /**\n * Adds classes and listeners on document required by open modals.\n *\n * The following classes are added and updated:\n * - `.is-reveal-open` - Prevents the scroll on document\n * - `.zf-has-scroll` - Displays a disabled scrollbar on document if required like if the\n * scroll was not disabled. This prevent a \"shift\" of the page content due\n * the scrollbar disappearing when the modal opens.\n *\n * @private\n */\n _addGlobalClasses() {\n const updateScrollbarClass = () => {\n $('html').toggleClass('zf-has-scroll', !!($(document).height() > $(window).height()));\n };\n\n this.$element.on('resizeme.zf.trigger.revealScrollbarListener', () => updateScrollbarClass());\n updateScrollbarClass();\n $('html').addClass('is-reveal-open');\n }\n\n /**\n * Removes classes and listeners on document that were required by open modals.\n * @private\n */\n _removeGlobalClasses() {\n this.$element.off('resizeme.zf.trigger.revealScrollbarListener');\n $('html').removeClass('is-reveal-open');\n $('html').removeClass('zf-has-scroll');\n }\n\n /**\n * Adds extra event handlers for the body and window if necessary.\n * @private\n */\n _addGlobalListeners() {\n var _this = this;\n if(!this.$element) { return; } // If we're in the middle of cleanup, don't freak out\n this.focusableElements = Keyboard.findFocusable(this.$element);\n\n if (!this.options.overlay && this.options.closeOnClick && !this.options.fullScreen) {\n $('body').on('click.zf.dropdown tap.zf.dropdown', function(e) {\n if (e.target === _this.$element[0] ||\n $.contains(_this.$element[0], e.target) ||\n !$.contains(document, e.target)) { return; }\n _this.close();\n });\n }\n\n if (this.options.closeOnEsc) {\n $(window).on('keydown.zf.reveal', function(e) {\n Keyboard.handleKey(e, 'Reveal', {\n close: function() {\n if (_this.options.closeOnEsc) {\n _this.close();\n }\n }\n });\n });\n }\n }\n\n /**\n * Closes the modal.\n * @function\n * @fires Reveal#closed\n */\n close() {\n if (!this.isActive || !this.$element.is(':visible')) {\n return false;\n }\n var _this = this;\n\n // Motion UI method of hiding\n if (this.options.animationOut) {\n if (this.options.overlay) {\n Motion.animateOut(this.$overlay, 'fade-out');\n }\n\n Motion.animateOut(this.$element, this.options.animationOut, finishUp);\n }\n // jQuery method of hiding\n else {\n this.$element.hide(this.options.hideDelay);\n\n if (this.options.overlay) {\n this.$overlay.hide(0, finishUp);\n }\n else {\n finishUp();\n }\n }\n\n // Conditionals to remove extra event listeners added on open\n if (this.options.closeOnEsc) {\n $(window).off('keydown.zf.reveal');\n }\n\n if (!this.options.overlay && this.options.closeOnClick) {\n $('body').off('click.zf.dropdown tap.zf.dropdown');\n }\n\n this.$element.off('keydown.zf.reveal');\n\n function finishUp() {\n\n // Get the current top before the modal is closed and restore the scroll after.\n // TODO: use component properties instead of HTML properties\n // See https://github.com/foundation/foundation-sites/pull/10786\n var scrollTop = parseInt($(\"html\").css(\"top\"));\n\n if ($('.reveal:visible').length === 0) {\n _this._removeGlobalClasses(); // also remove .is-reveal-open from the html element when there is no opened reveal\n }\n\n Keyboard.releaseFocus(_this.$element);\n\n _this.$element.attr('aria-hidden', true);\n\n if ($('.reveal:visible').length === 0) {\n _this._enableScroll(scrollTop);\n }\n\n /**\n * Fires when the modal is done closing.\n * @event Reveal#closed\n */\n _this.$element.trigger('closed.zf.reveal');\n }\n\n /**\n * Resets the modal content\n * This prevents a running video to keep going in the background\n */\n if (this.options.resetOnClose) {\n this.$element.html(this.$element.html());\n }\n\n this.isActive = false;\n // If deepLink and we did not switched to an other modal...\n if (_this.options.deepLink && window.location.hash === `#${this.id}`) {\n // Remove the history hash\n if (window.history.replaceState) {\n const urlWithoutHash = window.location.pathname + window.location.search;\n if (this.options.updateHistory) {\n window.history.pushState({}, '', urlWithoutHash); // remove the hash\n } else {\n window.history.replaceState('', document.title, urlWithoutHash);\n }\n } else {\n window.location.hash = '';\n }\n }\n\n this.$activeAnchor.focus();\n }\n\n /**\n * Toggles the open/closed state of a modal.\n * @function\n */\n toggle() {\n if (this.isActive) {\n this.close();\n } else {\n this.open();\n }\n };\n\n /**\n * Destroys an instance of a modal.\n * @function\n */\n _destroy() {\n if (this.options.overlay) {\n this.$element.appendTo($(this.options.appendTo)); // move $element outside of $overlay to prevent error unregisterPlugin()\n this.$overlay.hide().off().remove();\n }\n this.$element.hide().off();\n this.$anchor.off('.zf');\n $(window).off(`.zf.reveal:${this.id}`)\n if (this.onLoadListener) $(window).off(this.onLoadListener);\n\n if ($('.reveal:visible').length === 0) {\n this._removeGlobalClasses(); // also remove .is-reveal-open from the html element when there is no opened reveal\n }\n };\n}\n\nReveal.defaults = {\n /**\n * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide.\n * @option\n * @type {string}\n * @default ''\n */\n animationIn: '',\n /**\n * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide.\n * @option\n * @type {string}\n * @default ''\n */\n animationOut: '',\n /**\n * Time, in ms, to delay the opening of a modal after a click if no animation used.\n * @option\n * @type {number}\n * @default 0\n */\n showDelay: 0,\n /**\n * Time, in ms, to delay the closing of a modal after a click if no animation used.\n * @option\n * @type {number}\n * @default 0\n */\n hideDelay: 0,\n /**\n * Allows a click on the body/overlay to close the modal.\n * @option\n * @type {boolean}\n * @default true\n */\n closeOnClick: true,\n /**\n * Allows the modal to close if the user presses the `ESCAPE` key.\n * @option\n * @type {boolean}\n * @default true\n */\n closeOnEsc: true,\n /**\n * If true, allows multiple modals to be displayed at once.\n * @option\n * @type {boolean}\n * @default false\n */\n multipleOpened: false,\n /**\n * Distance, in pixels, the modal should push down from the top of the screen.\n * @option\n * @type {number|string}\n * @default auto\n */\n vOffset: 'auto',\n /**\n * Distance, in pixels, the modal should push in from the side of the screen.\n * @option\n * @type {number|string}\n * @default auto\n */\n hOffset: 'auto',\n /**\n * Allows the modal to be fullscreen, completely blocking out the rest of the view. JS checks for this as well.\n * @option\n * @type {boolean}\n * @default false\n */\n fullScreen: false,\n /**\n * Allows the modal to generate an overlay div, which will cover the view when modal opens.\n * @option\n * @type {boolean}\n * @default true\n */\n overlay: true,\n /**\n * Allows the modal to remove and reinject markup on close. Should be true if using video elements w/o using provider's api, otherwise, videos will continue to play in the background.\n * @option\n * @type {boolean}\n * @default false\n */\n resetOnClose: false,\n /**\n * Link the location hash to the modal.\n * Set the location hash when the modal is opened/closed, and open/close the modal when the location changes.\n * @option\n * @type {boolean}\n * @default false\n */\n deepLink: false,\n /**\n * If `deepLink` is enabled, update the browser history with the open modal\n * @option\n * @default false\n */\n updateHistory: false,\n /**\n * Allows the modal to append to custom div.\n * @option\n * @type {string}\n * @default \"body\"\n */\n appendTo: \"body\",\n /**\n * Allows adding additional class names to the reveal overlay.\n * @option\n * @type {string}\n * @default ''\n */\n additionalOverlayClasses: ''\n};\n\nexport {Reveal};\n","//**************************************************\n//**Work inspired by multiple jquery swipe plugins**\n//**Done by Yohai Ararat ***************************\n//**************************************************\n\nimport $ from 'jquery';\n\nvar Touch = {};\n\nvar startPosX,\n startPosY,\n startTime,\n elapsedTime,\n startEvent,\n isMoving = false,\n didMoved = false;\n\nfunction onTouchEnd(e) {\n this.removeEventListener('touchmove', onTouchMove);\n this.removeEventListener('touchend', onTouchEnd);\n\n // If the touch did not move, consider it as a \"tap\"\n if (!didMoved) {\n var tapEvent = $.Event('tap', startEvent || e);\n $(this).trigger(tapEvent);\n }\n\n startEvent = null;\n isMoving = false;\n didMoved = false;\n}\n\nfunction onTouchMove(e) {\n if ($.spotSwipe.preventDefault) { e.preventDefault(); }\n\n if(isMoving) {\n var x = e.touches[0].pageX;\n var y = e.touches[0].pageY;\n var dx = startPosX - x;\n var dy = startPosY - y;\n var dir;\n didMoved = true;\n elapsedTime = new Date().getTime() - startTime;\n if(Math.abs(dx) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) {\n dir = dx > 0 ? 'left' : 'right';\n }\n // else if(Math.abs(dy) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) {\n // dir = dy > 0 ? 'down' : 'up';\n // }\n if(dir) {\n e.preventDefault();\n onTouchEnd.apply(this, arguments);\n $(this)\n .trigger($.Event('swipe', Object.assign({}, e)), dir)\n .trigger($.Event(`swipe${dir}`, Object.assign({}, e)));\n }\n }\n\n}\n\nfunction onTouchStart(e) {\n\n if (e.touches.length == 1) {\n startPosX = e.touches[0].pageX;\n startPosY = e.touches[0].pageY;\n startEvent = e;\n isMoving = true;\n didMoved = false;\n startTime = new Date().getTime();\n this.addEventListener('touchmove', onTouchMove, false);\n this.addEventListener('touchend', onTouchEnd, false);\n }\n}\n\nfunction init() {\n this.addEventListener && this.addEventListener('touchstart', onTouchStart, false);\n}\n\nfunction teardown() {\n this.removeEventListener('touchstart', onTouchStart);\n}\n\nclass SpotSwipe {\n constructor($) {\n this.version = '1.0.0';\n this.enabled = 'ontouchstart' in document.documentElement;\n this.preventDefault = false;\n this.moveThreshold = 75;\n this.timeThreshold = 200;\n this.$ = $;\n this._init();\n }\n\n _init() {\n var $ = this.$;\n $.event.special.swipe = { setup: init };\n $.event.special.tap = { setup: init };\n\n $.each(['left', 'up', 'down', 'right'], function () {\n $.event.special[`swipe${this}`] = { setup: function(){\n $(this).on('swipe', $.noop);\n } };\n });\n }\n}\n\n/****************************************************\n * As far as I can tell, both setupSpotSwipe and *\n * setupTouchHandler should be idempotent, *\n * because they directly replace functions & *\n * values, and do not add event handlers directly. *\n ****************************************************/\n\nTouch.setupSpotSwipe = function($) {\n $.spotSwipe = new SpotSwipe($);\n};\n\n/****************************************************\n * Method for adding pseudo drag events to elements *\n ***************************************************/\nTouch.setupTouchHandler = function($) {\n $.fn.addTouch = function(){\n this.each(function(i,el){\n $(el).bind('touchstart touchmove touchend touchcancel', function(event) {\n //we pass the original event object because the jQuery event\n //object is normalized to w3c specs and does not provide the TouchList\n handleTouch(event);\n });\n });\n\n var handleTouch = function(event){\n var touches = event.changedTouches,\n first = touches[0],\n eventTypes = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup'\n },\n type = eventTypes[event.type],\n simulatedEvent\n ;\n\n if('MouseEvent' in window && typeof window.MouseEvent === 'function') {\n simulatedEvent = new window.MouseEvent(type, {\n 'bubbles': true,\n 'cancelable': true,\n 'screenX': first.screenX,\n 'screenY': first.screenY,\n 'clientX': first.clientX,\n 'clientY': first.clientY\n });\n } else {\n simulatedEvent = document.createEvent('MouseEvent');\n simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0/*left*/, null);\n }\n first.target.dispatchEvent(simulatedEvent);\n };\n };\n};\n\nTouch.init = function ($) {\n\n if(typeof($.spotSwipe) === 'undefined') {\n Touch.setupSpotSwipe($);\n Touch.setupTouchHandler($);\n }\n};\n\nexport {Touch};\n","'use strict';\n\nimport $ from 'jquery';\nimport { Plugin } from './foundation.core.plugin';\nimport { onLoad, GetYoDigits } from './foundation.core.utils';\nimport { Keyboard } from './foundation.util.keyboard';\n\n/**\n * Accordion module.\n * @module foundation.accordion\n * @requires foundation.util.keyboard\n */\n\nclass Accordion extends Plugin {\n /**\n * Creates a new instance of an accordion.\n * @class\n * @name Accordion\n * @fires Accordion#init\n * @param {jQuery} element - jQuery object to make into an accordion.\n * @param {Object} options - a plain object with settings to override the default options.\n */\n _setup(element, options) {\n this.$element = element;\n this.options = $.extend({}, Accordion.defaults, this.$element.data(), options);\n\n this.className = 'Accordion'; // ie9 back compat\n this._init();\n\n Keyboard.register('Accordion', {\n 'ENTER': 'toggle',\n 'SPACE': 'toggle',\n 'ARROW_DOWN': 'next',\n 'ARROW_UP': 'previous'\n });\n }\n\n /**\n * Initializes the accordion by animating the preset active pane(s).\n * @private\n */\n _init() {\n this._isInitializing = true;\n\n this.$element.attr('role', 'tablist');\n this.$tabs = this.$element.children('[data-accordion-item]');\n\n this.$tabs.attr({'role': 'presentation'});\n\n this.$tabs.each(function(idx, el) {\n var $el = $(el),\n $content = $el.children('[data-tab-content]'),\n id = $content[0].id || GetYoDigits(6, 'accordion'),\n linkId = (el.id) ? `${el.id}-label` : `${id}-label`;\n\n $el.find('a:first').attr({\n 'aria-controls': id,\n 'role': 'tab',\n 'id': linkId,\n 'aria-expanded': false,\n 'aria-selected': false\n });\n\n $content.attr({'role': 'tabpanel', 'aria-labelledby': linkId, 'aria-hidden': true, 'id': id});\n });\n\n var $initActive = this.$element.find('.is-active').children('[data-tab-content]');\n if ($initActive.length) {\n // Save up the initial hash to return to it later when going back in history\n this._initialAnchor = $initActive.prev('a').attr('href');\n this._openSingleTab($initActive);\n }\n\n this._checkDeepLink = () => {\n var anchor = window.location.hash;\n\n if (!anchor.length) {\n // If we are still initializing and there is no anchor, then there is nothing to do\n if (this._isInitializing) return;\n // Otherwise, move to the initial anchor\n if (this._initialAnchor) anchor = this._initialAnchor;\n }\n\n var $anchor = anchor && $(anchor);\n var $link = anchor && this.$element.find(`[href$=\"${anchor}\"]`);\n // Whether the anchor element that has been found is part of this element\n var isOwnAnchor = !!($anchor.length && $link.length);\n\n if (isOwnAnchor) {\n // If there is an anchor for the hash, open it (if not already active)\n if ($anchor && $link && $link.length) {\n if (!$link.parent('[data-accordion-item]').hasClass('is-active')) {\n this._openSingleTab($anchor);\n }\n }\n // Otherwise, close everything\n else {\n this._closeAllTabs();\n }\n\n // Roll up a little to show the titles\n if (this.options.deepLinkSmudge) {\n onLoad($(window), () => {\n var offset = this.$element.offset();\n $('html, body').animate({ scrollTop: offset.top - this.options.deepLinkSmudgeOffset }, this.options.deepLinkSmudgeDelay);\n });\n }\n\n /**\n * Fires when the plugin has deeplinked at pageload\n * @event Accordion#deeplink\n */\n this.$element.trigger('deeplink.zf.accordion', [$link, $anchor]);\n }\n }\n\n //use browser to open a tab, if it exists in this tabset\n if (this.options.deepLink) {\n this._checkDeepLink();\n }\n\n this._events();\n\n this._isInitializing = false;\n }\n\n /**\n * Adds event handlers for items within the accordion.\n * @private\n */\n _events() {\n var _this = this;\n\n this.$tabs.each(function() {\n var $elem = $(this);\n var $tabContent = $elem.children('[data-tab-content]');\n if ($tabContent.length) {\n $elem.children('a').off('click.zf.accordion keydown.zf.accordion')\n .on('click.zf.accordion', function(e) {\n e.preventDefault();\n _this.toggle($tabContent);\n }).on('keydown.zf.accordion', function(e) {\n Keyboard.handleKey(e, 'Accordion', {\n toggle: function() {\n _this.toggle($tabContent);\n },\n next: function() {\n var $a = $elem.next().find('a').focus();\n if (!_this.options.multiExpand) {\n $a.trigger('click.zf.accordion')\n }\n },\n previous: function() {\n var $a = $elem.prev().find('a').focus();\n if (!_this.options.multiExpand) {\n $a.trigger('click.zf.accordion')\n }\n },\n handled: function() {\n e.preventDefault();\n }\n });\n });\n }\n });\n if (this.options.deepLink) {\n $(window).on('hashchange', this._checkDeepLink);\n }\n }\n\n /**\n * Toggles the selected content pane's open/close state.\n * @param {jQuery} $target - jQuery object of the pane to toggle (`.accordion-content`).\n * @function\n */\n toggle($target) {\n if ($target.closest('[data-accordion]').is('[disabled]')) {\n console.info('Cannot toggle an accordion that is disabled.');\n return;\n }\n if ($target.parent().hasClass('is-active')) {\n this.up($target);\n } else {\n this.down($target);\n }\n //either replace or update browser history\n if (this.options.deepLink) {\n var anchor = $target.prev('a').attr('href');\n\n if (this.options.updateHistory) {\n history.pushState({}, '', anchor);\n } else {\n history.replaceState({}, '', anchor);\n }\n }\n }\n\n /**\n * Opens the accordion tab defined by `$target`.\n * @param {jQuery} $target - Accordion pane to open (`.accordion-content`).\n * @fires Accordion#down\n * @function\n */\n down($target) {\n if ($target.closest('[data-accordion]').is('[disabled]')) {\n console.info('Cannot call down on an accordion that is disabled.');\n return;\n }\n\n if (this.options.multiExpand)\n this._openTab($target);\n else\n this._openSingleTab($target);\n }\n\n /**\n * Closes the tab defined by `$target`.\n * It may be ignored if the Accordion options don't allow it.\n *\n * @param {jQuery} $target - Accordion tab to close (`.accordion-content`).\n * @fires Accordion#up\n * @function\n */\n up($target) {\n if (this.$element.is('[disabled]')) {\n console.info('Cannot call up on an accordion that is disabled.');\n return;\n }\n\n // Don't close the item if it is already closed\n const $targetItem = $target.parent();\n if (!$targetItem.hasClass('is-active')) return;\n\n // Don't close the item if there is no other active item (unless with `allowAllClosed`)\n const $othersItems = $targetItem.siblings();\n if (!this.options.allowAllClosed && !$othersItems.hasClass('is-active')) return;\n\n this._closeTab($target);\n }\n\n /**\n * Make the tab defined by `$target` the only opened tab, closing all others tabs.\n * @param {jQuery} $target - Accordion tab to open (`.accordion-content`).\n * @function\n * @private\n */\n _openSingleTab($target) {\n // Close all the others active tabs.\n const $activeContents = this.$element.children('.is-active').children('[data-tab-content]');\n if ($activeContents.length) {\n this._closeTab($activeContents.not($target));\n }\n\n // Then open the target.\n this._openTab($target);\n }\n\n /**\n * Opens the tab defined by `$target`.\n * @param {jQuery} $target - Accordion tab to open (`.accordion-content`).\n * @fires Accordion#down\n * @function\n * @private\n */\n _openTab($target) {\n const $targetItem = $target.parent();\n const targetContentId = $target.attr('aria-labelledby');\n\n $target.attr('aria-hidden', false);\n $targetItem.addClass('is-active');\n\n $(`#${targetContentId}`).attr({\n 'aria-expanded': true,\n 'aria-selected': true\n });\n\n $target.finish().slideDown(this.options.slideSpeed, () => {\n /**\n * Fires when the tab is done opening.\n * @event Accordion#down\n */\n this.$element.trigger('down.zf.accordion', [$target]);\n });\n }\n\n /**\n * Closes the tab defined by `$target`.\n * @param {jQuery} $target - Accordion tab to close (`.accordion-content`).\n * @fires Accordion#up\n * @function\n * @private\n */\n _closeTab($target) {\n const $targetItem = $target.parent();\n const targetContentId = $target.attr('aria-labelledby');\n\n $target.attr('aria-hidden', true)\n $targetItem.removeClass('is-active');\n\n $(`#${targetContentId}`).attr({\n 'aria-expanded': false,\n 'aria-selected': false\n });\n\n $target.finish().slideUp(this.options.slideSpeed, () => {\n /**\n * Fires when the tab is done collapsing up.\n * @event Accordion#up\n */\n this.$element.trigger('up.zf.accordion', [$target]);\n });\n }\n\n /**\n * Closes all active tabs\n * @fires Accordion#up\n * @function\n * @private\n */\n _closeAllTabs() {\n var $activeTabs = this.$element.children('.is-active').children('[data-tab-content]');\n if ($activeTabs.length) {\n this._closeTab($activeTabs);\n }\n }\n\n /**\n * Destroys an instance of an accordion.\n * @fires Accordion#destroyed\n * @function\n */\n _destroy() {\n this.$element.find('[data-tab-content]').stop(true).slideUp(0).css('display', '');\n this.$element.find('a').off('.zf.accordion');\n if (this.options.deepLink) {\n $(window).off('hashchange', this._checkDeepLink);\n }\n\n }\n}\n\nAccordion.defaults = {\n /**\n * Amount of time to animate the opening of an accordion pane.\n * @option\n * @type {number}\n * @default 250\n */\n slideSpeed: 250,\n /**\n * Allow the accordion to have multiple open panes.\n * @option\n * @type {boolean}\n * @default false\n */\n multiExpand: false,\n /**\n * Allow the accordion to close all panes.\n * @option\n * @type {boolean}\n * @default false\n */\n allowAllClosed: false,\n /**\n * Link the location hash to the open pane.\n * Set the location hash when the opened pane changes, and open and scroll to the corresponding pane when the location changes.\n * @option\n * @type {boolean}\n * @default false\n */\n deepLink: false,\n /**\n * If `deepLink` is enabled, adjust the deep link scroll to make sure the top of the accordion panel is visible\n * @option\n * @type {boolean}\n * @default false\n */\n deepLinkSmudge: false,\n /**\n * If `deepLinkSmudge` is enabled, animation time (ms) for the deep link adjustment\n * @option\n * @type {number}\n * @default 300\n */\n deepLinkSmudgeDelay: 300,\n /**\n * If `deepLinkSmudge` is enabled, the offset for scrollToTtop to prevent overlap by a sticky element at the top of the page\n * @option\n * @type {number}\n * @default 0\n */\n deepLinkSmudgeOffset: 0,\n /**\n * If `deepLink` is enabled, update the browser history with the open accordion\n * @option\n * @type {boolean}\n * @default false\n */\n updateHistory: false\n};\n\nexport { Accordion };\n","'use strict';\n\nimport $ from 'jquery';\nimport { MediaQuery } from './foundation.util.mediaQuery';\nimport { onImagesLoaded } from './foundation.util.imageLoader';\nimport { GetYoDigits } from './foundation.core.utils';\nimport { Plugin } from './foundation.core.plugin';\n\n/**\n * Equalizer module.\n * @module foundation.equalizer\n * @requires foundation.util.mediaQuery\n * @requires foundation.util.imageLoader if equalizer contains images\n */\n\nclass Equalizer extends Plugin {\n /**\n * Creates a new instance of Equalizer.\n * @class\n * @name Equalizer\n * @fires Equalizer#init\n * @param {Object} element - jQuery object to add the trigger to.\n * @param {Object} options - Overrides to the default plugin settings.\n */\n _setup(element, options){\n this.$element = element;\n this.options = $.extend({}, Equalizer.defaults, this.$element.data(), options);\n this.className = 'Equalizer'; // ie9 back compat\n\n this._init();\n }\n\n /**\n * Initializes the Equalizer plugin and calls functions to get equalizer functioning on load.\n * @private\n */\n _init() {\n var eqId = this.$element.attr('data-equalizer') || '';\n var $watched = this.$element.find(`[data-equalizer-watch=\"${eqId}\"]`);\n\n MediaQuery._init();\n\n this.$watched = $watched.length ? $watched : this.$element.find('[data-equalizer-watch]');\n this.$element.attr('data-resize', (eqId || GetYoDigits(6, 'eq')));\n this.$element.attr('data-mutate', (eqId || GetYoDigits(6, 'eq')));\n\n this.hasNested = this.$element.find('[data-equalizer]').length > 0;\n this.isNested = this.$element.parentsUntil(document.body, '[data-equalizer]').length > 0;\n this.isOn = false;\n this._bindHandler = {\n onResizeMeBound: this._onResizeMe.bind(this),\n onPostEqualizedBound: this._onPostEqualized.bind(this)\n };\n\n var imgs = this.$element.find('img');\n var tooSmall;\n if(this.options.equalizeOn){\n tooSmall = this._checkMQ();\n $(window).on('changed.zf.mediaquery', this._checkMQ.bind(this));\n }else{\n this._events();\n }\n if((typeof tooSmall !== 'undefined' && tooSmall === false) || typeof tooSmall === 'undefined'){\n if(imgs.length){\n onImagesLoaded(imgs, this._reflow.bind(this));\n }else{\n this._reflow();\n }\n }\n }\n\n /**\n * Removes event listeners if the breakpoint is too small.\n * @private\n */\n _pauseEvents() {\n this.isOn = false;\n this.$element.off({\n '.zf.equalizer': this._bindHandler.onPostEqualizedBound,\n 'resizeme.zf.trigger': this._bindHandler.onResizeMeBound,\n\t 'mutateme.zf.trigger': this._bindHandler.onResizeMeBound\n });\n }\n\n /**\n * function to handle $elements resizeme.zf.trigger, with bound this on _bindHandler.onResizeMeBound\n * @private\n */\n _onResizeMe(e) {\n this._reflow();\n }\n\n /**\n * function to handle $elements postequalized.zf.equalizer, with bound this on _bindHandler.onPostEqualizedBound\n * @private\n */\n _onPostEqualized(e) {\n if(e.target !== this.$element[0]){ this._reflow(); }\n }\n\n /**\n * Initializes events for Equalizer.\n * @private\n */\n _events() {\n var _this = this;\n this._pauseEvents();\n if(this.hasNested){\n this.$element.on('postequalized.zf.equalizer', this._bindHandler.onPostEqualizedBound);\n }else{\n this.$element.on('resizeme.zf.trigger', this._bindHandler.onResizeMeBound);\n\t this.$element.on('mutateme.zf.trigger', this._bindHandler.onResizeMeBound);\n }\n this.isOn = true;\n }\n\n /**\n * Checks the current breakpoint to the minimum required size.\n * @private\n */\n _checkMQ() {\n var tooSmall = !MediaQuery.is(this.options.equalizeOn);\n if(tooSmall){\n if(this.isOn){\n this._pauseEvents();\n this.$watched.css('height', 'auto');\n }\n }else{\n if(!this.isOn){\n this._events();\n }\n }\n return tooSmall;\n }\n\n /**\n * A noop version for the plugin\n * @private\n */\n _killswitch() {\n return;\n }\n\n /**\n * Calls necessary functions to update Equalizer upon DOM change\n * @private\n */\n _reflow() {\n if(!this.options.equalizeOnStack){\n if(this._isStacked()){\n this.$watched.css('height', 'auto');\n return false;\n }\n }\n if (this.options.equalizeByRow) {\n this.getHeightsByRow(this.applyHeightByRow.bind(this));\n }else{\n this.getHeights(this.applyHeight.bind(this));\n }\n }\n\n /**\n * Manually determines if the first 2 elements are *NOT* stacked.\n * @private\n */\n _isStacked() {\n if (!this.$watched[0] || !this.$watched[1]) {\n return true;\n }\n return this.$watched[0].getBoundingClientRect().top !== this.$watched[1].getBoundingClientRect().top;\n }\n\n /**\n * Finds the outer heights of children contained within an Equalizer parent and returns them in an array\n * @param {Function} cb - A non-optional callback to return the heights array to.\n * @returns {Array} heights - An array of heights of children within Equalizer container\n */\n getHeights(cb) {\n var heights = [];\n for(var i = 0, len = this.$watched.length; i < len; i++){\n this.$watched[i].style.height = 'auto';\n heights.push(this.$watched[i].offsetHeight);\n }\n cb(heights);\n }\n\n /**\n * Finds the outer heights of children contained within an Equalizer parent and returns them in an array\n * @param {Function} cb - A non-optional callback to return the heights array to.\n * @returns {Array} groups - An array of heights of children within Equalizer container grouped by row with element,height and max as last child\n */\n getHeightsByRow(cb) {\n var lastElTopOffset = (this.$watched.length ? this.$watched.first().offset().top : 0),\n groups = [],\n group = 0;\n //group by Row\n groups[group] = [];\n for(var i = 0, len = this.$watched.length; i < len; i++){\n this.$watched[i].style.height = 'auto';\n //maybe could use this.$watched[i].offsetTop\n var elOffsetTop = $(this.$watched[i]).offset().top;\n if (elOffsetTop!=lastElTopOffset) {\n group++;\n groups[group] = [];\n lastElTopOffset=elOffsetTop;\n }\n groups[group].push([this.$watched[i],this.$watched[i].offsetHeight]);\n }\n\n for (var j = 0, ln = groups.length; j < ln; j++) {\n var heights = $(groups[j]).map(function(){ return this[1]; }).get();\n var max = Math.max.apply(null, heights);\n groups[j].push(max);\n }\n cb(groups);\n }\n\n /**\n * Changes the CSS height property of each child in an Equalizer parent to match the tallest\n * @param {array} heights - An array of heights of children within Equalizer container\n * @fires Equalizer#preequalized\n * @fires Equalizer#postequalized\n */\n applyHeight(heights) {\n var max = Math.max.apply(null, heights);\n /**\n * Fires before the heights are applied\n * @event Equalizer#preequalized\n */\n this.$element.trigger('preequalized.zf.equalizer');\n\n this.$watched.css('height', max);\n\n /**\n * Fires when the heights have been applied\n * @event Equalizer#postequalized\n */\n this.$element.trigger('postequalized.zf.equalizer');\n }\n\n /**\n * Changes the CSS height property of each child in an Equalizer parent to match the tallest by row\n * @param {array} groups - An array of heights of children within Equalizer container grouped by row with element,height and max as last child\n * @fires Equalizer#preequalized\n * @fires Equalizer#preequalizedrow\n * @fires Equalizer#postequalizedrow\n * @fires Equalizer#postequalized\n */\n applyHeightByRow(groups) {\n /**\n * Fires before the heights are applied\n */\n this.$element.trigger('preequalized.zf.equalizer');\n for (var i = 0, len = groups.length; i < len ; i++) {\n var groupsILength = groups[i].length,\n max = groups[i][groupsILength - 1];\n if (groupsILength<=2) {\n $(groups[i][0][0]).css({'height':'auto'});\n continue;\n }\n /**\n * Fires before the heights per row are applied\n * @event Equalizer#preequalizedrow\n */\n this.$element.trigger('preequalizedrow.zf.equalizer');\n for (var j = 0, lenJ = (groupsILength-1); j < lenJ ; j++) {\n $(groups[i][j][0]).css({'height':max});\n }\n /**\n * Fires when the heights per row have been applied\n * @event Equalizer#postequalizedrow\n */\n this.$element.trigger('postequalizedrow.zf.equalizer');\n }\n /**\n * Fires when the heights have been applied\n */\n this.$element.trigger('postequalized.zf.equalizer');\n }\n\n /**\n * Destroys an instance of Equalizer.\n * @function\n */\n _destroy() {\n this._pauseEvents();\n this.$watched.css('height', 'auto');\n }\n}\n\n/**\n * Default settings for plugin\n */\nEqualizer.defaults = {\n /**\n * Enable height equalization when stacked on smaller screens.\n * @option\n * @type {boolean}\n * @default false\n */\n equalizeOnStack: false,\n /**\n * Enable height equalization row by row.\n * @option\n * @type {boolean}\n * @default false\n */\n equalizeByRow: false,\n /**\n * String representing the minimum breakpoint size the plugin should equalize heights on.\n * @option\n * @type {string}\n * @default ''\n */\n equalizeOn: ''\n};\n\nexport {Equalizer};\n","'use strict';\n\nimport $ from 'jquery';\nimport { MediaQuery } from './foundation.util.mediaQuery';\nimport { Plugin } from './foundation.core.plugin';\nimport { GetYoDigits } from './foundation.core.utils';\nimport { Triggers } from './foundation.util.triggers';\n\n/**\n * Interchange module.\n * @module foundation.interchange\n * @requires foundation.util.mediaQuery\n */\n\nclass Interchange extends Plugin {\n /**\n * Creates a new instance of Interchange.\n * @class\n * @name Interchange\n * @fires Interchange#init\n * @param {Object} element - jQuery object to add the trigger to.\n * @param {Object} options - Overrides to the default plugin settings.\n */\n _setup(element, options) {\n this.$element = element;\n this.options = $.extend({}, Interchange.defaults, this.$element.data(), options);\n this.rules = [];\n this.currentPath = '';\n this.className = 'Interchange'; // ie9 back compat\n\n // Triggers init is idempotent, just need to make sure it is initialized\n Triggers.init($);\n \n this._init();\n this._events();\n }\n\n /**\n * Initializes the Interchange plugin and calls functions to get interchange functioning on load.\n * @function\n * @private\n */\n _init() {\n MediaQuery._init();\n\n var id = this.$element[0].id || GetYoDigits(6, 'interchange');\n this.$element.attr({\n 'data-resize': id,\n 'id': id\n });\n\n this._parseOptions();\n this._addBreakpoints();\n this._generateRules();\n this._reflow();\n }\n\n /**\n * Initializes events for Interchange.\n * @function\n * @private\n */\n _events() {\n this.$element.off('resizeme.zf.trigger').on('resizeme.zf.trigger', () => this._reflow());\n }\n\n /**\n * Calls necessary functions to update Interchange upon DOM change\n * @function\n * @private\n */\n _reflow() {\n var match;\n\n // Iterate through each rule, but only save the last match\n for (var i in this.rules) {\n if(this.rules.hasOwnProperty(i)) {\n var rule = this.rules[i];\n if (window.matchMedia(rule.query).matches) {\n match = rule;\n }\n }\n }\n\n if (match) {\n this.replace(match.path);\n }\n }\n\n /**\n * Check options valifity and set defaults for:\n * - `data-interchange-type`: if set, enforce the type of replacement (auto, src, background or html)\n * @function\n * @private\n */\n _parseOptions() {\n var types = ['auto', 'src', 'background', 'html'];\n if (typeof this.options.type === 'undefined')\n this.options.type = 'auto';\n else if (types.indexOf(this.options.type) === -1) {\n console.log(`Warning: invalid value \"${this.options.type}\" for Interchange option \"type\"`);\n this.options.type = 'auto';\n }\n }\n\n /**\n * Gets the Foundation breakpoints and adds them to the Interchange.SPECIAL_QUERIES object.\n * @function\n * @private\n */\n _addBreakpoints() {\n for (var i in MediaQuery.queries) {\n if (MediaQuery.queries.hasOwnProperty(i)) {\n var query = MediaQuery.queries[i];\n Interchange.SPECIAL_QUERIES[query.name] = query.value;\n }\n }\n }\n\n /**\n * Checks the Interchange element for the provided media query + content pairings\n * @function\n * @private\n * @param {Object} element - jQuery object that is an Interchange instance\n * @returns {Array} scenarios - Array of objects that have 'mq' and 'path' keys with corresponding keys\n */\n _generateRules(element) {\n var rulesList = [];\n var rules;\n\n if (this.options.rules) {\n rules = this.options.rules;\n }\n else {\n rules = this.$element.data('interchange');\n }\n\n rules = typeof rules === 'string' ? rules.match(/\\[.*?, .*?\\]/g) : rules;\n\n for (var i in rules) {\n if(rules.hasOwnProperty(i)) {\n var rule = rules[i].slice(1, -1).split(', ');\n var path = rule.slice(0, -1).join('');\n var query = rule[rule.length - 1];\n\n if (Interchange.SPECIAL_QUERIES[query]) {\n query = Interchange.SPECIAL_QUERIES[query];\n }\n\n rulesList.push({\n path: path,\n query: query\n });\n }\n }\n\n this.rules = rulesList;\n }\n\n /**\n * Update the `src` property of an image, or change the HTML of a container, to the specified path.\n * @function\n * @param {String} path - Path to the image or HTML partial.\n * @fires Interchange#replaced\n */\n replace(path) {\n if (this.currentPath === path) return;\n\n var trigger = 'replaced.zf.interchange';\n\n var type = this.options.type;\n if (type === 'auto') {\n if (this.$element[0].nodeName === 'IMG')\n type = 'src';\n else if (path.match(/\\.(gif|jpe?g|png|svg|tiff)([?#].*)?/i))\n type = 'background';\n else\n type = 'html';\n }\n\n // Replacing images\n if (type === 'src') {\n this.$element.attr('src', path)\n .on('load', () => { this.currentPath = path; })\n .trigger(trigger);\n }\n // Replacing background images\n else if (type === 'background') {\n path = path.replace(/\\(/g, '%28').replace(/\\)/g, '%29');\n this.$element\n .css({ 'background-image': 'url(' + path + ')' })\n .trigger(trigger);\n }\n // Replacing HTML\n else if (type === 'html') {\n $.get(path, (response) => {\n this.$element\n .html(response)\n .trigger(trigger);\n $(response).foundation();\n this.currentPath = path;\n });\n }\n\n /**\n * Fires when content in an Interchange element is done being loaded.\n * @event Interchange#replaced\n */\n // this.$element.trigger('replaced.zf.interchange');\n }\n\n /**\n * Destroys an instance of interchange.\n * @function\n */\n _destroy() {\n this.$element.off('resizeme.zf.trigger')\n }\n}\n\n/**\n * Default settings for plugin\n */\nInterchange.defaults = {\n /**\n * Rules to be applied to Interchange elements. Set with the `data-interchange` array notation.\n * @option\n * @type {?array}\n * @default null\n */\n rules: null,\n\n /**\n * Type of the responsive ressource to replace. It can take the following options:\n * - `auto` (default): choose the type according to the element tag or the ressource extension,\n * - `src`: replace the `[src]` attribute, recommended for images ``.\n * - `background`: replace the `background-image` CSS property.\n * - `html`: replace the element content.\n * @option\n * @type {string}\n * @default 'auto'\n */\n type: 'auto'\n};\n\nInterchange.SPECIAL_QUERIES = {\n 'landscape': 'screen and (orientation: landscape)',\n 'portrait': 'screen and (orientation: portrait)',\n 'retina': 'only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)'\n};\n\nexport {Interchange};\n","jQuery.fn.setFirstLogoCrossfade = function (speed, animSpeed) {\r\n jQuery(\".logos_2\", this).css(\"display\", \"none\");\r\n let $this = $(this);\r\n jQuery(\".logos_1\", this)\r\n .fadeIn(animSpeed)\r\n .delay(speed)\r\n .fadeOut(animSpeed, function () {\r\n $this.setSecondLogoCrossfade(speed, animSpeed);\r\n });\r\n};\r\n\r\n\r\njQuery.fn.setSecondLogoCrossfade = function (speed, animSpeed) {\r\n jQuery(\".logos_1\", this).css(\"display\", \"none\");\r\n let $this = $(this);\r\n jQuery(\".logos_2\", this)\r\n .fadeIn(animSpeed)\r\n .delay(speed)\r\n .fadeOut(animSpeed, function () {\r\n $this.setFirstLogoCrossfade(speed, animSpeed);\r\n });\r\n};\r\n\r\njQuery(document).ready(function ($) {\r\n $('.logos-container.module').each(function () {\r\n let speed = parseInt($('.crossfaders', this).data('crossfade-speed'));\r\n let animSpeed = parseInt($('.crossfaders', this).data('crossfade-anim-speed'));\r\n\r\n if (!$(this).hasClass('animation-off'))\r\n $(this).setFirstLogoCrossfade(speed, animSpeed);\r\n });\r\n})","import Flickity from 'flickity'\r\nimport deBounce from 'lodash.debounce'\r\n\r\n$(function () {\r\n function setUniformSlideHeight(container) {\r\n var tallestHeight = 0;\r\n $('.slide', container).css('height', 'auto');\r\n $('.slide', container).each(function () {\r\n if ($(this).height() > tallestHeight)\r\n tallestHeight = $(this).height();\r\n });\r\n $('.slide', container).height(tallestHeight);\r\n }\r\n\r\n let flktyInstances = [];\r\n\r\n function initializeFlickity(container) {\r\n if (!$(container).hasClass('flickity-enabled')) {\r\n let flkty = new Flickity(container, {\r\n wrapAround: true,\r\n pageDots: true,\r\n cellAlign: \"center\",\r\n accessibility: false,\r\n draggable: false\r\n });\r\n\r\n flkty.on(\"select\", function (index) {\r\n const parentCarousel = $(this.element).closest('.testimonials-carousel');\r\n $(\".testimonial-background.active\", parentCarousel).removeClass(\"active\");\r\n $('.testimonial-background[data-slide=\"' + index + '\"]', parentCarousel).addClass(\"active\");\r\n });\r\n\r\n flktyInstances.push(flkty);\r\n }\r\n }\r\n\r\n $(\".testimonials-carousel .review-slider\").each(function () {\r\n if ($(this).find(\".slide\").length > 1) {\r\n setUniformSlideHeight(this);\r\n initializeFlickity(this);\r\n $(window).on('load resize', deBounce(function () {\r\n let flktyInstance = flktyInstances.find(instance => instance.element === this);\r\n\r\n if (flktyInstance) {\r\n setUniformSlideHeight(this);\r\n flktyInstance.resize();\r\n }\r\n //initializeFlickity(this);\r\n }.bind(this), 100));\r\n }\r\n });\r\n});","/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n","// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'get-size/get-size',\n ], function( getSize ) {\n return factory( window, getSize );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('get-size')\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Cell = factory(\n window,\n window.getSize\n );\n }\n\n}( window, function factory( window, getSize ) {\n\n'use strict';\n\nfunction Cell( elem, parent ) {\n this.element = elem;\n this.parent = parent;\n\n this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n this.element.style.position = 'absolute';\n this.element.setAttribute( 'aria-hidden', 'true' );\n this.x = 0;\n this.shift = 0;\n};\n\nproto.destroy = function() {\n // reset style\n this.unselect();\n this.element.style.position = '';\n var side = this.parent.originSide;\n this.element.style[ side ] = '';\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n this.x = x;\n this.updateTarget();\n this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n this.target = this.x + this.size[ marginProperty ] +\n this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n // render position of cell with in slider\n var side = this.parent.originSide;\n this.element.style[ side ] = this.parent.getPositionValue( x );\n};\n\nproto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\n/**\n * @param {Integer} shift - 0, 1, or -1\n */\nproto.wrapShift = function( shift ) {\n this.shift = shift;\n this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n} ) );\n","// slide\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Slide = factory();\n }\n\n}( window, function factory() {\n'use strict';\n\nfunction Slide( parent ) {\n this.parent = parent;\n this.isOriginLeft = parent.originSide == 'left';\n this.cells = [];\n this.outerWidth = 0;\n this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n this.cells.push( cell );\n this.outerWidth += cell.size.outerWidth;\n this.height = Math.max( cell.size.outerHeight, this.height );\n // first cell stuff\n if ( this.cells.length == 1 ) {\n this.x = cell.x; // x comes from first cell\n var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n this.firstMargin = cell.size[ beginMargin ];\n }\n};\n\nproto.updateTarget = function() {\n var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n var lastCell = this.getLastCell();\n var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n this.cells.forEach( function( cell ) {\n cell.select();\n } );\n};\n\nproto.unselect = function() {\n this.cells.forEach( function( cell ) {\n cell.unselect();\n } );\n};\n\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n } );\n};\n\nreturn Slide;\n\n} ) );\n","// animate\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'fizzy-ui-utils/utils',\n ], function( utils ) {\n return factory( window, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.animatePrototype = factory(\n window,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, utils ) {\n\n'use strict';\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n if ( this.isAnimating ) {\n return;\n }\n\n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n};\n\nproto.animate = function() {\n this.applyDragForce();\n this.applySelectedAttraction();\n\n var previousX = this.x;\n\n this.integratePhysics();\n this.positionSlider();\n this.settle( previousX );\n // animate next frame\n if ( this.isAnimating ) {\n var _this = this;\n requestAnimationFrame( function animateFrame() {\n _this.animate();\n } );\n }\n};\n\nproto.positionSlider = function() {\n var x = this.x;\n // wrap position around\n if ( this.options.wrapAround && this.cells.length > 1 ) {\n x = utils.modulo( x, this.slideableWidth );\n x -= this.slideableWidth;\n this.shiftWrapCells( x );\n }\n\n this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n x += this.cursorPosition;\n // reverse if right-to-left and using transform\n x = this.options.rightToLeft ? -x : x;\n var translateX = this.getPositionValue( x );\n // use 3D transforms for hardware acceleration on iOS\n // but use 2D when settled, for better font-rendering\n this.slider.style.transform = is3d ?\n 'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n};\n\nproto.dispatchScrollEvent = function() {\n var firstSlide = this.slides[0];\n if ( !firstSlide ) {\n return;\n }\n var positionX = -this.x - firstSlide.target;\n var progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) {\n return;\n }\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\n this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n if ( this.options.percentPosition ) {\n // percent position, round to 2 digits, like 12.34%\n return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n } else {\n // pixel positioning\n return Math.round( position ) + 'px';\n }\n};\n\nproto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n var isResting = !this.isPointerDown &&\n Math.round( this.x * 100 ) == Math.round( previousX * 100 );\n if ( isResting ) {\n this.restingFrames++;\n }\n // stop animating if resting for 3 or more frames\n if ( this.restingFrames > 2 ) {\n this.isAnimating = false;\n delete this.isFreeScrolling;\n // render position with translateX when settled\n this.positionSlider();\n this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n }\n};\n\nproto.shiftWrapCells = function( x ) {\n // shift before cells\n var beforeGap = this.cursorPosition + x;\n this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n // shift after cells\n var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n for ( var i = 0; i < cells.length; i++ ) {\n var cell = cells[i];\n var cellShift = gap > 0 ? shift : 0;\n cell.wrapShift( cellShift );\n gap -= cell.size.outerWidth;\n }\n};\n\nproto._unshiftCells = function( cells ) {\n if ( !cells || !cells.length ) {\n return;\n }\n for ( var i = 0; i < cells.length; i++ ) {\n cells[i].wrapShift( 0 );\n }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n if ( !this.isDraggable || !this.isPointerDown ) {\n return;\n }\n // change the position to drag position by applying force\n var dragVelocity = this.dragX - this.x;\n var dragForce = dragVelocity - this.velocity;\n this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n // do not attract if pointer down or no slides\n var dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n return;\n }\n var distance = this.selectedSlide.target * -1 - this.x;\n var force = distance * this.options.selectedAttraction;\n this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n","// drag\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unidragger/unidragger',\n 'fizzy-ui-utils/utils',\n ], function( Flickity, Unidragger, utils ) {\n return factory( window, Flickity, Unidragger, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unidragger'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = factory(\n window,\n window.Flickity,\n window.Unidragger,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n'use strict';\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n draggable: '>1',\n dragThreshold: 3,\n} );\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// -------------------------- -------------------------- //\n\nvar isTouch = 'createTouch' in document;\nvar isTouchmoveScrollCanceled = false;\n\nproto._createDrag = function() {\n this.on( 'activate', this.onActivateDrag );\n this.on( 'uiChange', this._uiChangeDrag );\n this.on( 'deactivate', this.onDeactivateDrag );\n this.on( 'cellChange', this.updateDraggable );\n // TODO updateDraggable on resize? if groupCells & slides change\n // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n // #457, RubaXa/Sortable#973\n if ( isTouch && !isTouchmoveScrollCanceled ) {\n window.addEventListener( 'touchmove', function() {} );\n isTouchmoveScrollCanceled = true;\n }\n};\n\nproto.onActivateDrag = function() {\n this.handles = [ this.viewport ];\n this.bindHandles();\n this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n // disable dragging if less than 2 slides. #278\n if ( this.options.draggable == '>1' ) {\n this.isDraggable = this.slides.length > 1;\n } else {\n this.isDraggable = this.options.draggable;\n }\n if ( this.isDraggable ) {\n this.element.classList.add('is-draggable');\n } else {\n this.element.classList.remove('is-draggable');\n }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n this.options.draggable = true;\n this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n this.options.draggable = false;\n this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n if ( !this.isDraggable ) {\n this._pointerDownDefault( event, pointer );\n return;\n }\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n\n this._pointerDownPreventDefault( event );\n this.pointerDownFocus( event );\n // blur\n if ( document.activeElement != this.element ) {\n // do not blur if already focused\n this.pointerDownBlur();\n }\n\n // stop if it was moving\n this.dragX = this.x;\n this.viewport.classList.add('is-pointer-down');\n // track scrolling\n this.pointerDownScroll = getScrollPosition();\n window.addEventListener( 'scroll', this );\n\n this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n // bind move and end events\n this._bindPostStartEvents( event );\n this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n INPUT: true,\n TEXTAREA: true,\n SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isFocusNode ) {\n this.focus();\n }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n var isTouchStart = event.type == 'touchstart';\n var isTouchPointer = event.pointerType == 'touch';\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n event.preventDefault();\n }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n delete this.isTouchScrolling;\n this.viewport.classList.remove('is-pointer-down');\n this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n this.dragStartPosition = this.x;\n this.startAnimation();\n window.removeEventListener( 'scroll', this );\n this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n if ( !this.isDraggable ) {\n return;\n }\n event.preventDefault();\n\n this.previousDragX = this.dragX;\n // reverse if right-to-left\n var direction = this.options.rightToLeft ? -1 : 1;\n if ( this.options.wrapAround ) {\n // wrap around move. #589\n moveVector.x %= this.slideableWidth;\n }\n var dragX = this.dragStartPosition + moveVector.x * direction;\n\n if ( !this.options.wrapAround && this.slides.length ) {\n // slow drag\n var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n }\n\n this.dragX = dragX;\n\n this.dragMoveTime = new Date();\n this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n if ( this.options.freeScroll ) {\n this.isFreeScrolling = true;\n }\n // set selectedIndex based on where flick will end up\n var index = this.dragEndRestingSelect();\n\n if ( this.options.freeScroll && !this.options.wrapAround ) {\n // if free-scroll & not wrap around\n // do not free-scroll if going outside of bounding slides\n // so bounding slides can attract slider, and keep it in bounds\n var restingX = this.getRestingPosition();\n this.isFreeScrolling = -restingX > this.slides[0].target &&\n -restingX < this.getLastSlide().target;\n } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n // boost selection if selected index has not changed\n index += this.dragEndBoostSelect();\n }\n delete this.previousDragX;\n // apply selection\n // TODO refactor this, selecting here feels weird\n // HACK, set flag so dragging stays in correct direction\n this.isDragSelect = this.options.wrapAround;\n this.select( index );\n delete this.isDragSelect;\n this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n var restingX = this.getRestingPosition();\n // how far away from selected slide\n var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n // get closet resting going up and going down\n var positiveResting = this._getClosestResting( restingX, distance, 1 );\n var negativeResting = this._getClosestResting( restingX, distance, -1 );\n // use closer resting for wrap-around\n var index = positiveResting.distance < negativeResting.distance ?\n positiveResting.index : negativeResting.index;\n return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n var index = this.selectedIndex;\n var minDistance = Infinity;\n var condition = this.options.contain && !this.options.wrapAround ?\n // if contain, keep going if distance is equal to minDistance\n function( dist, minDist ) {\n return dist <= minDist;\n } : function( dist, minDist ) {\n return dist < minDist;\n };\n while ( condition( distance, minDistance ) ) {\n // measure distance to next cell\n index += increment;\n minDistance = distance;\n distance = this.getSlideDistance( -restingX, index );\n if ( distance === null ) {\n break;\n }\n distance = Math.abs( distance );\n }\n return {\n distance: minDistance,\n // selected was previous index\n index: index - increment,\n };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n var len = this.slides.length;\n // wrap around if at least 2 slides\n var isWrapAround = this.options.wrapAround && len > 1;\n var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n var slide = this.slides[ slideIndex ];\n if ( !slide ) {\n return null;\n }\n // add distance for wrap-around slides\n var wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n // do not boost if no previousDragX or dragMoveTime\n if ( this.previousDragX === undefined || !this.dragMoveTime ||\n // or if drag was held for 100 ms\n new Date() - this.dragMoveTime > 100 ) {\n return 0;\n }\n\n var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n var delta = this.previousDragX - this.dragX;\n if ( distance > 0 && delta > 0 ) {\n // boost to next if moving towards the right, and positive velocity\n return 1;\n } else if ( distance < 0 && delta < 0 ) {\n // boost to previous if moving towards the left, and negative velocity\n return -1;\n }\n return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n // get clickedCell, if cell was clicked\n var clickedCell = this.getParentCell( event.target );\n var cellElem = clickedCell && clickedCell.element;\n var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n var scroll = getScrollPosition();\n var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n // cancel click/tap if scroll is too much\n if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n this._pointerDone();\n }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset,\n };\n}\n\n// ----- ----- //\n\nreturn Flickity;\n\n} ) );\n","/*!\n * Unidragger v2.3.1\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'unipointer/unipointer'\n ], function( Unipointer ) {\n return factory( window, Unipointer );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('unipointer')\n );\n } else {\n // browser global\n window.Unidragger = factory(\n window,\n window.Unipointer\n );\n }\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n // bind each handle\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n var touchAction = isAdd ? this._touchActionValue : '';\n for ( var i=0; i < this.handles.length; i++ ) {\n var handle = this.handles[i];\n this._bindStartEvent( handle, isAdd );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) {\n handle.style.touchAction = touchAction;\n }\n }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n\n event.preventDefault();\n this.pointerDownBlur();\n // bind move and end events\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n TEXTAREA: true,\n INPUT: true,\n SELECT: true,\n OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n radio: true,\n checkbox: true,\n button: true,\n submit: true,\n image: true,\n file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n var isCursorNode = cursorNodes[ event.target.nodeName ];\n var isClickType = clickTypes[ event.target.type ];\n var isOkay = !isCursorNode || isClickType;\n if ( !isOkay ) {\n this._pointerReset();\n }\n return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n var focused = document.activeElement;\n // do not blur body for IE10, metafizzy/flickity#117\n var canBlur = focused && focused.blur && focused != document.body;\n if ( canBlur ) {\n focused.blur();\n }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n var moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY\n };\n // start drag if pointer has moved far enough to start drag\n if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n this._dragStart( event, pointer );\n }\n return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n if ( this.isDragging ) {\n this._dragEnd( event, pointer );\n } else {\n // pointer didn't move enough for drag to start\n this._staticClick( event, pointer );\n }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n this.isDragging = true;\n // prevent clicks\n this.isPreventingClicks = true;\n this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n // do not drag if not dragging yet\n if ( !this.isDragging ) {\n return;\n }\n\n this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n event.preventDefault();\n this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n // set flags\n this.isDragging = false;\n // re-enable clicking async\n setTimeout( function() {\n delete this.isPreventingClicks;\n }.bind( this ) );\n\n this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n if ( this.isPreventingClicks ) {\n event.preventDefault();\n }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n // ignore emulated mouse up clicks\n if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n return;\n }\n\n this.staticClick( event, pointer );\n\n // set flag for emulated clicks 300ms after touchend\n if ( event.type != 'mouseup' ) {\n this.isIgnoringMouseUp = true;\n // reset flag after 300ms\n setTimeout( function() {\n delete this.isIgnoringMouseUp;\n }.bind( this ), 400 );\n }\n};\n\nproto.staticClick = function( event, pointer ) {\n this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// ----- ----- //\n\nreturn Unidragger;\n\n}));\n","// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unipointer/unipointer',\n 'fizzy-ui-utils/utils',\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n'use strict';\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n this.direction = direction;\n this.parent = parent;\n this._create();\n}\n\nPrevNextButton.prototype = Object.create( Unipointer.prototype );\n\nPrevNextButton.prototype._create = function() {\n // properties\n this.isEnabled = true;\n this.isPrevious = this.direction == -1;\n var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n this.isLeft = this.direction == leftDirection;\n\n var element = this.element = document.createElement('button');\n element.className = 'flickity-button flickity-prev-next-button';\n element.className += this.isPrevious ? ' previous' : ' next';\n // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n element.setAttribute( 'type', 'button' );\n // init as disabled\n this.disable();\n\n element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n\n // create arrow\n var svg = this.createSVG();\n element.appendChild( svg );\n // events\n this.parent.on( 'select', this.update.bind( this ) );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n this.bindStartEvent( this.element );\n this.element.addEventListener( 'click', this );\n // add to DOM\n this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n // remove from DOM\n this.parent.element.removeChild( this.element );\n // click events\n this.unbindStartEvent( this.element );\n this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n var svg = document.createElementNS( svgURI, 'svg' );\n svg.setAttribute( 'class', 'flickity-button-icon' );\n svg.setAttribute( 'viewBox', '0 0 100 100' );\n var path = document.createElementNS( svgURI, 'path' );\n var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n path.setAttribute( 'd', pathMovements );\n path.setAttribute( 'class', 'arrow' );\n // rotate arrow\n if ( !this.isLeft ) {\n path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n }\n svg.appendChild( path );\n return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n // use shape as movement if string\n if ( typeof shape == 'string' ) {\n return shape;\n }\n // create movement string\n return 'M ' + shape.x0 + ',50' +\n ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n ' L ' + shape.x3 + ',50 ' +\n ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n ' Z';\n}\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.parent.uiChange();\n var method = this.isPrevious ? 'previous' : 'next';\n this.parent[ method ]();\n};\n\n// ----- ----- //\n\nPrevNextButton.prototype.enable = function() {\n if ( this.isEnabled ) {\n return;\n }\n this.element.disabled = false;\n this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.element.disabled = true;\n this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n // index of first or last slide, if previous or next\n var slides = this.parent.slides;\n // enable is wrapAround and at least 2 slides\n if ( this.parent.options.wrapAround && slides.length > 1 ) {\n this.enable();\n return;\n }\n var lastIndex = slides.length ? slides.length - 1 : 0;\n var boundIndex = this.isPrevious ? 0 : lastIndex;\n var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n prevNextButtons: true,\n arrowShape: {\n x0: 10,\n x1: 60, y1: 50,\n x2: 70, y2: 40,\n x3: 30,\n },\n} );\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n if ( !this.options.prevNextButtons ) {\n return;\n }\n\n this.prevButton = new PrevNextButton( -1, this );\n this.nextButton = new PrevNextButton( 1, this );\n\n this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n this.prevButton.activate();\n this.nextButton.activate();\n this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n this.prevButton.deactivate();\n this.nextButton.deactivate();\n this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// -------------------------- -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n","// page dots\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'unipointer/unipointer',\n 'fizzy-ui-utils/utils',\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n'use strict';\n\nfunction PageDots( parent ) {\n this.parent = parent;\n this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\n\nPageDots.prototype._create = function() {\n // create holder element\n this.holder = document.createElement('ol');\n this.holder.className = 'flickity-page-dots';\n // create dots, array of elements\n this.dots = [];\n // events\n this.handleClick = this.onClick.bind( this );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n this.setDots();\n this.holder.addEventListener( 'click', this.handleClick );\n this.bindStartEvent( this.holder );\n // add to DOM\n this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n this.holder.removeEventListener( 'click', this.handleClick );\n this.unbindStartEvent( this.holder );\n // remove from DOM\n this.parent.element.removeChild( this.holder );\n};\n\nPageDots.prototype.setDots = function() {\n // get difference between number of slides and number of dots\n var delta = this.parent.slides.length - this.dots.length;\n if ( delta > 0 ) {\n this.addDots( delta );\n } else if ( delta < 0 ) {\n this.removeDots( -delta );\n }\n};\n\nPageDots.prototype.addDots = function( count ) {\n var fragment = document.createDocumentFragment();\n var newDots = [];\n var length = this.dots.length;\n var max = length + count;\n\n for ( var i = length; i < max; i++ ) {\n var dot = document.createElement('li');\n dot.className = 'dot';\n dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n fragment.appendChild( dot );\n newDots.push( dot );\n }\n\n this.holder.appendChild( fragment );\n this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n // remove from this.dots collection\n var removeDots = this.dots.splice( this.dots.length - count, count );\n // remove from DOM\n removeDots.forEach( function( dot ) {\n this.holder.removeChild( dot );\n }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n // remove selected class on previous\n if ( this.selectedDot ) {\n this.selectedDot.className = 'dot';\n this.selectedDot.removeAttribute('aria-current');\n }\n // don't proceed if no dots\n if ( !this.dots.length ) {\n return;\n }\n this.selectedDot = this.dots[ this.parent.selectedIndex ];\n this.selectedDot.className = 'dot is-selected';\n this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.prototype.onClick = function( event ) {\n var target = event.target;\n // only care about dot clicks\n if ( target.nodeName != 'LI' ) {\n return;\n }\n\n this.parent.uiChange();\n var index = this.dots.indexOf( target );\n this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pageDots: true,\n} );\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n if ( !this.options.pageDots ) {\n return;\n }\n this.pageDots = new PageDots( this );\n // events\n this.on( 'activate', this.activatePageDots );\n this.on( 'select', this.updateSelectedPageDots );\n this.on( 'cellChange', this.updatePageDots );\n this.on( 'resize', this.updatePageDots );\n this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n this.pageDots.deactivate();\n};\n\n// ----- ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n","// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'ev-emitter/ev-emitter',\n 'fizzy-ui-utils/utils',\n './flickity',\n ], function( EvEmitter, utils, Flickity ) {\n return factory( EvEmitter, utils, Flickity );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('ev-emitter'),\n require('fizzy-ui-utils'),\n require('./flickity')\n );\n } else {\n // browser global\n factory(\n window.EvEmitter,\n window.fizzyUIUtils,\n window.Flickity\n );\n }\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n'use strict';\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n this.parent = parent;\n this.state = 'stopped';\n // visibility change event handler\n this.onVisibilityChange = this.visibilityChange.bind( this );\n this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n if ( this.state == 'playing' ) {\n return;\n }\n // do not play if page is hidden, start playing when page is visible\n var isPageHidden = document.hidden;\n if ( isPageHidden ) {\n document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n return;\n }\n\n this.state = 'playing';\n // listen to visibility change\n document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n // start ticking\n this.tick();\n};\n\nPlayer.prototype.tick = function() {\n // do not tick if not playing\n if ( this.state != 'playing' ) {\n return;\n }\n\n var time = this.parent.options.autoPlay;\n // default to 3 seconds\n time = typeof time == 'number' ? time : 3000;\n var _this = this;\n // HACK: reset ticks if stopped and started within interval\n this.clear();\n this.timeout = setTimeout( function() {\n _this.parent.next( true );\n _this.tick();\n }, time );\n};\n\nPlayer.prototype.stop = function() {\n this.state = 'stopped';\n this.clear();\n // remove visibility change event\n document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n if ( this.state == 'playing' ) {\n this.state = 'paused';\n this.clear();\n }\n};\n\nPlayer.prototype.unpause = function() {\n // re-start play if paused\n if ( this.state == 'paused' ) {\n this.play();\n }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n var isPageHidden = document.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n pauseAutoPlayOnHover: true,\n} );\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n this.player = new Player( this );\n\n this.on( 'activate', this.activatePlayer );\n this.on( 'uiChange', this.stopPlayer );\n this.on( 'pointerDown', this.stopPlayer );\n this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n if ( !this.options.autoPlay ) {\n return;\n }\n this.player.play();\n this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n this.player.play();\n};\n\nproto.stopPlayer = function() {\n this.player.stop();\n};\n\nproto.pausePlayer = function() {\n this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n this.player.stop();\n this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n if ( !this.options.pauseAutoPlayOnHover ) {\n return;\n }\n this.player.pause();\n this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n this.player.unpause();\n this.element.removeEventListener( 'mouseleave', this );\n};\n\n// ----- ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n","// add, remove cell\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'fizzy-ui-utils/utils',\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n\n'use strict';\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n var fragment = document.createDocumentFragment();\n cells.forEach( function( cell ) {\n fragment.appendChild( cell.element );\n } );\n return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n var cells = this._makeCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n var len = this.cells.length;\n // default to append\n index = index === undefined ? len : index;\n // add cells with document fragment\n var fragment = getCellsFragment( cells );\n // append to slider\n var isAppend = index == len;\n if ( isAppend ) {\n this.slider.appendChild( fragment );\n } else {\n var insertCellElement = this.cells[ index ].element;\n this.slider.insertBefore( fragment, insertCellElement );\n }\n // add to this.cells\n if ( index === 0 ) {\n // prepend, add to start\n this.cells = cells.concat( this.cells );\n } else if ( isAppend ) {\n // append, add to end\n this.cells = this.cells.concat( cells );\n } else {\n // insert in this.cells\n var endCells = this.cells.splice( index, len - index );\n this.cells = this.cells.concat( cells ).concat( endCells );\n }\n\n this._sizeCells( cells );\n this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n var cells = this.getCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n\n var minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( function( cell ) {\n cell.remove();\n var index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n }, this );\n\n this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n var cell = this.getCell( elem );\n if ( !cell ) {\n return;\n }\n cell.getSize();\n\n var index = this.cells.indexOf( cell );\n this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n * @param {Boolean} isPositioningSlider - Positions slider after selection\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n var prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._getWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex\n // try to maintain position & select previous selected element\n var cell = this.getCell( prevSelectedElem );\n if ( cell ) {\n this.selectedIndex = this.getCellSlideIndex( cell );\n }\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n this.emitEvent( 'cellChange', [ changedCellIndex ] );\n // position slider\n this.select( this.selectedIndex );\n // do not position slider after lazy load\n if ( isPositioningSlider ) {\n this.positionSliderAtSelected();\n }\n};\n\n// ----- ----- //\n\nreturn Flickity;\n\n} ) );\n","// lazyload\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n './flickity',\n 'fizzy-ui-utils/utils',\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n'use strict';\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n var lazyLoad = this.options.lazyLoad;\n if ( !lazyLoad ) {\n return;\n }\n // get adjacent cells, use lazyLoad option for adjacent count\n var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n var cellElems = this.getAdjacentCellElements( adjCount );\n // get lazy images in those cells\n var lazyImages = [];\n cellElems.forEach( function( cellElem ) {\n var lazyCellImages = getCellLazyImages( cellElem );\n lazyImages = lazyImages.concat( lazyCellImages );\n } );\n // load lazy images\n lazyImages.forEach( function( img ) {\n new LazyLoader( img, this );\n }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n // check if cell element is lazy image\n if ( cellElem.nodeName == 'IMG' ) {\n var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n return [ cellElem ];\n }\n }\n // select lazy images in cell\n var lazySelector = 'img[data-flickity-lazyload], ' +\n 'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n var imgs = cellElem.querySelectorAll( lazySelector );\n return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Flickity} flickity - Flickity instance\n */\nfunction LazyLoader( img, flickity ) {\n this.img = img;\n this.flickity = flickity;\n this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n // get src & srcset\n var src = this.img.getAttribute('data-flickity-lazyload') ||\n this.img.getAttribute('data-flickity-lazyload-src');\n var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n // set src & serset\n this.img.src = src;\n if ( srcset ) {\n this.img.setAttribute( 'srcset', srcset );\n }\n // remove attr\n this.img.removeAttribute('data-flickity-lazyload');\n this.img.removeAttribute('data-flickity-lazyload-src');\n this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n // unbind events\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n\n var cell = this.flickity.getParentCell( this.img );\n var cellElem = cell && cell.element;\n this.flickity.cellSizeChange( cellElem );\n\n this.img.classList.add( className );\n this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// ----- ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n","let $ = jQuery;\r\n\r\n$(function () {\r\n function scrollUp() {\r\n let headerHeight = 0;\r\n if ($('#header-form').length) {\r\n headerHeight = $('#header-form').outerHeight();\r\n }\r\n\r\n $('html, body').animate({\r\n scrollTop: $(\".review-listing\").offset().top - headerHeight - 20\r\n }, 500);\r\n }\r\n\r\n // select the label rating and the label state when the values of the input change\r\n // then show the label \r\n \r\n const handleChange = function () {\r\n var $label = $(this).closest('.filter-field').find('label');\r\n var $select = $(this);\r\n var $selectedOption = $select.find('option:selected');\r\n\r\n $label.removeClass('show-for-sr');\r\n $select.removeClass('selected');\r\n\r\n if ($selectedOption.is(':disabled')) {\r\n $label.addClass('show-for-sr');\r\n } else {\r\n $select.addClass('selected');\r\n }\r\n }\r\n\r\n $('.review-listing [name=\"rating\"], .review-listing [name=\"state\"]').on('change',handleChange);\r\n // review filters\r\n $('.review-listing [name=\"state\"]').on('change', function () {\r\n $(\"#review-list\")\r\n .data('resetHtml', true)\r\n .data('state', $(this).val())\r\n .data('page', 1);\r\n loadMore();\r\n scrollUp();\r\n });\r\n \r\n $('.review-listing [name=\"rating\"]').on('change', function () {\r\n var filteredRating = $(this).val();\r\n $('.review-summary .summary-row').each(function () {\r\n let isZero = $(this).find(\".count\").text() == \"0\";\r\n if(!isZero) {\r\n $(this).prop(\"disabled\", false);\r\n }\r\n });\r\n $('.review-summary .summary-row').removeClass('filtered');\r\n if (filteredRating != '')\r\n {\r\n let filteredElm = $('.review-summary .summary-row').eq(-1 * filteredRating);\r\n filteredElm.addClass('filtered');\r\n filteredElm.prop(\"disabled\", true);\r\n }\r\n $(\"#review-list\")\r\n .data('resetHtml', true)\r\n .data('rating', filteredRating)\r\n .data('page', 1);\r\n loadMore();\r\n scrollUp();\r\n });\r\n\r\n // clicking on summary rating rows changes the rating filter to match the clicked rating\r\n $('.review-summary .summary-row').on('click', function () {\r\n var index = $(this).index() + 1;\r\n var $opt = $('.review-listing [name=\"rating\"] option').eq(index);\r\n $('.review-listing [name=\"rating\"]').val($opt.prop('value'))\r\n .trigger('change');\r\n });\r\n\r\n // changes the pages in view depending on screen sizes\r\n // also takes into consideration if filtered\r\n $(window).on('resize', function() {\r\n $(\".review-listing\").each(function() {\r\n let $pageLIs = $(this).find(\".pagination li\");\r\n let totalPages = $pageLIs.filter(\"li[style]:not([style^='display'])\").last().find(\"a\").attr(\"data-page\");\r\n if(totalPages > 8) {\r\n $pageLIs.parent().elidePages(totalPages);\r\n }\r\n });\r\n });\r\n\r\n\r\n if (window.location.hash) {\r\n // there may be anchors in the URL for reviews that haven't been loaded\r\n // handle that here\r\n // TODO: make this work with pagination\r\n if (window.location.hash.startsWith('#review-')) {\r\n if ($(window.location.hash).length) { // review on this page, scroll to it\r\n let headerHeight = 0;\r\n if ($('#header-form').length) {\r\n headerHeight = $('#header-form').outerHeight();\r\n }\r\n\r\n $('html, body').animate({\r\n scrollTop: $(window.location.hash).offset().top - headerHeight - 20\r\n }, 900, 'swing');\r\n }\r\n else { // review not on this page\r\n loadMore(window.location.hash.replace('#review-', ''));\r\n }\r\n }\r\n }\r\n\r\n // too many page numbers? remove some and replace with ellipses\r\n $('.pagination').each(function () {\r\n if ($('li', this).length > 8) {\r\n $(this).elidePages();\r\n }\r\n });\r\n\r\n // go to page\r\n $('#review-pagination .pagination a:not(.ellip)').on('click', function (e) {\r\n e.preventDefault();\r\n\r\n // Removing and Adding selected-page class to make enable/disable on click\r\n $('#review-pagination li a').removeClass('active');\r\n $(this).addClass('active');\r\n\r\n // reset elided page numbers accounting for new active page\r\n if ($('#review-pagination .pagination li').length > 8 &&\r\n !$('#review-pagination .pagination .active').is(':visible')) {\r\n $('#review-pagination .pagination').elidePages();\r\n }\r\n\r\n // Load Requested Page\r\n var requestedPage = $(this).data('page');\r\n $('#review-list').data('resetHtml', true).data('page', requestedPage);\r\n //Load more for the current page\r\n loadMore();\r\n scrollUp();\r\n });\r\n\r\n //Prev and Next Button\r\n $('#review-pagination .next').click(function () {\r\n var $pagination = $(this).closest('.pagination');\r\n\r\n // get current tab\r\n var currentTab = $(\".active\", $pagination);\r\n // get the next tab, if there is one\r\n var newTab = currentTab.parent().next().find(\"a\");\r\n // at the end, so go to the first one\r\n if (newTab.length === 0) {\r\n newTab = $(\"a\", $pagination).first();\r\n }\r\n\r\n newTab.trigger('click');\r\n });\r\n\r\n $('#review-pagination .previous').click(function () {\r\n var $pagination = $(this).closest('.pagination');\r\n\r\n // get current tab\r\n var currentTab = $(\".active\", $pagination);\r\n // get the previous tab, if there is one\r\n var newTab = currentTab.parent().prev().find(\"a\");\r\n // at the end, so go to the first one\r\n if (newTab.length === 0) {\r\n newTab = $(\"a\", $pagination).last();\r\n }\r\n // if the previous tab is an ellipse clicking it will do nothing so get the next previous elm\r\n // which is a numbered tab\r\n if(newTab.hasClass(\"ellip\")) {\r\n newTab = newTab.parent().prev().find(\"a\");\r\n }\r\n newTab.trigger('click');\r\n });\r\n\r\n //Jump to page\r\n window.reviewJumper = $('#review-pagination .jump-to-page').detach();\r\n $('#review-pagination .pagination').on('click', '.el-li a', function (e) {\r\n e.stopPropagation();\r\n $(this).after(window.reviewJumper);\r\n });\r\n // close jumper when clicking outside of it\r\n $(document).on('click', function (e) {\r\n var $target = $(e.target);\r\n if (!$target.closest('.jump-to-page').length &&\r\n window.reviewJumper.is(\":visible\")) {\r\n window.reviewJumper.detach();\r\n }\r\n });\r\n\r\n $('.pagination').on('change', '.jump-to-page select', function () {\r\n var selectedValue = $(this).val();\r\n var $pagination = $(this).closest('.pagination');\r\n\r\n $('a[data-page=\"' + selectedValue + '\"]', $pagination).trigger('click');\r\n window.reviewJumper.detach();\r\n });\r\n\r\n});\r\n\r\nfunction updateTotalRatingAvg($reviewListingWidget = null) {\r\n if($reviewListingWidget) {\r\n let reviewListingAvg = convertNumberToWord($reviewListingWidget.attr(\"data-ratingAvg\"));\r\n if(!reviewListingAvg) {\r\n console.error(\"null average value\");\r\n return;\r\n }\r\n // show current rating avg\r\n $reviewListingWidget.find(\".averageRating\").attr(\"src\", `/images/star-${reviewListingAvg}.png`);\r\n }\r\n \r\n}\r\nfunction convertNumberToWord(number = null) {\r\n if(!number) {\r\n return null;\r\n }\r\n let wholeNumber = Math.trunc(number);\r\n let decimal = number - wholeNumber;\r\n let decimalWord = \"\";\r\n if(decimal != 0) {\r\n decimalWord = \"-half\";\r\n }\r\n let wholeNumberWord = wholeNumber == 5 ? \"five\" : wholeNumber == 4 ? \"four\" : \r\n wholeNumber == 3 ? \"three\" : wholeNumber == 2 ? \"two\" : wholeNumber == 1 ? \"one\" : null;\r\n return `${wholeNumberWord}${decimalWord}`;\r\n}\r\nfunction loadMore(scrollToReview = null) {\r\n let $list = $(\"#review-list\");\r\n let parentElement = $list.closest(\".review-listing\");\r\n let totalCountElm = parentElement.find(\"span.countTotal\");\r\n let currLocationElm = parentElement.find(\"span.location\");\r\n let newLocation = parentElement.find(\"[name='state']\").val();\r\n let inElm = parentElement.find(\"span.in\");\r\n let page_num = parseInt($list.data(\"page\"));\r\n let api_url = \"/api/reviews/?page=\" + page_num;\r\n\r\n if (scrollToReview != null) {\r\n api_url += \"&showReview=\" + scrollToReview;\r\n } else {\r\n if ($list.data('state') != \"\")\r\n api_url += \"&state=\" + $list.data('state');\r\n\r\n if ($list.data('rating') != \"\")\r\n api_url += \"&rating=\" + $list.data('rating');\r\n\r\n if ($list.data('market') != \"\")\r\n api_url += \"&market=\" + $list.data('market');\r\n }\r\n\r\n // for franchisee / FZLP\r\n if ($list.data('satellitecode')) {\r\n api_url += \"&satelliteCode=\" + $list.data('satellitecode');\r\n }\r\n\r\n let verifiedSellerBadge = '\"Verified';\r\n if ($('.reviewList--hva').length) {\r\n verifiedSellerBadge = '\"Verified';\r\n }\r\n\r\n $.get(api_url, function (response) {\r\n if ($list.data('resetHtml')) {\r\n $list.html('').data('resetHtml', false);\r\n }\r\n\r\n // dynamically set the total count and location\r\n if(response.totalCount) {\r\n totalCountElm.html(`${Number(response.totalCount).toLocaleString('en-US')}`);\r\n }\r\n \r\n if(newLocation !== currLocationElm.text()) {\r\n if(newLocation === \"\" || newLocation == null) {\r\n inElm.addClass(\"hide\");\r\n newLocation = \"Nationwide\";\r\n } \r\n else {\r\n inElm.removeClass(\"hide\");\r\n }\r\n currLocationElm.html(newLocation);\r\n }\r\n // get the count for each rating and set the counts\r\n if (response.ratingCounts) {\r\n $('.review-summary button.summary-row').each(function(index) {\r\n let ratingCount = response.ratingCounts[4 - index] || 0;\r\n let percentage = 0;\r\n if(response.totalCount && response.totalCount != 0) {\r\n percentage = (ratingCount / response.totalCount) * 100;\r\n }\r\n $(this).find(\".inner\").width(`${percentage}%`);\r\n // if not disabled and the count is 0 then disable it\r\n if(ratingCount == 0) {\r\n if(!$(this).prop('disabled')) {\r\n $(this).prop('disabled', true);\r\n }\r\n }\r\n else if(!$(this).hasClass('filtered')) {\r\n if($(this).prop('disabled')) {\r\n $(this).prop('disabled', false);\r\n } \r\n }\r\n $(this).find('.count').text(`${Number(ratingCount).toLocaleString('en-US')}`);\r\n });\r\n }\r\n if(response.ratingAverage) {\r\n parentElement.attr(\"data-ratingAvg\", response.ratingAverage);\r\n updateTotalRatingAvg(parentElement);\r\n }\r\n if (response.reviews.length > 0) {\r\n $.each(response.reviews, function () {\r\n let locStr = '';\r\n if (this.city.length || this.state.length) {\r\n locStr = '(' + (this.city.length ? this.city + ', ' : '') + this.state + ')';\r\n }\r\n\r\n $list.append(\r\n `
  • \r\n
    ${verifiedSellerBadge}
    \r\n
    ${this.question2Answer}
    \r\n
    ${this.firstName} ${this.lastName.charAt(0)}. ${locStr} • (${getFormattedDate(new Date(this.datePublished))})
    \r\n
  • `\r\n );\r\n\r\n // if the quote is empty, then we don't need to show the quote icon\r\n if (this.question2Answer.length <= 1) {\r\n $('li#review-' + this.reviewID).addClass('no-quote');\r\n }\r\n });\r\n if (!$('.reviewList__verifiedSellerPanel').length) {\r\n let $listItems = $list.find('li');\r\n let verifiedSellerPanel = `\r\n
  • \r\n

    ${verifiedSellerBadge}

    \r\n ${window.verifiedSellerPanelContent}\r\n
  • `;\r\n if ($listItems.length >= 2) {\r\n $listItems.eq(1).after(verifiedSellerPanel);\r\n } else {\r\n $list.append(verifiedSellerPanel);\r\n }\r\n }\r\n if (scrollToReview != null) {\r\n // smooth scroll to review location\r\n let headerHeight = 0;\r\n if ($('#header-form').length) {\r\n headerHeight = $('#header-form').outerHeight();\r\n }\r\n\r\n $('html, body').animate({\r\n scrollTop: $('#review-' + scrollToReview).offset().top - headerHeight - 20\r\n }, 900, 'swing');\r\n }\r\n\r\n // reset 'no reviews' message and hidden pagination, if necessary\r\n $('.reviewList__msg').remove();\r\n $('#review-pagination').removeClass('disabled');\r\n reInitPagination(page_num, response.pageCount);\r\n }\r\n else if (page_num === 1) {\r\n $('.reviewList__msg').remove();\r\n let starRating = $('.review-listing [name=\"rating\"]').val();\r\n if(starRating) {\r\n $list.before(`

    There are no ${starRating} star reviews. Please filter by a different rating.

    `);\r\n } else {\r\n $list.before(`

    There are no reviews. Please filter by a different state.

    `);\r\n }\r\n $('#review-pagination').addClass('hide');\r\n }\r\n // add verifiedSellerPanel even with 0 reviews only on the reviews widget \r\n // that isn't present on the franchisee page - check if there's a \r\n // class only present on the reviews widget not on the franchisee page\r\n if ($(\"#review-list\").attr(\"data-widget\") != null && response.reviews.length == 0 && !$('.reviewList__verifiedSellerPanel').length) {\r\n let verifiedSellerPanel = `\r\n
  • \r\n

    ${verifiedSellerBadge}

    \r\n ${window.verifiedSellerPanelContent}\r\n
  • `;\r\n $list.append(verifiedSellerPanel);\r\n }\r\n });\r\n}\r\n\r\nfunction getFormattedDate(date) {\r\n let year = date.getFullYear();\r\n let month = (1 + date.getMonth()).toString().padStart(2, '0');\r\n let day = date.getDate().toString().padStart(2, '0');\r\n\r\n return month + '/' + day + '/' + year;\r\n}\r\n\r\nfunction reInitPagination(selectedPage, totalPages) {\r\n if (typeof (selectedPage) != 'undefined') {\r\n $('#review-pagination .pagination a').removeClass('active');\r\n $('#review-pagination .pagination a[data-page=\"' + selectedPage + '\"]').addClass('active');\r\n }\r\n\r\n\r\n // hide/show pagination based on how many pages \r\n // or whether user is on first or last active page\r\n if (selectedPage == totalPages) {\r\n $('.next').addClass('disabled').prop(\"disabled\", true);\r\n } else {\r\n $('.next').removeClass('disabled').removeAttr(\"disabled\");\r\n }\r\n\r\n if (selectedPage == 1) {\r\n $('.previous').addClass('disabled').prop(\"disabled\", true);\r\n } else {\r\n $('.previous').removeClass('disabled').removeAttr(\"disabled\");\r\n }\r\n \r\n if (totalPages == 1) {\r\n $('#review-pagination').addClass('hide');\r\n } else {\r\n $('#review-pagination').removeClass('hide');\r\n }\r\n\r\n // too many page numbers? remove some and replace with ellipses\r\n $('#review-pagination .pagination').each(function () {\r\n if ($('li', this).length > 8) {\r\n if (typeof (totalPages) != 'undefined')\r\n $(this).elidePages(totalPages);\r\n else\r\n $(this).elidePages();\r\n }\r\n });\r\n}\r\n\r\n$.fn.elidePages = function (totalPages) {\r\n $('.el-li', this).remove();\r\n var activePageNum = parseInt($('.active', this).data('page'));\r\n var $pageLIs = $('li', this).slice(1, -1);\r\n\r\n $pageLIs.hide();\r\n let ellipsisHtml = `\r\n
  • \r\n \r\n \"open\r\n \r\n
  • `;\r\n\r\n // hide page numbers that may not be used because of filter states\r\n if (typeof (totalPages) != 'undefined')\r\n {\r\n $pageLIs = $pageLIs.slice(0, totalPages);\r\n if(totalPages < 8) {\r\n $pageLIs.show();\r\n return;\r\n }\r\n }\r\n\r\n let isXXLarge = window.Foundation.mediaQuery.MediaQuery.is(\"xxlarge\");\r\n let isXLarge = window.Foundation.mediaQuery.MediaQuery.is(\"xlarge\");\r\n let isDesktop = window.Foundation.mediaQuery.MediaQuery.is(\"desktop\");\r\n let isLarge = window.Foundation.mediaQuery.MediaQuery.is(\"large\");\r\n let isMobile = window.Foundation.mediaQuery.MediaQuery.is(\"medium\");\r\n\r\n let leftHandRange = 0;\r\n let rightHandRange = 0;\r\n\r\n // the following values are made with the assumption that the active number is \r\n // on the left hand-side\r\n if(isXXLarge) {\r\n rightHandRange = 4;\r\n leftHandRange = 4;\r\n }\r\n else if(isXLarge){\r\n rightHandRange = 3;\r\n } \r\n else if(isDesktop) {\r\n rightHandRange = 2;\r\n } else {\r\n rightHandRange = 1;\r\n }\r\n \r\n if(isXLarge || isDesktop){\r\n leftHandRange = 3;\r\n } \r\n else if(isLarge){\r\n leftHandRange = 3;\r\n }\r\n else if(isMobile) {\r\n leftHandRange = 2;\r\n } \r\n\r\n // if the active page number is more on the right side than the left side\r\n // swap left and right ranges\r\n if(activePageNum >= $pageLIs.length - leftHandRange) {\r\n if(isLarge || isDesktop || isMobile) {\r\n // swap the left and right hand ranges\r\n let tmp = leftHandRange;\r\n leftHandRange = rightHandRange;\r\n rightHandRange = tmp;\r\n }\r\n }\r\n if(activePageNum <= leftHandRange || activePageNum > $pageLIs.length - rightHandRange) {\r\n $pageLIs.slice(0, leftHandRange).show();\r\n $pageLIs.slice(-1 * rightHandRange).show();\r\n $pageLIs.eq(leftHandRange).after(ellipsisHtml);\r\n }\r\n else { // otherwise two ellipses surrounding the selected page and two on either side\r\n $pageLIs.eq(0).show();\r\n $pageLIs.eq(-1).show();\r\n // check all screensizes are appropriately slice the middle\r\n if (isXXLarge) {\r\n $pageLIs.slice(activePageNum - 2, activePageNum + 3).show();\r\n $pageLIs.eq(activePageNum - 3).after(ellipsisHtml);\r\n $pageLIs.eq(activePageNum + 2).after(ellipsisHtml);\r\n } else if (isXLarge || isDesktop) {\r\n $pageLIs.slice(activePageNum - 1, activePageNum + 2).show();\r\n $pageLIs.eq(activePageNum - 2).after(ellipsisHtml);\r\n $pageLIs.eq(activePageNum + 1).after(ellipsisHtml);\r\n } else if (isLarge) {\r\n $pageLIs.slice(activePageNum - 1, activePageNum + 2).show();\r\n $pageLIs.eq(activePageNum - 2).after(ellipsisHtml);\r\n $pageLIs.eq(activePageNum + 1).after(ellipsisHtml);\r\n } else {\r\n $pageLIs.slice(activePageNum - 1, activePageNum).show();\r\n $pageLIs.eq(activePageNum - 2).after(ellipsisHtml);\r\n $pageLIs.eq(activePageNum).after(ellipsisHtml);\r\n }\r\n\r\n }\r\n};","import stickybits from 'stickybits'\r\nimport deBounce from 'lodash.debounce'\r\n\r\n// this script supports both floating and sticky forms\r\n$(document).ready(function () {\r\n\r\n if ($('.floating-form').length)\r\n setupFloatingForm();\r\n\r\n if ($('#vertical-form').length) {\r\n $('#vertical-form')\r\n .closest('.columns').addClass('v-form-wrapper')\r\n .siblings('.columns').addClass('vertical-form-wrapper')\r\n .closest('.main-with-sidebar').addClass('with-sticky-form');\r\n\r\n // only affects hva\r\n $('#vertical-form').closest('.xlarge-push-8').removeClass('xlarge-push-8').addClass('large-push-8')\r\n .siblings('.xlarge-pull-4').removeClass('xlarge-pull-4').addClass('large-pull-4');\r\n\r\n var offset = 20;\r\n if ($('#header-form').length)\r\n offset = 120;\r\n\r\n stickybits('#vertical-form', { stickyBitStickyOffset: offset });\r\n }\r\n});\r\n\r\nfunction setupFloatingForm() {\r\n $('.floating-form').closest('.columns').addClass('v-form-wrapper').siblings('.columns').addClass('vertical-form-wrapper');\r\n\r\n $('#page').addClass('with-floating-form');\r\n\r\n $(window).on('resize', function () {\r\n let hero = $('.hero');\r\n if (hero.length) {\r\n if (Foundation.mediaQuery.MediaQuery.atLeast('xlarge')) {\r\n let heroHeight = hero.height();\r\n $('.floating-form').css('top', '-' + heroHeight + 'px');\r\n } else {\r\n $('.floating-form').css('top', '');\r\n }\r\n }\r\n }).trigger('resize');\r\n}\r\n\r\n$(document).ready(function () {\r\n // add modifier class to elem based on its width\r\n // in the future, we can do this with container queries, but they aren't working with our current sass setup\r\n var $verticalLeadFormV2 = $('.verticalLeadFormV2');\r\n var wideMinWidth = 400;\r\n\r\n if ($verticalLeadFormV2.length === 0) {\r\n return;\r\n }\r\n\r\n function updateVerticalLeadFormV2() {\r\n if ($verticalLeadFormV2.width() >= wideMinWidth) {\r\n $verticalLeadFormV2.addClass('verticalLeadFormV2--wide');\r\n } else {\r\n $verticalLeadFormV2.removeClass('verticalLeadFormV2--wide');\r\n }\r\n\r\n // set tabindex for input and select elements after reorder\r\n var tabindex = 1;\r\n $('.verticalLeadFormV2__fieldGroupContainer').children().sort(function (a, b) {\r\n return ($(a).css('order') || 0) - ($(b).css('order') || 0);\r\n }).each(function () {\r\n $(this).find('input, select').each(function () {\r\n $(this).attr('tabindex', tabindex++);\r\n });\r\n });\r\n }\r\n\r\n updateVerticalLeadFormV2();\r\n\r\n $(window).on('resize', deBounce(function () {\r\n updateVerticalLeadFormV2();\r\n }, 50));\r\n});\r\n","/**\n stickybits - Stickybits is a lightweight alternative to `position: sticky` polyfills\n @version v3.7.9\n @link https://github.com/yowainwright/stickybits#readme\n @author Jeff Wainwright (https://jeffry.in)\n @license MIT\n**/\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\n/*\n STICKYBITS πŸ’‰\n --------\n > a lightweight alternative to `position: sticky` polyfills 🍬\n --------\n - each method is documented above it our view the readme\n - Stickybits does not manage polymorphic functionality (position like properties)\n * polymorphic functionality: (in the context of describing Stickybits)\n means making things like `position: sticky` be loosely supported with position fixed.\n It also means that features like `useStickyClasses` takes on styles like `position: fixed`.\n --------\n defaults πŸ”Œ\n --------\n - version = `package.json` version\n - userAgent = viewer browser agent\n - target = DOM element selector\n - noStyles = boolean\n - offset = number\n - parentClass = 'string'\n - scrollEl = window || DOM element selector || DOM element\n - stickyClass = 'string'\n - stuckClass = 'string'\n - useStickyClasses = boolean\n - useFixed = boolean\n - useGetBoundingClientRect = boolean\n - verticalPosition = 'string'\n - applyStyle = function\n --------\n propsπŸ”Œ\n --------\n - p = props {object}\n --------\n instance note\n --------\n - stickybits parent methods return this\n - stickybits instance methods return an instance item\n --------\n nomenclature\n --------\n - target => el => e\n - props => o || p\n - instance => item => it\n --------\n methods\n --------\n - .definePosition = defines sticky or fixed\n - .addInstance = an array of objects for each Stickybits Target\n - .getClosestParent = gets the parent for non-window scroll\n - .getTopPosition = gets the element top pixel position from the viewport\n - .computeScrollOffsets = computes scroll position\n - .toggleClasses = older browser toggler\n - .manageState = manages sticky state\n - .removeInstance = removes an instance\n - .cleanup = removes all Stickybits instances and cleans up dom from stickybits\n*/\nvar Stickybits = /*#__PURE__*/function () {\n function Stickybits(target, obj) {\n var _this = this;\n\n var o = typeof obj !== 'undefined' ? obj : {};\n this.version = '3.7.9';\n this.userAgent = window.navigator.userAgent || 'no `userAgent` provided by the browser';\n this.props = {\n customStickyChangeNumber: o.customStickyChangeNumber || null,\n noStyles: o.noStyles || false,\n stickyBitStickyOffset: o.stickyBitStickyOffset || 0,\n parentClass: o.parentClass || 'js-stickybit-parent',\n scrollEl: typeof o.scrollEl === 'string' ? document.querySelector(o.scrollEl) : o.scrollEl || window,\n stickyClass: o.stickyClass || 'js-is-sticky',\n stuckClass: o.stuckClass || 'js-is-stuck',\n stickyChangeClass: o.stickyChangeClass || 'js-is-sticky--change',\n useStickyClasses: o.useStickyClasses || false,\n useFixed: o.useFixed || false,\n useGetBoundingClientRect: o.useGetBoundingClientRect || false,\n verticalPosition: o.verticalPosition || 'top',\n applyStyle: o.applyStyle || function (item, style) {\n return _this.applyStyle(item, style);\n }\n };\n /*\n define positionVal after the setting of props, because definePosition looks at the props.useFixed\n ----\n - uses a computed (`.definePosition()`)\n - defined the position\n */\n\n this.props.positionVal = this.definePosition() || 'fixed';\n this.instances = [];\n var _this$props = this.props,\n positionVal = _this$props.positionVal,\n verticalPosition = _this$props.verticalPosition,\n noStyles = _this$props.noStyles,\n stickyBitStickyOffset = _this$props.stickyBitStickyOffset;\n var verticalPositionStyle = verticalPosition === 'top' && !noStyles ? stickyBitStickyOffset + \"px\" : '';\n var positionStyle = positionVal !== 'fixed' ? positionVal : '';\n this.els = typeof target === 'string' ? document.querySelectorAll(target) : target;\n if (!('length' in this.els)) this.els = [this.els];\n\n for (var i = 0; i < this.els.length; i++) {\n var _styles;\n\n var el = this.els[i];\n var instance = this.addInstance(el, this.props); // set vertical position\n\n this.props.applyStyle({\n styles: (_styles = {}, _styles[verticalPosition] = verticalPositionStyle, _styles.position = positionStyle, _styles),\n classes: {}\n }, instance);\n this.manageState(instance); // instances are an array of objects\n\n this.instances.push(instance);\n }\n }\n /*\n setStickyPosition βœ”οΈ\n --------\n β€” most basic thing stickybits does\n => checks to see if position sticky is supported\n => defined the position to be used\n => stickybits works accordingly\n */\n\n\n var _proto = Stickybits.prototype;\n\n _proto.definePosition = function definePosition() {\n var stickyProp;\n\n if (this.props.useFixed) {\n stickyProp = 'fixed';\n } else {\n var prefix = ['', '-o-', '-webkit-', '-moz-', '-ms-'];\n var test = document.head.style;\n\n for (var i = 0; i < prefix.length; i += 1) {\n test.position = prefix[i] + \"sticky\";\n }\n\n stickyProp = test.position ? test.position : 'fixed';\n test.position = '';\n }\n\n return stickyProp;\n }\n /*\n addInstance βœ”οΈ\n --------\n β€” manages instances of items\n - takes in an el and props\n - returns an item object\n ---\n - target = el\n - o = {object} = props\n - scrollEl = 'string' | object\n - verticalPosition = number\n - off = boolean\n - parentClass = 'string'\n - stickyClass = 'string'\n - stuckClass = 'string'\n ---\n - defined later\n - parent = dom element\n - state = 'string'\n - offset = number\n - stickyStart = number\n - stickyStop = number\n - returns an instance object\n */\n ;\n\n _proto.addInstance = function addInstance(el, props) {\n var _this2 = this;\n\n var item = {\n el: el,\n parent: el.parentNode,\n props: props\n };\n\n if (props.positionVal === 'fixed' || props.useStickyClasses) {\n this.isWin = this.props.scrollEl === window;\n var se = this.isWin ? window : this.getClosestParent(item.el, item.props.scrollEl);\n this.computeScrollOffsets(item);\n this.toggleClasses(item.parent, '', props.parentClass);\n item.state = 'default';\n item.stateChange = 'default';\n\n item.stateContainer = function () {\n return _this2.manageState(item);\n };\n\n se.addEventListener('scroll', item.stateContainer);\n }\n\n return item;\n }\n /*\n --------\n getParent πŸ‘¨β€\n --------\n - a helper function that gets the target element's parent selected el\n - only used for non `window` scroll elements\n - supports older browsers\n */\n ;\n\n _proto.getClosestParent = function getClosestParent(el, match) {\n // p = parent element\n var p = match;\n var e = el;\n if (e.parentElement === p) return p; // traverse up the dom tree until we get to the parent\n\n while (e.parentElement !== p) {\n e = e.parentElement;\n } // return parent element\n\n\n return p;\n }\n /*\n --------\n getTopPosition\n --------\n - a helper function that gets the topPosition of a Stickybit element\n - from the top level of the DOM\n */\n ;\n\n _proto.getTopPosition = function getTopPosition(el) {\n if (this.props.useGetBoundingClientRect) {\n return el.getBoundingClientRect().top + (this.props.scrollEl.pageYOffset || document.documentElement.scrollTop);\n }\n\n var topPosition = 0;\n\n do {\n topPosition = el.offsetTop + topPosition;\n } while (el = el.offsetParent);\n\n return topPosition;\n }\n /*\n computeScrollOffsets πŸ“Š\n ---\n computeScrollOffsets for Stickybits\n - defines\n - offset\n - start\n - stop\n */\n ;\n\n _proto.computeScrollOffsets = function computeScrollOffsets(item) {\n var it = item;\n var p = it.props;\n var el = it.el;\n var parent = it.parent;\n var isCustom = !this.isWin && p.positionVal === 'fixed';\n var isTop = p.verticalPosition !== 'bottom';\n var scrollElOffset = isCustom ? this.getTopPosition(p.scrollEl) : 0;\n var stickyStart = isCustom ? this.getTopPosition(parent) - scrollElOffset : this.getTopPosition(parent);\n var stickyChangeOffset = p.customStickyChangeNumber !== null ? p.customStickyChangeNumber : el.offsetHeight;\n var parentBottom = stickyStart + parent.offsetHeight;\n it.offset = !isCustom ? scrollElOffset + p.stickyBitStickyOffset : 0;\n it.stickyStart = isTop ? stickyStart - it.offset : 0;\n it.stickyChange = it.stickyStart + stickyChangeOffset;\n it.stickyStop = isTop ? parentBottom - (el.offsetHeight + it.offset) : parentBottom - window.innerHeight;\n }\n /*\n toggleClasses βš–οΈ\n ---\n toggles classes (for older browser support)\n r = removed class\n a = added class\n */\n ;\n\n _proto.toggleClasses = function toggleClasses(el, r, a) {\n var e = el;\n var cArray = e.className.split(' ');\n if (a && cArray.indexOf(a) === -1) cArray.push(a);\n var rItem = cArray.indexOf(r);\n if (rItem !== -1) cArray.splice(rItem, 1);\n e.className = cArray.join(' ');\n }\n /*\n manageState πŸ“\n ---\n - defines the state\n - normal\n - sticky\n - stuck\n */\n ;\n\n _proto.manageState = function manageState(item) {\n var _this3 = this;\n\n // cache object\n var it = item;\n var p = it.props;\n var state = it.state;\n var stateChange = it.stateChange;\n var start = it.stickyStart;\n var change = it.stickyChange;\n var stop = it.stickyStop; // cache props\n\n var pv = p.positionVal;\n var se = p.scrollEl;\n var sticky = p.stickyClass;\n var stickyChange = p.stickyChangeClass;\n var stuck = p.stuckClass;\n var vp = p.verticalPosition;\n var isTop = vp !== 'bottom';\n var aS = p.applyStyle;\n var ns = p.noStyles;\n /*\n requestAnimationFrame\n ---\n - use rAF\n - or stub rAF\n */\n\n var rAFStub = function rAFDummy(f) {\n f();\n };\n\n var rAF = !this.isWin ? rAFStub : window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || rAFStub;\n /*\n define scroll vars\n ---\n - scroll\n - notSticky\n - isSticky\n - isStuck\n */\n\n var scroll = this.isWin ? window.scrollY || window.pageYOffset : se.scrollTop;\n var notSticky = scroll > start && scroll < stop && (state === 'default' || state === 'stuck');\n var isSticky = isTop && scroll <= start && (state === 'sticky' || state === 'stuck');\n var isStuck = scroll >= stop && state === 'sticky';\n /*\n Unnamed arrow functions within this block\n ---\n - help wanted or discussion\n - view test.stickybits.js\n - `stickybits .manageState `position: fixed` interface` for more awareness πŸ‘€\n */\n\n if (notSticky) {\n it.state = 'sticky';\n } else if (isSticky) {\n it.state = 'default';\n } else if (isStuck) {\n it.state = 'stuck';\n }\n\n var isStickyChange = scroll >= change && scroll <= stop;\n var isNotStickyChange = scroll < change / 2 || scroll > stop;\n\n if (isNotStickyChange) {\n it.stateChange = 'default';\n } else if (isStickyChange) {\n it.stateChange = 'sticky';\n } // Only apply new styles if the state has changed\n\n\n if (state === it.state && stateChange === it.stateChange) return;\n rAF(function () {\n var _styles2, _classes, _styles3, _extends2, _classes2, _style$classes;\n\n var stateStyles = {\n sticky: {\n styles: (_styles2 = {\n position: pv,\n top: '',\n bottom: ''\n }, _styles2[vp] = p.stickyBitStickyOffset + \"px\", _styles2),\n classes: (_classes = {}, _classes[sticky] = true, _classes)\n },\n default: {\n styles: (_styles3 = {}, _styles3[vp] = '', _styles3),\n classes: {}\n },\n stuck: {\n styles: _extends((_extends2 = {}, _extends2[vp] = '', _extends2), pv === 'fixed' && !ns || !_this3.isWin ? {\n position: 'absolute',\n top: '',\n bottom: '0'\n } : {}),\n classes: (_classes2 = {}, _classes2[stuck] = true, _classes2)\n }\n };\n\n if (pv === 'fixed') {\n stateStyles.default.styles.position = '';\n }\n\n var style = stateStyles[it.state];\n style.classes = (_style$classes = {}, _style$classes[stuck] = !!style.classes[stuck], _style$classes[sticky] = !!style.classes[sticky], _style$classes[stickyChange] = isStickyChange, _style$classes);\n aS(style, item);\n });\n }\n /*\n applyStyle\n ---\n - apply the given styles and classes to the element\n */\n ;\n\n _proto.applyStyle = function applyStyle(_ref, item) {\n var styles = _ref.styles,\n classes = _ref.classes;\n // cache object\n var it = item;\n var e = it.el;\n var p = it.props;\n var stl = e.style; // cache props\n\n var ns = p.noStyles;\n var cArray = e.className.split(' '); // Disable due to bug with old versions of eslint-scope and for ... in\n // https://github.com/eslint/eslint/issues/12117\n // eslint-disable-next-line no-unused-vars\n\n for (var cls in classes) {\n var addClass = classes[cls];\n\n if (addClass) {\n if (cArray.indexOf(cls) === -1) cArray.push(cls);\n } else {\n var idx = cArray.indexOf(cls);\n if (idx !== -1) cArray.splice(idx, 1);\n }\n }\n\n e.className = cArray.join(' ');\n\n if (styles['position']) {\n stl['position'] = styles['position'];\n }\n\n if (ns) return; // eslint-disable-next-line no-unused-vars\n\n for (var key in styles) {\n stl[key] = styles[key];\n }\n };\n\n _proto.update = function update(updatedProps) {\n var _this4 = this;\n\n if (updatedProps === void 0) {\n updatedProps = null;\n }\n\n this.instances.forEach(function (instance) {\n _this4.computeScrollOffsets(instance);\n\n if (updatedProps) {\n // eslint-disable-next-line no-unused-vars\n for (var updatedProp in updatedProps) {\n instance.props[updatedProp] = updatedProps[updatedProp];\n }\n }\n });\n return this;\n }\n /*\n removes an instance πŸ‘‹\n --------\n - cleanup instance\n */\n ;\n\n _proto.removeInstance = function removeInstance(instance) {\n var _styles4, _classes3;\n\n var e = instance.el;\n var p = instance.props;\n this.applyStyle({\n styles: (_styles4 = {\n position: ''\n }, _styles4[p.verticalPosition] = '', _styles4),\n classes: (_classes3 = {}, _classes3[p.stickyClass] = '', _classes3[p.stuckClass] = '', _classes3)\n }, instance);\n this.toggleClasses(e.parentNode, p.parentClass);\n }\n /*\n cleanup πŸ›\n --------\n - cleans up each instance\n - clears instance\n */\n ;\n\n _proto.cleanup = function cleanup() {\n for (var i = 0; i < this.instances.length; i += 1) {\n var instance = this.instances[i];\n\n if (instance.stateContainer) {\n instance.props.scrollEl.removeEventListener('scroll', instance.stateContainer);\n }\n\n this.removeInstance(instance);\n }\n\n this.manageState = false;\n this.instances = [];\n };\n\n return Stickybits;\n}();\n/*\n export\n --------\n exports StickBits to be used 🏁\n*/\n\n\nfunction stickybits(target, o) {\n return new Stickybits(target, o);\n}\n\nexport default stickybits;\n","import Flickity from 'flickity'\r\n\r\njQuery(document).ready(function ($) {\r\n\tif ($(\".wrongs-slider\").length) {\r\n\t\t$(\".wrongs-slider\").each(function () {\r\n\t\t\tif ($(this).find(\".slide\").length > 1) {\r\n\r\n\t\t\t\tlet maxHeight = 0;\r\n\t\t\t\t$(this).find(\".slide\").each(function () {\r\n\t\t\t\t\tvar slideHeight = $('.inner', this).height();\r\n\t\t\t\t\tmaxHeight = Math.max(maxHeight, slideHeight);\r\n\t\t\t\t})\r\n\t\t\t\t$(this).find(\".slide\").height(maxHeight);\r\n\r\n\t\t\t\tvar $slider = $(this);\r\n\r\n\t\t\t\tlet flkty = new Flickity(this, {\r\n\t\t\t\t\twrapAround: true,\r\n\t\t\t\t\tpageDots: true,\r\n\t\t\t\t\tcellAlign: \"center\",\r\n\t\t\t\t\taccessibility: false,\r\n\t\t\t\t\tdraggable: false,\r\n\t\t\t\t\tfreeScroll: true,\r\n\t\t\t\t\tcontain: true,\r\n\t\t\t\t\twrapAround: true,\r\n\t\t\t\t\tresize: true\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// animate other wrongs after changing slides\r\n\t\t\t\tflkty.on('settle', function (index) {\r\n\t\t\t\t\tvar $img = $('.slide', $slider).eq(index).find('img');\r\n\t\t\t\t\t$img.attr('src', $img.data('animated-src'));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// animate first wrong we right when scrolled to\r\n\t\t// this assumes only one of these sliders per page\r\n\t\tfunction animateFirstSlide() {\r\n\t\t\tvar $triggerEl = $('.wrongs-slider .is-selected img');\r\n\t\t\tvar hT = $triggerEl.offset().top,\r\n\t\t\t\thH = $triggerEl.outerHeight(),\r\n\t\t\t\twH = $(window).height(),\r\n\t\t\t\twS = $(this).scrollTop();\r\n\t\t\tif (wS > (hT + hH - wH)) {\r\n\t\t\t\t$triggerEl.attr('src', $triggerEl.data('animated-src'));\r\n\t\t\t\t$(window).off('scroll', animateFirstSlide); // remove event handler after doing this once\r\n\t\t\t}\r\n\t\t}\r\n\t\t$(window).on('scroll', animateFirstSlide);\r\n\t}\r\n});","import Flickity from 'flickity'\r\n\r\njQuery(document).ready(function ($) {\r\n\t$(\".photo-carousel-slider\").each(function () {\r\n\t\tif ($(this).find(\".slide\").length > 1) {\r\n\t\t\tlet flkty = new Flickity(this, {\r\n\t\t\t\twrapAround: true,\r\n\t\t\t\tpageDots: true,\r\n\t\t\t\tcellAlign: \"center\",\r\n\t\t\t\taccessibility: false,\r\n\t\t\t\tdraggable: false\r\n\t\t\t});\r\n\r\n\t\t\tflkty.on(\"select\", function (index) {\r\n\t\t\t\tlet slide = $(\".photo-carousel-slider .slide\")\r\n\t\t\t\t\t.eq(index)\r\n\t\t\t\t\t.attr(\"data-slide\");\r\n\r\n\t\t\t\t$(\".photo-carousel-background.active\").removeClass(\"active\");\r\n\t\t\t\t$('.photo-carousel-background[data-slide=\"' + slide + '\"]').addClass(\r\n\t\t\t\t\t\"active\"\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n});","import Flickity from 'flickity'\r\n\r\n$(function ($) {\r\n\t$(\".unique-selling-propositions-slider\").each(function () {\r\n\t\tif ($(this).find(\".slide\").length > 1) {\r\n\t\t\tlet flkty = new Flickity(this, {\r\n\t\t\t\twrapAround: true,\r\n\t\t\t\tpageDots: true,\r\n\t\t\t\tcellAlign: \"center\",\r\n\t\t\t\taccessibility: false,\r\n\t\t\t\tdraggable: false\r\n\t\t\t});\r\n\r\n\t\t\tflkty.on(\"select\", function (index) {\r\n\t\t\t\tlet slide = $(\".unique-selling-propositions-slider .slide\")\r\n\t\t\t\t\t.eq(index)\r\n\t\t\t\t\t.attr(\"data-slide\");\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n});","import deBounce from 'lodash.debounce'\r\n\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n const newsLogosElements = document.querySelectorAll('.news-logos');\r\n if (!newsLogosElements.length) return;\r\n\r\n function checkAndApplyAnimation() {\r\n newsLogosElements.forEach((newsLogos, index) => {\r\n const wrapper = newsLogos.querySelector('.news-logos__wrapper');\r\n const logosContainer = newsLogos.querySelector('.news-logos__logos-container');\r\n\r\n if (wrapper && logosContainer) {\r\n const containerWidth = logosContainer.scrollWidth;\r\n const parentWidth = newsLogos.clientWidth - 60; // subtract extra for side gutter\r\n\r\n if (containerWidth > parentWidth) {\r\n wrapper.classList.add('ticker-animation');\r\n } else {\r\n wrapper.classList.remove('ticker-animation');\r\n }\r\n }\r\n });\r\n }\r\n\r\n const debouncedCheck = deBounce(checkAndApplyAnimation, 250);\r\n window.addEventListener('resize', debouncedCheck);\r\n\r\n\r\n // wait for all images to load before initial check\r\n const images = document.querySelectorAll('.news-logos img');\r\n let loadedImages = 0;\r\n\r\n function tryInitialize() {\r\n loadedImages++;\r\n if (loadedImages === images.length) {\r\n checkAndApplyAnimation();\r\n }\r\n }\r\n\r\n if (images.length > 0) {\r\n images.forEach(img => {\r\n if (img.complete) {\r\n tryInitialize();\r\n } else {\r\n img.addEventListener('load', tryInitialize);\r\n }\r\n });\r\n } else {\r\n checkAndApplyAnimation();\r\n }\r\n});","import Flickity from 'flickity';\r\nimport deBounce from 'lodash.debounce';\r\n\r\n$(function ($) {\r\n if (!$(\".video-testimonials__carousel\").length > 0) {\r\n return; // not on this page; exit\r\n }\r\n\r\n // animation init needs to fire before flickity\r\n setContainerHeights();\r\n watchClassChanges();\r\n $(window).on('resize', deBounce(setContainerHeights, 250)); // recalc on window resize\r\n // end: animation setup calls\r\n\r\n $(\".video-testimonials__carousel\").each(function () {\r\n const $carousel = $(this);\r\n let flkty = null;\r\n\r\n function initializeFlickity() {\r\n if (flkty) {\r\n flkty.destroy();\r\n }\r\n\r\n flkty = new Flickity($carousel[0], {\r\n wrapAround: true,\r\n contain: false, // no effect if wrapAround: true\r\n pageDots: true,\r\n prevNextButtons: false,\r\n cellAlign: \"center\",\r\n accessibility: false,\r\n draggable: true,\r\n adaptiveHeight: true, // adjust height to active slide\r\n });\r\n\r\n flkty.on(\"select\", function (index) {\r\n let slide = $carousel.find(\".video-testimonials__card-container\")\r\n .eq(index)\r\n .attr(\"data-slide\");\r\n });\r\n\r\n // insert custom arrows\r\n let $pageDots = $carousel.find('.flickity-page-dots');\r\n $pageDots.prepend('');\r\n $pageDots.append('');\r\n\r\n $carousel.find('.arrow-left').on('click', function () {\r\n flkty.previous();\r\n });\r\n\r\n $carousel.find('.arrow-right').on('click', function () {\r\n flkty.next();\r\n });\r\n }\r\n\r\n function destroyFlickity() {\r\n if (flkty) {\r\n flkty.destroy();\r\n flkty = null;\r\n }\r\n }\r\n\r\n function isCarouselNeeded() {\r\n const cardMarginGap = 16; //1rem\r\n\r\n const carouselWidth = $carousel.width() - cardMarginGap; // cardMarginGap here is for padding\r\n const contentWidth = $carousel.find(\".video-testimonials__card\").toArray().reduce((width, card) => width + $(card).outerWidth(true) + cardMarginGap, 0);\r\n\r\n if (contentWidth > carouselWidth) {\r\n if (!flkty) {\r\n destroyPlayers();\r\n initializeFlickity();\r\n }\r\n } else {\r\n if (flkty) {\r\n destroyPlayers();\r\n destroyFlickity();\r\n }\r\n }\r\n }\r\n\r\n isCarouselNeeded();\r\n $(window).on('resize', deBounce(isCarouselNeeded, 250));\r\n });\r\n\r\n // -- video thumbnails and auto play/pause\r\n function pauseVideos() {\r\n $('.video-testimonials__thumbnail.active').each(function () {\r\n const $videoWrapper = $(this).closest('.video-testimonials__video-wrapper');\r\n const $iframe = $videoWrapper.find('iframe');\r\n if ($iframe[0].src.includes('youtube')) {\r\n $iframe[0].contentWindow.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*');\r\n } else if ($iframe[0].src.includes('vimeo')) {\r\n $iframe[0].contentWindow.postMessage('{\"method\":\"pause\"}', '*');\r\n }\r\n $(this).removeClass('active'); // replace thumbnail\r\n });\r\n }\r\n\r\n $(document).on('click', function (e) {\r\n const $clickedElement = $(e.target);\r\n const $activeCard = $('.video-testimonials__thumbnail.active').closest('.video-testimonials__card');\r\n\r\n // if click was outside active card\r\n if (!$clickedElement.closest($activeCard).length) {\r\n pauseVideos();\r\n }\r\n });\r\n\r\n $(document).on('click', '.video-testimonials__thumbnail', function (e) {\r\n e.stopPropagation();\r\n pauseVideos();\r\n\r\n const $thumbnail = $(this);\r\n const $videoWrapper = $thumbnail.closest('.video-testimonials__video-wrapper');\r\n const $card = $videoWrapper.closest('.video-testimonials__card');\r\n const $iframe = $videoWrapper.find('iframe');\r\n\r\n // hide clicked thumbnail and play video\r\n $videoWrapper.find('.video-testimonials__thumbnail').addClass('active');\r\n\r\n if ($iframe[0].src.includes('youtube')) {\r\n initYoutubePlayer($iframe[0]);\r\n $iframe[0].contentWindow.postMessage('{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*');\r\n } else if ($iframe[0].src.includes('vimeo')) {\r\n initVimeoPlayer($iframe[0]);\r\n $iframe[0].contentWindow.postMessage('{\"method\":\"play\"}', '*');\r\n }\r\n });\r\n\r\n // video player events and control\r\n const pauseTimeout = 3000; // timer to replace thumbnail after video has been paused\r\n\r\n function destroyPlayers() {\r\n // remove video player APIs when flickity enabled state changes, otherwise YouTube/Vimeo player events (play/pause/etc.) stop working\r\n // API is re - init on thumbnail click\r\n $('.video-testimonials__video-wrapper iframe').each(function () {\r\n var $iframe = $(this);\r\n var $parent = $iframe.parent();\r\n\r\n var $newIframe = $iframe.clone();\r\n\r\n if (this.ytPlayer) {\r\n // clear any timeouts\r\n if (this.ytPlayer.timeoutId) {\r\n clearTimeout(this.ytPlayer.timeoutId);\r\n }\r\n\r\n this.ytPlayer.destroy();\r\n }\r\n\r\n if (this.vmPlayer) {\r\n if (this.vmPlayer.timeoutId) {\r\n clearTimeout(this.vmPlayer.timeoutId);\r\n }\r\n\r\n this.vmPlayer.destroy();\r\n }\r\n\r\n // replace the iframe with the new one\r\n $iframe.remove();\r\n $parent.append($newIframe);\r\n });\r\n }\r\n\r\n function initVimeoPlayer(iframe) {\r\n if (!window.Vimeo) {\r\n loadVimeoAPI(function () {\r\n setupVimeoPlayer(iframe);\r\n });\r\n } else {\r\n setupVimeoPlayer(iframe);\r\n }\r\n }\r\n\r\n function setupVimeoPlayer(iframe) {\r\n if (!iframe.vmPlayer) {\r\n iframe.vmPlayer = new Vimeo.Player(iframe);\r\n var $iframe = $(iframe);\r\n var $thumbnail = $iframe.closest('.video-testimonials__video-wrapper').find('.video-testimonials__thumbnail');\r\n\r\n iframe.vmPlayer.on('pause', function () {\r\n if (iframe.vmPlayer.timeoutId) {\r\n clearTimeout(iframe.vmPlayer.timeoutId);\r\n }\r\n\r\n iframe.vmPlayer.timeoutId = setTimeout(function () {\r\n iframe.vmPlayer.getPaused().then(function (paused) {\r\n if (paused) {\r\n $thumbnail.removeClass('active');\r\n }\r\n });\r\n }, pauseTimeout);\r\n });\r\n }\r\n\r\n return iframe.vmPlayer;\r\n }\r\n\r\n function loadVimeoAPI(callback) {\r\n if (typeof callback !== 'function') {\r\n callback = () => { };\r\n }\r\n\r\n if (window.Vimeo) {\r\n callback();\r\n } else {\r\n var vimeoScript = document.createElement('script');\r\n vimeoScript.src = \"https://player.vimeo.com/api/player.js\";\r\n vimeoScript.onload = callback;\r\n document.head.appendChild(vimeoScript);\r\n }\r\n }\r\n loadVimeoAPI();\r\n\r\n function initYoutubePlayer(iframe) {\r\n if (!window.YT) {\r\n loadYoutubeAPI(function () {\r\n setupYoutubePlayer(iframe);\r\n });\r\n } else {\r\n setupYoutubePlayer(iframe);\r\n }\r\n }\r\n\r\n function setupYoutubePlayer(iframe) {\r\n if (!iframe.ytPlayer) {\r\n iframe.ytPlayer = new YT.Player(iframe, {\r\n events: {\r\n 'onStateChange': function (event) {\r\n var $iframe = $(iframe);\r\n var $thumbnail = $iframe.closest('.video-testimonials__video-wrapper').find('.video-testimonials__thumbnail');\r\n if (event.data == YT.PlayerState.PAUSED || event.data == YT.PlayerState.ENDED) {\r\n if (iframe.ytPlayer.timeoutId) {\r\n clearTimeout(iframe.ytPlayer.timeoutId);\r\n }\r\n\r\n iframe.ytPlayer.timeoutId = setTimeout(function () {\r\n if (iframe.ytPlayer.getPlayerState() != YT.PlayerState.PLAYING) {\r\n $thumbnail.removeClass('active');\r\n }\r\n }, pauseTimeout);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n return iframe.ytPlayer;\r\n }\r\n\r\n function loadYoutubeAPI(callback) {\r\n if (typeof callback !== 'function') {\r\n callback = () => { };\r\n }\r\n\r\n if (window.YT) {\r\n callback();\r\n } else {\r\n window.onYouTubeIframeAPIReady = callback;\r\n var youtubeScript = document.createElement('script');\r\n youtubeScript.src = \"https://www.youtube.com/iframe_api\";\r\n var firstScriptTag = document.getElementsByTagName('script')[0];\r\n firstScriptTag.parentNode.insertBefore(youtubeScript, firstScriptTag);\r\n }\r\n }\r\n loadYoutubeAPI();\r\n\r\n // -- animations\r\n const cardMaxHeight = '700px';\r\n function setContainerHeights() {\r\n $('.video-testimonials').each(function () {\r\n var $parent = $(this);\r\n var maxHeight = 0;\r\n\r\n $parent.find('.video-testimonials__card-container').each(function () {\r\n var $container = $(this);\r\n var $card = $container.find('.video-testimonials__card');\r\n var $videoWrapper = $card.find('.video-testimonials__video-wrapper');\r\n var $content = $card.find('.video-testimonials__content');\r\n\r\n // Calculate full height: video wrapper + content\r\n var videoWrapperHeight = $videoWrapper.outerHeight();\r\n var contentHeight = $content.outerHeight();\r\n\r\n var fullHeight = videoWrapperHeight + contentHeight;\r\n\r\n if (fullHeight > maxHeight) {\r\n maxHeight = fullHeight;\r\n }\r\n });\r\n\r\n // Set all containers within this parent to max height\r\n $parent.find('.video-testimonials__card-container').height(maxHeight);\r\n\r\n // Set initial card max-height to video wrapper height (for cards that are not open/selected)\r\n $parent.find('.video-testimonials__card').each(function () {\r\n var $card = $(this);\r\n var $container = $card.closest('.video-testimonials__card-container');\r\n if (!$container.hasClass('is-open')) {\r\n var $videoWrapper = $card.find('.video-testimonials__video-wrapper');\r\n $card.css('max-height', $videoWrapper.outerHeight());\r\n }\r\n });\r\n });\r\n }\r\n\r\n function watchClassChanges() {\r\n $('.video-testimonials__card-container').each(function () {\r\n var $container = $(this);\r\n var $card = $container.find('.video-testimonials__card');\r\n var $videoWrapper = $card.find('.video-testimonials__video-wrapper');\r\n\r\n var observer = new MutationObserver(function (mutations) {\r\n mutations.forEach(function (mutation) {\r\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\r\n if ($container.hasClass('is-open')) {\r\n $card.css('max-height', cardMaxHeight);\r\n } else {\r\n $card.css('max-height', $videoWrapper.outerHeight());\r\n }\r\n }\r\n });\r\n });\r\n\r\n observer.observe($container[0], { attributes: true, attributeFilter: ['class'] });\r\n });\r\n }\r\n\r\n // -- open animation on scroll\r\n let isFirstTime = true;\r\n function openCardsOnScroll() {\r\n $('.video-testimonials__card-container:not(.is-open)').each(function () {\r\n var $container = $(this);\r\n var containerTop = $container.offset().top;\r\n var containerBottom = containerTop + $container.outerHeight();\r\n var windowHeight = $(window).height();\r\n var scrollTop = $(window).scrollTop();\r\n var scrollBottom = scrollTop + windowHeight;\r\n\r\n // visible percentage of container\r\n var visibleHeight = Math.min(containerBottom, scrollBottom) - Math.max(containerTop, scrollTop);\r\n var visiblePercentage = (visibleHeight / $container.outerHeight()) * 100;\r\n var isHighlyVisible = visiblePercentage >= 80;\r\n\r\n // is top of card less than x% from viewport top\r\n var topPercentage = (containerTop - scrollTop) / windowHeight * 100;\r\n var isTopNearViewport = topPercentage < 40 && topPercentage >= 0;\r\n\r\n if (isHighlyVisible || isTopNearViewport) {\r\n if (isFirstTime) {\r\n // disable animation if already visible on page load\r\n $container.addClass('disable-animation').addClass('is-open');\r\n } else {\r\n var randomDelay = Math.random() * 700;\r\n setTimeout(function () {\r\n $container.addClass('is-open');\r\n }, randomDelay);\r\n }\r\n }\r\n });\r\n\r\n isFirstTime = false;\r\n }\r\n\r\n openCardsOnScroll();\r\n $(window).on('scroll', openCardsOnScroll);\r\n $(window).on('resize', deBounce(openCardsOnScroll, 250));\r\n});","import $ from 'jquery';\r\n\r\n$(document).ready(function () {\r\n // Large Hero swap slides\r\n if ($(\".slide-wrapper .slide\").length > 1) {\r\n setInterval(() => {\r\n $(\".slide-wrapper .slide.active\")\r\n .removeClass(\"active\")\r\n .nextOrFirst(\".slide\")\r\n .addClass(\"active\");\r\n }, 4000);\r\n }\r\n});\r\n\r\n$.fn.nextOrFirst = function (selector) {\r\n var next = this.next(selector);\r\n return (next.length) ? next : this.prevAll(selector).last();\r\n};","import $ from 'jquery';\r\n\r\n$(document).ready(function () {\r\n // overlay for comparison table\r\n // would have been pure CSS, but we had to handle IE\r\n if ($('.comparison-table').length) {\r\n // Create our clone-able element\r\n var span = $(\"\").addClass(\"overlay\");\r\n\r\n // Add cloned elements at beginning/end of all .testTD cells\r\n $(\".comparison-table tbody td:nth-child(2)\").prepend(span.clone());\r\n\r\n // If the user is in Internet Explorer, avoid table-cell height bug\r\n if (document.documentMode && document.documentMode < 12) {\r\n $(\".comparison-table td .overlay\").height(function () {\r\n return $(this).parent().outerHeight();\r\n });\r\n }\r\n }\r\n});","import $ from 'jquery';\r\n\r\n$(document).ready(function () {\r\n\r\n $(document).on(\"FormSectionLoaded\", function () {\r\n resetHasContent(\"item: document, event: FormSectionLoaded\");\r\n });\r\n\r\n $(document).on(\"input\", \"form.bizform .form-control\", function () {\r\n if ($(this).val() !== \"\") {\r\n $(this).closest(\".form-field\").addClass(\"has-content\");\r\n $(this).addClass(\"form-control-used\");\r\n } else {\r\n if ($(this).closest(\".form-field\").hasClass(\"has-content\"))\r\n $(this).closest(\".form-field\").removeClass(\"has-content\");\r\n if ($(this).hasClass(\"form-control-used\"))\r\n $(this).removeClass(\"form-control-used\");\r\n }\r\n\r\n checkRequiredFields(\"item: form-control, event: input\");\r\n });\r\n\r\n function checkRequiredFields(handlerName) {\r\n var requiredFieldCount = $(\"form.bizform .form-field-required\").length;\r\n var requiredFieldsWithContent = $(\"form.bizform .form-field-required.has-content\").length;\r\n\r\n //console.log({ handlerName, requiredFieldCount, requiredFieldsWithContent });\r\n\r\n if (requiredFieldCount > 0 && requiredFieldCount === requiredFieldsWithContent) {\r\n //console.log(\"enable submit\");\r\n $(\"form.bizform input[type='submit']:disabled\").removeAttr(\"disabled\");\r\n } else {\r\n //console.log(\"disable submit\");\r\n $(\"form.bizform input[type='submit']\").attr(\"disabled\", \"disabled\");\r\n }\r\n }\r\n\r\n function resetHasContent(handlerName) {\r\n\r\n $(\"form.bizform textarea.form-control\").each(function () {\r\n if ($(this).val() !== \"\") {\r\n $(this).closest(\".form-field\").addClass(\"has-content\");\r\n $(this).addClass(\"form-control-used\");\r\n } else {\r\n if ($(this).closest(\".form-field\").hasClass(\"has-content\"))\r\n $(this).closest(\".form-field\").removeClass(\"has-content\");\r\n if ($(this).hasClass(\"form-control-used\"))\r\n $(this).removeClass(\"form-control-used\");\r\n }\r\n });\r\n\r\n $(\"form.bizform input[type=text].form-control\").each(function () {\r\n if ($(this).val() !== \"\") {\r\n $(this).closest(\".form-field\").addClass(\"has-content\");\r\n $(this).addClass(\"form-control-used\");\r\n } else {\r\n if ($(this).closest(\".form-field\").hasClass(\"has-content\"))\r\n $(this).closest(\".form-field\").removeClass(\"has-content\");\r\n if ($(this).hasClass(\"form-control-used\"))\r\n $(this).removeClass(\"form-control-used\");\r\n }\r\n });\r\n\r\n $(\"form.bizform input[type=radio].form-control\").each(function () {\r\n if ($(this).is(':checked')) {\r\n $(this).closest(\".form-field\").addClass(\"has-content\");\r\n }\r\n });\r\n\r\n\r\n checkRequiredFields(handlerName);\r\n }\r\n\r\n});\r\n","import $ from \"jquery\";\r\n\r\n$(document).ready(function () {\r\n if ($('.video-modal').length) {\r\n if (window.ytPlayers === undefined) {\r\n let tag = document.createElement('script');\r\n tag.src = 'https://www.youtube.com/iframe_api';\r\n let firstScriptTag = document.getElementsByTagName('script')[0];\r\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n\r\n window.ytPlayers = {};\r\n }\r\n\r\n $('.video-modal').each(function () {\r\n var videoID = $(this).attr('id').replace('video-modal-', '');\r\n window.ytPlayers['video-modal-placeholder-' + videoID] = {\r\n width: '595',\r\n height: '360',\r\n videoId: videoID,\r\n playerVars: {\r\n rel: '0'\r\n }\r\n };\r\n });\r\n\r\n $('.video-callout').on('click', function () {\r\n let iframeID = $('[data-open]', this).data('open').replace('video-modal', 'video-modal-placeholder');\r\n window.ytPlayers[iframeID].player.playVideo();\r\n });\r\n $(document).on('click', '.reveal-overlay', function () {\r\n if ($('.video-modal', this).length) {\r\n let iframeID = $('iframe', this).attr('id');\r\n window.ytPlayers[iframeID].player.stopVideo();\r\n }\r\n });\r\n }\r\n});\r\n\r\nwindow.onYouTubeIframeAPIReady = function () {\r\n // create a player for each placeholder\r\n let keys = Object.keys(window.ytPlayers);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n window.ytPlayers[key].player = new YT.Player(key, window.ytPlayers[key]);\r\n }\r\n}","import $ from \"jquery\";\r\n\r\n$(document).ready(function () {\r\n // prevent non-numeric input\r\n // we only want five-digit zip codes, so anything that's not a numeral can stay out\r\n $('.zip-check input').on('keypress', function (e) {\r\n var allowedChars = '0123456789';\r\n if (allowedChars.indexOf(e.key) == -1)\r\n e.preventDefault();\r\n });\r\n\r\n $('.zip-check form').on('submit', function (e) {\r\n let formAllowed = $(this).data('allowed');\r\n let inputZip = parseInt($('input', this).val()); // normally don't like to treat zip codes as ints, but it works since we're restricted to five-digit\r\n let isInputValid = formAllowed.includes(inputZip);\r\n if (!isInputValid) {\r\n e.preventDefault();\r\n $(this).closest('form').next('.reveal-overlay').addClass('open');\r\n $('html').addClass('is-reveal-open');\r\n }\r\n });\r\n\r\n $('.zip-check .reveal-overlay, .zip-check .close-reveal-modal').on('click', function () {\r\n $(this).closest('.reveal-overlay').removeClass('open');\r\n $('html').removeClass('is-reveal-open');\r\n });\r\n $('.zip-check .reveal').on('click', function (e) {\r\n e.stopPropagation();\r\n });\r\n});"],"sourceRoot":""}