{"version":3,"sources":["flickity.pkgd.js"],"names":["window","factory","define","amd","jQuery","module","exports","require","jQueryBridget","arraySlice","Array","prototype","slice","console","logError","message","error","namespace","PluginClass","$","option","opts","isPlainObject","this","options","extend","fn","arg0","each","i","elem","instance","data","_init","$elems","methodName","args","returnValue","pluginMethodStr","call","arguments","method","charAt","value","apply","undefined","updateJQuery","bridget","global","EvEmitter","proto","on","eventName","listener","events","_events","listeners","indexOf","push","once","onceEvents","_onceEvents","off","length","index","splice","emitEvent","onceListeners","allOff","getSize","getStyleSize","num","parseFloat","isNaN","measurements","measurementsLength","getStyle","style","getComputedStyle","isBoxSizeOuter","isSetup","div","document","createElement","width","padding","borderStyle","borderWidth","boxSizing","body","documentElement","appendChild","Math","round","removeChild","setup","querySelector","nodeType","display","size","height","innerWidth","innerHeight","outerWidth","outerHeight","getZeroSize","offsetWidth","offsetHeight","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","matchesSelector","matchesMethod","ElemProto","Element","matches","prefixes","selector","fizzyUIUtils","utils","a","b","prop","modulo","makeArray","obj","isArray","removeFrom","ary","getParent","parentNode","getQueryElement","handleEvent","event","type","filterFindElements","elems","ffElems","forEach","HTMLElement","childElems","querySelectorAll","debounceMethod","_class","threshold","timeoutName","timeout","clearTimeout","_this","setTimeout","docReady","callback","readyState","addEventListener","toDashed","str","replace","match","$1","$2","toLowerCase","htmlInit","WidgetClass","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","concat","dataOptionsAttr","attr","getAttribute","JSON","parse","className","Flickity","Cell","parent","element","create","position","setAttribute","x","shift","destroy","side","originSide","removeAttribute","setPosition","updateTarget","renderPosition","setDefaultTarget","marginProperty","target","cellAlign","getPositionValue","wrapShift","slideableWidth","remove","Slide","isOriginLeft","cells","addCell","cell","max","beginMargin","firstMargin","endMargin","lastCell","getLastCell","lastMargin","slideWidth","select","changeSelected","unselect","isSelected","classMethod","classList","toString","getCellElements","map","animatePrototype","startAnimation","isAnimating","restingFrames","animate","applyDragForce","applySelectedAttraction","previousX","integratePhysics","positionSlider","settle","requestAnimationFrame","wrapAround","shiftWrapCells","cursorPosition","rightToLeft","slider","transform","firstSlide","slides","positionX","progress","slidesWidth","dispatchEvent","positionSliderAtSelected","selectedSlide","velocity","percentPosition","isPointerDown","isFreeScrolling","selectedIndex","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","gap","cellShift","_unshiftCells","getFrictionFactor","applyForce","force","getRestingPosition","isDraggable","dragForce","dragX","selectedAttraction","_Flickity","moveElements","toElem","GUID","instances","queryElement","flickityGUID","$element","constructor","defaults","_create","accessibility","freeScrollFriction","friction","namespaceJQueryEvents","resize","setGallerySize","createMethods","id","guid","viewport","_createSlider","watchCSS","activate","isActive","add","_filterFindCellElements","children","reloadCells","tabIndex","initialIndex","isInitActivated","cellSelector","_makeCells","positionCells","_getWrapShiftCells","cellElem","getLastSlide","_sizeCells","_positionCells","maxCellHeight","cellX","startCell","len","updateSlides","_containSlides","slide","nextMargin","canCellFit","_getCanCellFit","updateSelectedSlide","groupCells","number","parseInt","percentMatch","percent","reposition","setCellAlign","cellAlignShorthands","center","left","right","shorthand","adaptiveHeight","gapX","cellIndex","_getGapCells","increment","contain","isRightToLeft","contentWidth","isContentSmaller","beginBound","endBound","min","emitArgs","$event","jQEvent","Event","trigger","isWrap","isInstant","_wrapSelect","prevIndex","wrapIndex","delta","abs","backWrapDelta","forewardWrapDelta","isDragSelect","previous","next","unselectSelectedSlide","selectedCells","selectedElements","selectedCell","selectedElement","selectCell","queryCell","getCellSlideIndex","getCell","getCells","getParentCell","getAdjacentCellElements","adjCount","cellElems","slideIndex","uiChange","childUIPointerDown","onresize","content","deactivate","onkeydown","isNotFocused","activeElement","handler","keyboardHandlers","keyCode","37","leftMethod","39","rightMethod","focus","prevScrollY","pageYOffset","preventScroll","scrollTo","pageXOffset","removeEventListener","removeData","setJQuery","jq","Unipointer","Object","bindStartEvent","_bindStartEvent","unbindStartEvent","isAdd","bindMethod","startEvent","PointerEvent","getTouch","touches","touch","identifier","pointerIdentifier","onmousedown","button","_pointerDown","ontouchstart","changedTouches","onpointerdown","pointer","pointerId","pointerDown","_bindPostStartEvents","postStartEvents","mousedown","touchstart","pointerdown","_boundPointerEvents","_unbindPostStartEvents","onmousemove","_pointerMove","onpointermove","ontouchmove","pointerMove","onmouseup","_pointerUp","onpointerup","ontouchend","_pointerDone","pointerUp","_pointerReset","pointerDone","onpointercancel","_pointerCancel","ontouchcancel","pointerCancel","getPointerPoint","pageX","y","pageY","Unidragger","bindHandles","_bindHandles","unbindHandles","touchAction","_touchActionValue","handles","handle","okayPointerDown","pointerDownPointer","preventDefault","pointerDownBlur","cursorNodes","TEXTAREA","INPUT","SELECT","OPTION","clickTypes","radio","checkbox","submit","image","file","isCursorNode","nodeName","isClickType","isOkay","focused","blur","moveVector","_dragPointerMove","_dragMove","isDragging","hasDragStarted","_dragStart","_dragPointerUp","_dragEnd","_staticClick","isPreventingClicks","dragStart","dragMove","bind","dragEnd","onclick","isIgnoringMouseUp","staticClick","draggable","dragThreshold","isTouch","isTouchmoveScrollCanceled","_createDrag","onActivateDrag","_uiChangeDrag","_childUIPointerDownDrag","onDeactivateDrag","updateDraggable","bindDrag","unbindDrag","pointerDownFocus","_pointerDownPreventDefault","pointerDownScroll","getScrollPosition","_pointerDownDefault","focusNodes","isTouchStart","isTouchPointer","pointerType","isFocusNode","isTouchScrolling","dragStartPosition","previousDragX","direction","originBound","dragMoveTime","Date","freeScroll","dragEndRestingSelect","restingX","dragEndBoostSelect","distance","getSlideDistance","positiveResting","_getClosestResting","negativeResting","minDistance","Infinity","condition","d","md","isWrapAround","wrap","floor","clickedCell","onscroll","scroll","scrollMoveX","scrollMoveY","TapListener","bindTap","unbindTap","tapElement","pointerPoint","boundingRect","getBoundingClientRect","scrollX","scrollY","top","bottom","svgURI","PrevNextButton","isEnabled","isPrevious","leftDirection","isLeft","disable","svg","createSVG","onTap","update","createElementNS","shape","path","pathMovements","arrowShape","x0","x1","y1","x2","y2","x3","enable","disabled","lastIndex","boundIndex","prevNextButtons","_createPrevNextButtons","prevButton","nextButton","activatePrevNextButtons","deactivatePrevNextButtons","PageDots","holder","dots","setDots","addDots","removeDots","count","fragment","createDocumentFragment","newDots","dot","updateSelected","selectedDot","pageDots","_createPageDots","activatePageDots","updateSelectedPageDots","updatePageDots","deactivatePageDots","Player","state","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","play","hidden","tick","time","autoPlay","clear","stop","pause","unpause","pauseAutoPlayOnHover","_createPlayer","player","activatePlayer","stopPlayer","deactivatePlayer","playPlayer","pausePlayer","unpausePlayer","onmouseenter","onmouseleave","insert","isAppend","insertCellElement","insertBefore","endCells","cellChange","append","prepend","minCellIndex","cellSizeChange","changedCellIndex","isPositioningSlider","prevSelectedElem","LazyLoader","img","flickity","load","_createLazyload","lazyLoad","lazyImages","lazyCellImages","lazyloadAttr","srcAttr","srcsetAttr","imgs","getCellLazyImages","src","srcset","onload","complete","onerror","_createAsNavFor","activateAsNavFor","deactivateAsNavFor","destroyAsNavFor","asNavForOption","asNavFor","setNavCompanion","companion","navCompanion","onNavCompanionSelect","navCompanionSelect","onNavStaticClick","t","firstIndex","selectIndex","removeNavSelectedElements","navSelectedElements","changeNavSelectedClass","navElem","cellElement","imagesLoaded","ImagesLoaded","onAlways","queryElem","elements","getImages","jqDeferred","Deferred","check","images","addElementImages","addImage","background","addElementBackgroundImages","elementNodeTypes","childImgs","child","1","9","11","LoadingImage","Background","url","Image","reURL","exec","backgroundImage","addBackground","loadingImage","onProgress","progressedCount","hasAnyBroken","isLoaded","notify","debug","log","isComplete","jqMethod","getIsImageComplete","confirm","naturalWidth","proxyImage","unbindEvents","makeJQueryPlugin","promise","_createImagesLoaded"],"mappings":"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","file":"../flickity.pkgd.min.js","sourcesContent":["/*!\n * Flickity PACKAGED v2.1.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-2018 Metafizzy\n */\n\n/**\n * Bridget makes jQuery widgets\n * v2.0.1\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) {\n return factory( window, jQuery );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('jquery')\n );\n } else {\n // browser global\n window.jQueryBridget = factory(\n window,\n window.jQuery\n );\n }\n\n}( window, function factory( window, jQuery ) {\n'use strict';\n\n// ----- utils ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// helper function for logging errors\n// $.error breaks jQuery chaining\nvar console = window.console;\nvar logError = typeof console == 'undefined' ? function() {} :\n function( message ) {\n console.error( message );\n };\n\n// ----- jQueryBridget ----- //\n\nfunction jQueryBridget( namespace, PluginClass, $ ) {\n $ = $ || jQuery || window.jQuery;\n if ( !$ ) {\n return;\n }\n\n // add option method -> $().plugin('option', {...})\n if ( !PluginClass.prototype.option ) {\n // option setter\n PluginClass.prototype.option = function( opts ) {\n // bail out if not an object\n if ( !$.isPlainObject( opts ) ){\n return;\n }\n this.options = $.extend( true, this.options, opts );\n };\n }\n\n // make jQuery plugin\n $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {\n if ( typeof arg0 == 'string' ) {\n // method call $().plugin( 'methodName', { options } )\n // shift arguments by 1\n var args = arraySlice.call( arguments, 1 );\n return methodCall( this, arg0, args );\n }\n // just $().plugin({ options })\n plainCall( this, arg0 );\n return this;\n };\n\n // $().plugin('methodName')\n function methodCall( $elems, methodName, args ) {\n var returnValue;\n var pluginMethodStr = '$().' + namespace + '(\"' + methodName + '\")';\n\n $elems.each( function( i, elem ) {\n // get instance\n var instance = $.data( elem, namespace );\n if ( !instance ) {\n logError( namespace + ' not initialized. Cannot call methods, i.e. ' +\n pluginMethodStr );\n return;\n }\n\n var method = instance[ methodName ];\n if ( !method || methodName.charAt(0) == '_' ) {\n logError( pluginMethodStr + ' is not a valid method' );\n return;\n }\n\n // apply method, get return value\n var value = method.apply( instance, args );\n // set return value if value is returned, use only first value\n returnValue = returnValue === undefined ? value : returnValue;\n });\n\n return returnValue !== undefined ? returnValue : $elems;\n }\n\n function plainCall( $elems, options ) {\n $elems.each( function( i, elem ) {\n var instance = $.data( elem, namespace );\n if ( instance ) {\n // set options & init\n instance.option( options );\n instance._init();\n } else {\n // initialize new instance\n instance = new PluginClass( elem, options );\n $.data( elem, namespace, instance );\n }\n });\n }\n\n updateJQuery( $ );\n\n}\n\n// ----- updateJQuery ----- //\n\n// set $.bridget for v1 backwards compatibility\nfunction updateJQuery( $ ) {\n if ( !$ || ( $ && $.bridget ) ) {\n return;\n }\n $.bridget = jQueryBridget;\n}\n\nupdateJQuery( jQuery || window.jQuery );\n\n// ----- ----- //\n\nreturn jQueryBridget;\n\n}));\n\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( 'ev-emitter/ev-emitter',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\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/*!\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( 'get-size/get-size',factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See https://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n\n/**\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( 'desandro-matches-selector/matches-selector',factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n\n/**\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( 'fizzy-ui-utils/utils',[\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\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\n// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/cell',[\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\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-selected', 'false' );\n this.x = 0;\n this.shift = 0;\n};\n\nproto.destroy = function() {\n // reset style\n this.element.style.position = '';\n var side = this.parent.originSide;\n this.element.removeAttribute('aria-selected');\n this.element.style[ side ] = '';\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n this.x = x;\n this.updateTarget();\n this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n this.target = this.x + this.size[ marginProperty ] +\n this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n // render position of cell with in slider\n var side = this.parent.originSide;\n this.element.style[ side ] = this.parent.getPositionValue( x );\n};\n\n/**\n * @param {Integer} factor - 0, 1, or -1\n**/\nproto.wrapShift = function( shift ) {\n this.shift = shift;\n this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n}));\n\n// slide\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/slide',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.changeSelected( true );\n};\n\nproto.unselect = function() {\n this.changeSelected( false );\n};\n\nproto.changeSelected = function( isSelected ) {\n var classMethod = isSelected ? 'add' : 'remove';\n this.cells.forEach( function( cell ) {\n cell.element.classList[ classMethod ]('is-selected');\n cell.element.setAttribute( 'aria-selected', isSelected.toString() );\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\n// animate\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/animate',[\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\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n if ( this.isAnimating ) {\n return;\n }\n\n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n};\n\nproto.animate = function() {\n this.applyDragForce();\n this.applySelectedAttraction();\n\n var previousX = this.x;\n\n this.integratePhysics();\n this.positionSlider();\n this.settle( previousX );\n // animate next frame\n if ( this.isAnimating ) {\n var _this = this;\n requestAnimationFrame( function animateFrame() {\n _this.animate();\n });\n }\n};\n\nproto.positionSlider = function() {\n var x = this.x;\n // wrap position around\n if ( this.options.wrapAround && this.cells.length > 1 ) {\n x = utils.modulo( x, this.slideableWidth );\n x = x - this.slideableWidth;\n this.shiftWrapCells( x );\n }\n\n x = x + this.cursorPosition;\n // reverse if right-to-left and using transform\n x = this.options.rightToLeft ? -x : x;\n var value = this.getPositionValue( x );\n // use 3D tranforms for hardware acceleration on iOS\n // but use 2D when settled, for better font-rendering\n this.slider.style.transform = this.isAnimating ?\n 'translate3d(' + value + ',0,0)' : 'translateX(' + value + ')';\n\n // scroll event\n var firstSlide = this.slides[0];\n if ( firstSlide ) {\n var positionX = -this.x - firstSlide.target;\n var progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n }\n};\n\nproto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) {\n return;\n }\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\n this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n if ( this.options.percentPosition ) {\n // percent position, round to 2 digits, like 12.34%\n return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 )+ '%';\n } else {\n // pixel positioning\n return Math.round( position ) + 'px';\n }\n};\n\nproto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n if ( !this.isPointerDown && Math.round( this.x * 100 ) == Math.round( previousX * 100 ) ) {\n this.restingFrames++;\n }\n // stop animating if resting for 3 or more frames\n if ( this.restingFrames > 2 ) {\n this.isAnimating = false;\n delete this.isFreeScrolling;\n // render position with translateX when settled\n this.positionSlider();\n this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n }\n};\n\nproto.shiftWrapCells = function( x ) {\n // shift before cells\n var beforeGap = this.cursorPosition + x;\n this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n // shift after cells\n var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n for ( var i=0; i < cells.length; i++ ) {\n var cell = cells[i];\n var cellShift = gap > 0 ? shift : 0;\n cell.wrapShift( cellShift );\n gap -= cell.size.outerWidth;\n }\n};\n\nproto._unshiftCells = function( cells ) {\n if ( !cells || !cells.length ) {\n return;\n }\n for ( var i=0; i < cells.length; i++ ) {\n cells[i].wrapShift( 0 );\n }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n if ( !this.isDraggable || !this.isPointerDown ) {\n return;\n }\n // change the position to drag position by applying force\n var dragVelocity = this.dragX - this.x;\n var dragForce = dragVelocity - this.velocity;\n this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n // do not attract if pointer down or no slides\n var dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n return;\n }\n var distance = this.selectedSlide.target * -1 - this.x;\n var force = distance * this.options.selectedAttraction;\n this.applyForce( force );\n};\n\nreturn proto;\n\n}));\n\n// Flickity main\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/flickity',[\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\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n elems = utils.makeArray( elems );\n while ( elems.length ) {\n toElem.appendChild( elems.shift() );\n }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // do not initialize twice on same element\n if ( this.element.flickityGUID ) {\n var instance = instances[ this.element.flickityGUID ];\n instance.option( options );\n return instance;\n }\n\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // kick things off\n this._create();\n}\n\nFlickity.defaults = {\n accessibility: true,\n // adaptiveHeight: false,\n cellAlign: 'center',\n // cellSelector: undefined,\n // contain: false,\n freeScrollFriction: 0.075, // friction when free-scrolling\n friction: 0.28, // friction when selecting\n namespaceJQueryEvents: true,\n // initialIndex: 0,\n percentPosition: true,\n resize: true,\n selectedAttraction: 0.025,\n setGallerySize: true\n // watchCSS: false,\n // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n // add id for Flickity.data\n var id = this.guid = ++GUID;\n this.element.flickityGUID = id; // expando\n instances[ id ] = this; // associate via id\n // initial properties\n this.selectedIndex = 0;\n // how many frames slider has been in same position\n this.restingFrames = 0;\n // initial physics properties\n this.x = 0;\n this.velocity = 0;\n this.originSide = this.options.rightToLeft ? 'right' : 'left';\n // create viewport & slider\n this.viewport = document.createElement('div');\n this.viewport.className = 'flickity-viewport';\n this._createSlider();\n\n if ( this.options.resize || this.options.watchCSS ) {\n window.addEventListener( 'resize', this );\n }\n\n // add listeners from on option\n for ( var eventName in this.options.on ) {\n var listener = this.options.on[ eventName ];\n this.on( eventName, listener );\n }\n\n Flickity.createMethods.forEach( function( method ) {\n this[ method ]();\n }, this );\n\n if ( this.options.watchCSS ) {\n this.watchCSS();\n } else {\n this.activate();\n }\n\n};\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n if ( this.isActive ) {\n return;\n }\n this.isActive = true;\n this.element.classList.add('flickity-enabled');\n if ( this.options.rightToLeft ) {\n this.element.classList.add('flickity-rtl');\n }\n\n this.getSize();\n // move initial cell elements so they can be loaded as cells\n var cellElems = this._filterFindCellElements( this.element.children );\n moveElements( cellElems, this.slider );\n this.viewport.appendChild( this.slider );\n this.element.appendChild( this.viewport );\n // get cells from children\n this.reloadCells();\n\n if ( this.options.accessibility ) {\n // allow element to focusable\n this.element.tabIndex = 0;\n // listen for key presses\n this.element.addEventListener( 'keydown', this );\n }\n\n this.emitEvent('activate');\n\n var index;\n var initialIndex = this.options.initialIndex;\n if ( this.isInitActivated ) {\n index = this.selectedIndex;\n } else if ( initialIndex !== undefined ) {\n index = this.cells[ initialIndex ] ? initialIndex : 0;\n } else {\n index = 0;\n }\n // select instantly\n this.select( index, false, true );\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n // slider element does all the positioning\n var slider = document.createElement('div');\n slider.className = 'flickity-slider';\n slider.style[ this.originSide ] = 0;\n this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n // collection of item elements\n this.cells = this._makeCells( this.slider.children );\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n var cellElems = this._filterFindCellElements( elems );\n\n // create new Flickity for collection\n var cells = cellElems.map( function( cellElem ) {\n return new Cell( cellElem, this );\n }, this );\n\n return cells;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n // size all cells\n this._sizeCells( this.cells );\n // position all cells\n this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n index = index || 0;\n // also measure maxCellHeight\n // start 0 if positioning all cells\n this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n var cellX = 0;\n // get cellX\n if ( index > 0 ) {\n var startCell = this.cells[ index - 1 ];\n cellX = startCell.x + startCell.size.outerWidth;\n }\n var len = this.cells.length;\n for ( var i=index; i < len; i++ ) {\n var cell = this.cells[i];\n cell.setPosition( cellX );\n cellX += cell.size.outerWidth;\n this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n }\n // keep track of cellX for wrap-around\n this.slideableWidth = cellX;\n // slides\n this.updateSlides();\n // contain slides target\n this._containSlides();\n // update slidesWidth\n this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells\n */\nproto._sizeCells = function( cells ) {\n cells.forEach( function( cell ) {\n cell.getSize();\n });\n};\n\n// -------------------------- -------------------------- //\n\nproto.updateSlides = function() {\n this.slides = [];\n if ( !this.cells.length ) {\n return;\n }\n\n var slide = new Slide( this );\n this.slides.push( slide );\n var isOriginLeft = this.originSide == 'left';\n var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n var canCellFit = this._getCanCellFit();\n\n this.cells.forEach( function( cell, i ) {\n // just add cell if first cell in slide\n if ( !slide.cells.length ) {\n slide.addCell( cell );\n return;\n }\n\n var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n if ( canCellFit.call( this, i, slideWidth ) ) {\n slide.addCell( cell );\n } else {\n // doesn't fit, new slide\n slide.updateTarget();\n\n slide = new Slide( this );\n this.slides.push( slide );\n slide.addCell( cell );\n }\n }, this );\n // last slide\n slide.updateTarget();\n // update .selectedSlide\n this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n var groupCells = this.options.groupCells;\n if ( !groupCells ) {\n return function() {\n return false;\n };\n } else if ( typeof groupCells == 'number' ) {\n // group by number. 3 -> [0,1,2], [3,4,5], ...\n var number = parseInt( groupCells, 10 );\n return function( i ) {\n return ( i % number ) !== 0;\n };\n }\n // default, group by width of slide\n // parse '75%\n var percentMatch = typeof groupCells == 'string' &&\n groupCells.match(/^(\\d+)%$/);\n var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n return function( i, slideWidth ) {\n return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n // cell align, then based on origin side\n center: {\n left: 0.5,\n right: 0.5\n },\n left: {\n left: 0,\n right: 1\n },\n right: {\n right: 0,\n left: 1\n }\n};\n\nproto.setCellAlign = function() {\n var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n if ( this.options.setGallerySize ) {\n var height = this.options.adaptiveHeight && this.selectedSlide ?\n this.selectedSlide.height : this.maxCellHeight;\n this.viewport.style.height = height + 'px';\n }\n};\n\nproto._getWrapShiftCells = function() {\n // only for wrap-around\n if ( !this.options.wrapAround ) {\n return;\n }\n // unshift previous cells\n this._unshiftCells( this.beforeShiftCells );\n this._unshiftCells( this.afterShiftCells );\n // get before cells\n // initial gap\n var gapX = this.cursorPosition;\n var cellIndex = this.cells.length - 1;\n this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n // get after cells\n // ending gap between last cell and end of gallery viewport\n gapX = this.size.innerWidth - this.cursorPosition;\n // start cloning at first cell, working forwards\n this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n // keep adding cells until the cover the initial gap\n var cells = [];\n while ( gapX > 0 ) {\n var cell = this.cells[ cellIndex ];\n if ( !cell ) {\n break;\n }\n cells.push( cell );\n cellIndex += increment;\n gapX -= cell.size.outerWidth;\n }\n return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n return;\n }\n var isRightToLeft = this.options.rightToLeft;\n var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n // content is less than gallery size\n var isContentSmaller = contentWidth < this.size.innerWidth;\n // bounds\n var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n // contain each cell target\n this.slides.forEach( function( slide ) {\n if ( isContentSmaller ) {\n // all cells fit inside gallery\n slide.target = contentWidth * this.cellAlign;\n } else {\n // contain to bounds\n slide.target = Math.max( slide.target, beginBound );\n slide.target = Math.min( slide.target, endBound );\n }\n }, this );\n};\n\n// ----- ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery && this.$element ) {\n // default trigger with type if no event\n type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n var $event = type;\n if ( event ) {\n // create jQuery event\n var jQEvent = jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n if ( !this.isActive ) {\n return;\n }\n index = parseInt( index, 10 );\n this._wrapSelect( index );\n\n if ( this.options.wrapAround || isWrap ) {\n index = utils.modulo( index, this.slides.length );\n }\n // bail if invalid index\n if ( !this.slides[ index ] ) {\n return;\n }\n var prevIndex = this.selectedIndex;\n this.selectedIndex = index;\n this.updateSelectedSlide();\n if ( isInstant ) {\n this.positionSliderAtSelected();\n } else {\n this.startAnimation();\n }\n if ( this.options.adaptiveHeight ) {\n this.setGallerySize();\n }\n // events\n this.dispatchEvent( 'select', null, [ index ] );\n // change event if new index\n if ( index != prevIndex ) {\n this.dispatchEvent( 'change', null, [ index ] );\n }\n // old v1 event name, remove in v3\n this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n var len = this.slides.length;\n var isWrapping = this.options.wrapAround && len > 1;\n if ( !isWrapping ) {\n return index;\n }\n var wrapIndex = utils.modulo( index, len );\n // go to shortest\n var delta = Math.abs( wrapIndex - this.selectedIndex );\n var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n if ( !this.isDragSelect && backWrapDelta < delta ) {\n index += len;\n } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n index -= len;\n }\n // wrap position so slider is within normal area\n if ( index < 0 ) {\n this.x -= this.slideableWidth;\n } else if ( index >= len ) {\n this.x += this.slideableWidth;\n }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n var slide = this.slides[ this.selectedIndex ];\n // selectedIndex could be outside of slides, if triggered before resize()\n if ( !slide ) {\n return;\n }\n // unselect previous selected slide\n this.unselectSelectedSlide();\n // update new selected slide\n this.selectedSlide = slide;\n slide.select();\n this.selectedCells = slide.cells;\n this.selectedElements = slide.getCellElements();\n // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n // Remove in v3?\n this.selectedCell = slide.cells[0];\n this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) {\n this.selectedSlide.unselect();\n }\n};\n\n/**\n * select slide from number or cell element\n * @param {Element or Number} elem\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n // get cell\n var cell = this.queryCell( value );\n if ( !cell ) {\n return;\n }\n\n var index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n // get index of slides that has cell\n for ( var i=0; i < this.slides.length; i++ ) {\n var slide = this.slides[i];\n var index = slide.cells.indexOf( cell );\n if ( index != -1 ) {\n return i;\n }\n }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem\n * @returns {Flickity.Cell} item\n */\nproto.getCell = function( elem ) {\n // loop through cells to get the one that matches\n for ( var i=0; i < this.cells.length; i++ ) {\n var cell = this.cells[i];\n if ( cell.element == elem ) {\n return cell;\n }\n }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {Element, Array, NodeList} elems\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n elems = utils.makeArray( elems );\n var cells = [];\n elems.forEach( function( elem ) {\n var cell = this.getCell( elem );\n if ( cell ) {\n cells.push( cell );\n }\n }, this );\n return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n });\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem\n * @returns {Flickit.Cell} cell\n */\nproto.getParentCell = function( elem ) {\n // first check if elem is cell\n var cell = this.getCell( elem );\n if ( cell ) {\n return cell;\n }\n // try to get parent cell elem\n elem = utils.getParent( elem, '.flickity-slider > *' );\n return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n if ( !adjCount ) {\n return this.selectedSlide.getCellElements();\n }\n index = index === undefined ? this.selectedIndex : index;\n\n var len = this.slides.length;\n if ( 1 + ( adjCount * 2 ) >= len ) {\n return this.getCellElements();\n }\n\n var cellElems = [];\n for ( var i = index - adjCount; i <= index + adjCount ; i++ ) {\n var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n var slide = this.slides[ slideIndex ];\n if ( slide ) {\n cellElems = cellElems.concat( slide.getCellElements() );\n }\n }\n return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {Element, Selector String, or Number} selector\n */\nproto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n if ( typeof selector == 'string' ) {\n // 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\nproto.childUIPointerDown = function( event ) {\n this.emitEvent( 'childUIPointerDown', [ event ] );\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n this.watchCSS();\n this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n if ( !this.isActive ) {\n return;\n }\n this.getSize();\n // wrap values\n if ( this.options.wrapAround ) {\n this.x = utils.modulo( this.x, this.slideableWidth );\n }\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n this.emitEvent('resize');\n // update selected index for group slides, instant\n // TODO: position can be lost between groups of various numbers\n var selectedElement = this.selectedElements && this.selectedElements[0];\n this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n var watchOption = this.options.watchCSS;\n if ( !watchOption ) {\n return;\n }\n\n var afterContent = getComputedStyle( this.element, ':after' ).content;\n // activate if :after { content: 'flickity' }\n if ( afterContent.indexOf('flickity') != -1 ) {\n this.activate();\n } else {\n this.deactivate();\n }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n // only work if element is in focus\n var isNotFocused = document.activeElement && document.activeElement != this.element;\n if ( !this.options.accessibility ||isNotFocused ) {\n return;\n }\n\n var handler = Flickity.keyboardHandlers[ event.keyCode ];\n if ( handler ) {\n handler.call( this );\n }\n};\n\nFlickity.keyboardHandlers = {\n // left arrow\n 37: function() {\n var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this.uiChange();\n this[ leftMethod ]();\n },\n // right arrow\n 39: function() {\n var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this.uiChange();\n this[ rightMethod ]();\n },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n // TODO remove scrollTo once focus options gets more support\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#Browser_compatibility\n var prevScrollY = window.pageYOffset;\n this.element.focus({ preventScroll: true });\n // hack to fix scroll jump after focus, #76\n if ( window.pageYOffset != prevScrollY ) {\n window.scrollTo( window.pageXOffset, prevScrollY );\n }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n if ( !this.isActive ) {\n return;\n }\n this.element.classList.remove('flickity-enabled');\n this.element.classList.remove('flickity-rtl');\n this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( function( cell ) {\n cell.destroy();\n });\n this.element.removeChild( this.viewport );\n // move child elements back into element\n moveElements( this.slider.children, this.element );\n if ( this.options.accessibility ) {\n this.element.removeAttribute('tabIndex');\n this.element.removeEventListener( 'keydown', this );\n }\n // set flags\n this.isActive = false;\n this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n this.deactivate();\n window.removeEventListener( 'resize', this );\n this.emitEvent('destroy');\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'flickity' );\n }\n delete this.element.flickityGUID;\n delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {Element} elem\n * @returns {Flickity}\n */\nFlickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.flickityGUID;\n return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n jQuery = jq;\n};\n\nFlickity.Cell = Cell;\n\nreturn Flickity;\n\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( 'unipointer/unipointer',[\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\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 * Unidragger v2.3.0\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'unidragger/unidragger',[\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\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n // bind each handle\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n var touchAction = isAdd ? this._touchActionValue : '';\n for ( var i=0; i < this.handles.length; i++ ) {\n var handle = this.handles[i];\n this._bindStartEvent( handle, isAdd );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) {\n handle.style.touchAction = touchAction;\n }\n }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n // track start event position\n this.pointerDownPointer = pointer;\n\n event.preventDefault();\n this.pointerDownBlur();\n // bind move and end events\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n TEXTAREA: true,\n INPUT: true,\n SELECT: true,\n OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n radio: true,\n checkbox: true,\n button: true,\n submit: true,\n image: true,\n file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n var isCursorNode = cursorNodes[ event.target.nodeName ];\n var isClickType = clickTypes[ event.target.type ];\n var isOkay = !isCursorNode || isClickType;\n if ( !isOkay ) {\n this._pointerReset();\n }\n return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n var focused = document.activeElement;\n // do not blur body for IE10, metafizzy/flickity#117\n var canBlur = focused && focused.blur && focused != document.body;\n if ( canBlur ) {\n focused.blur();\n }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n var moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY\n };\n // start drag if pointer has moved far enough to start drag\n if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n this._dragStart( event, pointer );\n }\n return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n if ( this.isDragging ) {\n this._dragEnd( event, pointer );\n } else {\n // pointer didn't move enough for drag to start\n this._staticClick( event, pointer );\n }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n this.isDragging = true;\n // prevent clicks\n this.isPreventingClicks = true;\n this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n // do not drag if not dragging yet\n if ( !this.isDragging ) {\n return;\n }\n\n this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n event.preventDefault();\n this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n // set flags\n this.isDragging = false;\n // re-enable clicking async\n setTimeout( function() {\n delete this.isPreventingClicks;\n }.bind( this ) );\n\n this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n if ( this.isPreventingClicks ) {\n event.preventDefault();\n }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n // ignore emulated mouse up clicks\n if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n return;\n }\n\n this.staticClick( event, pointer );\n\n // set flag for emulated clicks 300ms after touchend\n if ( event.type != 'mouseup' ) {\n this.isIgnoringMouseUp = true;\n // reset flag after 300ms\n setTimeout( function() {\n delete this.isIgnoringMouseUp;\n }.bind( this ), 400 );\n }\n};\n\nproto.staticClick = function( event, pointer ) {\n this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// ----- ----- //\n\nreturn Unidragger;\n\n}));\n\n// drag\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/drag',[\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\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( 'childUIPointerDown', this._childUIPointerDownDrag );\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\nproto._childUIPointerDownDrag = function( event ) {\n // allow focus & preventDefault even when not draggable\n // so child UI elements keep focus on carousel. #721\n event.preventDefault();\n this.pointerDownFocus( event );\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 this.pointerDownPointer = pointer;\n // bind move and end events\n this._bindPostStartEvents( event );\n this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n INPUT: true,\n TEXTAREA: true,\n SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isFocusNode ) {\n this.focus();\n }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n var isTouchStart = event.type == 'touchstart';\n var isTouchPointer = event.pointerType == 'touch';\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n event.preventDefault();\n }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n delete this.isTouchScrolling;\n this.viewport.classList.remove('is-pointer-down');\n this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n this.dragStartPosition = this.x;\n this.startAnimation();\n window.removeEventListener( 'scroll', this );\n this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n if ( !this.isDraggable ) {\n return;\n }\n event.preventDefault();\n\n this.previousDragX = this.dragX;\n // reverse if right-to-left\n var direction = this.options.rightToLeft ? -1 : 1;\n if ( this.options.wrapAround ) {\n // wrap around move. #589\n moveVector.x = moveVector.x % this.slideableWidth;\n }\n var dragX = this.dragStartPosition + moveVector.x * direction;\n\n if ( !this.options.wrapAround && this.slides.length ) {\n // slow drag\n var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n }\n\n this.dragX = dragX;\n\n this.dragMoveTime = new Date();\n this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n if ( this.options.freeScroll ) {\n this.isFreeScrolling = true;\n }\n // set selectedIndex based on where flick will end up\n var index = this.dragEndRestingSelect();\n\n if ( this.options.freeScroll && !this.options.wrapAround ) {\n // if free-scroll & not wrap around\n // do not free-scroll if going outside of bounding slides\n // so bounding slides can attract slider, and keep it in bounds\n var restingX = this.getRestingPosition();\n this.isFreeScrolling = -restingX > this.slides[0].target &&\n -restingX < this.getLastSlide().target;\n } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n // boost selection if selected index has not changed\n index += this.dragEndBoostSelect();\n }\n delete this.previousDragX;\n // apply selection\n // TODO refactor this, selecting here feels weird\n // HACK, set flag so dragging stays in correct direction\n this.isDragSelect = this.options.wrapAround;\n this.select( index );\n delete this.isDragSelect;\n this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n var restingX = this.getRestingPosition();\n // how far away from selected slide\n var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n // get closet resting going up and going down\n var positiveResting = this._getClosestResting( restingX, distance, 1 );\n var negativeResting = this._getClosestResting( restingX, distance, -1 );\n // use closer resting for wrap-around\n var index = positiveResting.distance < negativeResting.distance ?\n positiveResting.index : negativeResting.index;\n return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n var index = this.selectedIndex;\n var minDistance = Infinity;\n var condition = this.options.contain && !this.options.wrapAround ?\n // if contain, keep going if distance is equal to minDistance\n function( d, md ) { return d <= md; } : function( d, md ) { return d < md; };\n while ( condition( distance, minDistance ) ) {\n // measure distance to next cell\n index += increment;\n minDistance = distance;\n distance = this.getSlideDistance( -restingX, index );\n if ( distance === null ) {\n break;\n }\n distance = Math.abs( distance );\n }\n return {\n distance: minDistance,\n // selected was previous index\n index: index - increment\n };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x\n * @param {Integer} index - slide index\n */\nproto.getSlideDistance = function( x, index ) {\n var len = this.slides.length;\n // wrap around if at least 2 slides\n var isWrapAround = this.options.wrapAround && len > 1;\n var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n var slide = this.slides[ slideIndex ];\n if ( !slide ) {\n return null;\n }\n // add distance for wrap-around slides\n var wrap = isWrapAround ? this.slideableWidth * Math.floor( index / len ) : 0;\n return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n // do not boost if no previousDragX or dragMoveTime\n if ( this.previousDragX === undefined || !this.dragMoveTime ||\n // or if drag was held for 100 ms\n new Date() - this.dragMoveTime > 100 ) {\n return 0;\n }\n\n var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n var delta = this.previousDragX - this.dragX;\n if ( distance > 0 && delta > 0 ) {\n // boost to next if moving towards the right, and positive velocity\n return 1;\n } else if ( distance < 0 && delta < 0 ) {\n // boost to previous if moving towards the left, and negative velocity\n return -1;\n }\n return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n // get clickedCell, if cell was clicked\n var clickedCell = this.getParentCell( event.target );\n var cellElem = clickedCell && clickedCell.element;\n var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n var scroll = getScrollPosition();\n var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n // cancel click/tap if scroll is too much\n if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n this._pointerDone();\n }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n}\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n\n/*!\n * Tap listener v2.0.0\n * listens to taps\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( 'tap-listener/tap-listener',[\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.TapListener = factory(\n window,\n window.Unipointer\n );\n }\n\n}( window, function factory( window, Unipointer ) {\n\n\n\n// -------------------------- TapListener -------------------------- //\n\nfunction TapListener( elem ) {\n this.bindTap( elem );\n}\n\n// inherit Unipointer & EventEmitter\nvar proto = TapListener.prototype = Object.create( Unipointer.prototype );\n\n/**\n * bind tap event to element\n * @param {Element} elem\n */\nproto.bindTap = function( elem ) {\n if ( !elem ) {\n return;\n }\n this.unbindTap();\n this.tapElement = elem;\n this._bindStartEvent( elem, true );\n};\n\nproto.unbindTap = function() {\n if ( !this.tapElement ) {\n return;\n }\n this._bindStartEvent( this.tapElement, true );\n delete this.tapElement;\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n // ignore emulated mouse up clicks\n if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n return;\n }\n\n var pointerPoint = Unipointer.getPointerPoint( pointer );\n var boundingRect = this.tapElement.getBoundingClientRect();\n var scrollX = window.pageXOffset;\n var scrollY = window.pageYOffset;\n // calculate if pointer is inside tapElement\n var isInside = pointerPoint.x >= boundingRect.left + scrollX &&\n pointerPoint.x <= boundingRect.right + scrollX &&\n pointerPoint.y >= boundingRect.top + scrollY &&\n pointerPoint.y <= boundingRect.bottom + scrollY;\n // trigger callback if pointer is inside element\n if ( isInside ) {\n this.emitEvent( 'tap', [ event, pointer ] );\n }\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 var _this = this;\n setTimeout( function() {\n delete _this.isIgnoringMouseUp;\n }, 400 );\n }\n};\n\nproto.destroy = function() {\n this.pointerDone();\n this.unbindTap();\n};\n\n// ----- ----- //\n\nreturn TapListener;\n\n}));\n\n// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/prev-next-button',[\n './flickity',\n 'tap-listener/tap-listener',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, TapListener, utils ) {\n return factory( window, Flickity, TapListener, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('tap-listener'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.TapListener,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, TapListener, 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( TapListener.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.on( 'tap', this.onTap );\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.bindTap( this.element );\n // click events from keyboard\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 // do regular TapListener destroy\n TapListener.prototype.destroy.call( this );\n // click events from keyboard\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.onTap = 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\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function( event ) {\n // only allow clicks from keyboard\n var focused = document.activeElement;\n if ( focused && focused == this.element ) {\n this.onTap( event, event );\n }\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};\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\n// page dots\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/page-dots',[\n './flickity',\n 'tap-listener/tap-listener',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, TapListener, utils ) {\n return factory( window, Flickity, TapListener, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('tap-listener'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.TapListener,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, TapListener, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n\n\nfunction PageDots( parent ) {\n this.parent = parent;\n this._create();\n}\n\nPageDots.prototype = new TapListener();\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.on( 'tap', this.onTap );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n this.setDots();\n this.bindTap( this.holder );\n // add to DOM\n this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n // remove from DOM\n this.parent.element.removeChild( this.holder );\n TapListener.prototype.destroy.call( this );\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 = 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};\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\n// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/player',[\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\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\n// add, remove cell\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/add-remove-cell',[\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\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n var fragment = document.createDocumentFragment();\n cells.forEach( function( cell ) {\n fragment.appendChild( cell.element );\n });\n return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {Element, Array, NodeList} elems\n * @param {Integer} index\n */\nproto.insert = function( elems, index ) {\n var cells = this._makeCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n var len = this.cells.length;\n // default to append\n index = index === undefined ? len : index;\n // add cells with document fragment\n var fragment = getCellsFragment( cells );\n // append to slider\n var isAppend = index == len;\n if ( isAppend ) {\n this.slider.appendChild( fragment );\n } else {\n var insertCellElement = this.cells[ index ].element;\n this.slider.insertBefore( fragment, insertCellElement );\n }\n // add to this.cells\n if ( index === 0 ) {\n // prepend, add to start\n this.cells = cells.concat( this.cells );\n } else if ( isAppend ) {\n // append, add to end\n this.cells = this.cells.concat( cells );\n } else {\n // insert in this.cells\n var endCells = this.cells.splice( index, len - index );\n this.cells = this.cells.concat( cells ).concat( endCells );\n }\n\n this._sizeCells( cells );\n this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {Element, Array, NodeList} elems\n */\nproto.remove = function( elems ) {\n var cells = this.getCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n\n var minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( function( cell ) {\n cell.remove();\n var index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n }, this );\n\n this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n var cell = this.getCell( elem );\n if ( !cell ) {\n return;\n }\n cell.getSize();\n\n var index = this.cells.indexOf( cell );\n this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n var prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._getWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex\n // try to maintain position & select previous selected element\n var cell = this.getCell( prevSelectedElem );\n if ( cell ) {\n this.selectedIndex = this.getCellSlideIndex( cell );\n }\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n this.emitEvent( 'cellChange', [ changedCellIndex ] );\n // position slider\n this.select( this.selectedIndex );\n // do not position slider after lazy load\n if ( isPositioningSlider ) {\n this.positionSliderAtSelected();\n }\n};\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n\n// lazyload\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/lazyload',[\n './flickity',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, utils ) {\n'use strict';\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n var lazyLoad = this.options.lazyLoad;\n if ( !lazyLoad ) {\n return;\n }\n // get adjacent cells, use lazyLoad option for adjacent count\n var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n var cellElems = this.getAdjacentCellElements( adjCount );\n // get lazy images in those cells\n var lazyImages = [];\n cellElems.forEach( function( cellElem ) {\n var lazyCellImages = getCellLazyImages( cellElem );\n lazyImages = lazyImages.concat( lazyCellImages );\n });\n // load lazy images\n lazyImages.forEach( function( img ) {\n new LazyLoader( img, this );\n }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n // check if cell element is lazy image\n if ( cellElem.nodeName == 'IMG' ) {\n var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n return [ cellElem ];\n }\n }\n // select lazy images in cell\n var lazySelector = 'img[data-flickity-lazyload], ' +\n 'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n var imgs = cellElem.querySelectorAll( lazySelector );\n return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n */\nfunction LazyLoader( img, flickity ) {\n this.img = img;\n this.flickity = flickity;\n this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n // get src & srcset\n var src = this.img.getAttribute('data-flickity-lazyload') ||\n this.img.getAttribute('data-flickity-lazyload-src');\n var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n // set src & serset\n this.img.src = src;\n if ( srcset ) {\n this.img.setAttribute( 'srcset', srcset );\n }\n // remove attr\n this.img.removeAttribute('data-flickity-lazyload');\n this.img.removeAttribute('data-flickity-lazyload-src');\n this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n // unbind events\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n\n var cell = this.flickity.getParentCell( this.img );\n var cellElem = cell && cell.element;\n this.flickity.cellSizeChange( cellElem );\n\n this.img.classList.add( className );\n this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// ----- ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n}));\n\n/*!\n * Flickity v2.1.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-2018 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/index',[\n './flickity',\n './drag',\n './prev-next-button',\n './page-dots',\n './player',\n './add-remove-cell',\n './lazyload'\n ], factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./flickity'),\n require('./drag'),\n require('./prev-next-button'),\n require('./page-dots'),\n require('./player'),\n require('./add-remove-cell'),\n require('./lazyload')\n );\n }\n\n})( window, function factory( Flickity ) {\n /*jshint strict: false*/\n return Flickity;\n});\n\n/*!\n * Flickity asNavFor v2.0.1\n * enable asNavFor for Flickity\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 if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity-as-nav-for/as-nav-for',[\n 'flickity/js/index',\n 'fizzy-ui-utils/utils'\n ], factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = factory(\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( Flickity, utils ) {\n\n\n\n// -------------------------- asNavFor prototype -------------------------- //\n\n// Flickity.defaults.asNavFor = null;\n\nFlickity.createMethods.push('_createAsNavFor');\n\nvar proto = Flickity.prototype;\n\nproto._createAsNavFor = function() {\n this.on( 'activate', this.activateAsNavFor );\n this.on( 'deactivate', this.deactivateAsNavFor );\n this.on( 'destroy', this.destroyAsNavFor );\n\n var asNavForOption = this.options.asNavFor;\n if ( !asNavForOption ) {\n return;\n }\n // HACK do async, give time for other flickity to be initalized\n var _this = this;\n setTimeout( function initNavCompanion() {\n _this.setNavCompanion( asNavForOption );\n });\n};\n\nproto.setNavCompanion = function( elem ) {\n elem = utils.getQueryElement( elem );\n var companion = Flickity.data( elem );\n // stop if no companion or companion is self\n if ( !companion || companion == this ) {\n return;\n }\n\n this.navCompanion = companion;\n // companion select\n var _this = this;\n this.onNavCompanionSelect = function() {\n _this.navCompanionSelect();\n };\n companion.on( 'select', this.onNavCompanionSelect );\n // click\n this.on( 'staticClick', this.onNavStaticClick );\n\n this.navCompanionSelect( true );\n};\n\nproto.navCompanionSelect = function( isInstant ) {\n if ( !this.navCompanion ) {\n return;\n }\n // select slide that matches first cell of slide\n var selectedCell = this.navCompanion.selectedCells[0];\n var firstIndex = this.navCompanion.cells.indexOf( selectedCell );\n var lastIndex = firstIndex + this.navCompanion.selectedCells.length - 1;\n var selectIndex = Math.floor( lerp( firstIndex, lastIndex,\n this.navCompanion.cellAlign ) );\n this.selectCell( selectIndex, false, isInstant );\n // set nav selected class\n this.removeNavSelectedElements();\n // stop if companion has more cells than this one\n if ( selectIndex >= this.cells.length ) {\n return;\n }\n\n var selectedCells = this.cells.slice( firstIndex, lastIndex + 1 );\n this.navSelectedElements = selectedCells.map( function( cell ) {\n return cell.element;\n });\n this.changeNavSelectedClass('add');\n};\n\nfunction lerp( a, b, t ) {\n return ( b - a ) * t + a;\n}\n\nproto.changeNavSelectedClass = function( method ) {\n this.navSelectedElements.forEach( function( navElem ) {\n navElem.classList[ method ]('is-nav-selected');\n });\n};\n\nproto.activateAsNavFor = function() {\n this.navCompanionSelect( true );\n};\n\nproto.removeNavSelectedElements = function() {\n if ( !this.navSelectedElements ) {\n return;\n }\n this.changeNavSelectedClass('remove');\n delete this.navSelectedElements;\n};\n\nproto.onNavStaticClick = function( event, pointer, cellElement, cellIndex ) {\n if ( typeof cellIndex == 'number' ) {\n this.navCompanion.selectCell( cellIndex );\n }\n};\n\nproto.deactivateAsNavFor = function() {\n this.removeNavSelectedElements();\n};\n\nproto.destroyAsNavFor = function() {\n if ( !this.navCompanion ) {\n return;\n }\n this.navCompanion.off( 'select', this.onNavCompanionSelect );\n this.off( 'staticClick', this.onNavStaticClick );\n delete this.navCompanion;\n};\n\n// ----- ----- //\n\nreturn Flickity;\n\n}));\n\n/*!\n * imagesLoaded v4.1.4\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) { 'use strict';\n // universal module definition\n\n /*global define: false, module: false, require: false */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'imagesloaded/imagesloaded',[\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.imagesLoaded = factory(\n window,\n window.EvEmitter\n );\n }\n\n})( typeof window !== 'undefined' ? window : this,\n\n// -------------------------- factory -------------------------- //\n\nfunction factory( window, EvEmitter ) {\n\n\n\nvar $ = window.jQuery;\nvar console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// extend objects\nfunction extend( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n}\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\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// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {Array, Element, NodeList, String} elem\n * @param {Object or Function} options - if function, use as callback\n * @param {Function} onAlways - callback function\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n if ( !( this instanceof ImagesLoaded ) ) {\n return new ImagesLoaded( elem, options, onAlways );\n }\n // use elem as selector string\n var queryElem = elem;\n if ( typeof elem == 'string' ) {\n queryElem = document.querySelectorAll( elem );\n }\n // bail if bad element\n if ( !queryElem ) {\n console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );\n return;\n }\n\n this.elements = makeArray( queryElem );\n this.options = extend( {}, this.options );\n // shift arguments if no options set\n if ( typeof options == 'function' ) {\n onAlways = options;\n } else {\n extend( this.options, options );\n }\n\n if ( onAlways ) {\n this.on( 'always', onAlways );\n }\n\n this.getImages();\n\n if ( $ ) {\n // add jQuery Deferred object\n this.jqDeferred = new $.Deferred();\n }\n\n // HACK check async to allow time to bind listeners\n setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.options = {};\n\nImagesLoaded.prototype.getImages = function() {\n this.images = [];\n\n // filter & find items if we have an item selector\n this.elements.forEach( this.addElementImages, this );\n};\n\n/**\n * @param {Node} element\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n // filter siblings\n if ( elem.nodeName == 'IMG' ) {\n this.addImage( elem );\n }\n // get background image on element\n if ( this.options.background === true ) {\n this.addElementBackgroundImages( elem );\n }\n\n // find children\n // no non-element nodes, #143\n var nodeType = elem.nodeType;\n if ( !nodeType || !elementNodeTypes[ nodeType ] ) {\n return;\n }\n var childImgs = elem.querySelectorAll('img');\n // concat childElems to filterFound array\n for ( var i=0; i < childImgs.length; i++ ) {\n var img = childImgs[i];\n this.addImage( img );\n }\n\n // get child background images\n if ( typeof this.options.background == 'string' ) {\n var children = elem.querySelectorAll( this.options.background );\n for ( i=0; i < children.length; i++ ) {\n var child = children[i];\n this.addElementBackgroundImages( child );\n }\n }\n};\n\nvar elementNodeTypes = {\n 1: true,\n 9: true,\n 11: true\n};\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n return;\n }\n // get url inside url(\"...\")\n var reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n var matches = reURL.exec( style.backgroundImage );\n while ( matches !== null ) {\n var url = matches && matches[2];\n if ( url ) {\n this.addBackground( url, elem );\n }\n matches = reURL.exec( style.backgroundImage );\n }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n var loadingImage = new LoadingImage( img );\n this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n var background = new Background( url, elem );\n this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n var _this = this;\n this.progressedCount = 0;\n this.hasAnyBroken = false;\n // complete if no images\n if ( !this.images.length ) {\n this.complete();\n return;\n }\n\n function onProgress( image, elem, message ) {\n // HACK - Chrome triggers event before object properties have changed. #83\n setTimeout( function() {\n _this.progress( image, elem, message );\n });\n }\n\n this.images.forEach( function( loadingImage ) {\n loadingImage.once( 'progress', onProgress );\n loadingImage.check();\n });\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n this.progressedCount++;\n this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n // progress event\n this.emitEvent( 'progress', [ this, image, elem ] );\n if ( this.jqDeferred && this.jqDeferred.notify ) {\n this.jqDeferred.notify( this, image );\n }\n // check if completed\n if ( this.progressedCount == this.images.length ) {\n this.complete();\n }\n\n if ( this.options.debug && console ) {\n console.log( 'progress: ' + message, image, elem );\n }\n};\n\nImagesLoaded.prototype.complete = function() {\n var eventName = this.hasAnyBroken ? 'fail' : 'done';\n this.isComplete = true;\n this.emitEvent( eventName, [ this ] );\n this.emitEvent( 'always', [ this ] );\n if ( this.jqDeferred ) {\n var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n this.jqDeferred[ jqMethod ]( this );\n }\n};\n\n// -------------------------- -------------------------- //\n\nfunction LoadingImage( img ) {\n this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n // If complete is true and browser supports natural sizes,\n // try to check for image status manually.\n var isComplete = this.getIsImageComplete();\n if ( isComplete ) {\n // report based on naturalWidth\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n return;\n }\n\n // If none of the checks above matched, simulate loading on detached element.\n this.proxyImage = new Image();\n this.proxyImage.addEventListener( 'load', this );\n this.proxyImage.addEventListener( 'error', this );\n // bind to image as well for Firefox. #191\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n this.proxyImage.src = this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n // check for non-zero, non-undefined naturalWidth\n // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n this.isLoaded = isLoaded;\n this.emitEvent( 'progress', [ this, this.img, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nLoadingImage.prototype.onload = function() {\n this.confirm( true, 'onload' );\n this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n this.confirm( false, 'onerror' );\n this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n this.proxyImage.removeEventListener( 'load', this );\n this.proxyImage.removeEventListener( 'error', this );\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n this.url = url;\n this.element = element;\n this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n this.img.src = this.url;\n // check if image is already complete\n var isComplete = this.getIsImageComplete();\n if ( isComplete ) {\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n this.unbindEvents();\n }\n};\n\nBackground.prototype.unbindEvents = function() {\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n this.isLoaded = isLoaded;\n this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n jQuery = jQuery || window.jQuery;\n if ( !jQuery ) {\n return;\n }\n // set local variable\n $ = jQuery;\n // $().imagesLoaded()\n $.fn.imagesLoaded = function( options, callback ) {\n var instance = new ImagesLoaded( this, options, callback );\n return instance.jqDeferred.promise( $(this) );\n };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// -------------------------- -------------------------- //\n\nreturn ImagesLoaded;\n\n});\n\n/*!\n * Flickity imagesLoaded v2.0.0\n * enables imagesLoaded option for Flickity\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'flickity/js/index',\n 'imagesloaded/imagesloaded'\n ], function( Flickity, imagesLoaded ) {\n return factory( window, Flickity, imagesLoaded );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('flickity'),\n require('imagesloaded')\n );\n } else {\n // browser global\n window.Flickity = factory(\n window,\n window.Flickity,\n window.imagesLoaded\n );\n }\n\n}( window, function factory( window, Flickity, imagesLoaded ) {\n'use strict';\n\nFlickity.createMethods.push('_createImagesLoaded');\n\nvar proto = Flickity.prototype;\n\nproto._createImagesLoaded = function() {\n this.on( 'activate', this.imagesLoaded );\n};\n\nproto.imagesLoaded = function() {\n if ( !this.options.imagesLoaded ) {\n return;\n }\n var _this = this;\n function onImagesLoadedProgress( instance, image ) {\n var cell = _this.getParentCell( image.img );\n _this.cellSizeChange( cell && cell.element );\n if ( !_this.options.freeScroll ) {\n _this.positionSliderAtSelected();\n }\n }\n imagesLoaded( this.slider ).on( 'progress', onImagesLoadedProgress );\n};\n\nreturn Flickity;\n\n}));\n\n"]}