origin33/app/html/js/akamai-viewer.js.map

1 line
444 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["akamai-viewer.es2015"],"names":["global","time","Date","now","desiredFrames","millisecondsPerSecond","running","counter","core","effect","Animate","requestAnimationFrame","requestFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","isNative","test","toString","callback","root","TARGET_FPS","requests","requestCount","rafHandle","intervalHandle","lastActive","callbackHandle","setInterval","currentRequests","key","hasOwnProperty","clearInterval","stop","id","cleared","isRunning","start","stepCallback","verifyCallback","completedCallback","duration","easingMethod","lastFrame","percent","dropCounter","document","body","newRunning","usedId","step","virtual","render","droppedFrames","Math","round","j","min","value","Scroller","options","__callback","scrollingX","scrollingY","animating","animationDuration","bouncing","locking","paging","snapping","zooming","minZoom","maxZoom","easeOutCubic","pos","pow","easeInOutCubic","members","__isSingleTouch","__isTracking","__isGesturing","__isDragging","__isDecelerating","__isAnimating","__clientLeft","__clientTop","__clientWidth","__clientHeight","__contentWidth","__contentHeight","__snapWidth","__snapHeight","__refreshHeight","__refreshActive","__refreshActivate","__refreshDeactivate","__refreshStart","__zoomLevel","__scrollLeft","__scrollTop","__maxScrollLeft","__maxScrollTop","__scheduledLeft","__scheduledTop","__scheduledZoom","__lastTouchLeft","__lastTouchTop","__lastTouchMove","__positions","__minDecelerationScrollLeft","__minDecelerationScrollTop","__maxDecelerationScrollLeft","__maxDecelerationScrollTop","__decelerationVelocityX","__decelerationVelocityY","setDimensions","clientWidth","clientHeight","contentWidth","contentHeight","self","__computeScrollMax","scrollTo","setPosition","left","top","setSnapSize","width","height","activatePullToRefresh","activateCallback","deactivateCallback","startCallback","finishPullToRefresh","getValues","zoom","getScrollMax","zoomTo","level","animate","originLeft","originTop","Error","oldLevel","max","__publish","zoomBy","factor","scrollBy","startLeft","startTop","doMouseZoom","wheelDelta","timeStamp","pageX","pageY","change","doTouchStart","touches","length","valueOf","currentTouchLeft","currentTouchTop","isSingleTouch","abs","__initialTouchLeft","__initialTouchTop","__zoomLevelStart","__lastScale","__enableScrollX","__enableScrollY","doTouchMove","scale","positions","moveX","moveY","scrollLeft","scrollTop","currentTouchLeftRel","currentTouchTopRel","maxScrollLeft","maxScrollTop","splice","push","minimumTrackingForScroll","minimumTrackingForDrag","distanceX","distanceY","doTouchEnd","endPos","startPos","i","timeOffset","movedLeft","movedTop","minVelocityToStartDeceleration","__startDeceleration","wasAnimating","oldLeft","oldTop","oldZoom","diffLeft","diffTop","diffZoom","verify","completed","renderedFramesPerSecond","animationId","wasFinished","zoomLevel","floor","ceil","__stepThroughDeceleration","minVelocityToKeepDecelerating","scrollLeftFixed","scrollTopFixed","frictionFactor","scrollOutsideX","scrollOutsideY","penetrationDeceleration","penetrationAcceleration","prototype","factory","define","amd","module","exports","win","window","doc","shoestring","prim","sec","pType","ret","sel","Shoestring","call","ready","constructor","indexOf","dfrag","createElement","innerHTML","children","each","removeChild","find","querySelectorAll","Object","NodeList","Array","selector","merge","reverse","fn","extend","first","second","len","ajax","url","params","req","XMLHttpRequest","settings","data","encodeURIComponent","method","open","async","setRequestHeader","headers","onreadystatechange","readyState","res","responseText","replace","status","cancel","match","RegExp","$1","error","success","send","get","load","args","arguments","intCB","html","apply","post","collection","val","il","inArray","needle","haystack","isin","readyQueue","runReady","shift","attachEvent","addEventListener","is","parents","check","_checkElements","parent","e","needles","name","undefined","shoestringData","removeData","$","addClass","className","classes","split","add","after","fragment","nodeType","jl","insertEl","cloneNode","parentNode","insertBefore","nextSibling","append","appendChild","appendTo","attr","nameStr","setAttribute","getAttribute","before","childs","clone","closest","element","$self","parentElement","cssExceptions","convertPropertyName","str","character","toUpperCase","_getStyle","property","getComputedStyle","getPropertyValue","vendorPrefixes","convert","k","_setStyle","convertedProperty","style","css","eq","index","filter","wsel","context","createDocumentFragment","finds","concat","elements","_dimension","set","offsetName","letter","h","l","outerHTML","pile","_getIndex","result","item","documentElement","childNodes","insertAfter","last","next","found","not","offset","offsetTop","offsetLeft","curr","prepend","firstChild","prependTo","prev","prevAll","$previous","propFix","contenteditable","readonly","tabindex","prop","removeAttr","removeAttribute","removeClass","cname","newClassName","regex","remove","removeProp","replaceWith","replaceChild","inputTypes","inputTypeTest","join","serialize","type","checked","nodeName","selectedIndex","nodeValue","siblings","sibs","el","getText","elem","node","textContent","text","tagName","optionSet","option","values","newIndex","selected","wrapInner","inH","initEventCache","evt","events","loop","addToEventCache","eventInfo","obj","isCustomEvent","callfunc","originalCallback","namespace","customEventLoop","bind","evts","encasedCallback","triggeredElement","_namespace","returnTrue","isDefaultPrevented","originalPreventDefault","preventDefault","preventDefaultConstructor","returnValue","target","srcElement","stopPropagation","cancelBubble","_args","domEventCallback","customEventCallback","oEl","originalEvent","ssEventTrigger","on","unbind","event","unbindAll","bound","matched","removeEventListener","evtKey","off","one","thisevt","cbs","$t","triggerHandler","createEvent","bindings","initEvent","unshift","trigger","click","dispatchEvent","jQuery","Akamai","componentNamespace","$window","$doc","ns","Function","Tau","startIndex","reducedStepSize","$element","$initial","$loading","frames","parseInt","stepSize","autoRotateStartDelay","autoplay","delay","mouseMoveBinding","rotateEvent","touchMoveBinding","path","Path","$render","canvas","getContext","canvasCtx","clearTimeout","canvasResizeTimeout","setTimeout","renderCanvas","controls","play","right","createControls","createImages","enabled","autostartTimeout","autoRotate","autoRotateTraversalTime","verticalScrollRatio","maxVelocity","$controls","controlAnchorMarkup","arrows","onControlDown","onControlUp","$link","stopAutoRotate","autoInterval","delta","goto","$next","normalizedIndex","imageCount","$images","tauImageLoaded","showLoading","$current","$img","img","naturalWidth","naturalHeight","parentWidth","calcHeight","complete","drawImage","src","$new","boundImageLoaded","loadedCount","markImageLoaded","template","imgs","imageLoaded","initTriggered","hideLoading","initialized","track","autoRotateDelay","interval","point","tracking","release","reset","cursorGrab","defaultThreshold","rotateThreshold","sensitivity","getPoint","downX","x","downY","y","downIndex","slow","isSufficient","clearSlowInterval","rotate","velocity","decelVal","decelTimeStep","slowInterval","decel","sign","cursorRelease","touch","clientX","clientY","deltaX","deltaY","record","getTime","prevPoint","prevPrevPoint","distance","prevTime","prevPrevTime","timeStep","Util","preflight","_$el","_dataAttr","_options","defaultOptions","_originalOptions","mapEvents","component","init","constr","existing","_trigger","toLowerCase","createMany","mapping","_componentEventMapping","mappedTo","to","$el","mapEvent","from","$comps","objects","propRequired","msg","componentName","fullEvent","camelToKabob","string","m","defaults","dataAttrOptions","cloneDefaults","getDataAttrOptions","finalOptions","setDataAttrOptions","prefix","dashedProp","currentDataProp","subDefaults","newPrefix","subConfig","coerceAttrVal","setDataAttrOptionsPrefix","subOptions","parseFloat","deep","copy","copyIsArray","isPlainObject","proto","Ctor","rtrim","trim","map","array","reduce","acc","log","console","mapJSONVals","o","escapeJSONVals","escapeHTML","entityMap","String","fromEntityMap","s","Advanceable","extension","getIndex","previous","Sourceable","_srcArray","includeW","policy","thumbnail","widthParam","widths","w","_srcset","_fallbackSrc","_largestSrc","pop","extendStatic","raf","toss","tossing","sLeft","sTop","op","easing","finished","endLeft","endTop","startTime","endTime","run","curTime","tossingElems","state","t","b","c","d","pluginName","optionsOrMethod","pluginArgs","scrollListening","testProp","snapSupported","CSS","supports","itemsAtOffset","$childNodes","containWidth","activeItems","outerWidth","$elem","outerHeight","snapEvent","activeSlides","nothrow","overthrow","innerResult","addNextPrev","autoTimeout","$slider","enhancedClass","$itemsContain","$items","numItems","$nav","navSelectedClass","useDeepLinking","slice","itemWidth","snapScroll","updateWidths","$navInner","getAutoplayInterval","autoTiming","parseError","itemsContainStyle","itemStyle","sliderWidth","computed","itemLeftMargin","itemRightMargin","outerItemWidth","iPercentWidth","iPercentRightMargin","iPercentLeftMargin","outerPercentWidth","percentAsWidth","percentAsRightMargin","percentAsLeftMargin","$nextprev","$nextprevContain","slideID","arrowNavigate","$slide","history","replaceState","title","keyCode","stopImmediatePropagation","snapScrollCancelled","isTouched","currScroll","roundedScroll","maxScroll","startSlide","afterResize","snapStay","forward","scrollNav","lastActiveItem","activeItem","force","currTime","navWidth","navHeight","activeIndex","activeChild","thumbX","thumbY","scrollStop","scrolling","lastScroll","timeout","enlarge","button","hoverZoomWithoutClick","flyout","placement","magnification","internalResult","testimg","srcsetSupported","srcsetSizesSupported","$anchor","initialImg","targetImg","imgOriginalSrc","srcset","imgOriginalSizes","imgZoomSrc","href","initialText","innerText","zoomClass","delayClass","$contain","$zoomContain","$parentPane","$zoomParent","zoomed","lockZoomClass","standardToggleZoom","updatePlacement","$flyout","positionFlyout","flyoutSide","loupe","disable","disabled","opts","hoverEnabled","image","sizes","toggleImgSrc","addLoader","toggleZoomState","zoomimg","Image","onload","imgZoomWidth","scrollToCenter","pw","ph","offsetWidth","offsetHeight","toggleLockZoom","lockedZoom","focus","toggleImgZoom","forceInlineMode","oldO","resetPlacement","trackingOn","trackingTimer","mouseEntered","touchStarted","lastMouseMove","startTrackingDelay","scrollWithMouse","stopTrackingDelay","ev","getBoundingClientRect","mLeft","mTop","containHeight","containScrollWidth","containScrollHeight","zoomContainWidth","zoomContainHeight","widthFactor","heightFactor","defaultConfig","Spin360","_comp","_updateOptions","_renderImg","images","json","alt","urls","pause","getElement","States","Playing","Paused","getState","MagnifierImpl","updateOptions","zoomIn","zoomOut","isMagnified","toggleZoom","dataAttr","fallbackSrc","largestSrc","srcSet","ex","MagnifierImplEnlarge","create","buttonText","ClickTracker","handler","onDown","isDown","down","timestamp","onMove","isMoved","onUp","up","Infinity","MagnifierImplScroller","_container","_content","_imgCast","_zoomInBtn","_zoomOutBtn","_magnification","scroller","_renderer","rect","clientLeft","clientTop","_installEventHandlers","_updateButtonStates","_onResize","_zoomBy","incrementalZoomFactor","cyclicZoom","zoomInBtnText","zoomOutBtnText","Number","animateZoom","_onZoom","oldMagnification","toFixed","docStyle","engine","opera","navigator","cpuClass","vendorPrefix","trident","gecko","webkit","presto","helperElem","undef","perspectiveProperty","transformProperty","marginLeft","marginTop","clickTracker","changedTouches","Magnifier","mode","MODE_ANIMATED_ZOOM","_impl","MODE_HOVER_ZOOM","impl","in","out","toggle","VideoImpl","VideoImplPristine","Video","poster","mime","attrs","muted","VideoImplIm","_validateOptions","isArray","some","size","isNaN","viewPortWidth","innerWidth","joiner","_$videoElement","_videoElement","_unsupportedAPI","_unsupported","_setState","paused","_createPlayButton","MODE_IM","MODE_PRISTINE","_state","seek","newTime","currentTime","setLoop","videoPlayButton","videoWrapper","video","insertAdjacentHTML","classList","Carousel","_spins","spin360","_magnifiers","magnifier","_videos","snapper","_setAspectRatio","_bindAspectAttributes","slideshow","autostart","startSlideshow","_activeItemAttributes","_handleAutoplayables","_stopSlideshowEvents","stopSlideshow","isParentActive","comp","activeItemAttr","forEach","_carouselWasPlaying","update","aspectratio","renderMapping","_typeMapping","_uniqueItemId","_renderItem","mappedType","_renderThumbnailAnchor","thumbUrl","altText","_thumbUrl","_renderThumbnails","_setAspectAttributes","orientationAttr","loadBound","$item","$loadable","loadBinding","carouselOptions","templateAttrs","getSpin360s","getMagnifiers","getVideos","_itemAttr","_activeItemAttr","attrAllItems","attrActiveItem","_slideshowTimer","refresh","Fullscreen","_init","_$fullscreen","addButton","_fullscreenApiKeys","_keys","native","_useNativeApi","_fullscreenFallbackEnabled","_$placeholder","_isFullscreen","addEvents","btn","btnContainer","enterBtn","exitBtn","active","fallback","_$widthAdjust","_$buttonContainer","$target","enter","exit","onchange","_exit","code","which","_keyLookup","keys","_maximizePlacement","_restorePlacement","_adjustWidth","widthSmall","heightSmall","viewportWidth","screen","viewportHeight","innerHeight","widthBig","_revertWidth","Viewer","_carousels","isFullscreen","_updateSizesOptions","_onResizeComplete","carousel","_extendCarouselOptions","_withData","_checkJSONUrls","items","_tagMapping","_tagSplit","_fullscreen","fullscreen","_resolveBreakpointOptions","_setBreakpoints","localUpdateOnly","elWidth","fail","uri","_exceedsLimit","JSON","parse","kb","stringify","limit","_breakpoints","_reduceBreakpoints","breakpoints","_fullscreenBreakpoints","fullscreenBreakpoints","_bindBreakpoints","bps","bp","sort","a","_bindMatchMedia","cbtimer","minWidth","maxWidth","matchMedia","query","initList","addListener","_mediaMatch","list","ignoreDefault","matches","resolvedOptions","_getCurrentMinWidth","bpConfig","cloned","ptions","clonedCarousel","hostnames","_urlHostnameMatch","parser","hostname","location","defaultTag","renderAll","tags","tag","def","tagMapping","_firstRenderTag","_tagAttr","_renderTag","unwrapped","childMarkup","datum","wrapped","getCarousels","switchTag","getTags","$taggedViewer","$markup","$imgs","imgCount","loaded","carousels","_showViewer","$viewer","_tags","akamaiViewer"],"mappings":"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","file":"akamai-viewer.js","sourcesContent":["/*! Copyright 2019, Akamai Technologies, Inc. All Rights Reserved. akamai-viewer-0.7.2 *//**\n * Generic animation class with support for dropped frames both optional easing and duration.\n *\n * Optional duration is useful when the lifetime is defined by another condition than time\n * e.g. speed of an animating object, etc.\n *\n * Dropped frame logic allows to keep using the same updater logic independent from the actual\n * rendering. This eases a lot of cases where it might be pretty complex to break down a state\n * based on the pure time difference.\n */\n(function(global) {\n\tvar time = Date.now || function() {\n\t\treturn +new Date();\n\t};\n\tvar desiredFrames = 60;\n\tvar millisecondsPerSecond = 1000;\n\tvar running = {};\n\tvar counter = 1;\n\n\t// Create namespaces\n\tif (!global.core) {\n\t\tglobal.core = { effect : {} };\n\n\t} else if (!core.effect) {\n\t\tcore.effect = {};\n\t}\n\n\tcore.effect.Animate = {\n\n\t\t/**\n\t\t * A requestAnimationFrame wrapper / polyfill.\n\t\t *\n\t\t * @param callback {Function} The callback to be invoked before the next repaint.\n\t\t * @param root {HTMLElement} The root element for the repaint\n\t\t */\n\t\trequestAnimationFrame: (function() {\n\n\t\t\t// Check for request animation Frame support\n\t\t\tvar requestFrame = global.requestAnimationFrame || global.webkitRequestAnimationFrame || global.mozRequestAnimationFrame || global.oRequestAnimationFrame;\n\t\t\tvar isNative = !!requestFrame;\n\n\t\t\tif (requestFrame && !/requestAnimationFrame\\(\\)\\s*\\{\\s*\\[native code\\]\\s*\\}/i.test(requestFrame.toString())) {\n\t\t\t\tisNative = false;\n\t\t\t}\n\n\t\t\tif (isNative) {\n\t\t\t\treturn function(callback, root) {\n\t\t\t\t\trequestFrame(callback, root)\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar TARGET_FPS = 60;\n\t\t\tvar requests = {};\n\t\t\tvar requestCount = 0;\n\t\t\tvar rafHandle = 1;\n\t\t\tvar intervalHandle = null;\n\t\t\tvar lastActive = +new Date();\n\n\t\t\treturn function(callback, root) {\n\t\t\t\tvar callbackHandle = rafHandle++;\n\n\t\t\t\t// Store callback\n\t\t\t\trequests[callbackHandle] = callback;\n\t\t\t\trequestCount++;\n\n\t\t\t\t// Create timeout at first request\n\t\t\t\tif (intervalHandle === null) {\n\n\t\t\t\t\tintervalHandle = setInterval(function() {\n\n\t\t\t\t\t\tvar time = +new Date();\n\t\t\t\t\t\tvar currentRequests = requests;\n\n\t\t\t\t\t\t// Reset data structure before executing callbacks\n\t\t\t\t\t\trequests = {};\n\t\t\t\t\t\trequestCount = 0;\n\n\t\t\t\t\t\tfor(var key in currentRequests) {\n\t\t\t\t\t\t\tif (currentRequests.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\tcurrentRequests[key](time);\n\t\t\t\t\t\t\t\tlastActive = time;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Disable the timeout when nothing happens for a certain\n\t\t\t\t\t\t// period of time\n\t\t\t\t\t\tif (time - lastActive > 2500) {\n\t\t\t\t\t\t\tclearInterval(intervalHandle);\n\t\t\t\t\t\t\tintervalHandle = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}, 1000 / TARGET_FPS);\n\t\t\t\t}\n\n\t\t\t\treturn callbackHandle;\n\t\t\t};\n\n\t\t})(),\n\n\n\t\t/**\n\t\t * Stops the given animation.\n\t\t *\n\t\t * @param id {Integer} Unique animation ID\n\t\t * @return {Boolean} Whether the animation was stopped (aka, was running before)\n\t\t */\n\t\tstop: function(id) {\n\t\t\tvar cleared = running[id] != null;\n\t\t\tif (cleared) {\n\t\t\t\trunning[id] = null;\n\t\t\t}\n\n\t\t\treturn cleared;\n\t\t},\n\n\n\t\t/**\n\t\t * Whether the given animation is still running.\n\t\t *\n\t\t * @param id {Integer} Unique animation ID\n\t\t * @return {Boolean} Whether the animation is still running\n\t\t */\n\t\tisRunning: function(id) {\n\t\t\treturn running[id] != null;\n\t\t},\n\n\n\t\t/**\n\t\t * Start the animation.\n\t\t *\n\t\t * @param stepCallback {Function} Pointer to function which is executed on every step.\n\t\t * Signature of the method should be `function(percent, now, virtual) { return continueWithAnimation; }`\n\t\t * @param verifyCallback {Function} Executed before every animation step.\n\t\t * Signature of the method should be `function() { return continueWithAnimation; }`\n\t\t * @param completedCallback {Function}\n\t\t * Signature of the method should be `function(droppedFrames, finishedAnimation) {}`\n\t\t * @param duration {Integer} Milliseconds to run the animation\n\t\t * @param easingMethod {Function} Pointer to easing function\n\t\t * Signature of the method should be `function(percent) { return modifiedValue; }`\n\t\t * @param root {Element ? document.body} Render root, when available. Used for internal\n\t\t * usage of requestAnimationFrame.\n\t\t * @return {Integer} Identifier of animation. Can be used to stop it any time.\n\t\t */\n\t\tstart: function(stepCallback, verifyCallback, completedCallback, duration, easingMethod, root) {\n\n\t\t\tvar start = time();\n\t\t\tvar lastFrame = start;\n\t\t\tvar percent = 0;\n\t\t\tvar dropCounter = 0;\n\t\t\tvar id = counter++;\n\n\t\t\tif (!root) {\n\t\t\t\troot = document.body;\n\t\t\t}\n\n\t\t\t// Compacting running db automatically every few new animations\n\t\t\tif (id % 20 === 0) {\n\t\t\t\tvar newRunning = {};\n\t\t\t\tfor (var usedId in running) {\n\t\t\t\t\tnewRunning[usedId] = true;\n\t\t\t\t}\n\t\t\t\trunning = newRunning;\n\t\t\t}\n\n\t\t\t// This is the internal step method which is called every few milliseconds\n\t\t\tvar step = function(virtual) {\n\n\t\t\t\t// Normalize virtual value\n\t\t\t\tvar render = virtual !== true;\n\n\t\t\t\t// Get current time\n\t\t\t\tvar now = time();\n\n\t\t\t\t// Verification is executed before next animation step\n\t\t\t\tif (!running[id] || (verifyCallback && !verifyCallback(id))) {\n\n\t\t\t\t\trunning[id] = null;\n\t\t\t\t\tcompletedCallback && completedCallback(desiredFrames - (dropCounter / ((now - start) / millisecondsPerSecond)), id, false);\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\t// For the current rendering to apply let's update omitted steps in memory.\n\t\t\t\t// This is important to bring internal state variables up-to-date with progress in time.\n\t\t\t\tif (render) {\n\n\t\t\t\t\tvar droppedFrames = Math.round((now - lastFrame) / (millisecondsPerSecond / desiredFrames)) - 1;\n\t\t\t\t\tfor (var j = 0; j < Math.min(droppedFrames, 4); j++) {\n\t\t\t\t\t\tstep(true);\n\t\t\t\t\t\tdropCounter++;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Compute percent value\n\t\t\t\tif (duration) {\n\t\t\t\t\tpercent = (now - start) / duration;\n\t\t\t\t\tif (percent > 1) {\n\t\t\t\t\t\tpercent = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Execute step callback, then...\n\t\t\t\tvar value = easingMethod ? easingMethod(percent) : percent;\n\t\t\t\tif ((stepCallback(value, now, render) === false || percent === 1) && render) {\n\t\t\t\t\trunning[id] = null;\n\t\t\t\t\tcompletedCallback && completedCallback(desiredFrames - (dropCounter / ((now - start) / millisecondsPerSecond)), id, percent === 1 || duration == null);\n\t\t\t\t} else if (render) {\n\t\t\t\t\tlastFrame = now;\n\t\t\t\t\tcore.effect.Animate.requestAnimationFrame(step, root);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Mark as running\n\t\t\trunning[id] = true;\n\n\t\t\t// Init first step\n\t\t\tcore.effect.Animate.requestAnimationFrame(step, root);\n\n\t\t\t// Return unique animation ID\n\t\t\treturn id;\n\t\t}\n\t};\n})(this);\n\n\nvar Scroller;\n\n(function() {\n\t\n\t/**\n\t * A pure logic 'component' for 'virtual' scrolling/zooming.\n\t */\n\tScroller = function(callback, options) {\n\n\t\tthis.__callback = callback;\n\n\t\tthis.options = {\n\t\t\t\n\t\t\t/** Enable scrolling on x-axis */\n\t\t\tscrollingX: true,\n\n\t\t\t/** Enable scrolling on y-axis */\n\t\t\tscrollingY: true,\n\n\t\t\t/** Enable animations for deceleration, snap back, zooming and scrolling */\n\t\t\tanimating: true,\n\n\t\t\t/** duration for animations triggered by scrollTo/zoomTo */\n\t\t\tanimationDuration: 250,\n\n\t\t\t/** Enable bouncing (content can be slowly moved outside and jumps back after releasing) */\n\t\t\tbouncing: true,\n\n\t\t\t/** Enable locking to the main axis if user moves only slightly on one of them at start */\n\t\t\tlocking: true,\n\n\t\t\t/** Enable pagination mode (switching between full page content panes) */\n\t\t\tpaging: false,\n\n\t\t\t/** Enable snapping of content to a configured pixel grid */\n\t\t\tsnapping: false,\n\n\t\t\t/** Enable zooming of content via API, fingers and mouse wheel */\n\t\t\tzooming: false,\n\n\t\t\t/** Minimum zoom level */\n\t\t\tminZoom: 0.5,\n\n\t\t\t/** Maximum zoom level */\n\t\t\tmaxZoom: 3\n\t\t\t\n\t\t};\n\n\t\tfor (var key in options) {\n\t\t\tthis.options[key] = options[key];\n\t\t}\n\n\t};\n\t\n\t\n\t// Easing Equations (c) 2003 Robert Penner, all rights reserved.\n\t// Open source under the BSD License.\n\t\n\t/**\n\t * @param pos {Number} position between 0 (start of effect) and 1 (end of effect)\n\t**/\n\tvar easeOutCubic = function(pos) {\n\t\treturn (Math.pow((pos - 1), 3) + 1);\n\t};\n\n\t/**\n\t * @param pos {Number} position between 0 (start of effect) and 1 (end of effect)\n\t**/\n\tvar easeInOutCubic = function(pos) {\n\t\tif ((pos /= 0.5) < 1) {\n\t\t\treturn 0.5 * Math.pow(pos, 3);\n\t\t}\n\n\t\treturn 0.5 * (Math.pow((pos - 2), 3) + 2);\n\t};\n\t\n\t\n\tvar members = {\n\n\t\t/*\n\t\t---------------------------------------------------------------------------\n\t\t\tINTERNAL FIELDS :: STATUS\n\t\t---------------------------------------------------------------------------\n\t\t*/\n\n\t\t/** {Boolean} Whether only a single finger is used in touch handling */\n\t\t__isSingleTouch: false,\n\n\t\t/** {Boolean} Whether a touch event sequence is in progress */\n\t\t__isTracking: false,\n\n\t\t/**\n\t\t * {Boolean} Whether a gesture zoom/rotate event is in progress. Activates when\n\t\t * a gesturestart event happens. This has higher priority than dragging.\n\t\t */\n\t\t__isGesturing: false,\n\n\t\t/**\n\t\t * {Boolean} Whether the user has moved by such a distance that we have enabled\n\t\t * dragging mode. Hint: It's only enabled after some pixels of movement to\n\t\t * not interrupt with clicks etc.\n\t\t */\n\t\t__isDragging: false,\n\n\t\t/**\n\t\t * {Boolean} Not touching and dragging anymore, and smoothly animating the\n\t\t * touch sequence using deceleration.\n\t\t */\n\t\t__isDecelerating: false,\n\n\t\t/**\n\t\t * {Boolean} Smoothly animating the currently configured change\n\t\t */\n\t\t__isAnimating: false,\n\n\n\n\t\t/*\n\t\t---------------------------------------------------------------------------\n\t\t\tINTERNAL FIELDS :: DIMENSIONS\n\t\t---------------------------------------------------------------------------\n\t\t*/\n\n\t\t/** {Integer} Available outer left position (from document perspective) */\n\t\t__clientLeft: 0,\n\n\t\t/** {Integer} Available outer top position (from document perspective) */\n\t\t__clientTop: 0,\n\n\t\t/** {Integer} Available outer width */\n\t\t__clientWidth: 0,\n\n\t\t/** {Integer} Available outer height */\n\t\t__clientHeight: 0,\n\n\t\t/** {Integer} Outer width of content */\n\t\t__contentWidth: 0,\n\n\t\t/** {Integer} Outer height of content */\n\t\t__contentHeight: 0,\n\n\t\t/** {Integer} Snapping width for content */\n\t\t__snapWidth: 100,\n\n\t\t/** {Integer} Snapping height for content */\n\t\t__snapHeight: 100,\n\n\t\t/** {Integer} Height to assign to refresh area */\n\t\t__refreshHeight: null,\n\t\t\n\t\t/** {Boolean} Whether the refresh process is enabled when the event is released now */\n\t\t__refreshActive: false,\n\t\t\n\t\t/** {Function} Callback to execute on activation. This is for signalling the user about a refresh is about to happen when he release */\n\t\t__refreshActivate: null,\n\n\t\t/** {Function} Callback to execute on deactivation. This is for signalling the user about the refresh being cancelled */\n\t\t__refreshDeactivate: null,\n\t\t\n\t\t/** {Function} Callback to execute to start the actual refresh. Call {@link #refreshFinish} when done */\n\t\t__refreshStart: null,\n\n\t\t/** {Number} Zoom level */\n\t\t__zoomLevel: 1,\n\n\t\t/** {Number} Scroll position on x-axis */\n\t\t__scrollLeft: 0,\n\n\t\t/** {Number} Scroll position on y-axis */\n\t\t__scrollTop: 0,\n\n\t\t/** {Integer} Maximum allowed scroll position on x-axis */\n\t\t__maxScrollLeft: 0,\n\n\t\t/** {Integer} Maximum allowed scroll position on y-axis */\n\t\t__maxScrollTop: 0,\n\n\t\t/* {Number} Scheduled left position (final position when animating) */\n\t\t__scheduledLeft: 0,\n\n\t\t/* {Number} Scheduled top position (final position when animating) */\n\t\t__scheduledTop: 0,\n\n\t\t/* {Number} Scheduled zoom level (final scale when animating) */\n\t\t__scheduledZoom: 0,\n\n\n\n\t\t/*\n\t\t---------------------------------------------------------------------------\n\t\t\tINTERNAL FIELDS :: LAST POSITIONS\n\t\t---------------------------------------------------------------------------\n\t\t*/\n\n\t\t/** {Number} Left position of finger at start */\n\t\t__lastTouchLeft: null,\n\n\t\t/** {Number} Top position of finger at start */\n\t\t__lastTouchTop: null,\n\n\t\t/** {Date} Timestamp of last move of finger. Used to limit tracking range for deceleration speed. */\n\t\t__lastTouchMove: null,\n\t\t\n\t\t/** {Array} List of positions, uses three indexes for each state: left, top, timestamp */\n\t\t__positions: null,\n\n\n\n\t\t/*\n\t\t---------------------------------------------------------------------------\n\t\t\tINTERNAL FIELDS :: DECELERATION SUPPORT\n\t\t---------------------------------------------------------------------------\n\t\t*/\n\n\t\t/** {Integer} Minimum left scroll position during deceleration */\n\t\t__minDecelerationScrollLeft: null,\n\n\t\t/** {Integer} Minimum top scroll position during deceleration */\n\t\t__minDecelerationScrollTop: null,\n\n\t\t/** {Integer} Maximum left scroll position during deceleration */\n\t\t__maxDecelerationScrollLeft: null,\n\n\t\t/** {Integer} Maximum top scroll position during deceleration */\n\t\t__maxDecelerationScrollTop: null,\n\n\t\t/** {Number} Current factor to modify horizontal scroll position with on every step */\n\t\t__decelerationVelocityX: null,\n\n\t\t/** {Number} Current factor to modify vertical scroll position with on every step */\n\t\t__decelerationVelocityY: null,\n\n\n\n\t\t/*\n\t\t---------------------------------------------------------------------------\n\t\t\tPUBLIC API\n\t\t---------------------------------------------------------------------------\n\t\t*/\n\n\t\t/**\n\t\t * Configures the dimensions of the client (outer) and content (inner) elements.\n\t\t * Requires the available space for the outer element and the outer size of the inner element.\n\t\t * All values which are falsy (null or zero etc.) are ignored and the old value is kept.\n\t\t *\n\t\t * @param clientWidth {Integer ? null} Inner width of outer element\n\t\t * @param clientHeight {Integer ? null} Inner height of outer element\n\t\t * @param contentWidth {Integer ? null} Outer width of inner element\n\t\t * @param contentHeight {Integer ? null} Outer height of inner element\n\t\t */\n\t\tsetDimensions: function(clientWidth, clientHeight, contentWidth, contentHeight) {\n\n\t\t\tvar self = this;\n\n\t\t\t// Only update values which are defined\n\t\t\tif (clientWidth) {\n\t\t\t\tself.__clientWidth = clientWidth;\n\t\t\t}\n\n\t\t\tif (clientHeight) {\n\t\t\t\tself.__clientHeight = clientHeight;\n\t\t\t}\n\n\t\t\tif (contentWidth) {\n\t\t\t\tself.__contentWidth = contentWidth;\n\t\t\t}\n\n\t\t\tif (contentHeight) {\n\t\t\t\tself.__contentHeight = contentHeight;\n\t\t\t}\n\n\t\t\t// Refresh maximums\n\t\t\tself.__computeScrollMax();\n\n\t\t\t// Refresh scroll position\n\t\t\tself.scrollTo(self.__scrollLeft, self.__scrollTop, true);\n\t\t\t\n\t\t},\n\n\n\t\t/**\n\t\t * Sets the client coordinates in relation to the document.\n\t\t *\n\t\t * @param left {Integer ? 0} Left position of outer element\n\t\t * @param top {Integer ? 0} Top position of outer element\n\t\t */\n\t\tsetPosition: function(left, top) {\n\n\t\t\tvar self = this;\n\n\t\t\tself.__clientLeft = left || 0;\n\t\t\tself.__clientTop = top || 0;\n\n\t\t},\n\n\n\t\t/**\n\t\t * Configures the snapping (when snapping is active)\n\t\t *\n\t\t * @param width {Integer} Snapping width\n\t\t * @param height {Integer} Snapping height\n\t\t */\n\t\tsetSnapSize: function(width, height) {\n\n\t\t\tvar self = this;\n\n\t\t\tself.__snapWidth = width;\n\t\t\tself.__snapHeight = height;\n\n\t\t},\n\n\n\t\t/**\n\t\t * Activates pull-to-refresh. A special zone on the top of the list to start a list refresh whenever\n\t\t * the user event is released during visibility of this zone. This was introduced by some apps on iOS like\n\t\t * the official Twitter client.\n\t\t *\n\t\t * @param height {Integer} Height of pull-to-refresh zone on top of rendered list\n\t\t * @param activateCallback {Function} Callback to execute on activation. This is for signalling the user about a refresh is about to happen when he release.\n\t\t * @param deactivateCallback {Function} Callback to execute on deactivation. This is for signalling the user about the refresh being cancelled.\n\t\t * @param startCallback {Function} Callback to execute to start the real async refresh action. Call {@link #finishPullToRefresh} after finish of refresh.\n\t\t */\n\t\tactivatePullToRefresh: function(height, activateCallback, deactivateCallback, startCallback) {\n\n\t\t\tvar self = this;\n\n\t\t\tself.__refreshHeight = height;\n\t\t\tself.__refreshActivate = activateCallback;\n\t\t\tself.__refreshDeactivate = deactivateCallback;\n\t\t\tself.__refreshStart = startCallback;\n\n\t\t},\n\t\t\n\t\t\n\t\t/**\n\t\t * Signalizes that pull-to-refresh is finished. \n\t\t */\n\t\tfinishPullToRefresh: function() {\n\t\t\t\n\t\t\tvar self = this;\n\t\t\t\n\t\t\tself.__refreshActive = false;\n\t\t\tif (self.__refreshDeactivate) {\n\t\t\t\tself.__refreshDeactivate();\n\t\t\t}\n\t\t\t\n\t\t\tself.scrollTo(self.__scrollLeft, self.__scrollTop, true);\n\t\t\t\n\t\t},\n\n\n\t\t/**\n\t\t * Returns the scroll position and zooming values\n\t\t *\n\t\t * @return {Map} `left` and `top` scroll position and `zoom` level\n\t\t */\n\t\tgetValues: function() {\n\n\t\t\tvar self = this;\n\n\t\t\treturn {\n\t\t\t\tleft: self.__scrollLeft,\n\t\t\t\ttop: self.__scrollTop,\n\t\t\t\tzoom: self.__zoomLevel\n\t\t\t};\n\n\t\t},\n\t\t\n\t\t\n\t\t/**\n\t\t * Returns the maximum scroll values\n\t\t *\n\t\t * @return {Map} `left` and `top` maximum scroll values\n\t\t */\n\t\tgetScrollMax: function() {\n\t\t\t\n\t\t\tvar self = this;\n\t\t\t\n\t\t\treturn {\n\t\t\t\tleft: self.__maxScrollLeft,\n\t\t\t\ttop: self.__maxScrollTop\n\t\t\t};\n\t\t\t\n\t\t},\n\n\n\t\t/**\n\t\t * Zooms to the given level. Supports optional animation. Zooms\n\t\t * the center when no coordinates are given.\n\t\t *\n\t\t * @param level {Number} Level to zoom to\n\t\t * @param animate {Boolean ? false} Whether to use animation\n\t\t * @param originLeft {Number ? null} Zoom in at given left coordinate\n\t\t * @param originTop {Number ? null} Zoom in at given top coordinate\n\t\t */\n\t\tzoomTo: function(level, animate, originLeft, originTop) {\n\n\t\t\tvar self = this;\n\n\t\t\tif (!self.options.zooming) {\n\t\t\t\tthrow new Error(\"Zooming is not enabled!\");\n\t\t\t}\n\n\t\t\t// Stop deceleration\n\t\t\tif (self.__isDecelerating) {\n\t\t\t\tcore.effect.Animate.stop(self.__isDecelerating);\n\t\t\t\tself.__isDecelerating = false;\n\t\t\t}\n\n\t\t\tvar oldLevel = self.__zoomLevel;\n\n\t\t\t// Normalize input origin to center of viewport if not defined\n\t\t\tif (originLeft == null) {\n\t\t\t\toriginLeft = self.__clientWidth / 2;\n\t\t\t}\n\n\t\t\tif (originTop == null) {\n\t\t\t\toriginTop = self.__clientHeight / 2;\n\t\t\t}\n\n\t\t\t// Limit level according to configuration\n\t\t\tlevel = Math.max(Math.min(level, self.options.maxZoom), self.options.minZoom);\n\n\t\t\t// Recompute maximum values while temporary tweaking maximum scroll ranges\n\t\t\tself.__computeScrollMax(level);\n\n\t\t\t// Recompute left and top coordinates based on new zoom level\n\t\t\tvar left = ((originLeft + self.__scrollLeft) * level / oldLevel) - originLeft;\n\t\t\tvar top = ((originTop + self.__scrollTop) * level / oldLevel) - originTop;\n\n\t\t\t// Limit x-axis\n\t\t\tif (left > self.__maxScrollLeft) {\n\t\t\t\tleft = self.__maxScrollLeft;\n\t\t\t} else if (left < 0) {\n\t\t\t\tleft = 0;\n\t\t\t}\n\n\t\t\t// Limit y-axis\n\t\t\tif (top > self.__maxScrollTop) {\n\t\t\t\ttop = self.__maxScrollTop;\n\t\t\t} else if (top < 0) {\n\t\t\t\ttop = 0;\n\t\t\t}\n\n\t\t\t// Push values out\n\t\t\tself.__publish(left, top, level, animate);\n\n\t\t},\n\n\n\t\t/**\n\t\t * Zooms the content by the given factor.\n\t\t *\n\t\t * @param factor {Number} Zoom by given factor\n\t\t * @param animate {Boolean ? false} Whether to use animation\n\t\t * @param originLeft {Number ? 0} Zoom in at given left coordinate\n\t\t * @param originTop {Number ? 0} Zoom in at given top coordinate\n\t\t */\n\t\tzoomBy: function(factor, animate, originLeft, originTop) {\n\n\t\t\tvar self = this;\n\n\t\t\tself.zoomTo(self.__zoomLevel * factor, animate, originLeft, originTop);\n\n\t\t},\n\n\n\t\t/**\n\t\t * Scrolls to the given position. Respect limitations and snapping automatically.\n\t\t *\n\t\t * @param left {Number?null} Horizontal scroll position, keeps current if value is <code>null</code>\n\t\t * @param top {Number?null} Vertical scroll position, keeps current if value is <code>null</code>\n\t\t * @param animate {Boolean?false} Whether the scrolling should happen using an animation\n\t\t * @param zoom {Number?null} Zoom level to go to\n\t\t */\n\t\tscrollTo: function(left, top, animate, zoom) {\n\n\t\t\tvar self = this;\n\t\t\t\n\t\t\t// Stop deceleration\n\t\t\tif (self.__isDecelerating) {\n\t\t\t\tcore.effect.Animate.stop(self.__isDecelerating);\n\t\t\t\tself.__isDecelerating = false;\n\t\t\t}\n\t\t\t\n\t\t\t// Correct coordinates based on new zoom level\n\t\t\tif (zoom != null && zoom !== self.__zoomLevel) {\n\t\t\t\t\n\t\t\t\tif (!self.options.zooming) {\n\t\t\t\t\tthrow new Error(\"Zooming is not enabled!\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tleft *= zoom;\n\t\t\t\ttop *= zoom;\n\t\t\t\t\n\t\t\t\t// Recompute maximum values while temporary tweaking maximum scroll ranges\n\t\t\t\tself.__computeScrollMax(zoom);\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\t// Keep zoom when not defined\n\t\t\t\tzoom = self.__zoomLevel;\n\t\t\t\t\n\t\t\t}\n\n\t\t\tif (!self.options.scrollingX) {\n\n\t\t\t\tleft = self.__scrollLeft;\n\n\t\t\t} else {\n\n\t\t\t\tif (self.options.paging) {\n\t\t\t\t\tleft = Math.round(left / self.__clientWidth) * self.__clientWidth;\n\t\t\t\t} else if (self.options.snapping) {\n\t\t\t\t\tleft = Math.round(left / self.__snapWidth) * self.__snapWidth;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (!self.options.scrollingY) {\n\n\t\t\t\ttop = self.__scrollTop;\n\n\t\t\t} else {\n\n\t\t\t\tif (self.options.paging) {\n\t\t\t\t\ttop = Math.round(top / self.__clientHeight) * self.__clientHeight;\n\t\t\t\t} else if (self.options.snapping) {\n\t\t\t\t\ttop = Math.round(top / self.__snapHeight) * self.__snapHeight;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Limit for allowed ranges\n\t\t\tleft = Math.max(Math.min(self.__maxScrollLeft, left), 0);\n\t\t\ttop = Math.max(Math.min(self.__maxScrollTop, top), 0);\n\n\t\t\t// Don't animate when no change detected, still call publish to make sure\n\t\t\t// that rendered position is really in-sync with internal data\n\t\t\tif (left === self.__scrollLeft && top === self.__scrollTop) {\n\t\t\t\tanimate = false;\n\t\t\t}\n\t\t\t\n\t\t\t// Publish new values\n\t\t\tself.__publish(left, top, zoom, animate);\n\n\t\t},\n\n\n\t\t/**\n\t\t * Scroll by the given offset\n\t\t *\n\t\t * @param left {Number ? 0} Scroll x-axis by given offset\n\t\t * @param top {Number ? 0} Scroll x-axis by given offset\n\t\t * @param animate {Boolean ? false} Whether to animate the given change\n\t\t */\n\t\tscrollBy: function(left, top, animate) {\n\n\t\t\tvar self = this;\n\n\t\t\tvar startLeft = self.__isAnimating ? self.__scheduledLeft : self.__scrollLeft;\n\t\t\tvar startTop = self.__isAnimating ? self.__scheduledTop : self.__scrollTop;\n\n\t\t\tself.scrollTo(startLeft + (left || 0), startTop + (top || 0), animate);\n\n\t\t},\n\n\n\n\t\t/*\n\t\t---------------------------------------------------------------------------\n\t\t\tEVENT CALLBACKS\n\t\t---------------------------------------------------------------------------\n\t\t*/\n\n\t\t/**\n\t\t * Mouse wheel handler for zooming support\n\t\t */\n\t\tdoMouseZoom: function(wheelDelta, timeStamp, pageX, pageY) {\n\n\t\t\tvar self = this;\n\t\t\tvar change = wheelDelta > 0 ? 0.97 : 1.03;\n\n\t\t\treturn self.zoomTo(self.__zoomLevel * change, false, pageX - self.__clientLeft, pageY - self.__clientTop);\n\n\t\t},\n\n\n\t\t/**\n\t\t * Touch start handler for scrolling support\n\t\t */\n\t\tdoTouchStart: function(touches, timeStamp) {\n\n\t\t\t// Array-like check is enough here\n\t\t\tif (touches.length == null) {\n\t\t\t\tthrow new Error(\"Invalid touch list: \" + touches);\n\t\t\t}\n\n\t\t\tif (timeStamp instanceof Date) {\n\t\t\t\ttimeStamp = timeStamp.valueOf();\n\t\t\t}\n\t\t\tif (typeof timeStamp !== \"number\") {\n\t\t\t\tthrow new Error(\"Invalid timestamp value: \" + timeStamp);\n\t\t\t}\n\t\t\t\n\t\t\tvar self = this;\n\n\t\t\t// Stop deceleration\n\t\t\tif (self.__isDecelerating) {\n\t\t\t\tcore.effect.Animate.stop(self.__isDecelerating);\n\t\t\t\tself.__isDecelerating = false;\n\t\t\t}\n\n\t\t\t// Stop animation\n\t\t\tif (self.__isAnimating) {\n\t\t\t\tcore.effect.Animate.stop(self.__isAnimating);\n\t\t\t\tself.__isAnimating = false;\n\t\t\t}\n\n\t\t\t// Use center point when dealing with two fingers\n\t\t\tvar currentTouchLeft, currentTouchTop;\n\t\t\tvar isSingleTouch = touches.length === 1;\n\t\t\tif (isSingleTouch) {\n\t\t\t\tcurrentTouchLeft = touches[0].pageX;\n\t\t\t\tcurrentTouchTop = touches[0].pageY;\n\t\t\t} else {\n\t\t\t\tcurrentTouchLeft = Math.abs(touches[0].pageX + touches[1].pageX) / 2;\n\t\t\t\tcurrentTouchTop = Math.abs(touches[0].pageY + touches[1].pageY) / 2;\n\t\t\t}\n\n\t\t\t// Store initial positions\n\t\t\tself.__initialTouchLeft = currentTouchLeft;\n\t\t\tself.__initialTouchTop = currentTouchTop;\n\n\t\t\t// Store current zoom level\n\t\t\tself.__zoomLevelStart = self.__zoomLevel;\n\n\t\t\t// Store initial touch positions\n\t\t\tself.__lastTouchLeft = currentTouchLeft;\n\t\t\tself.__lastTouchTop = currentTouchTop;\n\n\t\t\t// Store initial move time stamp\n\t\t\tself.__lastTouchMove = timeStamp;\n\n\t\t\t// Reset initial scale\n\t\t\tself.__lastScale = 1;\n\n\t\t\t// Reset locking flags\n\t\t\tself.__enableScrollX = !isSingleTouch && self.options.scrollingX;\n\t\t\tself.__enableScrollY = !isSingleTouch && self.options.scrollingY;\n\n\t\t\t// Reset tracking flag\n\t\t\tself.__isTracking = true;\n\n\t\t\t// Dragging starts directly with two fingers, otherwise lazy with an offset\n\t\t\tself.__isDragging = !isSingleTouch;\n\n\t\t\t// Some features are disabled in multi touch scenarios\n\t\t\tself.__isSingleTouch = isSingleTouch;\n\n\t\t\t// Clearing data structure\n\t\t\tself.__positions = [];\n\n\t\t},\n\n\n\t\t/**\n\t\t * Touch move handler for scrolling support\n\t\t */\n\t\tdoTouchMove: function(touches, timeStamp, scale) {\n\n\t\t\t// Array-like check is enough here\n\t\t\tif (touches.length == null) {\n\t\t\t\tthrow new Error(\"Invalid touch list: \" + touches);\n\t\t\t}\n\n\t\t\tif (timeStamp instanceof Date) {\n\t\t\t\ttimeStamp = timeStamp.valueOf();\n\t\t\t}\n\t\t\tif (typeof timeStamp !== \"number\") {\n\t\t\t\tthrow new Error(\"Invalid timestamp value: \" + timeStamp);\n\t\t\t}\n\t\t\t\n\t\t\tvar self = this;\n\n\t\t\t// Ignore event when tracking is not enabled (event might be outside of element)\n\t\t\tif (!self.__isTracking) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tvar currentTouchLeft, currentTouchTop;\n\n\t\t\t// Compute move based around of center of fingers\n\t\t\tif (touches.length === 2) {\n\t\t\t\tcurrentTouchLeft = Math.abs(touches[0].pageX + touches[1].pageX) / 2;\n\t\t\t\tcurrentTouchTop = Math.abs(touches[0].pageY + touches[1].pageY) / 2;\n\t\t\t} else {\n\t\t\t\tcurrentTouchLeft = touches[0].pageX;\n\t\t\t\tcurrentTouchTop = touches[0].pageY;\n\t\t\t}\n\n\t\t\tvar positions = self.__positions;\n\n\t\t\t// Are we already is dragging mode?\n\t\t\tif (self.__isDragging) {\n\n\t\t\t\t// Compute move distance\n\t\t\t\tvar moveX = currentTouchLeft - self.__lastTouchLeft;\n\t\t\t\tvar moveY = currentTouchTop - self.__lastTouchTop;\n\n\t\t\t\t// Read previous scroll position and zooming\n\t\t\t\tvar scrollLeft = self.__scrollLeft;\n\t\t\t\tvar scrollTop = self.__scrollTop;\n\t\t\t\tvar level = self.__zoomLevel;\n\n\t\t\t\t// Work with scaling\n\t\t\t\tif (scale != null && self.options.zooming) {\n\n\t\t\t\t\tvar oldLevel = level;\n\n\t\t\t\t\t// Recompute level based on previous scale and new scale\n\t\t\t\t\tlevel = level / self.__lastScale * scale;\n\n\t\t\t\t\t// Limit level according to configuration\n\t\t\t\t\tlevel = Math.max(Math.min(level, self.options.maxZoom), self.options.minZoom);\n\n\t\t\t\t\t// Only do further compution when change happened\n\t\t\t\t\tif (oldLevel !== level) {\n\n\t\t\t\t\t\t// Compute relative event position to container\n\t\t\t\t\t\tvar currentTouchLeftRel = currentTouchLeft - self.__clientLeft;\n\t\t\t\t\t\tvar currentTouchTopRel = currentTouchTop - self.__clientTop;\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Recompute left and top coordinates based on new zoom level\n\t\t\t\t\t\tscrollLeft = ((currentTouchLeftRel + scrollLeft) * level / oldLevel) - currentTouchLeftRel;\n\t\t\t\t\t\tscrollTop = ((currentTouchTopRel + scrollTop) * level / oldLevel) - currentTouchTopRel;\n\n\t\t\t\t\t\t// Recompute max scroll values\n\t\t\t\t\t\tself.__computeScrollMax(level);\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (self.__enableScrollX) {\n\n\t\t\t\t\tscrollLeft -= moveX;\n\t\t\t\t\tvar maxScrollLeft = self.__maxScrollLeft;\n\n\t\t\t\t\tif (scrollLeft > maxScrollLeft || scrollLeft < 0) {\n\n\t\t\t\t\t\t// Slow down on the edges\n\t\t\t\t\t\tif (self.options.bouncing) {\n\n\t\t\t\t\t\t\tscrollLeft += (moveX / 2);\n\n\t\t\t\t\t\t} else if (scrollLeft > maxScrollLeft) {\n\n\t\t\t\t\t\t\tscrollLeft = maxScrollLeft;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tscrollLeft = 0;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Compute new vertical scroll position\n\t\t\t\tif (self.__enableScrollY) {\n\n\t\t\t\t\tscrollTop -= moveY;\n\t\t\t\t\tvar maxScrollTop = self.__maxScrollTop;\n\n\t\t\t\t\tif (scrollTop > maxScrollTop || scrollTop < 0) {\n\n\t\t\t\t\t\t// Slow down on the edges\n\t\t\t\t\t\tif (self.options.bouncing) {\n\n\t\t\t\t\t\t\tscrollTop += (moveY / 2);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Support pull-to-refresh (only when only y is scrollable)\n\t\t\t\t\t\t\tif (!self.__enableScrollX && self.__refreshHeight != null) {\n\n\t\t\t\t\t\t\t\tif (!self.__refreshActive && scrollTop <= -self.__refreshHeight) {\n\n\t\t\t\t\t\t\t\t\tself.__refreshActive = true;\n\t\t\t\t\t\t\t\t\tif (self.__refreshActivate) {\n\t\t\t\t\t\t\t\t\t\tself.__refreshActivate();\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else if (self.__refreshActive && scrollTop > -self.__refreshHeight) {\n\n\t\t\t\t\t\t\t\t\tself.__refreshActive = false;\n\t\t\t\t\t\t\t\t\tif (self.__refreshDeactivate) {\n\t\t\t\t\t\t\t\t\t\tself.__refreshDeactivate();\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if (scrollTop > maxScrollTop) {\n\n\t\t\t\t\t\t\tscrollTop = maxScrollTop;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tscrollTop = 0;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Keep list from growing infinitely (holding min 10, max 20 measure points)\n\t\t\t\tif (positions.length > 60) {\n\t\t\t\t\tpositions.splice(0, 30);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Track scroll movement for decleration\n\t\t\t\tpositions.push(scrollLeft, scrollTop, timeStamp);\n\n\t\t\t\t// Sync scroll position\n\t\t\t\tself.__publish(scrollLeft, scrollTop, level);\n\n\t\t\t// Otherwise figure out whether we are switching into dragging mode now.\n\t\t\t} else {\n\n\t\t\t\tvar minimumTrackingForScroll = self.options.locking ? 3 : 0;\n\t\t\t\tvar minimumTrackingForDrag = 5;\n\n\t\t\t\tvar distanceX = Math.abs(currentTouchLeft - self.__initialTouchLeft);\n\t\t\t\tvar distanceY = Math.abs(currentTouchTop - self.__initialTouchTop);\n\n\t\t\t\tself.__enableScrollX = self.options.scrollingX && distanceX >= minimumTrackingForScroll;\n\t\t\t\tself.__enableScrollY = self.options.scrollingY && distanceY >= minimumTrackingForScroll;\n\t\t\t\t\n\t\t\t\tpositions.push(self.__scrollLeft, self.__scrollTop, timeStamp);\n\n\t\t\t\tself.__isDragging = (self.__enableScrollX || self.__enableScrollY) && (distanceX >= minimumTrackingForDrag || distanceY >= minimumTrackingForDrag);\n\n\t\t\t}\n\n\t\t\t// Update last touch positions and time stamp for next event\n\t\t\tself.__lastTouchLeft = currentTouchLeft;\n\t\t\tself.__lastTouchTop = currentTouchTop;\n\t\t\tself.__lastTouchMove = timeStamp;\n\t\t\tself.__lastScale = scale;\n\n\t\t},\n\n\n\t\t/**\n\t\t * Touch end handler for scrolling support\n\t\t */\n\t\tdoTouchEnd: function(timeStamp) {\n\t\t\t\n\t\t\tif (timeStamp instanceof Date) {\n\t\t\t\ttimeStamp = timeStamp.valueOf();\n\t\t\t}\n\t\t\tif (typeof timeStamp !== \"number\") {\n\t\t\t\tthrow new Error(\"Invalid timestamp value: \" + timeStamp);\n\t\t\t}\n\t\t\t\n\t\t\tvar self = this;\n\n\t\t\t// Ignore event when tracking is not enabled (no touchstart event on element)\n\t\t\t// This is required as this listener ('touchmove') sits on the document and not on the element itself.\n\t\t\tif (!self.__isTracking) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t// Not touching anymore (when two finger hit the screen there are two touch end events)\n\t\t\tself.__isTracking = false;\n\n\t\t\t// Be sure to reset the dragging flag now. Here we also detect whether\n\t\t\t// the finger has moved fast enough to switch into a deceleration animation.\n\t\t\tif (self.__isDragging) {\n\n\t\t\t\t// Reset dragging flag\n\t\t\t\tself.__isDragging = false;\n\n\t\t\t\t// Start deceleration\n\t\t\t\t// Verify that the last move detected was in some relevant time frame\n\t\t\t\tif (self.__isSingleTouch && self.options.animating && (timeStamp - self.__lastTouchMove) <= 100) {\n\n\t\t\t\t\t// Then figure out what the scroll position was about 100ms ago\n\t\t\t\t\tvar positions = self.__positions;\n\t\t\t\t\tvar endPos = positions.length - 1;\n\t\t\t\t\tvar startPos = endPos;\n\t\t\t\t\t\n\t\t\t\t\t// Move pointer to position measured 100ms ago\n\t\t\t\t\tfor (var i = endPos; i > 0 && positions[i] > (self.__lastTouchMove - 100); i -= 3) {\n\t\t\t\t\t\tstartPos = i;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// If start and stop position is identical in a 100ms timeframe, \n\t\t\t\t\t// we cannot compute any useful deceleration.\n\t\t\t\t\tif (startPos !== endPos) {\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Compute relative movement between these two points\n\t\t\t\t\t\tvar timeOffset = positions[endPos] - positions[startPos];\n\t\t\t\t\t\tvar movedLeft = self.__scrollLeft - positions[startPos - 2];\n\t\t\t\t\t\tvar movedTop = self.__scrollTop - positions[startPos - 1];\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Based on 50ms compute the movement to apply for each render step\n\t\t\t\t\t\tself.__decelerationVelocityX = movedLeft / timeOffset * (1000 / 60);\n\t\t\t\t\t\tself.__decelerationVelocityY = movedTop / timeOffset * (1000 / 60);\n\n\t\t\t\t\t\t// How much velocity is required to start the deceleration\n\t\t\t\t\t\tvar minVelocityToStartDeceleration = self.options.paging || self.options.snapping ? 4 : 1;\n\n\t\t\t\t\t\t// Verify that we have enough velocity to start deceleration\n\t\t\t\t\t\tif (Math.abs(self.__decelerationVelocityX) > minVelocityToStartDeceleration || Math.abs(self.__decelerationVelocityY) > minVelocityToStartDeceleration) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Deactivate pull-to-refresh when decelerating\n\t\t\t\t\t\t\tif (!self.__refreshActive) {\n\n\t\t\t\t\t\t\t\tself.__startDeceleration(timeStamp);\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If this was a slower move it is per default non decelerated, but this\n\t\t\t// still means that we want snap back to the bounds which is done here.\n\t\t\t// This is placed outside the condition above to improve edge case stability\n\t\t\t// e.g. touchend fired without enabled dragging. This should normally do not\n\t\t\t// have modified the scroll positions or even showed the scrollbars though.\n\t\t\tif (!self.__isDecelerating) {\n\n\t\t\t\tif (self.__refreshActive && self.__refreshStart) {\n\t\t\t\t\t\n\t\t\t\t\t// Use publish instead of scrollTo to allow scrolling to out of boundary position\n\t\t\t\t\t// We don't need to normalize scrollLeft, zoomLevel, etc. here because we only y-scrolling when pull-to-refresh is enabled\n\t\t\t\t\tself.__publish(self.__scrollLeft, -self.__refreshHeight, self.__zoomLevel, true);\n\t\t\t\t\t\n\t\t\t\t\tif (self.__refreshStart) {\n\t\t\t\t\t\tself.__refreshStart();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t\n\t\t\t\t\tself.scrollTo(self.__scrollLeft, self.__scrollTop, true, self.__zoomLevel);\n\t\t\t\t\t\n\t\t\t\t\t// Directly signalize deactivation (nothing todo on refresh?)\n\t\t\t\t\tif (self.__refreshActive) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tself.__refreshActive = false;\n\t\t\t\t\t\tif (self.__refreshDeactivate) {\n\t\t\t\t\t\t\tself.__refreshDeactivate();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Fully cleanup list\n\t\t\tself.__positions.length = 0;\n\n\t\t},\n\n\n\n\t\t/*\n\t\t---------------------------------------------------------------------------\n\t\t\tPRIVATE API\n\t\t---------------------------------------------------------------------------\n\t\t*/\n\n\t\t/**\n\t\t * Applies the scroll position to the content element\n\t\t *\n\t\t * @param left {Number} Left scroll position\n\t\t * @param top {Number} Top scroll position\n\t\t * @param animate {Boolean?false} Whether animation should be used to move to the new coordinates\n\t\t */\n\t\t__publish: function(left, top, zoom, animate) {\n\n\t\t\tvar self = this;\n\t\t\t\n\t\t\t// Remember whether we had an animation, then we try to continue based on the current \"drive\" of the animation\n\t\t\tvar wasAnimating = self.__isAnimating;\n\t\t\tif (wasAnimating) {\n\t\t\t\tcore.effect.Animate.stop(wasAnimating);\n\t\t\t\tself.__isAnimating = false;\n\t\t\t}\n\n\t\t\tif (animate && self.options.animating) {\n\n\t\t\t\t// Keep scheduled positions for scrollBy/zoomBy functionality\n\t\t\t\tself.__scheduledLeft = left;\n\t\t\t\tself.__scheduledTop = top;\n\t\t\t\tself.__scheduledZoom = zoom;\n\n\t\t\t\tvar oldLeft = self.__scrollLeft;\n\t\t\t\tvar oldTop = self.__scrollTop;\n\t\t\t\tvar oldZoom = self.__zoomLevel;\n\n\t\t\t\tvar diffLeft = left - oldLeft;\n\t\t\t\tvar diffTop = top - oldTop;\n\t\t\t\tvar diffZoom = zoom - oldZoom;\n\n\t\t\t\tvar step = function(percent, now, render) {\n\n\t\t\t\t\tif (render) {\n\n\t\t\t\t\t\tself.__scrollLeft = oldLeft + (diffLeft * percent);\n\t\t\t\t\t\tself.__scrollTop = oldTop + (diffTop * percent);\n\t\t\t\t\t\tself.__zoomLevel = oldZoom + (diffZoom * percent);\n\n\t\t\t\t\t\t// Push values out\n\t\t\t\t\t\tif (self.__callback) {\n\t\t\t\t\t\t\tself.__callback(self.__scrollLeft, self.__scrollTop, self.__zoomLevel);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tvar verify = function(id) {\n\t\t\t\t\treturn self.__isAnimating === id;\n\t\t\t\t};\n\n\t\t\t\tvar completed = function(renderedFramesPerSecond, animationId, wasFinished) {\n\t\t\t\t\tif (animationId === self.__isAnimating) {\n\t\t\t\t\t\tself.__isAnimating = false;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (self.options.zooming) {\n\t\t\t\t\t\tself.__computeScrollMax();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\t// When continuing based on previous animation we choose an ease-out animation instead of ease-in-out\n\t\t\t\tself.__isAnimating = core.effect.Animate.start(step, verify, completed, self.options.animationDuration, wasAnimating ? easeOutCubic : easeInOutCubic);\n\n\t\t\t} else {\n\n\t\t\t\tself.__scheduledLeft = self.__scrollLeft = left;\n\t\t\t\tself.__scheduledTop = self.__scrollTop = top;\n\t\t\t\tself.__scheduledZoom = self.__zoomLevel = zoom;\n\n\t\t\t\t// Push values out\n\t\t\t\tif (self.__callback) {\n\t\t\t\t\tself.__callback(left, top, zoom);\n\t\t\t\t}\n\n\t\t\t\t// Fix max scroll ranges\n\t\t\t\tif (self.options.zooming) {\n\t\t\t\t\tself.__computeScrollMax();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\n\t\t/**\n\t\t * Recomputes scroll minimum values based on client dimensions and content dimensions.\n\t\t */\n\t\t__computeScrollMax: function(zoomLevel) {\n\n\t\t\tvar self = this;\n\t\t\t\n\t\t\tif (zoomLevel == null) {\n\t\t\t\tzoomLevel = self.__zoomLevel;\n\t\t\t}\n\n\t\t\tself.__maxScrollLeft = Math.max((self.__contentWidth * zoomLevel) - self.__clientWidth, 0);\n\t\t\tself.__maxScrollTop = Math.max((self.__contentHeight * zoomLevel) - self.__clientHeight, 0);\n\t\t\t\n\t\t},\n\n\n\n\t\t/*\n\t\t---------------------------------------------------------------------------\n\t\t\tANIMATION (DECELERATION) SUPPORT\n\t\t---------------------------------------------------------------------------\n\t\t*/\n\n\t\t/**\n\t\t * Called when a touch sequence end and the speed of the finger was high enough\n\t\t * to switch into deceleration mode.\n\t\t */\n\t\t__startDeceleration: function(timeStamp) {\n\n\t\t\tvar self = this;\n\n\t\t\tif (self.options.paging) {\n\n\t\t\t\tvar scrollLeft = Math.max(Math.min(self.__scrollLeft, self.__maxScrollLeft), 0);\n\t\t\t\tvar scrollTop = Math.max(Math.min(self.__scrollTop, self.__maxScrollTop), 0);\n\t\t\t\tvar clientWidth = self.__clientWidth;\n\t\t\t\tvar clientHeight = self.__clientHeight;\n\n\t\t\t\t// We limit deceleration not to the min/max values of the allowed range, but to the size of the visible client area.\n\t\t\t\t// Each page should have exactly the size of the client area.\n\t\t\t\tself.__minDecelerationScrollLeft = Math.floor(scrollLeft / clientWidth) * clientWidth;\n\t\t\t\tself.__minDecelerationScrollTop = Math.floor(scrollTop / clientHeight) * clientHeight;\n\t\t\t\tself.__maxDecelerationScrollLeft = Math.ceil(scrollLeft / clientWidth) * clientWidth;\n\t\t\t\tself.__maxDecelerationScrollTop = Math.ceil(scrollTop / clientHeight) * clientHeight;\n\n\t\t\t} else {\n\n\t\t\t\tself.__minDecelerationScrollLeft = 0;\n\t\t\t\tself.__minDecelerationScrollTop = 0;\n\t\t\t\tself.__maxDecelerationScrollLeft = self.__maxScrollLeft;\n\t\t\t\tself.__maxDecelerationScrollTop = self.__maxScrollTop;\n\n\t\t\t}\n\n\t\t\t// Wrap class method\n\t\t\tvar step = function(percent, now, render) {\n\t\t\t\tself.__stepThroughDeceleration(render);\n\t\t\t};\n\n\t\t\t// How much velocity is required to keep the deceleration running\n\t\t\tvar minVelocityToKeepDecelerating = self.options.snapping ? 4 : 0.1;\n\n\t\t\t// Detect whether it's still worth to continue animating steps\n\t\t\t// If we are already slow enough to not being user perceivable anymore, we stop the whole process here.\n\t\t\tvar verify = function() {\n\t\t\t\treturn Math.abs(self.__decelerationVelocityX) >= minVelocityToKeepDecelerating || Math.abs(self.__decelerationVelocityY) >= minVelocityToKeepDecelerating;\n\t\t\t};\n\n\t\t\tvar completed = function(renderedFramesPerSecond, animationId, wasFinished) {\n\t\t\t\tself.__isDecelerating = false;\n\n\t\t\t\t// Animate to grid when snapping is active, otherwise just fix out-of-boundary positions\n\t\t\t\tself.scrollTo(self.__scrollLeft, self.__scrollTop, self.options.snapping);\n\t\t\t};\n\n\t\t\t// Start animation and switch on flag\n\t\t\tself.__isDecelerating = core.effect.Animate.start(step, verify, completed);\n\n\t\t},\n\n\n\t\t/**\n\t\t * Called on every step of the animation\n\t\t *\n\t\t * @param inMemory {Boolean?false} Whether to not render the current step, but keep it in memory only. Used internally only!\n\t\t */\n\t\t__stepThroughDeceleration: function(render) {\n\n\t\t\tvar self = this;\n\n\n\t\t\t//\n\t\t\t// COMPUTE NEXT SCROLL POSITION\n\t\t\t//\n\n\t\t\t// Add deceleration to scroll position\n\t\t\tvar scrollLeft = self.__scrollLeft + self.__decelerationVelocityX;\n\t\t\tvar scrollTop = self.__scrollTop + self.__decelerationVelocityY;\n\n\n\t\t\t//\n\t\t\t// HARD LIMIT SCROLL POSITION FOR NON BOUNCING MODE\n\t\t\t//\n\n\t\t\tif (!self.options.bouncing) {\n\n\t\t\t\tvar scrollLeftFixed = Math.max(Math.min(self.__maxDecelerationScrollLeft, scrollLeft), self.__minDecelerationScrollLeft);\n\t\t\t\tif (scrollLeftFixed !== scrollLeft) {\n\t\t\t\t\tscrollLeft = scrollLeftFixed;\n\t\t\t\t\tself.__decelerationVelocityX = 0;\n\t\t\t\t}\n\n\t\t\t\tvar scrollTopFixed = Math.max(Math.min(self.__maxDecelerationScrollTop, scrollTop), self.__minDecelerationScrollTop);\n\t\t\t\tif (scrollTopFixed !== scrollTop) {\n\t\t\t\t\tscrollTop = scrollTopFixed;\n\t\t\t\t\tself.__decelerationVelocityY = 0;\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t//\n\t\t\t// UPDATE SCROLL POSITION\n\t\t\t//\n\n\t\t\tif (render) {\n\n\t\t\t\tself.__publish(scrollLeft, scrollTop, self.__zoomLevel);\n\n\t\t\t} else {\n\n\t\t\t\tself.__scrollLeft = scrollLeft;\n\t\t\t\tself.__scrollTop = scrollTop;\n\n\t\t\t}\n\n\n\t\t\t//\n\t\t\t// SLOW DOWN\n\t\t\t//\n\n\t\t\t// Slow down velocity on every iteration\n\t\t\tif (!self.options.paging) {\n\n\t\t\t\t// This is the factor applied to every iteration of the animation\n\t\t\t\t// to slow down the process. This should emulate natural behavior where\n\t\t\t\t// objects slow down when the initiator of the movement is removed\n\t\t\t\tvar frictionFactor = 0.95;\n\n\t\t\t\tself.__decelerationVelocityX *= frictionFactor;\n\t\t\t\tself.__decelerationVelocityY *= frictionFactor;\n\n\t\t\t}\n\n\n\t\t\t//\n\t\t\t// BOUNCING SUPPORT\n\t\t\t//\n\n\t\t\tif (self.options.bouncing) {\n\n\t\t\t\tvar scrollOutsideX = 0;\n\t\t\t\tvar scrollOutsideY = 0;\n\n\t\t\t\t// This configures the amount of change applied to deceleration/acceleration when reaching boundaries\n\t\t\t\tvar penetrationDeceleration = 0.03;\n\t\t\t\tvar penetrationAcceleration = 0.08;\n\n\t\t\t\t// Check limits\n\t\t\t\tif (scrollLeft < self.__minDecelerationScrollLeft) {\n\t\t\t\t\tscrollOutsideX = self.__minDecelerationScrollLeft - scrollLeft;\n\t\t\t\t} else if (scrollLeft > self.__maxDecelerationScrollLeft) {\n\t\t\t\t\tscrollOutsideX = self.__maxDecelerationScrollLeft - scrollLeft;\n\t\t\t\t}\n\n\t\t\t\tif (scrollTop < self.__minDecelerationScrollTop) {\n\t\t\t\t\tscrollOutsideY = self.__minDecelerationScrollTop - scrollTop;\n\t\t\t\t} else if (scrollTop > self.__maxDecelerationScrollTop) {\n\t\t\t\t\tscrollOutsideY = self.__maxDecelerationScrollTop - scrollTop;\n\t\t\t\t}\n\n\t\t\t\t// Slow down until slow enough, then flip back to snap position\n\t\t\t\tif (scrollOutsideX !== 0) {\n\t\t\t\t\tif (scrollOutsideX * self.__decelerationVelocityX <= 0) {\n\t\t\t\t\t\tself.__decelerationVelocityX += scrollOutsideX * penetrationDeceleration;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.__decelerationVelocityX = scrollOutsideX * penetrationAcceleration;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (scrollOutsideY !== 0) {\n\t\t\t\t\tif (scrollOutsideY * self.__decelerationVelocityY <= 0) {\n\t\t\t\t\t\tself.__decelerationVelocityY += scrollOutsideY * penetrationDeceleration;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.__decelerationVelocityY = scrollOutsideY * penetrationAcceleration;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\t\n\t// Copy over members to prototype\n\tfor (var key in members) {\n\t\tScroller.prototype[key] = members[key];\n\t}\n\t\t\n})();\n\n(function( factory ) {\n\tif( typeof define === 'function' && define.amd ) {\n\t\t\t// AMD. Register as an anonymous module.\n\t\t\tdefine( [ 'shoestring' ], factory );\n\t} else if (typeof module === 'object' && module.exports) {\n\t\t// Node/CommonJS\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Browser globals\n\t\tfactory();\n\t}\n}(function () {\n\tvar win = typeof window !== \"undefined\" ? window : this;\n\tvar doc = win.document;\n\n\n\t/**\n\t * The shoestring object constructor.\n\t *\n\t * @param {string,object} prim The selector to find or element to wrap.\n\t * @param {object} sec The context in which to match the `prim` selector.\n\t * @returns shoestring\n\t * @this window\n\t */\n\tfunction shoestring( prim, sec ){\n\t\tvar pType = typeof( prim ),\n\t\t\t\tret = [],\n\t\t\t\tsel;\n\n\t\t// return an empty shoestring object\n\t\tif( !prim ){\n\t\t\treturn new Shoestring( ret );\n\t\t}\n\n\t\t// ready calls\n\t\tif( prim.call ){\n\t\t\treturn shoestring.ready( prim );\n\t\t}\n\n\t\t// handle re-wrapping shoestring objects\n\t\tif( prim.constructor === Shoestring && !sec ){\n\t\t\treturn prim;\n\t\t}\n\n\t\t// if string starting with <, make html\n\t\tif( pType === \"string\" && prim.indexOf( \"<\" ) === 0 ){\n\t\t\tvar dfrag = doc.createElement( \"div\" );\n\n\t\t\tdfrag.innerHTML = prim;\n\n\t\t\t// TODO depends on children (circular)\n\t\t\treturn shoestring( dfrag ).children().each(function(){\n\t\t\t\tdfrag.removeChild( this );\n\t\t\t});\n\t\t}\n\n\t\t// if string, it's a selector, use qsa\n\t\tif( pType === \"string\" ){\n\t\t\tif( sec ){\n\t\t\t\treturn shoestring( sec ).find( prim );\n\t\t\t}\n\n\t\t\t\tsel = doc.querySelectorAll( prim );\n\n\t\t\treturn new Shoestring( sel, prim );\n\t\t}\n\n\t\t// array like objects or node lists\n\t\tif( Object.prototype.toString.call( pType ) === '[object Array]' ||\n\t\t\t\t(win.NodeList && prim instanceof win.NodeList) ){\n\n\t\t\treturn new Shoestring( prim, prim );\n\t\t}\n\n\t\t// if it's an array, use all the elements\n\t\tif( prim.constructor === Array ){\n\t\t\treturn new Shoestring( prim, prim );\n\t\t}\n\n\t\t// otherwise assume it's an object the we want at an index\n\t\treturn new Shoestring( [prim], prim );\n\t}\n\n\tvar Shoestring = function( ret, prim ) {\n\t\tthis.length = 0;\n\t\tthis.selector = prim;\n\t\tshoestring.merge(this, ret);\n\t};\n\n\t// TODO only required for tests\n\tShoestring.prototype.reverse = [].reverse;\n\n\t// For adding element set methods\n\tshoestring.fn = Shoestring.prototype;\n\n\tshoestring.Shoestring = Shoestring;\n\n\t// For extending objects\n\t// TODO move to separate module when we use prototypes\n\tshoestring.extend = function( first, second ){\n\t\tfor( var i in second ){\n\t\t\tif( second.hasOwnProperty( i ) ){\n\t\t\t\tfirst[ i ] = second[ i ];\n\t\t\t}\n\t\t}\n\n\t\treturn first;\n\t};\n\n\t// taken directly from jQuery\n\tshoestring.merge = function( first, second ) {\n\t\tvar len, j, i;\n\n\t\tlen = +second.length,\n\t\tj = 0,\n\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t};\n\n\t// expose\n\twin.shoestring = shoestring;\n\n\n\n\t/**\n\t * Make an HTTP request to a url.\n\t *\n\t * **NOTE** the following options are supported:\n\t *\n\t * - *method* - The HTTP method used with the request. Default: `GET`.\n\t * - *data* - Raw object with keys and values to pass with request as query params. Default `null`.\n\t * - *headers* - Set of request headers to add. Default `{}`.\n\t * - *async* - Whether the opened request is asynchronouse. Default `true`.\n\t * - *success* - Callback for successful request and response. Passed the response data.\n\t * - *error* - Callback for failed request and response.\n\t * - *cancel* - Callback for cancelled request and response.\n\t *\n\t * @param {string} url The url to request.\n\t * @param {object} options The options object, see Notes.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\n\tshoestring.ajax = function( url, options ) {\n\t\tvar params = \"\", req = new XMLHttpRequest(), settings, key;\n\n\t\tsettings = shoestring.extend( {}, shoestring.ajax.settings );\n\n\t\tif( options ){\n\t\t\tshoestring.extend( settings, options );\n\t\t}\n\n\t\tif( !url ){\n\t\t\turl = settings.url;\n\t\t}\n\n\t\tif( !req || !url ){\n\t\t\treturn;\n\t\t}\n\n\t\t// create parameter string from data object\n\t\tif( settings.data ){\n\t\t\tfor( key in settings.data ){\n\t\t\t\tif( settings.data.hasOwnProperty( key ) ){\n\t\t\t\t\tif( params !== \"\" ){\n\t\t\t\t\t\tparams += \"&\";\n\t\t\t\t\t}\n\t\t\t\t\tparams += encodeURIComponent( key ) + \"=\" +\n\t\t\t\t\t\tencodeURIComponent( settings.data[key] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// append params to url for GET requests\n\t\tif( settings.method === \"GET\" && params ){\n\t\t\t\n\t\t\turl += \"?\" + params;\n\t\t}\n\n\t\treq.open( settings.method, url, settings.async );\n\n\t\tif( req.setRequestHeader ){\n\t\t\treq.setRequestHeader( \"X-Requested-With\", \"XMLHttpRequest\" );\n\n\t\t\t// Set 'Content-type' header for POST requests\n\t\t\tif( settings.method === \"POST\" && params ){\n\t\t\t\treq.setRequestHeader( \"Content-type\", \"application/x-www-form-urlencoded\" );\n\t\t\t}\n\n\t\t\tfor( key in settings.headers ){\n\t\t\t\tif( settings.headers.hasOwnProperty( key ) ){\n\t\t\t\t\treq.setRequestHeader(key, settings.headers[ key ]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treq.onreadystatechange = function () {\n\t\t\tif( req.readyState === 4 ){\n\t\t\t\t// Trim the whitespace so shoestring('<div>') works\n\t\t\t\tvar res = (req.responseText || '').replace(/^\\s+|\\s+$/g, '');\n\t\t\t\tif( req.status.toString().indexOf( \"0\" ) === 0 ){\n\t\t\t\t\treturn settings.cancel( res, req.status, req );\n\t\t\t\t}\n\t\t\t\telse if ( req.status.toString().match( /^(4|5)/ ) && RegExp.$1 ){\n\t\t\t\t\treturn settings.error( res, req.status, req );\n\t\t\t\t}\n\t\t\t\telse if (settings.success) {\n\t\t\t\t\treturn settings.success( res, req.status, req );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif( req.readyState === 4 ){\n\t\t\treturn req;\n\t\t}\n\n\t\t// Send request\n\t\tif( settings.method === \"POST\" && params ){\n\t\t\treq.send( params );\n\t\t} else {\n\t\t\treq.send();\n\t\t}\n\n\t\treturn req;\n\t};\n\n\tshoestring.ajax.settings = {\n\t\tsuccess: function(){},\n\t\terror: function(){},\n\t\tcancel: function(){},\n\t\tmethod: \"GET\",\n\t\tasync: true,\n\t\tdata: null,\n\t\theaders: {}\n\t};\n\n\n\n\t/**\n\t * Helper function wrapping a call to [ajax](ajax.js.html) using the `GET` method.\n\t *\n\t * @param {string} url The url to GET from.\n\t * @param {function} callback Callback to invoke on success.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.get = function( url, callback ){\n\t\treturn shoestring.ajax( url, { success: callback } );\n\t};\n\n\n\n /**\n\t * Load the HTML response from `url` into the current set of elements.\n\t *\n\t * @param {string} url The url to GET from.\n\t * @param {function} callback Callback to invoke after HTML is inserted.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.load = function( url, callback ){\n\t\tvar self = this,\n\t\t\targs = arguments,\n\t\t\tintCB = function( data ){\n\t\t\t\tself.each(function(){\n\t\t\t\t\tshoestring( this ).html( data );\n\t\t\t\t});\n\n\t\t\t\tif( callback ){\n\t\t\t\t\tcallback.apply( self, args );\n\t\t\t\t}\n\t\t };\n\n\t\tshoestring.ajax( url, { success: intCB } );\n\t\treturn this;\n\t};\n\n\n\n\t/**\n\t * Helper function wrapping a call to [ajax](ajax.js.html) using the `POST` method.\n\t *\n\t * @param {string} url The url to POST to.\n\t * @param {object} data The data to send.\n\t * @param {function} callback Callback to invoke on success.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.post = function( url, data, callback ){\n\t\treturn shoestring.ajax( url, { data: data, method: \"POST\", success: callback } );\n\t};\n\n\n\n\t/**\n\t * Iterates over `shoestring` collections.\n\t *\n\t * @param {function} callback The callback to be invoked on each element and index\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.each = function( callback ){\n\t\treturn shoestring.each( this, callback );\n\t};\n\n\tshoestring.each = function( collection, callback ) {\n\t\tvar val;\n\t\tfor( var i = 0, il = collection.length; i < il; i++ ){\n\t\t\tval = callback.call( collection[i], i, collection[i] );\n\t\t\tif( val === false ){\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn collection;\n\t};\n\n\n\n /**\n\t * Check for array membership.\n\t *\n\t * @param {object} needle The thing to find.\n\t * @param {object} haystack The thing to find the needle in.\n\t * @return {boolean}\n\t * @this window\n\t */\n\tshoestring.inArray = function( needle, haystack ){\n\t\tvar isin = -1;\n\t\tfor( var i = 0, il = haystack.length; i < il; i++ ){\n\t\t\tif( haystack.hasOwnProperty( i ) && haystack[ i ] === needle ){\n\t\t\t\tisin = i;\n\t\t\t}\n\t\t}\n\t\treturn isin;\n\t};\n\n\n\n /**\n\t * Bind callbacks to be run when the DOM is \"ready\".\n\t *\n\t * @param {function} fn The callback to be run\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.ready = function( fn ){\n\t\tif( ready && fn ){\n\t\t\tfn.call( doc );\n\t\t}\n\t\telse if( fn ){\n\t\t\treadyQueue.push( fn );\n\t\t}\n\t\telse {\n\t\t\trunReady();\n\t\t}\n\n\t\treturn [doc];\n\t};\n\n\t// TODO necessary?\n\tshoestring.fn.ready = function( fn ){\n\t\tshoestring.ready( fn );\n\t\treturn this;\n\t};\n\n\t// Empty and exec the ready queue\n\tvar ready = false,\n\t\treadyQueue = [],\n\t\trunReady = function(){\n\t\t\tif( !ready ){\n\t\t\t\twhile( readyQueue.length ){\n\t\t\t\t\treadyQueue.shift().call( doc );\n\t\t\t\t}\n\t\t\t\tready = true;\n\t\t\t}\n\t\t};\n\n\t// If DOM is already ready at exec time, depends on the browser.\n\t// From: https://github.com/mobify/mobifyjs/blob/526841be5509e28fc949038021799e4223479f8d/src/capture.js#L128\n\tif (doc.attachEvent ? doc.readyState === \"complete\" : doc.readyState !== \"loading\") {\n\t\trunReady();\n\t} else {\n\t\tdoc.addEventListener( \"DOMContentLoaded\", runReady, false );\n\t\tdoc.addEventListener( \"readystatechange\", runReady, false );\n\t\twin.addEventListener( \"load\", runReady, false );\n\t}\n\n\n\n /**\n\t * Checks the current set of elements against the selector, if one matches return `true`.\n\t *\n\t * @param {string} selector The selector to check.\n\t * @return {boolean}\n\t * @this {shoestring}\n\t */\n\tshoestring.fn.is = function( selector ){\n\t\tvar ret = false, self = this, parents, check;\n\n\t\t// assume a dom element\n\t\tif( typeof selector !== \"string\" ){\n\t\t\t// array-like, ie shoestring objects or element arrays\n\t\t\tif( selector.length && selector[0] ){\n\t\t\t\tcheck = selector;\n\t\t\t} else {\n\t\t\t\tcheck = [selector];\n\t\t\t}\n\n\t\t\treturn _checkElements(this, check);\n\t\t}\n\n\t\tparents = this.parent();\n\n\t\tif( !parents.length ){\n\t\t\tparents = shoestring( doc );\n\t\t}\n\n\t\tparents.each(function( i, e ) {\n\t\t\tvar children;\n\n\t\t\t\t\tchildren = e.querySelectorAll( selector );\n\n\t\t\tret = _checkElements( self, children );\n\t\t});\n\n\t\treturn ret;\n\t};\n\n\tfunction _checkElements(needles, haystack){\n\t\tvar ret = false;\n\n\t\tneedles.each(function() {\n\t\t\tvar j = 0;\n\n\t\t\twhile( j < haystack.length ){\n\t\t\t\tif( this === haystack[j] ){\n\t\t\t\t\tret = true;\n\t\t\t\t}\n\n\t\t\t\tj++;\n\t\t\t}\n\t\t});\n\n\t\treturn ret;\n\t}\n\n\n\n\t/**\n\t * Get data attached to the first element or set data values on all elements in the current set.\n\t *\n\t * @param {string} name The data attribute name.\n\t * @param {any} value The value assigned to the data attribute.\n\t * @return {any|shoestring}\n\t * @this shoestring\n\t */\n\tshoestring.fn.data = function( name, value ){\n\t\tif( name !== undefined ){\n\t\t\tif( value !== undefined ){\n\t\t\t\treturn this.each(function(){\n\t\t\t\t\tif( !this.shoestringData ){\n\t\t\t\t\t\tthis.shoestringData = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.shoestringData[ name ] = value;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( this[ 0 ] ) {\n\t\t\t\t\tif( this[ 0 ].shoestringData ) {\n\t\t\t\t\t\treturn this[ 0 ].shoestringData[ name ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\treturn this[ 0 ] ? this[ 0 ].shoestringData || {} : undefined;\n\t\t}\n\t};\n\n\n\t/**\n\t * Remove data associated with `name` or all the data, for each element in the current set.\n\t *\n\t * @param {string} name The data attribute name.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.removeData = function( name ){\n\t\treturn this.each(function(){\n\t\t\tif( name !== undefined && this.shoestringData ){\n\t\t\t\tthis.shoestringData[ name ] = undefined;\n\t\t\t\tdelete this.shoestringData[ name ];\n\t\t\t}\telse {\n\t\t\t\tthis[ 0 ].shoestringData = {};\n\t\t\t}\n\t\t});\n\t};\n\n\n\n\t/**\n\t * An alias for the `shoestring` constructor.\n\t */\n\tif (typeof(win.$) === \"undefined\") { win.$ = shoestring; }\n\n\n\n\t/**\n\t * Add a class to each DOM element in the set of elements.\n\t *\n\t * @param {string} className The name of the class to be added.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.addClass = function( className ){\n\t\tvar classes = className.replace(/^\\s+|\\s+$/g, '').split( \" \" );\n\n\t\treturn this.each(function(){\n\t\t\tfor( var i = 0, il = classes.length; i < il; i++ ){\n\t\t\t\tif( this.className !== undefined &&\n\t\t\t\t\t\t(this.className === \"\" ||\n\t\t\t\t\t\t!this.className.match( new RegExp( \"(^|\\\\s)\" + classes[ i ] + \"($|\\\\s)\"))) ){\n\t\t\t\t\tthis.className += \" \" + classes[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\n\n /**\n\t * Add elements matching the selector to the current set.\n\t *\n\t * @param {string} selector The selector for the elements to add from the DOM\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.add = function( selector ){\n\t\tvar ret = [];\n\t\tthis.each(function(){\n\t\t\tret.push( this );\n\t\t});\n\n\t\tshoestring( selector ).each(function(){\n\t\t\tret.push( this );\n\t\t});\n\n\t\treturn shoestring( ret );\n\t};\n\n\n\n\t/**\n\t * Insert an element or HTML string after each element in the current set.\n\t *\n\t * @param {string|HTMLElement} fragment The HTML or HTMLElement to insert.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.after = function( fragment ){\n\t\tif( typeof( fragment ) === \"string\" || fragment.nodeType !== undefined ){\n\t\t\tfragment = shoestring( fragment );\n\t\t}\n\n\t\tif( fragment.length > 1 ){\n\t\t\tfragment = fragment.reverse();\n\t\t}\n\t\treturn this.each(function( i ){\n\t\t\tfor( var j = 0, jl = fragment.length; j < jl; j++ ){\n\t\t\t\tvar insertEl = i > 0 ? fragment[ j ].cloneNode( true ) : fragment[ j ];\n\t\t\t\tthis.parentNode.insertBefore( insertEl, this.nextSibling );\n\t\t\t}\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Insert an element or HTML string as the last child of each element in the set.\n\t *\n\t * @param {string|HTMLElement} fragment The HTML or HTMLElement to insert.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.append = function( fragment ){\n\t\tif( typeof( fragment ) === \"string\" || fragment.nodeType !== undefined ){\n\t\t\tfragment = shoestring( fragment );\n\t\t}\n\n\t\treturn this.each(function( i ){\n\t\t\tfor( var j = 0, jl = fragment.length; j < jl; j++ ){\n\t\t\t\tthis.appendChild( i > 0 ? fragment[ j ].cloneNode( true ) : fragment[ j ] );\n\t\t\t}\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Insert the current set as the last child of the elements matching the selector.\n\t *\n\t * @param {string} selector The selector after which to append the current set.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.appendTo = function( selector ){\n\t\treturn this.each(function(){\n\t\t\tshoestring( selector ).append( this );\n\t\t});\n\t};\n\n\n\n /**\n\t * Get the value of the first element of the set or set the value of all the elements in the set.\n\t *\n\t * @param {string} name The attribute name.\n\t * @param {string} value The new value for the attribute.\n\t * @return {shoestring|string|undefined}\n\t * @this {shoestring}\n\t */\n\tshoestring.fn.attr = function( name, value ){\n\t\tvar nameStr = typeof( name ) === \"string\";\n\n\t\tif( value !== undefined || !nameStr ){\n\t\t\treturn this.each(function(){\n\t\t\t\tif( nameStr ){\n\t\t\t\t\tthis.setAttribute( name, value );\n\t\t\t\t}\telse {\n\t\t\t\t\tfor( var i in name ){\n\t\t\t\t\t\tif( name.hasOwnProperty( i ) ){\n\t\t\t\t\t\t\tthis.setAttribute( i, name[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn this[ 0 ] ? this[ 0 ].getAttribute( name ) : undefined;\n\t\t}\n\t};\n\n\n\n\t/**\n\t * Insert an element or HTML string before each element in the current set.\n\t *\n\t * @param {string|HTMLElement} fragment The HTML or HTMLElement to insert.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.before = function( fragment ){\n\t\tif( typeof( fragment ) === \"string\" || fragment.nodeType !== undefined ){\n\t\t\tfragment = shoestring( fragment );\n\t\t}\n\n\t\treturn this.each(function( i ){\n\t\t\tfor( var j = 0, jl = fragment.length; j < jl; j++ ){\n\t\t\t\tthis.parentNode.insertBefore( i > 0 ? fragment[ j ].cloneNode( true ) : fragment[ j ], this );\n\t\t\t}\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Get the children of the current collection.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.children = function(){\n\t\t\t\tvar ret = [],\n\t\t\tchilds,\n\t\t\tj;\n\t\tthis.each(function(){\n\t\t\tchilds = this.children;\n\t\t\tj = -1;\n\n\t\t\twhile( j++ < childs.length-1 ){\n\t\t\t\tif( shoestring.inArray( childs[ j ], ret ) === -1 ){\n\t\t\t\t\tret.push( childs[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn shoestring(ret);\n\t};\n\n\n\n\t/**\n\t * Clone and return the current set of nodes into a new `shoestring` object.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.clone = function() {\n\t\tvar ret = [];\n\n\t\tthis.each(function() {\n\t\t\tret.push( this.cloneNode( true ) );\n\t\t});\n\n\t\treturn shoestring( ret );\n\t};\n\n\n\n\t/**\n\t * Find an element matching the selector in the set of the current element and its parents.\n\t *\n\t * @param {string} selector The selector used to identify the target element.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.closest = function( selector ){\n\t\tvar ret = [];\n\n\t\tif( !selector ){\n\t\t\treturn shoestring( ret );\n\t\t}\n\n\t\tthis.each(function(){\n\t\t\tvar element, $self = shoestring( element = this );\n\n\t\t\tif( $self.is(selector) ){\n\t\t\t\tret.push( this );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twhile( element.parentElement ) {\n\t\t\t\tif( shoestring(element.parentElement).is(selector) ){\n\t\t\t\t\tret.push( element.parentElement );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\telement = element.parentElement;\n\t\t\t}\n\t\t});\n\n\t\treturn shoestring( ret );\n\t};\n\n\n\n shoestring.cssExceptions = {\n\t\t'float': [ 'cssFloat' ]\n\t};\n\n\n\n\t(function() {\n\t\tvar cssExceptions = shoestring.cssExceptions;\n\n\t\t// marginRight instead of margin-right\n\t\tfunction convertPropertyName( str ) {\n\t\t\treturn str.replace( /\\-([A-Za-z])/g, function ( match, character ) {\n\t\t\t\treturn character.toUpperCase();\n\t\t\t});\n\t\t}\n\n\t\tfunction _getStyle( element, property ) {\n\t\t\treturn win.getComputedStyle( element, null ).getPropertyValue( property );\n\t\t}\n\n\t\tvar vendorPrefixes = [ '', '-webkit-', '-ms-', '-moz-', '-o-', '-khtml-' ];\n\n\t\t/**\n\t\t * Private function for getting the computed style of an element.\n\t\t *\n\t\t * **NOTE** Please use the [css](../css.js.html) method instead.\n\t\t *\n\t\t * @method _getStyle\n\t\t * @param {HTMLElement} element The element we want the style property for.\n\t\t * @param {string} property The css property we want the style for.\n\t\t */\n\t\tshoestring._getStyle = function( element, property ) {\n\t\t\tvar convert, value, j, k;\n\n\t\t\tif( cssExceptions[ property ] ) {\n\t\t\t\tfor( j = 0, k = cssExceptions[ property ].length; j < k; j++ ) {\n\t\t\t\t\tvalue = _getStyle( element, cssExceptions[ property ][ j ] );\n\n\t\t\t\t\tif( value ) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor( j = 0, k = vendorPrefixes.length; j < k; j++ ) {\n\t\t\t\tconvert = convertPropertyName( vendorPrefixes[ j ] + property );\n\n\t\t\t\t// VendorprefixKeyName || key-name\n\t\t\t\tvalue = _getStyle( element, convert );\n\n\t\t\t\tif( convert !== property ) {\n\t\t\t\t\tvalue = value || _getStyle( element, property );\n\t\t\t\t}\n\n\t\t\t\tif( vendorPrefixes[ j ] ) {\n\t\t\t\t\t// -vendorprefix-key-name\n\t\t\t\t\tvalue = value || _getStyle( element, vendorPrefixes[ j ] + property );\n\t\t\t\t}\n\n\t\t\t\tif( value ) {\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\t})();\n\n\n\n\t(function() {\n\t\tvar cssExceptions = shoestring.cssExceptions;\n\n\t\t// marginRight instead of margin-right\n\t\tfunction convertPropertyName( str ) {\n\t\t\treturn str.replace( /\\-([A-Za-z])/g, function ( match, character ) {\n\t\t\t\treturn character.toUpperCase();\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Private function for setting the style of an element.\n\t\t *\n\t\t * **NOTE** Please use the [css](../css.js.html) method instead.\n\t\t *\n\t\t * @method _setStyle\n\t\t * @param {HTMLElement} element The element we want to style.\n\t\t * @param {string} property The property being used to style the element.\n\t\t * @param {string} value The css value for the style property.\n\t\t */\n\t\tshoestring._setStyle = function( element, property, value ) {\n\t\t\tvar convertedProperty = convertPropertyName(property);\n\n\t\t\telement.style[ property ] = value;\n\n\t\t\tif( convertedProperty !== property ) {\n\t\t\t\telement.style[ convertedProperty ] = value;\n\t\t\t}\n\n\t\t\tif( cssExceptions[ property ] ) {\n\t\t\t\tfor( var j = 0, k = cssExceptions[ property ].length; j<k; j++ ) {\n\t\t\t\t\telement.style[ cssExceptions[ property ][ j ] ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t})();\n\n\n\n\t/**\n\t * Get the compute style property of the first element or set the value of a style property\n\t * on all elements in the set.\n\t *\n\t * @method _setStyle\n\t * @param {string} property The property being used to style the element.\n\t * @param {string|undefined} value The css value for the style property.\n\t * @return {string|shoestring}\n\t * @this shoestring\n\t */\n\tshoestring.fn.css = function( property, value ){\n\t\tif( !this[0] ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( typeof property === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tfor( var key in property ) {\n\t\t\t\t\tif( property.hasOwnProperty( key ) ) {\n\t\t\t\t\t\tshoestring._setStyle( this, key, property[key] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\telse {\n\t\t\t// assignment else retrieve first\n\t\t\tif( value !== undefined ){\n\t\t\t\treturn this.each(function(){\n\t\t\t\t\tshoestring._setStyle( this, property, value );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn shoestring._getStyle( this[0], property );\n\t\t}\n\t};\n\n\n\n\t/**\n\t * Returns the indexed element wrapped in a new `shoestring` object.\n\t *\n\t * @param {integer} index The index of the element to wrap and return.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.eq = function( index ){\n\t\tif( this[index] ){\n\t\t\treturn shoestring( this[index] );\n\t\t}\n\n\t\treturn shoestring([]);\n\t};\n\n\n\n\t/**\n\t * Filter out the current set if they do *not* match the passed selector or\n\t * the supplied callback returns false\n\t *\n\t * @param {string,function} selector The selector or boolean return value callback used to filter the elements.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.filter = function( selector ){\n\t\tvar ret = [];\n\n\t\tthis.each(function( index ){\n\t\t\tvar wsel;\n\n\t\t\tif( typeof selector === 'function' ) {\n\t\t\t\tif( selector.call( this, index ) !== false ) {\n\t\t\t\t\tret.push( this );\n\t\t\t\t}\n\t\t\t// document node\n\t\t\t} else if( this.nodeType === 9 ){\n\t\t\t\tif( this === selector ) {\n\t\t\t\t\tret.push( this );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif( !this.parentNode ){\n\t\t\t\t\tvar context = shoestring( doc.createDocumentFragment() );\n\n\t\t\t\t\tcontext[ 0 ].appendChild( this );\n\t\t\t\t\twsel = shoestring( selector, context );\n\t\t\t\t} else {\n\t\t\t\t\twsel = shoestring( selector, this.parentNode );\n\t\t\t\t}\n\n\t\t\t\tif( shoestring.inArray( this, wsel ) > -1 ){\n\t\t\t\t\tret.push( this );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn shoestring( ret );\n\t};\n\n\n\n\t/**\n\t * Find descendant elements of the current collection.\n\t *\n\t * @param {string} selector The selector used to find the children\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.find = function( selector ){\n\t\tvar ret = [],\n\t\t\tfinds;\n\t\tthis.each(function(){\n\t\t\t\tfinds = this.querySelectorAll( selector );\n\n\t\t\tfor( var i = 0, il = finds.length; i < il; i++ ){\n\t\t\t\tret = ret.concat( finds[i] );\n\t\t\t}\n\t\t});\n\t\treturn shoestring( ret );\n\t};\n\n\n\n\t/**\n\t * Returns the first element of the set wrapped in a new `shoestring` object.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.first = function(){\n\t\treturn this.eq( 0 );\n\t};\n\n\n\n\t/**\n\t * Returns the raw DOM node at the passed index.\n\t *\n\t * @param {integer} index The index of the element to wrap and return.\n\t * @return {HTMLElement|undefined|array}\n\t * @this shoestring\n\t */\n\tshoestring.fn.get = function( index ){\n\n\t\t// return an array of elements if index is undefined\n\t\tif( index === undefined ){\n\t\t\tvar elements = [];\n\n\t\t\tfor( var i = 0; i < this.length; i++ ){\n\t\t\t\telements.push( this[ i ] );\n\t\t\t}\n\n\t\t\treturn elements;\n\t\t} else {\n\t\t\treturn this[ index ];\n\t\t}\n\t};\n\n\n\n\t/**\n\t * Private function for setting/getting the offset property for height/width.\n\t *\n\t * **NOTE** Please use the [width](width.js.html) or [height](height.js.html) methods instead.\n\t *\n\t * @param {shoestring} set The set of elements.\n\t * @param {string} name The string \"height\" or \"width\".\n\t * @param {float|undefined} value The value to assign.\n\t * @return shoestring\n\t * @this window\n\t */\n\tshoestring._dimension = function( set, name, value ){\n\t\tvar offsetName;\n\n\t\tif( value === undefined ){\n\t\t\toffsetName = name.replace(/^[a-z]/, function( letter ) {\n\t\t\t\treturn letter.toUpperCase();\n\t\t\t});\n\n\t\t\treturn set[ 0 ][ \"offset\" + offsetName ];\n\t\t} else {\n\t\t\t// support integer values as pixels\n\t\t\tvalue = typeof value === \"string\" ? value : value + \"px\";\n\n\t\t\treturn set.each(function(){\n\t\t\t\tthis.style[ name ] = value;\n\t\t\t});\n\t\t}\n\t};\n\n\n\n\t/**\n\t * Gets the height value of the first element or sets the height for the whole set.\n\t *\n\t * @param {float|undefined} value The value to assign.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.height = function( value ){\n\t\treturn shoestring._dimension( this, \"height\", value );\n\t};\n\n\n\n\tvar set = function( html ){\n\t\tif( typeof html === \"string\" || typeof html === \"number\" ){\n\t\t\treturn this.each(function(){\n\t\t\t\tthis.innerHTML = \"\" + html;\n\t\t\t});\n\t\t} else {\n\t\t\tvar h = \"\";\n\t\t\tif( typeof html.length !== \"undefined\" ){\n\t\t\t\tfor( var i = 0, l = html.length; i < l; i++ ){\n\t\t\t\t\th += html[i].outerHTML;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\th = html.outerHTML;\n\t\t\t}\n\t\t\treturn this.each(function(){\n\t\t\t\tthis.innerHTML = h;\n\t\t\t});\n\t\t}\n\t};\n\t/**\n\t * Gets or sets the `innerHTML` from all the elements in the set.\n\t *\n\t * @param {string|undefined} html The html to assign\n\t * @return {string|shoestring}\n\t * @this shoestring\n\t */\n\tshoestring.fn.html = function( html ){\n\t\t\t\tif( typeof html !== \"undefined\" ){\n\t\t\treturn set.call( this, html );\n\t\t} else { // get\n\t\t\tvar pile = \"\";\n\n\t\t\tthis.each(function(){\n\t\t\t\tpile += this.innerHTML;\n\t\t\t});\n\n\t\t\treturn pile;\n\t\t}\n\t};\n\n\n\n\t(function() {\n\t\tfunction _getIndex( set, test ) {\n\t\t\tvar i, result, element;\n\n\t\t\tfor( i = result = 0; i < set.length; i++ ) {\n\t\t\t\telement = set.item ? set.item(i) : set[i];\n\n\t\t\t\tif( test(element) ){\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\t// ignore text nodes, etc\n\t\t\t\t// NOTE may need to be more permissive\n\t\t\t\tif( element.nodeType === 1 ){\n\t\t\t\t\tresult++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn -1;\n\t\t}\n\n\t\t/**\n\t\t * Find the index in the current set for the passed selector.\n\t\t * Without a selector it returns the index of the first node within the array of its siblings.\n\t\t *\n\t\t * @param {string|undefined} selector The selector used to search for the index.\n\t\t * @return {integer}\n\t\t * @this {shoestring}\n\t\t */\n\t\tshoestring.fn.index = function( selector ){\n\t\t\tvar self, children;\n\n\t\t\tself = this;\n\n\t\t\t// no arg? check the children, otherwise check each element that matches\n\t\t\tif( selector === undefined ){\n\t\t\t\tchildren = ( ( this[ 0 ] && this[0].parentNode ) || doc.documentElement).childNodes;\n\n\t\t\t\t// check if the element matches the first of the set\n\t\t\t\treturn _getIndex(children, function( element ) {\n\t\t\t\t\treturn self[0] === element;\n\t\t\t\t});\n\t\t\t} else {\n\n\t\t\t\t// check if the element matches the first selected node from the parent\n\t\t\t\treturn _getIndex(self, function( element ) {\n\t\t\t\t\treturn element === (shoestring( selector, element.parentNode )[ 0 ]);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t})();\n\n\n\n\t/**\n\t * Insert the current set after the elements matching the selector.\n\t *\n\t * @param {string} selector The selector after which to insert the current set.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.insertAfter = function( selector ){\n\t\treturn this.each(function(){\n\t\t\tshoestring( selector ).after( this );\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Insert the current set before the elements matching the selector.\n\t *\n\t * @param {string} selector The selector before which to insert the current set.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.insertBefore = function( selector ){\n\t\treturn this.each(function(){\n\t\t\tshoestring( selector ).before( this );\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Returns the last element of the set wrapped in a new `shoestring` object.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.last = function(){\n\t\treturn this.eq( this.length - 1 );\n\t};\n\n\n\n\t/**\n\t * Returns a `shoestring` object with the set of siblings of each element in the original set.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.next = function(){\n\t\t\n\t\tvar result = [];\n\n\t\t// TODO need to implement map\n\t\tthis.each(function() {\n\t\t\tvar children, item, found;\n\n\t\t\t// get the child nodes for this member of the set\n\t\t\tchildren = shoestring( this.parentNode )[0].childNodes;\n\n\t\t\tfor( var i = 0; i < children.length; i++ ){\n\t\t\t\titem = children.item( i );\n\n\t\t\t\t// found the item we needed (found) which means current item value is\n\t\t\t\t// the next node in the list, as long as it's viable grab it\n\t\t\t\t// NOTE may need to be more permissive\n\t\t\t\tif( found && item.nodeType === 1 ){\n\t\t\t\t\tresult.push( item );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// find the current item and mark it as found\n\t\t\t\tif( item === this ){\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn shoestring( result );\n\t};\n\n\n\n\t/**\n\t * Removes elements from the current set.\n\t *\n\t * @param {string} selector The selector to use when removing the elements.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.not = function( selector ){\n\t\tvar ret = [];\n\n\t\tthis.each(function(){\n\t\t\tvar found = shoestring( selector, this.parentNode );\n\n\t\t\tif( shoestring.inArray(this, found) === -1 ){\n\t\t\t\tret.push( this );\n\t\t\t}\n\t\t});\n\n\t\treturn shoestring( ret );\n\t};\n\n\n\n\t/**\n\t * Returns an object with the `top` and `left` properties corresponging to the first elements offsets.\n\t *\n\t * @return object\n\t * @this shoestring\n\t */\n\tshoestring.fn.offset = function(){\n\t\treturn {\n\t\t\ttop: this[ 0 ].offsetTop,\n\t\t\tleft: this[ 0 ].offsetLeft\n\t\t};\n\t};\n\n\n\n\t/**\n\t * Returns the set of first parents for each element in the current set.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.parent = function(){\n\t\tvar ret = [],\n\t\t\tparent;\n\n\t\tthis.each(function(){\n\t\t\t// no parent node, assume top level\n\t\t\t// jQuery parent: return the document object for <html> or the parent node if it exists\n\t\t\tparent = (this === doc.documentElement ? doc : this.parentNode);\n\n\t\t\t// if there is a parent and it's not a document fragment\n\t\t\tif( parent && parent.nodeType !== 11 ){\n\t\t\t\tret.push( parent );\n\t\t\t}\n\t\t});\n\n\t\treturn shoestring(ret);\n\t};\n\n\n\n\t/**\n\t * Returns the set of all parents matching the selector if provided for each element in the current set.\n\t *\n\t * @param {string} selector The selector to check the parents with.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.parents = function( selector ){\n\t\tvar ret = [];\n\n\t\tthis.each(function(){\n\t\t\tvar curr = this, match;\n\n\t\t\twhile( curr.parentElement && !match ){\n\t\t\t\tcurr = curr.parentElement;\n\n\t\t\t\tif( selector ){\n\t\t\t\t\tif( curr === shoestring( selector )[0] ){\n\t\t\t\t\t\tmatch = true;\n\n\t\t\t\t\t\tif( shoestring.inArray( curr, ret ) === -1 ){\n\t\t\t\t\t\t\tret.push( curr );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif( shoestring.inArray( curr, ret ) === -1 ){\n\t\t\t\t\t\tret.push( curr );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn shoestring(ret);\n\t};\n\n\n\n\t/**\n\t * Add an HTML string or element before the children of each element in the current set.\n\t *\n\t * @param {string|HTMLElement} fragment The HTML string or element to add.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.prepend = function( fragment ){\n\t\tif( typeof( fragment ) === \"string\" || fragment.nodeType !== undefined ){\n\t\t\tfragment = shoestring( fragment );\n\t\t}\n\n\t\treturn this.each(function( i ){\n\n\t\t\tfor( var j = 0, jl = fragment.length; j < jl; j++ ){\n\t\t\t\tvar insertEl = i > 0 ? fragment[ j ].cloneNode( true ) : fragment[ j ];\n\t\t\t\tif ( this.firstChild ){\n\t\t\t\t\tthis.insertBefore( insertEl, this.firstChild );\n\t\t\t\t} else {\n\t\t\t\t\tthis.appendChild( insertEl );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Add each element of the current set before the children of the selected elements.\n\t *\n\t * @param {string} selector The selector for the elements to add the current set to..\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.prependTo = function( selector ){\n\t\treturn this.each(function(){\n\t\t\tshoestring( selector ).prepend( this );\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Returns a `shoestring` object with the set of *one* siblingx before each element in the original set.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.prev = function(){\n\t\t\n\t\tvar result = [];\n\n\t\t// TODO need to implement map\n\t\tthis.each(function() {\n\t\t\tvar children, item, found;\n\n\t\t\t// get the child nodes for this member of the set\n\t\t\tchildren = shoestring( this.parentNode )[0].childNodes;\n\n\t\t\tfor( var i = children.length -1; i >= 0; i-- ){\n\t\t\t\titem = children.item( i );\n\n\t\t\t\t// found the item we needed (found) which means current item value is\n\t\t\t\t// the next node in the list, as long as it's viable grab it\n\t\t\t\t// NOTE may need to be more permissive\n\t\t\t\tif( found && item.nodeType === 1 ){\n\t\t\t\t\tresult.push( item );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// find the current item and mark it as found\n\t\t\t\tif( item === this ){\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn shoestring( result );\n\t};\n\n\n\n\t/**\n\t * Returns a `shoestring` object with the set of *all* siblings before each element in the original set.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.prevAll = function(){\n\t\t\n\t\tvar result = [];\n\n\t\tthis.each(function() {\n\t\t\tvar $previous = shoestring( this ).prev();\n\n\t\t\twhile( $previous.length ){\n\t\t\t\tresult.push( $previous[0] );\n\t\t\t\t$previous = $previous.prev();\n\t\t\t}\n\t\t});\n\n\t\treturn shoestring( result );\n\t};\n\n\n\n\t// Property normalization, a subset taken from jQuery src\n\tshoestring.propFix = {\n\t\t\"class\": \"className\",\n\t\tcontenteditable: \"contentEditable\",\n\t\t\"for\": \"htmlFor\",\n\t\treadonly: \"readOnly\",\n\t\ttabindex: \"tabIndex\"\n\t};\n\n\n\n\t/**\n\t * Gets the property value from the first element or sets the property value on all elements of the currrent set.\n *\n\t * @param {string} name The property name.\n * @param {any} value The property value.\n\t * @return {any|shoestring}\n\t * @this shoestring\n\t */\n\tshoestring.fn.prop = function( name, value ){\n\t\tif( !this[0] ){\n\t\t\treturn;\n\t\t}\n\n\t\tname = shoestring.propFix[ name ] || name;\n\n\t\tif( value !== undefined ){\n\t\t\treturn this.each(function(){\n\t\t\t\tthis[ name ] = value;\n\t\t\t});\n\t\t}\telse {\n\t\t\treturn this[ 0 ][ name ];\n\t\t}\n\t};\n\n\n\n\t/**\n\t * Remove an attribute from each element in the current set.\n\t *\n\t * @param {string} name The name of the attribute.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.removeAttr = function( name ){\n\t\treturn this.each(function(){\n\t\t\tthis.removeAttribute( name );\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Remove a class from each DOM element in the set of elements.\n\t *\n\t * @param {string} className The name of the class to be removed.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.removeClass = function( cname ){\n\t\tvar classes = cname.replace(/^\\s+|\\s+$/g, '').split( \" \" );\n\n\t\treturn this.each(function(){\n\t\t\tvar newClassName, regex;\n\n\t\t\tfor( var i = 0, il = classes.length; i < il; i++ ){\n\t\t\t\tif( this.className !== undefined ){\n\t\t\t\t\tregex = new RegExp( \"(^|\\\\s)\" + classes[ i ] + \"($|\\\\s)\", \"gmi\" );\n\t\t\t\t\tnewClassName = this.className.replace( regex, \" \" );\n\n\t\t\t\t\tthis.className = newClassName.replace(/^\\s+|\\s+$/g, '');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Remove the current set of elements from the DOM.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.remove = function(){\n\t\treturn this.each(function(){\n\t\t\tif( this.parentNode ) {\n\t\t\t\tthis.parentNode.removeChild( this );\n\t\t\t}\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Remove a proprety from each element in the current set.\n\t *\n\t * @param {string} name The name of the property.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.removeProp = function( property ){\n\t\tvar name = shoestring.propFix[ property ] || property;\n\n\t\treturn this.each(function(){\n\t\t\tthis[ name ] = undefined;\n\t\t\tdelete this[ name ];\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Replace each element in the current set with that argument HTML string or HTMLElement.\n\t *\n\t * @param {string|HTMLElement} fragment The value to assign.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.replaceWith = function( fragment ){\n\t\tif( typeof( fragment ) === \"string\" ){\n\t\t\tfragment = shoestring( fragment );\n\t\t}\n\n\t\tvar ret = [];\n\n\t\tif( fragment.length > 1 ){\n\t\t\tfragment = fragment.reverse();\n\t\t}\n\t\tthis.each(function( i ){\n\t\t\tvar clone = this.cloneNode( true ),\n\t\t\t\tinsertEl;\n\t\t\tret.push( clone );\n\n\t\t\t// If there is no parentNode, this is pointless, drop it.\n\t\t\tif( !this.parentNode ){ return; }\n\n\t\t\tif( fragment.length === 1 ){\n\t\t\t\tinsertEl = i > 0 ? fragment[ 0 ].cloneNode( true ) : fragment[ 0 ];\n\t\t\t\tthis.parentNode.replaceChild( insertEl, this );\n\t\t\t} else {\n\t\t\t\tfor( var j = 0, jl = fragment.length; j < jl; j++ ){\n\t\t\t\t\tinsertEl = i > 0 ? fragment[ j ].cloneNode( true ) : fragment[ j ];\n\t\t\t\t\tthis.parentNode.insertBefore( insertEl, this.nextSibling );\n\t\t\t\t}\n\t\t\t\tthis.parentNode.removeChild( this );\n\t\t\t}\n\t\t});\n\n\t\treturn shoestring( ret );\n\t};\n\n\n\n\tshoestring.inputTypes = [\n\t\t\"text\",\n\t\t\"hidden\",\n\t\t\"password\",\n\t\t\"color\",\n\t\t\"date\",\n\t\t\"datetime\",\n\t\t// \"datetime\\-local\" matched by datetime\n\t\t\"email\",\n\t\t\"month\",\n\t\t\"number\",\n\t\t\"range\",\n\t\t\"search\",\n\t\t\"tel\",\n\t\t\"time\",\n\t\t\"url\",\n\t\t\"week\"\n\t];\n\n\tshoestring.inputTypeTest = new RegExp( shoestring.inputTypes.join( \"|\" ) );\n\n\n\t/**\n\t * Serialize child input element values into an object.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.serialize = function(){\n\t\tvar data = {};\n\n\t\tshoestring( \"input, select\", this ).each(function(){\n\t\t\tvar type = this.type, name = this.name,\tvalue = this.value;\n\n\t\t\tif( shoestring.inputTypeTest.test( type ) ||\n\t\t\t\t\t( type === \"checkbox\" || type === \"radio\" ) &&\n\t\t\t\t\tthis.checked ){\n\n\t\t\t\tdata[ name ] = value;\n\t\t\t}\telse if( this.nodeName === \"SELECT\" ){\n\t\t\t\tdata[ name ] = this.options[ this.selectedIndex ].nodeValue;\n\t\t\t}\n\t\t});\n\n\t\treturn data;\n\t};\n\n\n\n /**\n\t * Get all of the sibling elements for each element in the current set.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.siblings = function(){\n\t\t\n\t\tif( !this.length ) {\n\t\t\treturn shoestring( [] );\n\t\t}\n\n\t\tvar sibs = [], el = this[ 0 ].parentNode.firstChild;\n\n\t\tdo {\n\t\t\tif( el.nodeType === 1 && el !== this[ 0 ] ) {\n\t\t\t\tsibs.push( el );\n\t\t\t}\n\n el = el.nextSibling;\n\t\t} while( el );\n\n\t\treturn shoestring( sibs );\n\t};\n\n\n\n\tvar getText = function( elem ){\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( (node = elem[i++]) ) {\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += getText( node );\n\t\t\t}\n\t\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t\t// Use textContent for elements\n\t\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\t\treturn elem.textContent;\n\t\t\t} else {\n\t\t\t\t// Traverse its children\n\t\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\t\tret += getText( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t};\n\n /**\n\t * Recursively retrieve the text content of the each element in the current set.\n\t *\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.text = function() {\n\t\t\n\t\treturn getText( this );\n\t};\n\n\n\n\n\t/**\n\t * Get the value of the first element or set the value of all elements in the current set.\n\t *\n\t * @param {string} value The value to set.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.val = function( value ){\n\t\tvar el;\n\t\tif( value !== undefined ){\n\t\t\treturn this.each(function(){\n\t\t\t\tif( this.tagName === \"SELECT\" ){\n\t\t\t\t\tvar optionSet, option,\n\t\t\t\t\t\toptions = this.options,\n\t\t\t\t\t\tvalues = [],\n\t\t\t\t\t\ti = options.length,\n\t\t\t\t\t\tnewIndex;\n\n\t\t\t\t\tvalues[0] = value;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\toption = options[ i ];\n\t\t\t\t\t\tif ( (option.selected = shoestring.inArray( option.value, values ) >= 0) ) {\n\t\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t\t\tnewIndex = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// force browsers to behave consistently when non-matching value is set\n\t\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\t\tthis.selectedIndex = -1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.selectedIndex = newIndex;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.value = value;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tel = this[0];\n\n\t\t\tif( el.tagName === \"SELECT\" ){\n\t\t\t\tif( el.selectedIndex < 0 ){ return \"\"; }\n\t\t\t\treturn el.options[ el.selectedIndex ].value;\n\t\t\t} else {\n\t\t\t\treturn el.value;\n\t\t\t}\n\t\t}\n\t};\n\n\n\n\t/**\n\t * Gets the width value of the first element or sets the width for the whole set.\n\t *\n\t * @param {float|undefined} value The value to assign.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.width = function( value ){\n\t\treturn shoestring._dimension( this, \"width\", value );\n\t};\n\n\n\n\t/**\n\t * Wraps the child elements in the provided HTML.\n\t *\n\t * @param {string} html The wrapping HTML.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.wrapInner = function( html ){\n\t\treturn this.each(function(){\n\t\t\tvar inH = this.innerHTML;\n\n\t\t\tthis.innerHTML = \"\";\n\t\t\tshoestring( this ).append( shoestring( html ).html( inH ) );\n\t\t});\n\t};\n\n\n\n\tfunction initEventCache( el, evt ) {\n\t\tif ( !el.shoestringData ) {\n\t\t\tel.shoestringData = {};\n\t\t}\n\t\tif ( !el.shoestringData.events ) {\n\t\t\tel.shoestringData.events = {};\n\t\t}\n\t\tif ( !el.shoestringData.loop ) {\n\t\t\tel.shoestringData.loop = {};\n\t\t}\n\t\tif ( !el.shoestringData.events[ evt ] ) {\n\t\t\tel.shoestringData.events[ evt ] = [];\n\t\t}\n\t}\n\n\tfunction addToEventCache( el, evt, eventInfo ) {\n\t\tvar obj = {};\n\t\tobj.isCustomEvent = eventInfo.isCustomEvent;\n\t\tobj.callback = eventInfo.callfunc;\n\t\tobj.originalCallback = eventInfo.originalCallback;\n\t\tobj.namespace = eventInfo.namespace;\n\n\t\tel.shoestringData.events[ evt ].push( obj );\n\n\t\tif( eventInfo.customEventLoop ) {\n\t\t\tel.shoestringData.loop[ evt ] = eventInfo.customEventLoop;\n\t\t}\n\t}\n\n\t/**\n\t * Bind a callback to an event for the currrent set of elements.\n\t *\n\t * @param {string} evt The event(s) to watch for.\n\t * @param {object,function} data Data to be included with each event or the callback.\n\t * @param {function} originalCallback Callback to be invoked when data is define.d.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.bind = function( evt, data, originalCallback ){\n\n\t\t\t\tif( typeof data === \"function\" ){\n\t\t\toriginalCallback = data;\n\t\t\tdata = null;\n\t\t}\n\n\t\tvar evts = evt.split( \" \" );\n\n\t\t// NOTE the `triggeredElement` is purely for custom events from IE\n\t\tfunction encasedCallback( e, namespace, triggeredElement ){\n\t\t\tvar result;\n\n\t\t\tif( e._namespace && e._namespace !== namespace ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.data = data;\n\t\t\te.namespace = e._namespace;\n\n\t\t\tvar returnTrue = function(){\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\te.isDefaultPrevented = function(){\n\t\t\t\treturn false;\n\t\t\t};\n\n\t\t\tvar originalPreventDefault = e.preventDefault;\n\t\t\tvar preventDefaultConstructor = function(){\n\t\t\t\tif( originalPreventDefault ) {\n\t\t\t\t\treturn function(){\n\t\t\t\t\t\te.isDefaultPrevented = returnTrue;\n\t\t\t\t\t\toriginalPreventDefault.call(e);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\treturn function(){\n\t\t\t\t\t\te.isDefaultPrevented = returnTrue;\n\t\t\t\t\t\te.returnValue = false;\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// thanks https://github.com/jonathantneal/EventListener\n\t\t\te.target = triggeredElement || e.target || e.srcElement;\n\t\t\te.preventDefault = preventDefaultConstructor();\n\t\t\te.stopPropagation = e.stopPropagation || function () {\n\t\t\t\te.cancelBubble = true;\n\t\t\t};\n\n\t\t\tresult = originalCallback.apply(this, [ e ].concat( e._args ) );\n\n\t\t\tif( result === false ){\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\treturn this.each(function(){\n\t\t\tvar domEventCallback,\n\t\t\t\tcustomEventCallback,\n\t\t\t\tcustomEventLoop,\n\t\t\t\toEl = this;\n\n\t\t\tfor( var i = 0, il = evts.length; i < il; i++ ){\n\t\t\t\tvar split = evts[ i ].split( \".\" ),\n\t\t\t\t\tevt = split[ 0 ],\n\t\t\t\t\tnamespace = split.length > 0 ? split[ 1 ] : null;\n\n\t\t\t\tdomEventCallback = function( originalEvent ) {\n\t\t\t\t\tif( oEl.ssEventTrigger ) {\n\t\t\t\t\t\toriginalEvent._namespace = oEl.ssEventTrigger._namespace;\n\t\t\t\t\t\toriginalEvent._args = oEl.ssEventTrigger._args;\n\n\t\t\t\t\t\toEl.ssEventTrigger = null;\n\t\t\t\t\t}\n\t\t\t\t\treturn encasedCallback.call( oEl, originalEvent, namespace );\n\t\t\t\t};\n\t\t\t\tcustomEventCallback = null;\n\t\t\t\tcustomEventLoop = null;\n\n\t\t\t\tinitEventCache( this, evt );\n\n\t\t\t\tthis.addEventListener( evt, domEventCallback, false );\n\n\t\t\t\taddToEventCache( this, evt, {\n\t\t\t\t\tcallfunc: customEventCallback || domEventCallback,\n\t\t\t\t\tisCustomEvent: !!customEventCallback,\n\t\t\t\t\tcustomEventLoop: customEventLoop,\n\t\t\t\t\toriginalCallback: originalCallback,\n\t\t\t\t\tnamespace: namespace\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t};\n\n\tshoestring.fn.on = shoestring.fn.bind;\n\n\t\n\n\n\t/**\n\t * Unbind a previous bound callback for an event.\n\t *\n\t * @param {string} event The event(s) the callback was bound to..\n\t * @param {function} callback Callback to unbind.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.unbind = function( event, callback ){\n\n\t\t\n\t\tvar evts = event ? event.split( \" \" ) : [];\n\n\t\treturn this.each(function(){\n\t\t\tif( !this.shoestringData || !this.shoestringData.events ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif( !evts.length ) {\n\t\t\t\tunbindAll.call( this );\n\t\t\t} else {\n\t\t\t\tvar split, evt, namespace;\n\t\t\t\tfor( var i = 0, il = evts.length; i < il; i++ ){\n\t\t\t\t\tsplit = evts[ i ].split( \".\" ),\n\t\t\t\t\tevt = split[ 0 ],\n\t\t\t\t\tnamespace = split.length > 0 ? split[ 1 ] : null;\n\n\t\t\t\t\tif( evt ) {\n\t\t\t\t\t\tunbind.call( this, evt, namespace, callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tunbindAll.call( this, namespace, callback );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tfunction unbind( evt, namespace, callback ) {\n\t\tvar bound = this.shoestringData.events[ evt ];\n\t\tif( !(bound && bound.length) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar matched = [], j, jl;\n\t\tfor( j = 0, jl = bound.length; j < jl; j++ ) {\n\t\t\tif( !namespace || namespace === bound[ j ].namespace ) {\n\t\t\t\tif( callback === undefined || callback === bound[ j ].originalCallback ) {\n\t\t\t\t\tthis.removeEventListener( evt, bound[ j ].callback, false );\n\t\t\t\t\tmatched.push( j );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor( j = 0, jl = matched.length; j < jl; j++ ) {\n\t\t\tthis.shoestringData.events[ evt ].splice( j, 1 );\n\t\t}\n\t}\n\n\tfunction unbindAll( namespace, callback ) {\n\t\tfor( var evtKey in this.shoestringData.events ) {\n\t\t\tunbind.call( this, evtKey, namespace, callback );\n\t\t}\n\t}\n\n\tshoestring.fn.off = shoestring.fn.unbind;\n\n\n\t/**\n\t * Bind a callback to an event for the currrent set of elements, unbind after one occurence.\n\t *\n\t * @param {string} event The event(s) to watch for.\n\t * @param {function} callback Callback to invoke on the event.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.one = function( event, callback ){\n\t\tvar evts = event.split( \" \" );\n\n\t\treturn this.each(function(){\n\t\t\tvar thisevt, cbs = {},\t$t = shoestring( this );\n\n\t\t\tfor( var i = 0, il = evts.length; i < il; i++ ){\n\t\t\t\tthisevt = evts[ i ];\n\n\t\t\t\tcbs[ thisevt ] = function( e ){\n\t\t\t\t\tvar $t = shoestring( this );\n\n\t\t\t\t\tfor( var j in cbs ) {\n\t\t\t\t\t\t$t.unbind( j, cbs[ j ] );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn callback.apply( this, [ e ].concat( e._args ) );\n\t\t\t\t};\n\n\t\t\t\t$t.bind( thisevt, cbs[ thisevt ] );\n\t\t\t}\n\t\t});\n\t};\n\n\n\n\t/**\n\t * Trigger an event on the first element in the set, no bubbling, no defaults.\n\t *\n\t * @param {string} event The event(s) to trigger.\n\t * @param {object} args Arguments to append to callback invocations.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.triggerHandler = function( event, args ){\n\t\tvar e = event.split( \" \" )[ 0 ],\n\t\t\tel = this[ 0 ],\n\t\t\tret;\n\n\t\t// See this.fireEvent( 'on' + evts[ i ], document.createEventObject() ); instead of click() etc in trigger.\n\t\tif( doc.createEvent && el.shoestringData && el.shoestringData.events && el.shoestringData.events[ e ] ){\n\t\t\tvar bindings = el.shoestringData.events[ e ];\n\t\t\tfor (var i in bindings ){\n\t\t\t\tif( bindings.hasOwnProperty( i ) ){\n\t\t\t\t\tevent = doc.createEvent( \"Event\" );\n\t\t\t\t\tevent.initEvent( e, true, true );\n\t\t\t\t\tevent._args = args;\n\t\t\t\t\targs.unshift( event );\n\n\t\t\t\t\tret = bindings[ i ].originalCallback.apply( event.target, args );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n\n\n\n\t/**\n\t * Trigger an event on each of the DOM elements in the current set.\n\t *\n\t * @param {string} event The event(s) to trigger.\n\t * @param {object} args Arguments to append to callback invocations.\n\t * @return shoestring\n\t * @this shoestring\n\t */\n\tshoestring.fn.trigger = function( event, args ){\n\t\tvar evts = event.split( \" \" );\n\n\t\treturn this.each(function(){\n\t\t\tvar split, evt, namespace;\n\t\t\tfor( var i = 0, il = evts.length; i < il; i++ ){\n\t\t\t\tsplit = evts[ i ].split( \".\" ),\n\t\t\t\tevt = split[ 0 ],\n\t\t\t\tnamespace = split.length > 0 ? split[ 1 ] : null;\n\n\t\t\t\tif( evt === \"click\" ){\n\t\t\t\t\tif( this.tagName === \"INPUT\" && this.type === \"checkbox\" && this.click ){\n\t\t\t\t\t\tthis.click();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif( doc.createEvent ){\n\t\t\t\t\tvar event = doc.createEvent( \"Event\" );\n\t\t\t\t\tevent.initEvent( evt, true, true );\n\t\t\t\t\tevent._args = args;\n\t\t\t\t\tevent._namespace = namespace;\n\n\t\t\t\t\tthis.dispatchEvent( event );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\n\n\treturn shoestring;\n}));\n\nif( !window.jQuery ){\n window.jQuery = window.jQuery || window.shoestring;\n}\n\n(function(exports){\n\t/**\n\t * The Akamai component namespace contains the {@link Akamai.Viewer}, {@link\n\t * Akamai.Spin360}, {@link Akamai.Carousel}, and {@link Akamai.Zoom} components.\n\t * The {@link Akamai.Viewer} component manages the other components depending on\n\t * the state of the markup it is provided, start there for more.\n\t *\n\t * @example <caption>On-ready automatic initialization with jQuery</caption>\n\t * $(function(){\n\t *\t $( \"[data-akamai-viewer]\" ).each(function(i, element){\n\t *\t\t var viewer = Akamai.Viewer( element );\n\t *\t\t ...\n\t *\t\t // example API use, stoping autoration of first {@link Akamai.Spin360}\n\t *\t\t viewer.getCarousels()[0].getSpin360s()[0].stopSpin();\n\t *\t })\n\t * })\n\t *\n\t * @namespace Akamai\n\t */\n\texports.Akamai = exports.Akamai || {};\n\twindow.componentNamespace = \"Akamai\";\n})(typeof exports === 'undefined'? window : exports);\n\n(function( window, $ ) {\n var $window, $doc;\n\n $window = $(window);\n $doc = $( document.documentElement );\n\n var ns = window.componentNamespace = window.componentNamespace || \"FG\";\n window[ns] = window[ns] || {};\n\n Function.prototype.bind = Function.prototype.bind || function( context ) {\n var self = this;\n\n return function() {\n self.apply( context, arguments );\n };\n };\n\n var Tau = window[ns].Tau = function( element, options ) {\n var startIndex, reducedStepSize;\n\n this.element = element;\n this.options = options || {};\n this.$element = $( element );\n this.$initial = this.$element.find( \"img\" );\n this.$loading = this.$element.find( \".loading\" );\n this.index = 0;\n\n // frame count by order of precendence\n // 1. initial frames when they are specified explicitly\n // 2. the data attribute on the initial image\n // 3. the configured number of frames\n this.frames =\n this.$initial.length > 1 ? this.$initial.length :\n parseInt( this.$initial.attr(\"data-frames\"), 10 ) ||\n this.options.frames;\n\n // grab the user specified step size for when the browser is less-abled\n reducedStepSize = parseInt( this.$initial.attr(\"data-reduced-step-size\"), 10 ) || 4;\n\n // TODO sort out a better qualification for the full set of images?\n this.stepSize = window.requestAnimationFrame ? 1 : reducedStepSize;\n\n // grab the user specified auto start delay\n this.autoRotateStartDelay =\n (this.options.autoplay || {}).delay ||\n parseInt( this.$initial.attr(\"data-auto-rotate-delay\"), 10 ) ||\n Tau.autoRotateStartDelay;\n\n this.mouseMoveBinding = this.rotateEvent.bind(this);\n this.touchMoveBinding = this.rotateEvent.bind(this);\n\n this.path = new Tau.Path();\n\n // make sure the initial image stays visible after enhance\n this.$initial.first().addClass( \"focused\" );\n\n // hide all other images\n this.$element.addClass( \"tau-enhanced\" );\n\n // create a rendering spot to force decoding in IE and prevent blinking\n this.$render = $( \"<div data-render class=\\\"render\\\"></div>\" )\n .css( \"position\", \"absolute\" )\n .css( \"left\", \"0\" )\n .css( \"top\", \"0\" )\n .prependTo( this.element );\n\n if( this.options.canvas !== false ){\n this.canvas = $( \"<canvas/>\").prependTo( this.element )[0];\n\n if(this.canvas.getContext ){\n this.canvasCtx = this.canvas.getContext(\"2d\");\n this.$element.addClass( \"tau-canvas\" );\n\n $(window).bind(\"resize\", function(){\n clearTimeout(this.canvasResizeTimeout);\n this.canvasResizeTimeout = setTimeout(this.renderCanvas.bind(this), 100);\n }.bind(this));\n }\n }\n\n if( this.options.controls ){\n this.options.controls.text = this.options.controls.text || {\n play: \"Spin Object\",\n left: \"Rotate Left\",\n right: \"Rotate Right\"\n };\n\n this.createControls();\n }\n\n // create the rest of the images\n this.createImages();\n\n // set the initial index and image\n if( this.options.autoplay && this.options.autoplay.enabled ){\n // start the automatic rotation\n this.autostartTimeout = setTimeout(this.autoRotate.bind(this), this.autoRotateStartDelay);\n }\n\n // setup the event bindings for touch drag and mouse drag rotation\n this.bind();\n };\n\n Tau.autoRotateTraversalTime = 4500;\n Tau.autoRotateStartDelay = 100;\n Tau.verticalScrollRatio = 4;\n // Tau.decelTimeStep = Tau.autoRotateDelay / 2;\n // Tau.decel = Tau.decelTimeStep / 8;\n Tau.maxVelocity = 60;\n\n Tau.prototype.createControls = function(){\n this.$controls = $(\"<div class='tau-controls'></div>\");\n\n if(this.options.controls.play){\n this.$controls.append(this.controlAnchorMarkup(\"play\"));\n }\n\n if(this.options.controls.arrows){\n this.$controls\n .prepend(this.controlAnchorMarkup(\"left\"))\n .append(this.controlAnchorMarkup(\"right\"));\n }\n\n this.$controls.bind(\"mousedown touchstart\", this.onControlDown.bind(this));\n this.$controls.bind(\"mouseup\", this.onControlUp.bind(this));\n\n // prevent link clicks from bubbling\n this.$controls.bind(\"click\", function(event){\n if( $(event.target).is(\"a\") ){\n event.preventDefault();\n }\n });\n\n this.$element.append(this.$controls);\n };\n\n Tau.prototype.controlAnchorMarkup = function(name){\n var text = this.options.controls.text[name];\n\n return \"<a href='#' data-tau-controls='\" + name +\n \"' title='\" + text +\n \"'>\" + text +\n \"</a>\";\n };\n\n Tau.prototype.onControlDown = function(event){\n var $link = $(event.target).closest(\"a\");\n\n switch($link.attr(\"data-tau-controls\")){\n case \"left\":\n this.$element.addClass(\"control-left-down\");\n this.stopAutoRotate();\n this.autoRotate();\n break;\n case \"right\":\n this.$element.addClass(\"control-right-down\");\n this.stopAutoRotate();\n this.autoRotate(true);\n break;\n }\n };\n\n Tau.prototype.onControlUp = function(event){\n var $link = $(event.target).closest(\"a\");\n\n switch($link.attr(\"data-tau-controls\")){\n case \"left\":\n case \"right\":\n this.$element.removeClass(\"control-left-down\");\n this.$element.removeClass(\"control-right-down\");\n this.stopAutoRotate();\n break;\n case \"play\":\n if( this.autoInterval ){\n this.stopAutoRotate();\n } else {\n this.autoRotate();\n }\n break;\n }\n };\n\n Tau.prototype.change = function( delta ) {\n this.goto( this.options.reverse ? this.index - delta : this.index + delta );\n };\n\n Tau.prototype.goto = function( index ) {\n var $next, normalizedIndex, imageCount = this.$images.length;\n\n index = index % imageCount;\n\n // stay within the bounds of the array\n normalizedIndex = (imageCount + index) % imageCount;\n\n // set the next image that's going to be shown/focused\n $next = this.$images.eq( normalizedIndex );\n\n // skip this action if the desired image isn't loaded yet\n // TODO do something fancier here instead of just throwing up hands\n if( !$next[0].tauImageLoaded ) {\n this.showLoading();\n return false;\n }\n\n // hide any image that happens to be visible (initial image when canvas)\n if( this.$current ) {\n this.$current.removeClass( \"focused\" );\n } else {\n this.$images.removeClass( \"focused\" );\n }\n\n // record the current focused image and make it visible\n this.$current = $next;\n\n // record the updated index only after advancing is possible\n this.index = normalizedIndex;\n\n if( this.canvasCtx ) {\n return this.renderCanvas();\n } else {\n // show the new focused image\n this.$current.addClass( \"focused\" );\n return true;\n }\n };\n\n Tau.prototype.renderCanvas = function() {\n var $img = this.$current;\n var img = $img[0];\n\n var width = img.naturalWidth;\n var height = img.naturalHeight;\n\n var parentWidth = this.element.clientWidth;\n var calcHeight = (parentWidth/width) * height;\n\n if(!width || !height || !img.complete){\n return false;\n }\n\n if( this.canvas.width !== parentWidth ||\n this.canvas.height !== calcHeight || (parentWidth && calcHeight) ) {\n this.canvas.width = parentWidth;\n this.canvas.height = calcHeight;\n }\n\n this.canvasCtx.drawImage(img, 0, 0, parentWidth, calcHeight);\n\n return true;\n };\n\n // TODO transplant the attributes from the initial image\n Tau.prototype.createImages = function() {\n var src, frames, html, $new, boundImageLoaded;\n\n // if there are no image elements, raise an exception\n if( this.$initial.length < 1 ){\n throw new Error( \"At least one image required\" );\n }\n\n this.loadedCount = 0;\n\n // if there is only one image element, assume it's a template\n if( this.$initial.length == 1 ) {\n this.markImageLoaded( this.$initial[0] );\n\n src =\n this.options.template ||\n this.$initial.attr( \"data-src-template\" );\n\n var imgs = [];\n for( var i = this.stepSize + 1; i <= this.frames; i+= this.stepSize ) {\n html = \"<img src=\" + src.replace(\"$FRAME\", i) + \"></img>\";\n $new = $( html );\n imgs.push($new);\n }\n\n $.each(imgs, function(i, e){\n var $img = $(e);\n\n $img.bind(\"load error\", function(e){ this.imageLoaded(i, e.target, e); }.bind(this));\n\n this.$element.append( $img );\n this.$render.append( $img.html() );\n }.bind(this));\n\n // take all the child images and use them as frames of the rotation\n this.$images = this.$element.children().filter( \"img\" );\n this.$current = this.$images;\n this.goto(0);\n } else {\n // take all the child images and use them as frames of the rotation\n this.$images = this.$element.children().filter( \"img\" );\n\n this.$images.each(function(i, e){\n // if the image height is greater than zero we assume the image is loaded\n // otherwise we bind to onload and pray that we win the race\n if( $(e).height() > 0 ){\n this.imageLoaded( i, e );\n } else {\n $(e).bind(\"load error\", function(event){\n this.imageLoaded( i, event.target, event );\n }.bind(this));\n }\n }.bind(this));\n }\n };\n\n\n Tau.prototype.imageLoaded = function( index, element, event ) {\n var initTriggered = false;\n this.markImageLoaded( element );\n\n // if the isn't going to play automatically and the first image is\n // loaded make sure to render it\n if( this.$element.find(\"img\")[0] == element &&\n (!event || event.type !== \"error\") &&\n (!this.options.autoplay || !this.options.autoplay.enabled) ){\n this.goto(0);\n this.$element.trigger(\"tau.init\");\n initTriggered = true;\n }\n\n this.loadedCount++;\n\n if( this.loadedCount >= this.frames - 1) {\n this.hideLoading();\n\n if(!initTriggered) {\n this.$element.trigger(\"tau.init\");\n this.initialized = true;\n }\n }\n };\n\n Tau.prototype.markImageLoaded = function( element ) {\n element.tauImageLoaded = true;\n };\n\n Tau.prototype.bind = function() {\n this.$element.bind( \"mousedown touchstart\", this.track.bind(this) );\n };\n\n Tau.prototype.autoRotate = function( right ) {\n // already rotating\n if( this.autoInterval ) {\n return;\n }\n\n this.$element.addClass(\"spinning\");\n\n // move once initially\n this.change( right ? -1 : 1 );\n\n // move after the interval\n this.autoInterval = setInterval(function() {\n this.change( right ? -1 : 1 );\n }.bind(this), this.autoRotateDelay() * this.stepSize);\n\n this.$element.trigger( \"tau.auto-rotate-start\" );\n };\n\n Tau.prototype.autoRotateDelay = function(){\n return (this.options.interval || Tau.autoRotateTraversalTime) / this.frames;\n };\n\n Tau.prototype.stopAutoRotate = function() {\n clearInterval( this.autoInterval );\n clearInterval( this.autostartTimeout );\n this.$element.removeClass(\"spinning\");\n this.autoInterval = undefined;\n this.$element.trigger( \"tau.auto-rotate-stop\" );\n };\n\n Tau.prototype.track = function( event ) {\n var point;\n\n // ignore tracking on control clicks\n if( $(event.target).closest(\".tau-controls\").length ){\n return;\n }\n\n // prevent dragging behavior for mousedown\n if( event.type === \"mousedown\" ){\n event.preventDefault();\n }\n\n if( event.type === \"touchstart\" ) {\n this.$element.trigger(\"tau.touch-tracking-start\");\n } else {\n this.$element.trigger(\"tau.mouse-tracking-start\");\n }\n\n if( this.tracking ) {\n return;\n }\n\n $doc.one( \"mouseup\", this.release.bind(this) );\n $doc.one( \"touchend\", this.release.bind(this) );\n\n this.tracking = true;\n\n // clean out the path since we'll need a new one for decel\n this.path.reset();\n\n // show the cursor as grabbing\n this.cursorGrab();\n\n // By default the number of pixels required to move the carousel by one\n // frame is the ratio of the tau element width to the number of frames. That\n // is, by default the user should be able to see the full rotation by moving\n // their input device from one side of the tau element to the other.\n var defaultThreshold = this.$element[0].clientWidth / this.frames ;\n\n // divide the default by the sensitivity. If the senstivity is greater than\n // 1 it will require less effort (smaller distance) to advance the rotation\n // by a single slide. If the sensitivity is less than 1 it will require more\n // effort\n this.rotateThreshold = defaultThreshold / (this.options.sensitivity || 1);\n\n // record the x for threshold calculations\n point = this.getPoint( event );\n this.downX = point.x;\n this.downY = point.y;\n this.downIndex = this.index;\n\n $doc.bind( \"mousemove\", this.mouseMoveBinding );\n $doc.bind( \"touchmove\", this.touchMoveBinding );\n };\n\n Tau.prototype.slow = function() {\n // if the path gets broken during the decel just stop\n if( !this.path.isSufficient() ) {\n this.clearSlowInterval();\n return;\n }\n\n this.rotate({\n x: this.path.last().x + this.velocity,\n y: this.path.last().y\n });\n\n if( this.velocity > 0 ){\n this.velocity = this.velocity - this.decelVal();\n\n if( this.velocity <= 0 ){\n this.clearSlowInterval();\n }\n } else {\n this.velocity = this.velocity + this.decelVal();\n\n if( this.velocity >= 0 ){\n this.clearSlowInterval();\n }\n }\n };\n\n Tau.prototype.decelVal = function(){\n return this.decelTimeStep() / 8;\n };\n\n Tau.prototype.clearSlowInterval = function() {\n clearInterval(this.slowInterval);\n this.velocity = 0;\n this.slowInterval = undefined;\n };\n\n Tau.prototype.decel = function() {\n var velocity, sign;\n\n // if we don't have two points of mouse or touch tracking this won't work\n if( !this.path.isSufficient() ) {\n return;\n }\n\n // determine the starting velocity based on the traced path\n velocity = this.path.velocity( this.decelTimeStep() );\n\n // borrowed from http://stackoverflow.com/questions/7624920/number-sign-in-javascript\n sign = velocity > 0 ? 1 : velocity < 0 ? -1 : 0;\n\n // keep a lid on how fast the rotation spins out\n if( Math.abs(velocity) > Tau.maxVelocity ){\n velocity = sign * Tau.maxVelocity;\n }\n\n this.velocity = velocity;\n this.slowInterval = setInterval(this.slow.bind(this), this.decelTimeStep());\n };\n\n Tau.prototype.decelTimeStep = function(){\n return this.autoRotateDelay() / 2;\n };\n\n Tau.prototype.release = function( event ) {\n if( $(event.target).closest(\".tau-controls\").length ){\n return;\n }\n\n if( !this.tracking ){\n return;\n }\n\n if( event.type === \"touchend\" ) {\n this.$element.trigger(\"tau.touch-tracking-stop\");\n } else {\n this.$element.trigger(\"tau.mouse-tracking-stop\");\n }\n\n this.decel();\n\n this.cursorRelease();\n\n // TODO sort out why shoestring borks when unbinding with a string split list\n $doc.unbind( \"mousemove\", this.mouseMoveBinding );\n $doc.unbind( \"touchmove\", this.touchMoveBinding );\n\n this.tracking = false;\n };\n\n Tau.prototype.cursorGrab = function() {\n $doc.addClass( \"grabbing\" );\n };\n\n Tau.prototype.cursorRelease = function() {\n $doc.removeClass( \"grabbing\" );\n };\n\n Tau.prototype.showLoading = function() {\n this.$loading.attr( \"style\" , \"display: block\" );\n };\n\n Tau.prototype.hideLoading = function() {\n this.$loading.attr( \"style\" , \"display: none\" );\n };\n\n Tau.prototype.getPoint = function( event ) {\n var touch = event.touches || (event.originalEvent && event.originalEvent.touches);\n\n if( touch ){\n return {\n x: touch[0].pageX,\n y: touch[0].pageY\n };\n }\n\n return {\n x: event.pageX || event.clientX,\n y: event.pageY || event.clientY\n };\n };\n\n Tau.prototype.rotateEvent = function( event ) {\n // NOTE it might be better to prevent when the rotation returns anything BUT false\n // so that slow drags still get the scroll prevented\n if( this.rotate(this.getPoint(event)) ){\n event.preventDefault();\n }\n };\n\n Tau.prototype.rotate = function( point ) {\n var deltaX, deltaY;\n\n deltaX = point.x - this.downX;\n deltaY = point.y - this.downY;\n\n // if the movement on the Y dominates X then skip and allow scroll\n if( Math.abs(deltaY) / Math.abs(deltaX) >= Tau.verticalScrollRatio ) {\n return false;\n }\n\n // since we're rotating record the point for decel\n this.path.record( point );\n\n // NOTE to reverse the spin direction add the delta/thresh to the downIndex\n if( Math.abs(deltaX) >= this.rotateThreshold ) {\n // NOTE works better on mousedown, here allows autorotate to continue\n this.stopAutoRotate();\n\n var index;\n\n if( this.options.reverse ) {\n index = this.downIndex + Math.round(deltaX / this.rotateThreshold);\n } else {\n index = this.downIndex - Math.round(deltaX / this.rotateThreshold);\n }\n\n this.goto( index );\n\n return true;\n }\n };\n})(this, jQuery);\n\n(function( window, $ ) {\n var ns = window.componentNamespace = window.componentNamespace || \"FG\";\n window[ns] = window[ns] || {};\n\n // IE 8\n Date.now = Date.now || function now() {\n return new Date().getTime();\n };\n\n var Path = window[ns].Tau.Path = function() {\n this.reset();\n };\n\n Path.prototype.isSufficient = function() {\n return !!this.prevPoint && this.prevPrevPoint;\n };\n\n Path.prototype.distance = function() {\n return this.prevPoint.x - this.prevPrevPoint.x;\n };\n\n Path.prototype.duration = function() {\n return this.prevTime - this.prevPrevTime;\n };\n\n // TODO sort out variable names\n Path.prototype.record = function( point ) {\n this.prevPrevTime = this.prevTime;\n this.prevPrevPoint = this.prevPoint;\n\n // record the most recent drag point for decel on release\n this.prevTime = Date.now();\n this.prevPoint = point;\n };\n\n Path.prototype.velocity = function( timeStep ) {\n var distance, time;\n\n distance = this.distance();\n time = this.duration();\n\n return distance / ( time / timeStep );\n };\n\n Path.prototype.reset = function() {\n this.prevPoint = undefined;\n this.prevTime = undefined;\n\n this.prevPrevTime = undefined;\n this.prevPrevPoint = undefined;\n };\n\n Path.prototype.last = function() {\n return this.prevPoint;\n };\n})(this, jQuery);\n\n(function(exports, $){\n\texports.Akamai = exports.Akamai || {};\n\tvar Util = exports.Akamai.Util = {};\n\n\tUtil.preflight = function(context, element, options, name){\n\t\tname = name || context.constructor.name;\n\n\t\tcontext._$el = $(element);\n\n\t\tif( !context._$el.length ){\n\t\t\tthrow new Error( name + \" component requires element\" );\n\t\t}\n\n\t\t// If the element has already been instantiated with this component, skip\n\t\tif( context._$el.data(name) ) {\n\t\t\treturn context._$el.data(name);\n\t\t}\n\n\t\t// Store the instance for access and to prevent double init above\n\t\tcontext._$el.data( name, context );\n\n\t\t// make sure the element has the data attribute for CSS that keys off it\n\t\tcontext._$el.attr(context.constructor._dataAttr, true);\n\n\t\tcontext._options =\n\t\t\tUtil.options(context.constructor.defaultOptions || {}, options || {}, context._$el, name);\n\n\t\t// retain the options decided at instantiation for reseting the options\n\t\t// when the breakpoint options don't apply (are \"backed out\")\n\t\tcontext._originalOptions = Util.extend(true, {}, context._options);\n\n\t\t// map all the child component events to the wrapper component events\n\t\tUtil.mapEvents(context);\n\n\t\treturn false;\n\t};\n\n\tUtil.component = function(name, async, init){\n\t\tif( !init ){\n\t\t\tinit = async;\n\t\t\tasync = false;\n\t\t}\n\n\t\tvar constr = function(element, options){\n\t\t\t// do the preflight\n\t\t\tvar existing = Util.preflight(this, element, options, name);\n\n\t\t\t// return on double init\n\t\t\tif( existing ){\n\t\t\t\tthis._trigger(\"init\");\n\t\t\t\treturn existing;\n\t\t\t}\n\n\t\t\t// call the init code\n\t\t\tinit.apply(this, arguments);\n\n\t\t\t// trigger the init event\n\t\t\tif( !async ) { this._trigger(\"init\"); }\n\t\t};\n\n\t\tconstr.name = name;\n\n\t\tconstr._dataAttr = `data-akamai-${name.toLowerCase()}`;\n\n\t\t// static constructor for many possible objects\n\t\tconstr.createMany = Util.createMany(constr);\n\n\t\t// component prefixed event trigger\n\t\tconstr.prototype._trigger = Util.trigger(name);\n\n\t\treturn constr;\n\t};\n\n\tUtil.mapEvents = function(context){\n\t\tvar mapping = context.constructor._componentEventMapping || {};\n\n\t\tfor( var event in mapping) {\n\t\t\tif( mapping.hasOwnProperty(event) ){\n\t\t\t\tvar mappedTo = mapping[event].to || mapping[event];\n\t\t\t\tvar $el =\n\t\t\t\t\tmapping[event].selector ? context._$el.find(mapping[event].selector) : undefined;\n\n\t\t\t\tUtil.mapEvent(context, event, mappedTo, $el);\n\t\t\t}\n\t\t}\n\t};\n\n\tUtil.mapEvent = function(context, from, to, $el){\n\t\t($el || context._$el).bind(from, function(){\n\t\t\tcontext._trigger(to);\n\t\t}.bind(context));\n\t};\n\n\tUtil.createMany = function(constructor, selector){\n\t\tselector = selector || `[${constructor._dataAttr}]`;\n\n\t\treturn function(element, options){\n\t\t\tvar $comps = $(element).find( selector );\n\n\t\t\t// sigh, shoestring needs map\n\t\t\tvar objects = [];\n\n\t\t\t$comps.each(function(i, el){\n\t\t\t\tobjects.push(new constructor(el, options));\n\t\t\t});\n\n\t\t\treturn objects;\n\t\t};\n\t};\n\n\t/**\n\t * Helper for building assertions into methods based on property requirements\n\t * @private\n\t * @static\n\t * @param {prop} prop - the property required for the function to operate correctly\n\t * @param {fn} function - the function definition\n\t */\n\tUtil.propRequired = function(prop, msg, fn){\n\t\treturn function(){\n\t\t\tvar args = arguments;\n\n\t\t\tif( !this[prop] ){\n\t\t\t\tthrow new Error( msg );\n\t\t\t}\n\n\t\t\treturn fn.apply(this, args);\n\t\t};\n\t};\n\n\tUtil.trigger = function(componentName){\n\t\tcomponentName = componentName.toLowerCase();\n\t\treturn function(event) {\n\t\t\tvar fullEvent = \"akamai-\" + componentName + \"-\" + event;\n\n\t\t\t// NOTE we assume here that if jQuery is present we will only want to trigger\n\t\t\t// with jQuery and that we are using the same DOM lib across the library\n\t\t\tthis._$el.trigger(fullEvent);\n\t\t};\n\t};\n\n\n\tUtil.camelToKabob = function(string){\n\t\treturn string.replace(/([A-Z]+)/g, function(m){\n\t\t\treturn \"-\" + m.toLowerCase();\n\t\t});\n\t};\n\n\tUtil.options = function(defaults, options, $element, name){\n\t\tvar dataAttrOptions = {};\n\t\t// make sure to make a new copy of the defaults so we don't mess with the original\n\t\tvar cloneDefaults = Util.extend(true, {}, defaults);\n\n\t\tif( $element && name ) {\n\t\t\tdataAttrOptions =\n\t\t\t\tUtil.getDataAttrOptions($element, defaults, \"data-akamai-\" + name.toLowerCase());\n\t\t}\n\n\t\t// use the following precedence, prefering settings further to the right\n\t\t// defaults -> options -> datattributes\n\t\tvar finalOptions =\n\t\t\t\tUtil.extend(true, Util.extend(true, cloneDefaults, dataAttrOptions), options);\n\n\t\t// push the final options down to the dom element so that CSS that keys off\n\t\t// of the attributes can apply when JS config is used\n\t\tif( $element && name ){\n\t\t\tUtil.setDataAttrOptions($element, defaults, finalOptions, name);\n\t\t}\n\n\t\treturn finalOptions;\n\t};\n\n\tUtil.getDataAttrOptions = function($element, defaults, prefix){\n\t\tvar dataAttrOptions = {};\n\n\t\tfor( var prop in defaults ) {\n\t\t\tif( defaults.hasOwnProperty(prop) ){\n\t\t\t\tvar dashedProp = Util.camelToKabob(prop);\n\t\t\t\tvar currentDataProp = prefix + \"-\" + dashedProp;\n\n\t\t\t\tif( /object/.test(typeof defaults[prop]) && !(defaults[prop] instanceof Array)){\n\t\t\t\t\tvar subDefaults = defaults[prop];\n\t\t\t\t\tvar newPrefix = currentDataProp;\n\n\t\t\t\t\tvar subConfig = Util.getDataAttrOptions($element, subDefaults, newPrefix);\n\t\t\t\t\tdataAttrOptions[prop] = subConfig;\n\t\t\t\t} else {\n\t\t\t\t\tvar value = $element.attr(currentDataProp);\n\t\t\t\t\tvalue = Util.coerceAttrVal(value);\n\n\t\t\t\t\tif( value !== undefined && value !== null ){\n\t\t\t\t\t\t// set the config\n\t\t\t\t\t\tdataAttrOptions[prop] = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn dataAttrOptions;\n\t};\n\n\tUtil.setDataAttrOptions = function($element, defaults, options, name){\n\t\tUtil.setDataAttrOptionsPrefix($element, defaults, options, \"data-akamai-\" + name.toLowerCase());\n\t};\n\n\n\tUtil.setDataAttrOptionsPrefix = function($element, defaults, options, prefix){\n\t\tdefaults = defaults || {};\n\n\t\tfor( var prop in options ) {\n\t\t\tif( options.hasOwnProperty(prop) && prop !== \"breakpoints\" ){\n\t\t\t\tvar dashedProp = Util.camelToKabob(prop);\n\t\t\t\tvar currentDataProp = prefix + \"-\" + dashedProp;\n\n\t\t\t\tif( /object/.test(typeof options[prop]) ){\n\t\t\t\t\tvar subOptions = options[prop];\n\t\t\t\t\tvar newPrefix = currentDataProp;\n\n\t\t\t\t\tUtil.setDataAttrOptionsPrefix($element, defaults[prop], subOptions, newPrefix);\n\t\t\t\t} else {\n\n\t\t\t\t\t// if the $element had the attribute already or the property exists\n\t\t\t\t\t// as one of the defaults then we can write it to the element.\n\t\t\t\t\tif( $element.attr(currentDataProp) || defaults[prop] !== undefined ) {\n\t\t\t\t\t\t$element.attr(currentDataProp, options[prop]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tUtil.coerceAttrVal = function(value){\n\t\tif( value === \"true\" ) { return true; }\n\t\tif( value === \"false\" ) { return false; }\n\t\tif( /^[0-9]+$/.test(value) ) { return parseInt(value, 10); }\n\t\tif( /^[0-9]+.[0-9]+$/.test(value) ) { return parseFloat(value, 10); }\n\n\t\treturn value;\n\t};\n\n\t// Due to jQuery, but with less argument handling\n\tUtil.extend = function( deep, target, options ) {\n\t\tvar name, src, copy, copyIsArray, clone;\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( options\t!= null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && Util.isPlainObject( copy ) ) {\n\n\t\t\t\t\tclone = src && Util.isPlainObject( src ) ? src : {};\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = Util.extend( deep, clone, copy );\n\n\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Return the modified object\n\t\treturn target;\n\t};\n\n\t// Due to jQuery\n\tUtil.isPlainObject = function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// taken from https://github.com/jupiter/simple-mock/pull/3/files\n\t\tif ( !obj || Object.prototype.toString.call(obj) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t};\n\n\t// Due to jQuery\n\tvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\tUtil.trim = function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t};\n\n\tUtil.map = function(array, fn){\n\t\treturn Util.reduce(array, function(acc, val, i){\n\t\t\tacc.push(fn(val, i));\n\t\t\treturn acc;\n\t\t}, []);\n\t};\n\n\tUtil.reduce = function(array, fn, acc){\n\t\tfor(var i = 0; i < array.length; i++){\n\t\t\tacc = fn(acc, array[i], i);\n\t\t}\n\n\t\treturn acc;\n\t};\n\n\tUtil.log = function(msg, type){\n\t\ttype = type || \"log\";\n\n\t\tif( console ){\n\t\t\tconsole[type](msg);\n\t\t}\n\t};\n\n\tUtil.mapJSONVals = function(obj, callback, key){\n\t\tvar result = {};\n\n\t\tif(obj.map){\n\t\t\treturn obj.map(function(o){\n\t\t\t\treturn Util.mapJSONVals(o, callback);\n\t\t\t});\n\t\t}\n\n\t\tif([\"string\", \"number\", \"boolean\"].indexOf( typeof obj ) >= 0 ){\n\t\t\treturn callback(obj, key);\n\t\t}\n\n\t\tfor( var prop in obj ){\n\t\t\tif(obj.hasOwnProperty(prop)){\n\t\t\t\tresult[prop] = Util.mapJSONVals(obj[prop], callback, prop);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\tUtil.escapeJSONVals = function(obj){\n\t\treturn Util.mapJSONVals(obj, function(val){\n\t\t\tif(typeof val === \"string\" ) {\n\t\t\t\treturn escapeHTML(val);\n\t\t\t}\n\n\t\t\treturn val;\n\t\t});\n\t};\n\n\t// https://github.com/janl/mustache.js/blob/23beb3a8805c9a857e3ea777431481599fab503e/mustache.js#L60\n\tvar entityMap = {\n\t\t'&': '&amp;',\n\t\t'<': '&lt;',\n\t\t'>': '&gt;',\n\t\t'\"': '&quot;',\n\t\t\"'\": '&#39;',\n\t\t'/': '&#x2F;',\n\t\t'`': '&#x60;',\n\t\t'=': '&#x3D;'\n\t};\n\n\tfunction escapeHTML(string) {\n\t\treturn String(string).replace(/[&<>\"'`=\\/]/g, function fromEntityMap (s) {\n\t\t\treturn entityMap[s];\n\t\t});\n\t}\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n(function(exports, $){\n\tvar Advanceable = {\n\t\textension: {\n\t\t\tnext: function(callback){\n\t\t\t\tthis.goto(this.getIndex() + 1, function(){\n\t\t\t\t\tif( callback ) { callback(); };\n\t\t\t\t\tthis._trigger(\"next\");\n\t\t\t\t}.bind(this));\n\t\t\t},\n\n\t\t\tprevious: function(callback){\n\t\t\t\tthis.goto(this.getIndex() - 1, function(){\n\t\t\t\t\tif( callback ) { callback(); };\n\t\t\t\t\tthis._trigger(\"previous\");\n\t\t\t\t}.bind(this));\n\t\t\t}\n\t\t},\n\n\t\textend: function(constr) {\n\t\t\tif(!constr.prototype.goto || !constr.prototype.getIndex) {\n\t\t\t\tthrow new Error(\"Advanceable mixin requires `goto` and `getIndex` methods\");\n\t\t\t}\n\n\t\t\t$.extend(constr.prototype, this.extension);\n\t\t}\n\t};\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.Advanceable = Advanceable;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n\n// TODO this should be handled in an image component\n(function(exports, $){\n\tvar Sourceable = {\n\t\textension: {\n\t\t\t_srcArray: function(url, options, includeW ){\n\t\t\t\tvar policy = options.policy || options.thumbnail && options.thumbnail.policy;\n\t\t\t\tvar widthParam = options.widthParam;\n\n\t\t\t\treturn options.widths.map(function(w){\n\t\t\t\t\tvar src = url + (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + widthParam + \"=\" + w;\n\n\t\t\t\t\tif( policy ){\n\t\t\t\t\t\tsrc += \"&impolicy=\" + policy;\n\t\t\t\t\t}\n\n\t\t\t\t\t//note src width for srcset (eg ' 500w')\n\t\t\t\t\tif( includeW ){\n\t\t\t\t\t\tsrc += \" \" + w + \"w\";\n\t\t\t\t\t}\n\n\t\t\t\t\treturn src;\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t_srcset: function(url, options){\n\t\t\t\treturn this._srcArray( url, options, true ).join(\", \");\n\t\t\t},\n\n\t\t\t_fallbackSrc: function(url, options){\n\t\t\t\treturn this._srcArray( url, options )[ 0 ];\n\t\t\t},\n\n\t\t\t_largestSrc: function(url, options){\n\t\t\t\treturn this._srcArray( url, options ).pop();\n\t\t\t}\n\t\t},\n\n\t\textendStatic: function(constr) {\n\t\t\tAkamai.Util.extend(false, constr, this.extension);\n\t\t}\n\t};\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.Sourceable = Sourceable;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n\n(function( w, undefined ){\n\n\t// requestAnimationFrame pfill\n\tvar raf = (function(){\n\t\treturn window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction( callback ){\n\t\t\t\tw.setTimeout(callback, 1000 / 60);\n\t\t\t};\n\t})();\n\n\n\n\n\t/* toss scrolls and element with easing\n\n\t// elem is the element to scroll\n\t// options hash:\n\t\t* left is the desired horizontal scroll. Default is \"+0\". For relative distances, pass a string with \"+\" or \"-\" in front.\n\t\t* top is the desired vertical scroll. Default is \"+0\". For relative distances, pass a string with \"+\" or \"-\" in front.\n\t\t* duration is the number of milliseconds the throw will take. Default is 100.\n\t\t* easing is an optional custom easing function. Default is w.toss.easing. Must follow the easing function signature\n\n\t*/\n\tw.toss = function( elem, options ){\n\t\ttoss.tossing( elem, false );\n\t\tvar i = 0,\n\t\t\tsLeft = elem.scrollLeft,\n\t\t\tsTop = elem.scrollTop,\n\t\t\t// Toss defaults\n\t\t\top = {\n\t\t\t\ttop: \"+0\",\n\t\t\t\tleft: \"+0\",\n\t\t\t\tduration: 200,\n\t\t\t\teasing: toss.easing,\n\t\t\t\tfinished: function() {}\n\t\t\t},\n\t\t\tendLeft, endTop;\n\n\t\t// Mixin based on predefined defaults\n\t\tif( options ){\n\t\t\tfor( var j in op ){\n\t\t\t\tif( options[ j ] !== undefined ){\n\t\t\t\t\top[ j ] = options[ j ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Convert relative values to ints\n\t\t// First the left val\n\t\tif( typeof op.left === \"string\" ){\n\t\t\top.left = parseFloat( op.left );\n\t\t\tendLeft = op.left + sLeft;\n\t\t}\n\t\telse {\n\t\t\tendLeft = op.left;\n\t\t\top.left = op.left - sLeft;\n\t\t}\n\t\t// Then the top val\n\t\tif( typeof op.top === \"string\" ){\n\n\t\t\top.top = parseFloat( op.top );\n\t\t\tendTop = op.top + sTop;\n\t\t}\n\t\telse {\n\t\t\tendTop = op.top;\n\t\t\top.top = op.top - sTop;\n\t\t}\n\n\t\ttoss.tossing( elem, true );\n\t\tvar startTime = new Date().getTime();\n\t\tvar endTime = startTime + op.duration;\n\t\tvar run = function(){\n\t\t\tvar curTime = new Date().getTime();\n\t\t\t// if tossing is suddenly not true, return the callback\n\t\t\tif( !toss.tossing( elem ) ){\n\t\t\t\tif( op.finished ){\n\t\t\t\t\top.finished();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// if the time is still less than the end of duration, keep scrolling\n\t\t\telse if( curTime < endTime ){\n\t\t\t\ti = ( ( curTime - startTime ) / op.duration ) * op.duration;\n\t\t\t\telem.scrollLeft = op.easing( i, sLeft, op.left, op.duration );\n\t\t\t\telem.scrollTop = op.easing( i, sTop, op.top, op.duration );\n\t\t\t\treturn raf( run );\n\t\t\t}\n\t\t\t// if time is up,\n\t\t\telse{\n\t\t\t\telem.scrollLeft = endLeft;\n\t\t\t\telem.scrollTop = endTop;\n\t\t\t\tif( op.finished ){\n\t\t\t\t\top.finished();\n\t\t\t\t}\n\t\t\t\ttoss.tossing( elem, false );\n\t\t\t}\n\t\t};\n\n\t\traf( run );\n\n\t\t// Return the values, post-mixin, with end values specified\n\t\treturn { top: endTop, left: endLeft, duration: op.duration, easing: op.easing };\n\t};\n\n // tossing object keeps track of currently tossing elements. true during a programatic scroll\n var tossingElems = {};\n toss.tossing = function( elem, state ){\n if( state !== undefined ){\n tossingElems[ elem ] = state;\n }\n return tossingElems[ elem ];\n };\n\n // Easing can use any of Robert Penner's equations (http://www.robertpenner.com/easing_terms_of_use.html). By default, toss includes ease-out-cubic\n // arguments: t = current iteration, b = initial value, c = end value, d = total iterations\n // use w.toss.easing to provide a custom function externally, or pass an easing function as a callback to the toss method\n toss.easing = function (t, b, c, d) {\n return c*((t=t/d-1)*t*t + 1) + b;\n };\n\n //retain old api\n toss.toss = toss;\n\n})( this );\n\n;(function( w, $ ){\n\tvar pluginName = \"snapper\";\n\t$.fn[ pluginName ] = function(optionsOrMethod){\n\t\tvar pluginArgs = arguments;\n\t\tvar scrollListening = true;\n\n\t\t// css snap points feature test.\n\t\t// even if this test passes, several behaviors will still be polyfilled, such as snapping after resize, and animated advancing of slides with anchor links or next/prev links\n\t\tvar testProp = \"scroll-snap-type\";\n\t\t// test latest spec first. then fallback older\n\t\tvar snapSupported = w.CSS && w.CSS.supports && (w.CSS.supports(testProp, \"x mandatory\") || w.CSS.supports(testProp, \"mandatory\") || w.CSS.supports(\"-webkit-\" + testProp, \"mandatory\") || w.CSS.supports(\"-ms-\" + testProp, \"mandatory\") );\n\n\t\t// get the snapper_item elements whose left offsets fall within the scroll pane. Returns a wrapped array.\n\t\tfunction itemsAtOffset( elem, offset ){\n\t\t\tvar $childNodes = $( elem ).find( \".\" + pluginName + \"_item\" );\n\t\t\tvar containWidth = $( elem ).width();\n\t\t\tvar activeItems = [];\n\n\t\t\t$childNodes.each(function( i ){\n\t\t\t\tif( this.offsetLeft >= offset - 5 && this.offsetLeft < offset + containWidth - 5 ){\n\t\t\t\t\tactiveItems.push( this );\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn $( activeItems );\n\t\t}\n\n\t\tfunction outerWidth( $elem ){\n\t\t\treturn $elem.width() + parseFloat( $elem.css( \"margin-left\" ) ) + parseFloat( $elem.css( \"margin-right\" ) );\n\t\t}\n\n\t\tfunction outerHeight( $elem ){\n\t\t\treturn $elem.height() + parseFloat( $elem.css( \"margin-bottom\" ) ) + parseFloat( $elem.css( \"margin-top\" ) );\n\t\t}\n\n\n\t\t// snapEvent dispatches the \"snapper.snap\" event.\n\t\t// The snapper_item elements with left offsets that are inside the scroll viewport are listed in an array in the second callback argument's activeSlides property.\n\t\t// use like this: $( \".snapper\" ).bind( \"snapper.snap\", function( event, data ){ console.log( data.activeSlides );\t} );\n\t\tfunction snapEvent( elem, x, prefix ){\n\t\t\tprefix = prefix ? prefix + \"-\" : \"\";\n\t\t\tvar activeSlides = itemsAtOffset( elem, x );\n\t\t\t$( elem ).trigger( pluginName + \".\" + prefix + \"snap\", { activeSlides: activeSlides } );\n\t\t}\n\n\t\t// optional: include toss() in your page to get a smooth scroll, otherwise it'll just jump to the slide\n\t\tfunction goto( elem, x, nothrow, callback ){\n\t\t\tscrollListening = false;\n\t\t\tsnapEvent( elem, x );\n\n\t\t\tvar after = function(){\n\t\t\t\telem.scrollLeft = x;\n\t\t\t\t$(elem).closest( \".\" + pluginName ).removeClass( pluginName + \"-looping\" );\n\t\t\t\t$( elem ).trigger( pluginName + \".after-goto\", {\n\t\t\t\t\tactiveSlides: itemsAtOffset( elem, x )\n\t\t\t\t});\n\n\t\t\t\tif( callback ){ callback(); };\n\t\t\t\tsnapEvent( elem, x, \"after\" );\n\t\t\t\tscrollListening = true;\n\t\t\t};\n\n\t\t\t// backport to old toss for compat\n\t\t\tif( !w.toss && w.overthrow ){\n\t\t\t\tw.toss = w.overthrow.toss;\n\t\t\t}\n\t\t\tif( typeof w.toss !== \"undefined\" && !nothrow ){\n\t\t\t\tw.toss( elem, { left: x, finished: after });\n\t\t\t}\n\t\t\telse {\n\t\t\t\telem.scrollLeft = x;\n\t\t\t\tafter();\n\t\t\t}\n\t\t}\n\n\n\t\tvar result, innerResult;\n\n\t\t// Loop through snapper elements and enhance/bind events\n\t\tresult = this.each(function(){\n\t\t\tif( innerResult !== undefined ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar self = this;\n\t\t\tvar $self = $( self );\n\t\t\tvar addNextPrev = $self.is( \"[data-\" + pluginName + \"-nextprev]\" );\n\t\t\tvar autoTimeout;\n\t\t\tvar $slider = $( \".\" + pluginName + \"_pane\", self );\n\t\t\tvar enhancedClass = pluginName + \"-enhanced\";\n\t\t\tvar $itemsContain = $slider.find( \".\" + pluginName + \"_items\" );\n\t\t\tvar $items = $itemsContain.children();\n\t\t\t$items.addClass( pluginName + \"_item\" );\n\t\t\tvar numItems = $items.length;\n\t\t\tvar $nav = $( \".\" + pluginName + \"_nav\", self );\n\t\t\tvar navSelectedClass = pluginName + \"_nav_item-selected\";\n\t\t\tvar useDeepLinking = $self.attr( \"data-snapper-deeplinking\" ) !== \"false\";\n\n\t\t\tif( typeof optionsOrMethod === \"string\" ){\n\t\t\t\tvar args = Array.prototype.slice.call(pluginArgs, 1);\n\t\t\t\tvar index;\n\t\t\t\tvar itemWidth = ( $itemsContain.width() / numItems );\n\n\t\t\t\tswitch(optionsOrMethod) {\n\t\t\t\tcase \"goto\":\n\t\t\t\t\tindex = args[0] % numItems;\n\n\t\t\t\t\t// width / items * index to make sure it goes\n\t\t\t\t\toffset = itemWidth * index;\n\t\t\t\t\tgoto( $slider[ 0 ], offset, false, function(){\n\t\t\t\t\t\t// snap the scroll to the right position\n\t\t\t\t\t\tsnapScroll();\n\n\t\t\t\t\t\t// invoke the callback if it was supplied\n\t\t\t\t\t\tif( typeof args[1] === \"function\" ){\n\t\t\t\t\t\t\targs[1]();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"getIndex\":\n\t\t\t\t\t// NOTE make the scroll left value large enough to overcome\n\t\t\t\t\t// subpixel widths\n\t\t\t\t\tinnerResult = Math.floor(($slider[ 0 ].scrollLeft + 1)/ itemWidth);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"updateWidths\":\n\t\t\t\t\tupdateWidths();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// avoid double enhance activities\n\t\t\tif( $self.attr(\"data-\" + pluginName + \"-enhanced\") ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// NOTE all state manipulation has to come after method invocation to\n\t\t\t// avoid monkeying with the DOM when it's unwarranted\n\t\t\tvar $navInner = $nav.find( \".\" + pluginName + \"_nav_inner\" );\n\t\t\tif( !$navInner.length ){\n\t\t\t\t$navInner = $( '<div class=\"'+ pluginName + '_nav_inner\"></div>' ).append( $nav.children() ).appendTo( $nav );\n\t\t\t}\n\n\t\t\t// give the pane a tabindex for arrow key handling\n\t\t\t$slider.attr(\"tabindex\", \"0\");\n\n\t\t\tfunction getAutoplayInterval() {\n\t\t\t\tvar autoTiming = $self.attr( \"data-autoplay\" ) || $self.attr( \"data-snapper-autoplay\" );\n\t\t\t\tvar parseError = false;\n\n\t\t\t\tif( autoTiming ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tautoTiming = parseInt(autoTiming, 10);\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\tparseError = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// if NaN or there was an error throw an exception\n\t\t\t\t\tif( !autoTiming || parseError ) {\n\t\t\t\t\t\tvar msg = \"Snapper: `data-autoplay` must have an natural number value.\";\n\t\t\t\t\t\tthrow new Error(msg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn autoTiming;\n\t\t\t}\n\n\t\t\t// this function updates the widths of the items within the slider, and their container.\n\t\t\t// It factors in margins and converts those to values that make sense when all items are placed in a long row\n\t\t\tfunction updateWidths(){\n\t\t\t\tvar itemsContainStyle = $itemsContain.attr( \"style\" );\n\t\t\t\t$itemsContain.attr( \"style\", \"\" );\n\t\t\t\tvar itemStyle = $items.eq(0).attr( \"style\" );\n\t\t\t\t$items.eq(0).attr( \"style\", \"\" );\n\t\t\t\tvar sliderWidth = $slider.width();\n\t\t\t\tvar itemWidth = $items.eq(0).width();\n\t\t\t\tvar computed = w.getComputedStyle( $items[ 0 ], null );\n\t\t\t\tvar itemLeftMargin = parseFloat( computed.getPropertyValue( \"margin-left\" ) );\n\t\t\t\tvar itemRightMargin = parseFloat( computed.getPropertyValue( \"margin-right\" ) );\n\t\t\t\tvar outerItemWidth = itemWidth + itemLeftMargin + itemRightMargin;\n\t\t\t\t$items.eq(0).attr( \"style\", itemStyle );\n\t\t\t\t$itemsContain.attr( \"style\", itemsContainStyle );\n\t\t\t\tvar parentWidth = numItems / Math.round(sliderWidth / outerItemWidth) * 100;\n\t\t\t\tvar iPercentWidth = itemWidth / sliderWidth * 100;\n\t\t\t\tvar iPercentRightMargin = itemRightMargin / sliderWidth * 100;\n\t\t\t\tvar iPercentLeftMargin = itemLeftMargin / sliderWidth * 100;\n\t\t\t\tvar outerPercentWidth = iPercentWidth + iPercentLeftMargin + iPercentRightMargin;\n\t\t\t\tvar percentAsWidth = iPercentWidth / outerPercentWidth;\n\t\t\t\tvar percentAsRightMargin = iPercentRightMargin / outerPercentWidth;\n\t\t\t\tvar percentAsLeftMargin = iPercentLeftMargin / outerPercentWidth;\n\t\t\t\t$itemsContain.css( \"width\", parentWidth + \"%\");\n\t\t\t\t$items.css( \"width\", 100 / numItems * percentAsWidth + \"%\" );\n\t\t\t\t$items.css( \"margin-left\", 100 / numItems * percentAsLeftMargin + \"%\" );\n\t\t\t\t$items.css( \"margin-right\", 100 / numItems * percentAsRightMargin + \"%\" );\n\t\t\t}\n\n\t\t\tupdateWidths();\n\t\t\t$( self ).addClass( enhancedClass );\n\n\t\t\t// if the nextprev option is set, add the nextprev nav\n\t\t\tif( addNextPrev ){\n\t\t\t\tvar\t$nextprev = $( '<ul class=\"snapper_nextprev\"><li class=\"snapper_nextprev_item\"><a href=\"#prev\" class=\"snapper_nextprev_prev\">Prev</a></li><li class=\"snapper_nextprev_item\"><a href=\"#next\" class=\"snapper_nextprev_next\">Next</a></li></ul>' );\n\t\t\t\tvar $nextprevContain = $( \".snapper_nextprev_contain\", self );\n\t\t\t\tif( !$nextprevContain.length ){\n\t\t\t\t\t$nextprevContain = $( self );\n\t\t\t\t}\n\t\t\t\t$nextprev.appendTo( $nextprevContain );\n\t\t\t}\n\n\t\t\t// This click binding will allow deep-linking to slides without causing the page to scroll to the carousel container\n\t\t\t// this also supports click handling for generated next/prev links\n\t\t\t$( \"a\", this ).bind( \"click\", function( e ){\n\t\t\t\tclearTimeout(autoTimeout);\n\t\t\t\tvar slideID = $( this ).attr( \"href\" );\n\n\t\t\t\tif( $( this ).is( \".snapper_nextprev_next\" ) ){\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn arrowNavigate( true );\n\t\t\t\t}\n\t\t\t\telse if( $( this ).is( \".snapper_nextprev_prev\" ) ){\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn arrowNavigate( false );\n\t\t\t\t}\n\t\t\t\t// internal links to slides\n\t\t\t\telse if( slideID.indexOf( \"#\" ) === 0 && slideID.length > 1 ){\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\tvar $slide = $( slideID, self );\n\t\t\t\t\tif( $slide.length ){\n\t\t\t\t\t\tgoto( $slider[ 0 ], $slide[ 0 ].offsetLeft );\n\t\t\t\t\t\tif( useDeepLinking && \"replaceState\" in w.history ){\n\t\t\t\t\t\t\tw.history.replaceState( {}, document.title, slideID );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// arrow key bindings for next/prev\n\t\t\t$( this )\n\t\t\t\t.bind( \"keydown\", function( e ){\n\t\t\t\t\tif( e.keyCode === 37 || e.keyCode === 38 ){\n\t\t\t\t\t\tclearTimeout(autoTimeout);\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\t\tarrowNavigate( false );\n\t\t\t\t\t}\n\t\t\t\t\tif( e.keyCode === 39 || e.keyCode === 40 ){\n\t\t\t\t\t\tclearTimeout(autoTimeout);\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\t\tarrowNavigate( true );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\tvar snapScrollCancelled = false;\n\n\t\t\t// snap to nearest slide. Useful after a scroll stops, for polyfilling snap points\n\t\t\tfunction snapScroll(){\n\t\t\t\tif(isTouched){\n\t\t\t\t\tsnapScrollCancelled = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar currScroll = $slider[ 0 ].scrollLeft;\n\t\t\t\tvar width = $itemsContain.width();\n\t\t\t\tvar itemWidth = $items[ 1 ] ? $items[ 1 ].offsetLeft : outerWidth( $items.eq( 0 ) );\n\t\t\t\tvar roundedScroll = Math.round(currScroll/itemWidth)*itemWidth;\n\t\t\t\tvar maxScroll = width - $slider.width();\n\t\t\t\tif( roundedScroll > maxScroll ){\n\t\t\t\t\troundedScroll = maxScroll;\n\t\t\t\t}\n\t\t\t\tif( currScroll !== roundedScroll ){\n\t\t\t\t\tif( snapSupported ){\n\t\t\t\t\t\tsnapEvent( $slider[ 0 ], roundedScroll );\n\t\t\t\t\t\tsnapEvent( $slider[ 0 ], roundedScroll, \"after\" );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tgoto( $slider[ 0 ], roundedScroll );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgoto( $slider[ 0 ], roundedScroll );\n\t\t\t\t}\n\n\t\t\t\tsnapScrollCancelled = false;\n\t\t\t}\n\n\t\t\t// retain snapping on resize (necessary even in scroll-snap supporting browsers currently, unfortunately)\n\t\t\tvar startSlide;\n\t\t\tvar afterResize;\n\t\t\tfunction snapStay(){\n\t\t\t\tvar currScroll = $slider[ 0 ].scrollLeft;\n\t\t\t\tvar numItems = $items.length;\n\t\t\t\tvar width = $itemsContain.width();\n\t\t\t\tif( startSlide === undefined ){\n\t\t\t\t\tstartSlide = Math.round( currScroll / width * numItems );\n\t\t\t\t}\n\t\t\t\tif( afterResize ){\n\t\t\t\t\tclearTimeout( afterResize );\n\t\t\t\t}\n\t\t\t\tafterResize = setTimeout( function(){\n\t\t\t\t\tupdateWidths();\n\t\t\t\t\tgoto( $slider[ 0 ], $items[ startSlide ].offsetLeft, true );\n\t\t\t\t\tstartSlide = afterResize = undefined;\n\t\t\t\t}, 50 );\n\t\t\t}\n\t\t\t$( w ).bind( \"resize\", snapStay );\n\n\t\t\t// next/prev links or arrows should loop back to the other end when an extreme is reached\n\t\t\tfunction arrowNavigate( forward ){\n\t\t\t\tvar currScroll = $slider[ 0 ].scrollLeft;\n\t\t\t\tvar width = $itemsContain.width();\n\t\t\t\tvar itemWidth = outerWidth( $slider );\n\t\t\t\tvar maxScroll = width - itemWidth - 5;\n\t\t\t\tif( forward ){\n\t\t\t\t\tif( currScroll >= maxScroll ){\n\t\t\t\t\t\t$self.addClass( pluginName + \"-looping\" );\n\t\t\t\t\t\treturn first();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treturn next();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif( currScroll === 0 ){\n\t\t\t\t\t\t$self.addClass( pluginName + \"-looping\" );\n\t\t\t\t\t\treturn last();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treturn prev();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// advance slide one full scrollpane's width forward\n\t\t\tfunction next(){\n\t\t\t\tgoto( $slider[ 0 ], $slider[ 0 ].scrollLeft + ( $itemsContain.width() / numItems ), false, function(){\n\t\t\t\t\t$slider.trigger( pluginName + \".after-next\" );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// advance slide one full scrollpane's width backwards\n\t\t\tfunction prev(){\n\t\t\t\tgoto( $slider[ 0 ], $slider[ 0 ].scrollLeft - ( $itemsContain.width() / numItems ), false, function(){\n\t\t\t\t\t$slider.trigger( pluginName + \".after-prev\" );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// go to first slide\n\t\t\tfunction first(){\n\t\t\t\tgoto( $slider[ 0 ], 0 );\n\t\t\t}\n\n\t\t\t// go to last slide\n\t\t\tfunction last(){\n\t\t\t\tgoto( $slider[ 0 ], $itemsContain.width() - $slider.width() );\n\t\t\t}\n\n\t\t\t// update thumbnail state on pane scroll\n\t\t\tif( $nav.length ){\n\t\t\t\t// function for scrolling to the xy of the active thumbnail\n\t\t\t\tfunction scrollNav(elem, x, y){\n\t\t\t\t\tif( typeof w.toss !== \"undefined\" ){\n\t\t\t\t\t\tw.toss( elem, { left: x, top:y });\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\telem.scrollLeft = x;\n\t\t\t\t\t\telem.scrollTop = y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar lastActiveItem;\n\t\t\t\tfunction activeItem( force ){\n\t\t\t\t\tvar currTime = new Date().getTime();\n\t\t\t\t\tif( !force && lastActiveItem && currTime - lastActiveItem < 200 ){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlastActiveItem = currTime;\n\t\t\t\t\tvar currScroll = $slider[ 0 ].scrollLeft;\n\t\t\t\t\tvar width = outerWidth( $itemsContain );\n\t\t\t\t\tvar navWidth = outerWidth( $nav );\n\t\t\t\t\tvar navHeight = outerHeight( $nav );\n\t\t\t\t\tvar activeIndex = Math.round( currScroll / width * numItems ) || 0;\n\t\t\t\t\tvar childs = $nav.find( \"a\" ).removeClass( navSelectedClass );\n\t\t\t\t\tvar activeChild = childs.eq( activeIndex ).addClass( navSelectedClass );\n\n\t\t\t\t\tvar thumbX = activeChild[ 0 ].offsetLeft - (navWidth/2);\n\t\t\t\t\tvar thumbY = activeChild[ 0 ].offsetTop - (navHeight/2);\n\n\t\t\t\t\tscrollNav( $navInner[ 0 ], thumbX, thumbY );\n\t\t\t\t}\n\n\t\t\t\t// set active item on init\n\t\t\t\tactiveItem();\n\n\t\t\t\t$slider.bind( \"scroll\", activeItem );\n\t\t\t}\n\n\t\t\t// apply snapping after scroll, in browsers that don't support CSS scroll-snap\n\t\t\tvar scrollStop;\n\t\t\tvar scrolling;\n\t\t\tvar lastScroll = 0;\n\n\n\t\t\t$slider.bind( \"scroll\", function(e){\n\t\t\t\tlastScroll = new Date().getTime();\n\t\t\t\tscrolling = true;\n\t\t\t});\n\n\t\t\tsetInterval(function(){\n\t\t\t\tif( scrolling && lastScroll <= new Date().getTime() - 150) {\n\t\t\t\t\tsnapScroll();\n\t\t\t\t\tif( activeItem ){\n\t\t\t\t\t\tactiveItem( true );\n\t\t\t\t\t}\n\t\t\t\t\tscrolling = false;\n\t\t\t\t}\n\t\t\t}, 150);\n\n\t\t\tvar isTouched = false;\n\n\t\t\t// if a touch event is fired on the snapper we know the user is trying to\n\t\t\t// interact with it and we should disable the auto play\n\t\t\t$slider.bind(\"touchstart\", function(){\n\t\t\t\tclearTimeout(autoTimeout);\n\n\t\t\t\tisTouched = true;\n\t\t\t});\n\n\t\t\t$slider.bind(\"touchend\", function(){\n\t\t\t\tisTouched = false;\n\n\t\t\t\tif(snapScrollCancelled && !scrolling){\n\t\t\t\t\tsnapScroll();\n\t\t\t\t\tscrolling = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// if the `data-autoplay` attribute is assigned a natural number value\n\t\t\t// use it to make the slides cycle until there is a user interaction\n\t\t\tfunction autoplay( autoTiming ) {\n\t\t\t\tif( autoTiming ){\n\t\t\t\t\t// autoTimeout is cleared in each user interaction binding\n\t\t\t\t\tautoTimeout = setTimeout(function(){\n\t\t\t\t\t\tvar timeout = getAutoplayInterval();\n\t\t\t\t\t\tif( timeout ) {\n\t\t\t\t\t\t\tarrowNavigate(true);\n\t\t\t\t\t\t\tautoplay( timeout );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, autoTiming);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tautoplay( getAutoplayInterval() );\n\t\t\t$self.attr(\"data-\" + pluginName + \"-enhanced\", true);\n\t\t});\n\n\t\treturn (innerResult !== undefined ? innerResult : result);\n\t};\n}( this, jQuery ));\n\n;(function( w ){\n\tvar enlarge = function(){\n\t\tvar $ = w.jQuery;\n\t\tvar pluginName = \"enlarge\";\n\t\t$.fn[ pluginName ] = function( options ){\n\t\t\tvar pluginArgs = arguments;\n\n\t\t\t// options\n\t\t\tvar o = $(this).data(\"options\") || {\n\t\t\t\tbutton: true,\n\t\t\t\thoverZoomWithoutClick: true,\n\t\t\t\tdelay: 300,\n\t\t\t\tflyout: {\n\t\t\t\t\twidth: 200,\n\t\t\t\t\theight: 200\n\t\t\t\t},\n\t\t\t\tplacement: \"inline\",\n\t\t\t\tmagnification: 3\n\t\t\t};\n\n\t\t\tif( typeof options !== \"string\" ) {\n\t\t\t\t// extend with passed options\n\t\t\t\to = $.extend( o, options );\n\t\t\t\t$(this).data(\"options\", o);\n\t\t\t}\n\n\t\t\tvar internalResult;\n\n\t\t\tvar result = this.each(function(){\n\t\t\t\tvar $element = $(this);\n\n\t\t\t\tvar self = this;\n\t\t\t\tvar testimg = w.document.createElement( \"img\" );\n\t\t\t\tvar srcsetSupported = \"srcset\" in testimg;\n\t\t\t\tvar srcsetSizesSupported = srcsetSupported && \"sizes\" in testimg;\n\t\t\t\tvar $anchor = $( this ).find( \"a\" );\n\n\t\t\t\tif( !$anchor.length ){\n\t\t\t\t\tthrow new Error(pluginName + \": requires an anchor element with `href` for the enlarged image source\");\n\t\t\t\t}\n\n\t\t\t\t// find image within container\n\t\t\t\tvar initialImg = $element.find( \"img\" )[ 0 ];\n\t\t\t\tvar targetImg = initialImg;\n\t\t\t\tvar imgOriginalSrc = targetImg.src;\n\t\t\t\tvar srcset = $( targetImg ).attr( \"srcset\" );\n\t\t\t\tvar imgOriginalSizes = $( targetImg ).attr( \"sizes\" );\n\t\t\t\tvar imgZoomSrc = $anchor[ 0 ].href;\n\t\t\t\tvar initialText = $anchor[ 0 ].innerText;\n\t\t\t\tvar zoomClass = pluginName + \"-zoomed\";\n\t\t\t\tvar delayClass = pluginName + \"-delay\";\n\t\t\t\tvar $contain = $( targetImg ).closest( \".enlarge_contain\" );\n\t\t\t\tvar $zoomContain = $contain;\n\t\t\t\tvar $parentPane = $( targetImg ).closest( \".enlarge_pane\" ) || $element;\n\n\t\t\t\tvar $zoomParent = $(this).data(\"zoomParent\") || $parentPane;\n\t\t\t\t$(this).data(\"zoomParent\", $zoomParent);\n\n\t\t\t\tvar zoomed = $element.data(\"zoomed\") || false;\n\t\t\t\t$element.data(\"zoomed\", zoomed);\n\n\t\t\t\t$element.data(\"lockedZoom\", $element.data(\"lockedZoom\") || false);\n\n\t\t\t\tvar lockZoomClass = pluginName + \"-locked\";\n\n\t\t\t\tif( !$contain.length ){\n\t\t\t\t\tthrow new Error(pluginName + \": requires an element above the image marked with the class `enlarge_contain`\");\n\t\t\t\t}\n\n\t\t\t\t// this allows for methods and changing options in subsequent calls to the plugin\n\t\t\t\tif( typeof options === \"string\" ) {\n\t\t\t\t\tvar args = Array.prototype.slice.call(pluginArgs, 1);\n\n\t\t\t\t\tswitch(options){\n\t\t\t\t\tcase \"in\":\n\t\t\t\t\t\tif( !$element.data(\"zoomed\") ){\n\t\t\t\t\t\t\tstandardToggleZoom();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"out\":\n\t\t\t\t\t\tif( $element.data(\"zoomed\") ){\n\t\t\t\t\t\t\tstandardToggleZoom();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"isZoomed\":\n\t\t\t\t\t\tinternalResult = $element.data(\"zoomed\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"updateOptions\":\n\t\t\t\t\t\t$element.data( \"updateOptions\" )( args[ 0 ] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// to toggle between inline and flyout modes, we change the elements that\n\t\t\t\t// the targetImg, zoomParent, and zoomContain vars refer to\n\t\t\t\tfunction updatePlacement(){\n\t\t\t\t\tif( o.placement === \"inline\" ){\n\t\t\t\t\t\ttargetImg = initialImg;\n\t\t\t\t\t\t$zoomParent = $parentPane;\n\t\t\t\t\t\t$element.data(\"zoomParent\", $zoomParent);\n\t\t\t\t\t\t$zoomContain = $contain;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttargetImg = $flyout.find( \"img\" )[ 0 ];\n\t\t\t\t\t\t$zoomParent = $zoomContain = $flyout;\n\t\t\t\t\t\t$element.data(\"zoomParent\", $zoomParent);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// this positions the loupe or side flyout element either according to mouse/touch coordinates\n\t\t\t\t// or the sides of the viewer specified\n\t\t\t\tfunction positionFlyout(){\n\n\t\t\t\t\t// set flyout width and height\n\t\t\t\t\t$flyout.css({\n\t\t\t\t\t\t\"width\": o.flyout.width + \"px\",\n\t\t\t\t\t\t\"height\": o.flyout.height + \"px\",\n\t\t\t\t\t\ttop: \"\",\n\t\t\t\t\t\tleft: \"\",\n\t\t\t\t\t\t\"margin-left\": \"\",\n\t\t\t\t\t\t\"margin-top\": \"\"\n\t\t\t\t\t});\n\n\t\t\t\t\t// set negative left or right value to match width\n\t\t\t\t\tvar flyoutSide = o.placement.match( /left|right/ );\n\n\t\t\t\t\tif( flyoutSide ){\n\t\t\t\t\t\t$flyout.css( flyoutSide[ 0 ], -o.flyout.width + \"px\" );\n\t\t\t\t\t}\n\t\t\t\t\t// if loupe mode, center offset\n\t\t\t\t\tvar loupe = o.placement.match( /loupe/ );\n\n\t\t\t\t\tif( loupe ) {\n\t\t\t\t\t\t// loupe\n\t\t\t\t\t\t$flyout.css({\n\t\t\t\t\t\t\t\"margin-left\": ( -o.flyout.width / 2 ) + \"px\",\n\t\t\t\t\t\t\t\"margin-top\": ( -o.flyout.height / 2 ) + \"px\"\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// add class to specify positioning spot for static css to apply\n\t\t\t\t\t$flyout[ 0 ].className = $flyout[ 0 ].className.replace( /enlarge_flyout\\-[^$\\s]+/, ' ' );\n\t\t\t\t\t$flyout.addClass( \"enlarge_flyout-\" +\t o.placement );\n\t\t\t\t}\n\n\t\t\t\tfunction disable(){\n\t\t\t\t\tif(o.disabled){\n\t\t\t\t\t\t$element.addClass(\"enlarge_disabled\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$element.removeClass(\"enlarge_disabled\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdisable();\n\n\t\t\t\t// this allows for subsequent calls to the plugin to pass an updateOptions method and object,\n\t\t\t\t// which will pass through to the existing viewer on that element\n\t\t\t\t$element.data( \"updateOptions\", function( opts ){\n\t\t\t\t\to = $.extend( o, opts );\n\t\t\t\t\t$(this).data(\"options\", o);\n\n\t\t\t\t\tupdatePlacement();\n\t\t\t\t\tpositionFlyout();\n\t\t\t\t\thoverEnabled = o.hoverZoomWithoutClick;\n\t\t\t\t\tif( o.image && o.image.sizes ){\n\t\t\t\t\t\timgOriginalSizes = o.image.sizes;\n\t\t\t\t\t\ttoggleImgSrc();\n\t\t\t\t\t}\n\n\t\t\t\t\tdisable();\n\n\t\t\t\t\tif( o.disabled && $element.data(\"zoomed\") ) {\n\t\t\t\t\t\tstandardToggleZoom();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// loader div holds a new image while its new source is loading\n\t\t\t\t// we insert this into the dom so that srcset/sizes can calculate a best source\n\t\t\t\tfunction addLoader(){\n\t\t\t\t\t$contain.append( '<i class=\"enlarge_loader\"><i></i></i>' );\n\t\t\t\t}\n\n\t\t\t\t// zoom state toggle boolean\n\t\t\t\tfunction toggleZoomState(){\n\t\t\t\t\tzoomed = !$element.data(\"zoomed\");\n\t\t\t\t\t$element.data(\"zoomed\", zoomed);\n\t\t\t\t}\n\n\t\t\t\t// toggle the image source bigger or smaller\n\t\t\t\t// ideally, this toggles the sizes attribute and allows the browser to select a new source from srcset\n\t\t\t\t// if srcset isn't supported or sizes attribute is not provided, the link href is used for the larger source\n\t\t\t\tfunction toggleImgSrc(after){\n\t\t\t\t\tafter = after || function(){};\n\n\t\t\t\t\tif( !zoomed ){\n\t\t\t\t\t\ttargetImg.sizes = imgOriginalSizes;\n\t\t\t\t\t\tif( !srcsetSizesSupported ){\n\t\t\t\t\t\t\ttargetImg.src = imgOriginalSrc;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tafter();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// if the zooming is disabled do not replace with the larger source\n\t\t\t\t\t\t// NOTE we don't prevent switching to the original source because we\n\t\t\t\t\t\t// always want to allow the plugin to back out of the zoomed state\n\t\t\t\t\t\t// when disabled\n\t\t\t\t\t\tif( o.disabled ) { after(); return false; }\n\n\t\t\t\t\t\tvar zoomimg = new Image();\n\t\t\t\t\t\tzoomimg.className = \"enlarge_img-loading\";\n\t\t\t\t\t\tzoomimg.onload = function(){\n\t\t\t\t\t\t\ttargetImg.sizes = zoomimg.sizes;\n\t\t\t\t\t\t\tif( !srcsetSizesSupported || !srcset ){\n\t\t\t\t\t\t\t\ttargetImg.src = imgZoomSrc;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$( zoomimg ).remove();\n\n\t\t\t\t\t\t\tafter();\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tzoomimg.sizes = imgZoomWidth() + \"px\";\n\n\t\t\t\t\t\tif( !srcsetSizesSupported || !srcset ){\n\t\t\t\t\t\t\tzoomimg.src = imgZoomSrc;\n\t\t\t\t\t\t} else if (srcset) {\n\t\t\t\t\t\t\tzoomimg.srcset = srcset;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$( zoomimg ).insertBefore( targetImg );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// scroll to the center of the zoomed image\n\t\t\t\tfunction scrollToCenter(){\n\t\t\t\t\tvar pw = $zoomContain.width();\n\t\t\t\t\tvar ph = $zoomContain.height();\n\t\t\t\t\tvar w = targetImg.offsetWidth;\n\t\t\t\t\tvar h = targetImg.offsetHeight;\n\t\t\t\t\t$zoomContain[ 0 ].scrollLeft = ( w / 2 ) - ( pw / 2 );\n\t\t\t\t\t$zoomContain[ 0 ].scrollTop = ( h / 2 ) - ( ph / 2 );\n\t\t\t\t}\n\n\t\t\t\t// lock zoom mode allows for scrolling around normally without a cursor-follow behavior\n\t\t\t\tfunction toggleLockZoom(){\n\t\t\t\t\tif( !$element.data(\"lockedZoom\") ){\n\t\t\t\t\t\t// NOTE we allow the image to zoom out if functionality gets disabled\n\t\t\t\t\t\t// when it's in a zoomed state\n\t\t\t\t\t\tif(o.disabled) { return false; }\n\n\t\t\t\t\t\t$parentPane.add( $zoomParent ).addClass( lockZoomClass );\n\t\t\t\t\t\t$element.data(\"lockedZoom\", lockedZoom = true);\n\t\t\t\t\t\t$zoomContain.attr( \"tabindex\", \"0\" );\n\t\t\t\t\t\t$zoomContain[ 0 ].focus();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t$parentPane.add( $zoomParent ).removeClass( lockZoomClass );\n\t\t\t\t\t\t$element.data(\"lockedZoom\", lockedZoom = false);\n\t\t\t\t\t\t$zoomContain.removeAttr( \"tabindex\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction imgZoomWidth(){\n\t\t\t\t\treturn $parentPane[0].offsetWidth * o.magnification;\n\t\t\t\t}\n\n\t\t\t\t// toggle magnification of image\n\t\t\t\tfunction toggleImgZoom(){\n\t\t\t\t\tif( $element.data(\"zoomed\") ){\n\t\t\t\t\t\t// NOTE we allow the image to zoom out if functionality gets disabled\n\t\t\t\t\t\t// when it's in a zoomed state\n\t\t\t\t\t\tif(o.disabled) { return false; }\n\n\t\t\t\t\t\tif( o.placement === \"inline\" ){\n\t\t\t\t\t\t\t$contain.add( $parentPane ).css( { \"width\": $parentPane[0].offsetWidth + \"px\", \"height\": parseFloat( getComputedStyle( $parentPane[0] ).height ) + \"px\" } );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$zoomParent.addClass( zoomClass );\n\t\t\t\t\t\t$( targetImg ).css( \"width\", imgZoomWidth() + \"px\" );\n\n\t\t\t\t\t\t$(self).trigger( pluginName + \".after-zoom-in\");\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\t$zoomParent.removeClass( zoomClass );\n\t\t\t\t\t\tif( o.placement === \"inline\" ){\n\t\t\t\t\t\t\t$contain.add( $parentPane ).css( { \"width\": \"\", \"height\": \"\" } );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$( targetImg ).css( \"width\", \"\" );\n\n\t\t\t\t\t\t$(self).trigger( pluginName + \".after-zoom-out\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction forceInlineMode(){\n\t\t\t\t\tvar oldO = o.placement;\n\t\t\t\t\tif( oldO !== \"inline\" ){\n\t\t\t\t\t\tfunction resetPlacement(){\n\t\t\t\t\t\t\to.placement = oldO;\n\t\t\t\t\t\t\tupdatePlacement();\n\t\t\t\t\t\t\t$(self).unbind( pluginName + \".after-zoom-out\", resetPlacement );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(self).bind( pluginName + \".after-zoom-out\", resetPlacement );\n\t\t\t\t\t\to.placement = \"inline\";\n\t\t\t\t\t\tupdatePlacement();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// lock zoom mode toggle\n\t\t\t\tfunction standardToggleZoom(){\n\t\t\t\t\t// NOTE if the current is zoomed out and it's disabled prevent toggling\n\t\t\t\t\tif(o.disabled && !$element.data(\"zoomed\")) { return false; }\n\t\t\t\t\ttoggleZoomState();\n\t\t\t\t\ttoggleImgSrc(function(){\n\t\t\t\t\t\ttoggleLockZoom();\n\t\t\t\t\t\ttoggleImgZoom();\n\t\t\t\t\t\tscrollToCenter();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tvar trackingOn;\n\t\t\t\tvar trackingTimer;\n\t\t\t\tvar mouseEntered;\n\t\t\t\tvar touchStarted;\n\t\t\t\tvar hoverEnabled = o.hoverZoomWithoutClick;\n\t\t\t\tvar lastMouseMove;\n\n\t\t\t\t// mouseenter or touchstart handler for dragging image\n\t\t\t\tfunction startTrackingDelay(e){\n\t\t\t\t\tif( e.type === \"touchstart\" ){\n\t\t\t\t\t\ttouchStarted = true;\n\t\t\t\t\t}\n\t\t\t\t\tif( touchStarted && e.type === \"mouseenter\" ||\n\t\t\t\t\t\t\te.type === \"mouseenter\" && !touchStarted && !hoverEnabled ||\n\t\t\t\t\t\t\t$element.data(\"lockedZoom\") ||\n\t\t\t\t\t\t\tmouseEntered ){\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\tmouseEntered = true;\n\t\t\t\t\t$contain.addClass( delayClass );\n\t\t\t\t\ttrackingTimer = setTimeout( function(){\n\t\t\t\t\t\t$contain.removeClass( delayClass );\n\t\t\t\t\t\ttoggleZoomState();\n\t\t\t\t\t\ttoggleImgSrc(function(){\n\t\t\t\t\t\t\ttoggleImgZoom();\n\t\t\t\t\t\t\ttrackingOn = true;\n\t\t\t\t\t\t\tif (lastMouseMove) {\n\t\t\t\t\t\t\t\tscrollWithMouse(lastMouseMove);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tscrollWithMouse(e);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}, o.delay );\n\t\t\t\t}\n\n\t\t\t\t// mouseleave or touchend after a drag\n\t\t\t\tfunction stopTrackingDelay( e ){\n\t\t\t\t\t$contain.removeClass( delayClass );\n\t\t\t\t\tclearTimeout( trackingTimer );\n\t\t\t\t\ttrackingOn = false;\n\t\t\t\t\tif( o.hoverZoomWithoutClick === false && !touchStarted ){\n\t\t\t\t\t\thoverEnabled = false;\n\t\t\t\t\t}\n\t\t\t\t\tif( touchStarted && e.type === \"mouseleave\" ){\n\t\t\t\t\t\ttouchStarted = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// mousemove or touch-drag image placement\n\t\t\t\tfunction scrollWithMouse( e ){\n\t\t\t\t\t// if tracking's not on yet, ignore. This allows the delay to work\n\t\t\t\t\tif( trackingOn ){\n\t\t\t\t\t\t// if the move was touch-started, and the event is mousemove, it can be ignored\n\t\t\t\t\t\t// (mouse events fire along with touch events and we just want the touch)\n\t\t\t\t\t\tif( touchStarted && e.type === \"mousemove\" ){\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// normalize ev to touch or mouse\n\t\t\t\t\t\tvar ev = e.touches ? e.touches[ 0 ] : e;\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tvar x = ev.clientX - $contain[ 0 ].getBoundingClientRect().left;\n\t\t\t\t\t\tvar y = ev.clientY - $contain[ 0 ].getBoundingClientRect().top;\n\n\t\t\t\t\t\tif( o.placement.match( /loupe/ ) ) {\n\t\t\t\t\t\t\t// offset the loupe a little differently for touch so that it's not directly beneath a finger\n\t\t\t\t\t\t\tvar mLeft = ( e.touches ? -o.flyout.width / 1.3 : -o.flyout.width / 2 ) + \"px\";\n\t\t\t\t\t\t\tvar mTop = ( e.touches ? -o.flyout.height / 1.3 : -o.flyout.height / 2 ) + \"px\";\n\t\t\t\t\t\t\trequestAnimationFrame(function(){\n\t\t\t\t\t\t\t\t$flyout.css( {\n\t\t\t\t\t\t\t\t\ttop: y + \"px\",\n\t\t\t\t\t\t\t\t\tleft: x + \"px\",\n\t\t\t\t\t\t\t\t\t\"margin-left\": mLeft,\n\t\t\t\t\t\t\t\t\t\"margin-top\": mTop\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar containWidth = $contain[ 0 ].offsetWidth;\n\t\t\t\t\t\tvar containHeight = $contain[ 0 ].offsetHeight;\n\t\t\t\t\t\tvar containScrollWidth =\ttargetImg.offsetWidth;\n\t\t\t\t\t\tvar containScrollHeight = targetImg.offsetHeight;\n\t\t\t\t\t\tvar zoomContainWidth = $zoomContain[ 0 ].offsetWidth;\n\t\t\t\t\t\tvar zoomContainHeight = $zoomContain[ 0 ].offsetHeight;\n\t\t\t\t\t\tvar widthFactor = containWidth / zoomContainWidth;\n\t\t\t\t\t\tvar heightFactor = containHeight / zoomContainHeight;\n\n\t\t\t\t\t\t$zoomContain[ 0 ].scrollLeft = (( x / containWidth ) * ( containScrollWidth - zoomContainWidth ));\n\t\t\t\t\t\t$zoomContain[0].scrollLeft += ((x / containWidth) - 0.5) * zoomContainWidth;\n\t\t\t\t\t\t$zoomContain[ 0 ].scrollTop = (( y / containHeight ) * ( containScrollHeight - zoomContainHeight )) ;\n\t\t\t\t\t\t$zoomContain[0].scrollTop += ((y / containHeight) - 0.5) * zoomContainHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastMouseMove = e;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// add flyout for flyout and loupe modes\n\t\t\t\t// flyout is always present, yet hidden when inline mode is active\n\t\t\t\tvar $flyout = $( '<div class=\"enlarge_flyout\"></div>' ).append( $contain.clone() );\n\t\t\t\t$flyout.insertAfter( $parentPane );\n\n\t\t\t\t// add loader div\n\t\t\t\taddLoader();\n\t\t\t\tupdatePlacement();\n\t\t\t\tpositionFlyout();\n\n\t\t\t\t// clicking the magnify anchor toggles lock-zoom mode\n\t\t\t\t$anchor\n\t\t\t\t\t.bind( \"keydown\", function(e){\n\t\t\t\t\t\tif( e.keyCode === 13 || e.keyCode === 32 ){\n\t\t\t\t\t\t\tforceInlineMode();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// spacebar triggers click too\n\t\t\t\t\t\tif( e.keyCode === 32 ){\n\t\t\t\t\t\t\te.preventDefault(); // don't scroll the new focused area\n\t\t\t\t\t\t\t$( this ).trigger( \"click\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.bind( \"click\", function( e ){\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tstandardToggleZoom();\n\t\t\t\t\t});\n\n\t\t\t\t// on resize, if in lock zoom mode, un zoom\n\t\t\t\t$( w )\n\t\t\t\t\t.bind( \"resize\", function( e ){\n\t\t\t\t\t\tif( $element.data(\"lockedZoom\") ){\n\t\t\t\t\t\t\tstandardToggleZoom();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t// on click-out on the page, if in locked zoom mode, zoom out\n\t\t\t\t$( w.document )\n\t\t\t\t\t.bind( \"mouseup\", function( e ){\n\t\t\t\t\t\tif( $element.data(\"lockedZoom\") && !$( e.target ).closest( $parentPane ).length ){\n\t\t\t\t\t\t\tstandardToggleZoom();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t// mouse hover and touch-drag gestures for a cursor-tracked zoom behavior\n\t\t\t\t$( initialImg )\n\t\t\t\t\t.bind( \"mouseenter touchstart\", startTrackingDelay )\n\t\t\t\t\t.bind( \"mousemove touchmove\", scrollWithMouse )\n\t\t\t\t\t.bind( \"mouseleave touchend\", function( e ){\n\t\t\t\t\t\tmouseEntered = false;\n\t\t\t\t\t\tif( zoomed && !$element.data(\"lockedZoom\") ){\n\t\t\t\t\t\t\ttoggleZoomState();\n\t\t\t\t\t\t\ttoggleImgSrc(function(){\n\t\t\t\t\t\t\t\ttoggleImgZoom();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstopTrackingDelay( e );\n\t\t\t\t\t})\n\t\t\t\t// tapping the image should trigger a lock zoom\n\t\t\t\t// click will not fire after a touch-drag so it works as a tap for our needs here\n\t\t\t\t\t.bind( \"click\", function( e ){\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t// if the click was started with a touchstart event,\n\t\t\t\t\t\t// and placement is inline\n\t\t\t\t\t\t// toggle the locked zoom mode\n\t\t\t\t\t\tif( touchStarted && o.placement === \"inline\" ){\n\t\t\t\t\t\t\tstandardToggleZoom();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif( o.hoverZoomWithoutClick === false && !touchStarted ){\n\t\t\t\t\t\t\thoverEnabled = !hoverEnabled;\n\t\t\t\t\t\t\tif( hoverEnabled ){\n\t\t\t\t\t\t\t\t$( this ).trigger( \"mouseenter\" );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t$( this ).trigger( \"mouseleave\" );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// keyboard handling for arrows in zoom mode\n\t\t\t\t$(this).bind( \"keydown keyup\", function( e ){\n\t\t\t\t\tif( e.keyCode === 37 ||\n\t\t\t\t\t\t\te.keyCode === 38 ||\n\t\t\t\t\t\t\te.keyCode === 39 ||\n\t\t\t\t\t\t\te.keyCode === 40 ){\n\t\t\t\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\t\t\t\tif( !$element.data(\"lockedZoom\") ){\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if( e.type === \"keyup\" && $(this).data(\"lockedZoom\") && e.keyCode === 27 ){ //esc or backspace closes zoom\n\t\t\t\t\t\t\t\tstandardToggleZoom();\n\t\t\t\t\t\t\t\t$anchor[0].focus();\n\t\t\t\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// on scroll, zoom out\n\t\t\t\t$parentPane.bind( \"scroll\", function(){\n\t\t\t\t\tif( $element.data(\"zoomed\") ){\n\t\t\t\t\t\ttoggleZoomState();\n\t\t\t\t\t\ttoggleImgSrc(function(){\n\t\t\t\t\t\t\tif( $element.data(\"lockedZoom\") ){\n\t\t\t\t\t\t\t\ttoggleLockZoom();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttoggleImgZoom();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn internalResult !== undefined ? internalResult : result;\n\t\t};\n\t};\n\n\tif( typeof module !== \"undefined\" ){\n\t\tmodule.exports = enlarge;\n\t} else {\n\t\tenlarge();\n\t}\n}( typeof global !== \"undefined\" ? global : this ));\n\n(function(exports){\n\tvar Image = {\n\t\tdefaultConfig: {\n\t\t\twidths: [\n\t\t\t\t\"320\",\n\t\t\t\t\"640\",\n\t\t\t\t\"800\",\n\t\t\t\t\"1024\",\n\t\t\t\t\"2048\",\n\t\t\t\t\"5000\"\n\t\t\t],\n\n\t\t\tsizes: \"100vw\",\n\t\t\tpolicy: undefined,\n\t\t\twidthParam: \"imwidth\"\n\t\t}\n\t};\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.Image = Image;\n})(typeof exports === 'undefined'? window : exports);\n\n(function(exports, $){\n\t/**\n\t * 360 degree viewer\n\t * @class\n\t * @alias Akamai.Spin360\n\t * @param {HTMLElement} element - the DOM element representing the component markup\n\t * @param {Object} options - configuration options\n\t */\n\tvar Spin360 = Akamai.Util.component(\"Spin360\", function(element, options){\n\t\tthis._comp = new Akamai.Tau(element, this._options);\n\t});\n\n\t// srcset stuff\n\tAkamai.Sourceable.extendStatic(Spin360);\n\n\t// Used in preflight to \"rename\" events based on the child component events\n\tSpin360._componentEventMapping = {\n\t\t\"tau.auto-rotate-start\": \"play\",\n\t\t\"tau.auto-rotate-stop\": \"pause\"\n\t};\n\n\tSpin360.prototype._updateOptions = function(options){\n\t\tif( !options ) {\n\t\t\tthis._options = this._originalOptions;\n\t\t}\n\n\t\tthis._options = Akamai.Util.extend(true, this._options, options);\n\n\t\t// push the final options down to the dom element so that CSS that keys off\n\t\t// of the attributes can apply when JS config is used\n\t\tAkamai.Util.setDataAttrOptions(this._$el, Spin360.defaultOptions, this._options, \"Spin360\");\n\n\t\t// TODO actually update the options\n\t};\n\n\tSpin360._renderImg = function(url, options){\n\t\treturn `\n\t\t\t<img src=\"${Spin360._fallbackSrc(url, options.images)}\"\n\t\t\t\tsrcset=\"${Spin360._srcset(url, options.images)}\"\n\t\t\t\tsizes=\"${options.images.sizes}\" />\n\t\t`;\n\t};\n\n\tSpin360.render = function(json, options){\n\t\tvar finalOptions = Akamai.Util.options(Spin360.defaultOptions, options);\n\n\t\t// TODO fix the string problem in shoestring\n\t\treturn Akamai.Util.trim(`\n\t\t\t<div class=\"tau\" data-akamai-spin360 title=\"${json.alt}\">\n\t\t\t\t${Akamai.Util\n\t\t\t\t\t\t.map(json.urls, function(url) { return Spin360._renderImg(url, finalOptions); })\n\t\t\t\t\t\t.join(\"\\n\")\n\t\t\t\t}\n\t\t\t</div>\n\t\t`);\n\t};\n\n\t/**\n\t * Defines the global default options for all Spin360s on the page\n\t * @static\n\t * @property {Boolean} autoplay.enabled - Enable autoplay (default: false)\n\t * @property {Integer} autoplay.delay - Delay in milliseconds after initialization before spinning begins (default: 1000)\n\t * @property {Boolean} controls.arrows - Render controls to spin left and right (default: false)\n\t * @property {Boolean} controls.play - Render controls to enable and disable automatic spinning (default: false)\n\t * @property {String} controls.text.left - Left rotation control title and text (default: \"Rotate Left\")\n\t * @property {String} controls.text.right - Right rotation control title and text (default: \"Rotate Right\")\n\t * @property {String} controls.text.play - Spin control title and text (default: \"Spin Object\")\n\t * @property {Array} images.widths - list of available widths for an image (to be combined with image.widthParam), Default: [\"320\",\"640\",\"800\",\"1024\",\"2048\",\"5000\"]\n\t * @property {String} images.sizes - value for image sizes attribute. Default is set dynamically to viewer width when rendered with JS, and updated dynamically. Values: `100vw`, `200px`, `(min-width:1000px) 500px, 100vw`.\n\t * @property {String} images.policy - query param value for policy, appended to &policy= per image url when specified. Values: `foo`. Default: undefined.\n\t * @property {String} images.widthParam - query string name to use for setting each url width. Default urls will be ?imwidth=320 for example. Values: `imwidth` (default), `w`, `width`, etc.\n\t * @property {Integer} interval - The full rotation interval in milliseconds, determines physics, (default: 3000)\n\t * @property {Boolean} reverse - Reverse the direction of the spin (default: false)\n\t * @property {Float} sensitivity - The speed at which the object rotates relative to user input (default: 1). At the default value of `1` the object will complete a full 360 rotation when you drag across the entire width of the spin360 component. To require less effort to complete a rotation, change this value to a higher number. For example, setting `sensitivity: 2` would complete a full 360 rotation by dragging halfway (ex. from the center to the edge).\n\t */\n\tSpin360.defaultOptions = {\n\t\tautoplay: {\n\t\t\tenabled: false,\n\t\t\tdelay: 1000\n\t\t},\n\n\t\tcontrols: {\n\t\t\tarrows: false,\n\t\t\tplay: false,\n\t\t\ttext: {\n\t\t\t\tleft: \"Rotate Left\",\n\t\t\t\tright: \"Rotate Right\",\n\t\t\t\tplay: \"Spin Object\"\n\t\t\t}\n\t\t},\n\n\t\t// unsupported, the number of frame images to create using the configured\n\t\t// template\n\t\tframes: 72,\n\t\timages: Akamai.Image.defaultConfig,\n\t\tinterval: 3000,\n\t\treverse: false,\n\n\t\tsensitivity: 1,\n\n\t\t// unsupported, template used to generate urls when only one image is\n\t\t// present in the 360 viewer\n\t\ttemplate: undefined\n\t};\n\n\t/**\n\t * Goto to a particular frame of the spining image\n\t * @method\n\t * @param {Integer} index - the frame to advance to\n\t * @param {Function?} callback - callback invoked after the action has completed in the DOM\n\t * @returns {undefined}\n\t */\n\tSpin360.prototype.goto = function(index, callback){\n\t\tthis._comp.goto(index);\n\t\t// NOTE goto must come before the callback because the callback will be\n\t\t// used to trigger the `next` and `previous` events. The order should be\n\t\t// maintained consistently as `goto` -> `next`/`previous`\n\t\tthis._trigger(\"goto\");\n\t\tif(callback){ callback(); }\n\t};\n\n\t/**\n\t * Return the current frame index\n\t * @method\n\t * @returns {Integer}\n\t */\n\tSpin360.prototype.getIndex = function(){\n\t\treturn this._comp.index;\n\t};\n\n\t// Extend Carousel with Advanceable interface\n\tAkamai.Advanceable.extend(Spin360);\n\n\t/**\n\t * Go to the next frame\n\t * @method\n\t * @param {Function?} callback - callback invoked after the action has completed in the DOM\n\t * @returns {undefined}\n\t */\n\tSpin360.prototype.next;\n\t// required for JSDocs\n\n\t/**\n\t * Go to the previous frame\n\t * @method\n\t * @param {Function?} callback - callback invoked after the action has completed in the DOM\n\t * @returns {undefined}\n\t */\n\tSpin360.prototype.previous;\n\t// required for JSDocs\n\n\t/**\n\t * Begin the automatic rotation of the images\n\t * @todo support passing in an interval or speed?\n\t * @method\n\t * @fires Akamai.Spin360#akamai-spin360-play\n\t * @returns {undefined}\n\t */\n\tSpin360.prototype.play = function(){\n\t\tthis._comp.autoRotate();\n\t};\n\n\t/**\n\t * Stop the automatic rotation of the images\n\t * @method\n\t * @fires Akamai.Spin360#akamai-spin360-pause\n\t * @returns {undefined}\n\t */\n\tSpin360.prototype.pause = function(){\n\t\tthis._comp.stopAutoRotate();\n\t};\n\n\tSpin360.prototype.getElement = function(){\n\t\treturn this._$el[0];\n\t};\n\n\tSpin360.States = {\n\t\tPlaying: 0,\n\t\tPaused: 1\n\t};\n\n\t/**\n\t * Return the current state of the spin360\n\t * @example <caption>Spin360 states</caption>\n\t * Akamai.Spin360.States = {\n\t *\tPlaying: 0,\n\t *\tPaused: 1\n\t * };\n\t *\n\t * @example <caption>Conditioning on states</caption>\n\t * if( spin360.getState() === Akamai.Spin360.States.Paused ) {\n\t *\t spin360.play()\n\t * }\n\t * @method\n\t * @returns {Akamai.Spin360.State}\n\t */\n\tSpin360.prototype.getState = function(){\n\t\t// TODO expose using method in Tau\n\t\treturn !!this._comp.autoInterval ? Spin360.States.Playing : Spin360.States.Paused;\n\t};\n\n\t/**\n\t * Triggered when the spin360 has stoped automatically spinning\n\t * {@link Akamai.Spin360#pause}.\n\t *\n\t * @event Akamai.Spin360#akamai-spin360-stop-spin\n\t */\n\n\t/**\n\t * Triggered when the spin360 has started automatically spinning\n\t * {@link Akamai.Spin360#play}.\n\t *\n\t * @event Akamai.Spin360#akamai-spin360-start-spin\n\t */\n\n\t/**\n\t * Triggered when initialization finishes\n\t * {@link Akamai.Spin360}.\n\t *\n\t * @event Akamai.Spin360#akamai-spin360-init\n\t */\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.Spin360 = Spin360;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n(function(){\n\tfunction MagnifierImpl(element, options){\n\t\tthrow new Error('Not allowed to instantiate MagnifierImpl');\n\t}\n\n\tMagnifierImpl.prototype.updateOptions = function(options){\n\t\tthrow new Error('magnifier updateOptions not implemented');\n\t};\n\n\tMagnifierImpl.prototype.zoomIn = function(){\n\t\tthrow new Error('magnifier zoomIn not implemented');\n\t};\n\n\tMagnifierImpl.prototype.zoomOut = function(){\n\t\tthrow new Error('magnifier zoomOut not implemented');\n\t};\n\n\tMagnifierImpl.prototype.isMagnified = function(){\n\t\tthrow new Error('magnifier isMagnified not implemented');\n\t};\n\n\tMagnifierImpl.prototype.toggleZoom = function(){\n\t\tthrow new Error('magnifier toggleZoom not implemented');\n\t};\n\n\tMagnifierImpl.prototype.render = function(options, dataAttr, fallbackSrc, largestSrc, srcSet){\n\t\tthrow new Error('magnifier render not implemented');\n\t};\n\n\tvar ex = (typeof exports === 'undefined') ? window : exports;\n\tex.Akamai = ex.Akamai || {};\n\tex.Akamai.MagnifierImpl = MagnifierImpl;\n})();\n(function(){\n\tfunction MagnifierImplEnlarge(element, options){\n\t\tthis._$el = $(element);\n\t\tthis._$el.enlarge(options);\n\t}\n\n\tMagnifierImplEnlarge.prototype = Object.create(Akamai.MagnifierImpl.prototype);\n\tMagnifierImplEnlarge.prototype.constructor = MagnifierImplEnlarge;\n\n\tMagnifierImplEnlarge.prototype.updateOptions = function(options){\n\t\tthis._$el.enlarge( \"updateOptions\", options );\n\t};\n\n\tMagnifierImplEnlarge.prototype.zoomIn = function(){\n\t\tthis._$el.enlarge( \"in\" );\n\t};\n\n\tMagnifierImplEnlarge.prototype.zoomOut = function(){\n\t\tthis._$el.enlarge( \"out\" );\n\t};\n\n\tMagnifierImplEnlarge.prototype.isMagnified = function(){\n\t\treturn this._$el.enlarge( \"isZoomed\" );\n\t};\n\n\tMagnifierImplEnlarge.prototype.toggleZoom = function(){\n\t\tif(this.isMagnified()){\n\t\t\tthis.zoomOut();\n\t\t} else {\n\t\t\tthis.zoomIn();\n\t\t}\n\t};\n\n\tMagnifierImplEnlarge.render = function(options, dataAttr, fallbackSrc, largestSrc, srcSet){\n\t\treturn `\n\t\t\t<div ${dataAttr}>\n\t\t\t\t<div class=\"enlarge_contain\">\n\t\t\t\t\t<img src=\"${fallbackSrc}\"\n\t\t\t\t\t\tsrcset=\"${srcSet}\"\n\t\t\t\t\t\tsizes=\"${options.image.sizes}\">\n\t\t\t\t</div>\n\t\t\t\t<a href=\"${largestSrc}\"\n\t\t\t\t\tclass=\"enlarge_btn\"\n\t\t\t\t\ttitle=\"${options.buttonText}\">\n\t\t\t\t\t${options.buttonText}\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t`;\n\t};\n\t\n\tvar ex = (typeof exports === 'undefined') ? window : exports;\n\tex.Akamai = ex.Akamai || {};\n\tex.Akamai.MagnifierImplEnlarge = MagnifierImplEnlarge;\n})();\n(function(){\n\tfunction ClickTracker(element, handler){\n\t\tvar self = this;\n\t\tself.element = element;\n\t\tself.handler = handler;\n\t\tthis.reset();\n\t}\n\n\tClickTracker.prototype.onDown = function(e){\n\t\tif (e.target == this.element) {\n\t\t\tif (this.isDown) {\n\t\t\t\tthis.reset();\n\t\t\t} else {\n\t\t\t\tthis.down.x = e.clientX;\n\t\t\t\tthis.down.y = e.clientY;\n\t\t\t\tthis.down.timestamp = new Date();\n\t\t\t\tthis.isDown = true;\n\t\t\t}\n\t\t}\n\t};\n\n\tClickTracker.prototype.onMove = function(){\n\t\tthis.isMoved = true;\n\t};\n\n\tClickTracker.prototype.onUp = function(e){\n\t\tif (this.isDown) {\n\t\t\tthis.up.x = e.clientX;\n\t\t\tthis.up.y = e.clientY;\n\t\t\tthis.up.timestamp = new Date();\n\n\t\t\tif (!this.isMoved && (this.down.x === this.up.x && this.down.y === this.up.y && (this.up.timestamp.getTime() - this.down.timestamp.getTime() <= 500))) {\n\t\t\t\tthis.handler();\n\t\t\t}\n\t\t}\n\n\t\tthis.reset();\n\t};\n\n\tClickTracker.prototype.reset = function(x, y){\n\t\tthis.down = {\n\t\t\tx: -Infinity,\n\t\t\ty: -Infinity,\n\t\t\ttimestamp: new Date(0)\n\t\t};\n\n\t\tthis.isDown = false;\n\t\tthis.isMoved = false;\n\n\t\tthis.up = {\n\t\t\tx: Infinity,\n\t\t\ty: Infinity,\n\t\t\ttimestamp: new Date()\n\t\t};\n\t};\n\n\tfunction MagnifierImplScroller(element, options){\n\t\tthis._$el = $(element);\n\t\tthis._options = options;\n\t\tthis._container = this._$el.get(0);\n\t\tthis._content = this._$el.children().get(0);\n\t\tthis._imgCast = $(this._content).find('div').get(0);\n\t\tthis._zoomInBtn = this._$el.find(\"a.scroller-zoom-in\").get(0);\n\t\tthis._zoomOutBtn = this._$el.find(\"a.scroller-zoom-out\").get(0);\n\t\tthis._magnification = 1;\n\n\t\tvar self = this;\n\n\t\t// Initialize Scroller\n\t\tthis.scroller = new Scroller(this._renderer(), {\n\t\t\tzooming: options.enabled,\n\t\t\tminZoom: 1,\n\t\t\tmaxZoom: options.magnification,\n\t\t\tanimationDuration: options.animationDuration\n\t\t});\n\n\t\tvar rect = this._container.getBoundingClientRect();\n\t\tthis.scroller.setPosition(rect.left + this._container.clientLeft, rect.top + this._container.clientTop);\n\n\t\tthis._installEventHandlers();\n\t\tthis._updateButtonStates();\n\t\tsetTimeout(function(){\n\t\t\tself._onResize();\n\t\t});\n\t}\n\n\tMagnifierImplScroller.prototype = Object.create(Akamai.MagnifierImpl.prototype);\n\tMagnifierImplScroller.prototype.constructor = MagnifierImplScroller;\n\n\tMagnifierImplScroller.prototype.updateOptions = function(options){\n\t\tvar rect = this._container.getBoundingClientRect();\n\t\tthis.scroller.setPosition(rect.left + this._container.clientLeft, rect.top + this._container.clientTop);\n\t\tthis._onResize();\n\t\tthis._zoomBy(1 / this._options.magnification, false);\n\t};\n\n\tMagnifierImplScroller.prototype.zoomIn = function(){\n\t\tthis._zoomBy(this._options.incrementalZoomFactor);\n\t};\n\n\tMagnifierImplScroller.prototype.cyclicZoom = function(){\n\t\tvar self = this;\n\t\tif (this._magnification >= this._options.magnification) {\n\t\t\tthis._zoomBy(1 / this._options.magnification);\n\t\t} else {\n\t\t\tthis.zoomIn();\n\t\t}\n\t};\n\n\tMagnifierImplScroller.prototype.zoomOut = function(){\n\t\tthis._zoomBy(1 / this._options.incrementalZoomFactor);\n\t};\n\n\tMagnifierImplScroller.prototype.isMagnified = function(){\n\t\treturn this._magnification > 1;\n\t};\n\n\tMagnifierImplScroller.prototype.toggleZoom = function(){\n\t\tthrow new Error('zoom toggle behavior is undefined in scroller mode');\n\t};\n\n\tMagnifierImplScroller.render = function(options, dataAttr, fallbackSrc, largestSrc, srcSet){\n\t\treturn `\n\t\t\t<div ${dataAttr}>\n\t\t\t\t<div>\n\t\t\t\t\t<img src=\"${fallbackSrc}\"\n\t\t\t\t\tsrcset=\"${srcSet}\"\n\t\t\t\t\tsizes=\"${options.image.sizes}\">\n\t\t\t\t\t<div></div>\n\t\t\t\t</div>\n\t\t\t\t<a href=\"${largestSrc}\"\n\t\t\t\t\tclass=\"scroller-zoom-in\"\n\t\t\t\t\ttitle=\"${options.zoomInBtnText}\">\n\t\t\t\t\t${options.zoomInBtnText}\n\t\t\t\t</a>\n\t\t\t\t<a href=\"${largestSrc}\"\n\t\t\t\t\tclass=\"scroller-zoom-out\"\n\t\t\t\t\ttitle=\"${options.zoomOutBtnText}\">\n\t\t\t\t\t${options.zoomOutBtnText}\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t`;\n\t};\n\n\tMagnifierImplScroller.prototype._zoomBy = function(magnification, animate){\n\t\tvar self = this, magnification = Number(magnification);\n\n\t\tif (typeof(animate) === \"undefined\") {\n\t\t\tanimate = this._options.animateZoom;\n\t\t}\n\n\t\tif (magnification === 1 || \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// if we are magnifying by 1 OR\n\t\t\t(this._magnification === 1 && magnification < 1) || \t\t\t\t\t\t\t// fully zoomed out and still attempting a zoom out OR\n\t\t\t(this._magnification === this._options.magnification && magnification > 1)) {\t// fully zoomed in and still attempting a zoom in\n\t\t\treturn;\n\t\t}\n\n\t\tthis.scroller.zoomTo(this._magnification * magnification, this._options.animateZoom);\n\n\t\tsetTimeout(function(){\n\t\t\tself._onZoom();\n\t\t}, this._options.animationDuration);\n\t}\n\n\tMagnifierImplScroller.prototype._onZoom = function(){\n\t\tvar oldMagnification = this._magnification;\n\n\t\tthis._magnification = Number(this.scroller.getValues().zoom.toFixed(2));\n\t\tthis._updateButtonStates();\n\n\t\tif (oldMagnification > this._magnification) {\n\t\t\tthis._$el.trigger(\"scroller.after-zoom-out\");\n\t\t} else if (oldMagnification < this._magnification) {\n\t\t\tthis._$el.trigger(\"scroller.after-zoom-in\");\n\t\t}\n\t};\n\n\tMagnifierImplScroller.prototype._renderer = function(){\n\t\tvar docStyle = document.documentElement.style, self = this;\n\n\t\tvar engine;\n\t\tif (window.opera && Object.prototype.toString.call(opera) === '[object Opera]') {\n\t\t\tengine = 'presto';\n\t\t} else if ('MozAppearance' in docStyle) {\n\t\t\tengine = 'gecko';\n\t\t} else if ('WebkitAppearance' in docStyle) {\n\t\t\tengine = 'webkit';\n\t\t} else if (typeof navigator.cpuClass === 'string') {\n\t\t\tengine = 'trident';\n\t\t}\n\n\t\tvar vendorPrefix = {\n\t\t\ttrident: 'ms',\n\t\t\tgecko: 'Moz',\n\t\t\twebkit: 'Webkit',\n\t\t\tpresto: 'O'\n\t\t}[engine];\n\n\t\tvar helperElem = document.createElement(\"div\");\n\t\tvar undef;\n\n\t\tvar perspectiveProperty = vendorPrefix + \"Perspective\";\n\t\tvar transformProperty = vendorPrefix + \"Transform\";\n\n\t\tif (helperElem.style[perspectiveProperty] !== undef) {\n\t\t\treturn function(left, top, zoom) {\n\t\t\t\tself._content.style[transformProperty] = 'translate3d(' + (-left) + 'px,' + (-top) + 'px,0) scale(' + zoom + ')';\n\t\t\t};\n\n\t\t} else if (helperElem.style[transformProperty] !== undef) {\n\t\t\treturn function(left, top, zoom) {\n\t\t\t\tself._content.style[transformProperty] = 'translate(' + (-left) + 'px,' + (-top) + 'px) scale(' + zoom + ')';\n\t\t\t};\n\n\t\t} else {\n\t\t\treturn function(left, top, zoom) {\n\t\t\t\tself._content.style.marginLeft = left ? (-left/zoom) + 'px' : '';\n\t\t\t\tself._content.style.marginTop = top ? (-top/zoom) + 'px' : '';\n\t\t\t\tself._content.style.zoom = zoom || '';\n\t\t\t};\n\t\t}\n\t};\n\n\tMagnifierImplScroller.prototype._onResize = function(){\n\t\tthis.scroller.setDimensions(this._container.clientWidth, this._container.clientHeight, this._container.clientWidth, this._container.clientHeight);\n\t};\n\n\tMagnifierImplScroller.prototype._installEventHandlers = function(){\n\t\tvar self = this, clickTracker = new ClickTracker(this._imgCast, function(){\n\t\t\tself.cyclicZoom();\n\t\t});\n\n\t\twindow.addEventListener(\"resize\", function(e){\n\t\t\tself._onResize(e);\n\t\t}, false);\n\n\t\tthis._zoomInBtn.addEventListener(\"click\", function(e) {\n\t\t\te.preventDefault();\n\t\t\tself.zoomIn();\n\t\t}, false);\n\n\t\tthis._zoomOutBtn.addEventListener(\"click\", function(e) {\n\t\t\te.preventDefault();\n\t\t\tself.zoomOut();\n\t\t}, false);\n\n\t\tif ('ontouchstart' in window) {\n\t\t\tself._container.addEventListener(\"touchstart\", function(e) {\n\t\t\t\t// Don't react if initial down happens on one of the zoom buttons\n\t\t\t\tif (e.touches[0].target == self._$el.find('a.scroller-zoom-in').get(0) || e.touches[0].target == self._$el.find('a.scroller-zoom-out').get(0)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Don't react if initial down happens on a form element\n\t\t\t\tif (e.touches[0] && e.touches[0].target && e.touches[0].target.tagName.match(/input|textarea|select/i)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tself.scroller.doTouchStart(e.touches, e.timeStamp);\n\n\t\t\t\tfor (var i = 0; i < e.touches.length; i++) {\n\t\t\t\t\tclickTracker.onDown(e.touches[i]);\n\t\t\t\t}\n\n\t\t\t\te.preventDefault();\n\t\t\t}, false);\n\n\t\t\tdocument.addEventListener(\"touchmove\", function(e) {\n\t\t\t\tself.scroller.doTouchMove(e.touches, e.timeStamp, e.scale);\n\t\t\t\tclickTracker.onMove();\n\t\t\t}, false);\n\n\t\t\tdocument.addEventListener(\"touchend\", function(e) {\n\t\t\t\tself.scroller.doTouchEnd(e.timeStamp);\n\n\t\t\t\t// handle any zoom that may have occured\n\t\t\t\tself._onZoom();\n\n\t\t\t\tfor (var i = 0; i < e.changedTouches.length; i++) {\n\t\t\t\t\tclickTracker.onUp(e.changedTouches[i]);\n\t\t\t\t}\n\t\t\t}, false);\n\n\t\t\tdocument.addEventListener(\"touchcancel\", function(e) {\n\t\t\t\tself.scroller.doTouchEnd(e.timeStamp);\n\t\t\t\t// handle any zoom that may have occured\n\t\t\t\tself._onZoom();\n\n\t\t\t\tfor (var i = 0; i < e.changedTouches.length; i++) {\n\t\t\t\t\tclickTracker.onUp(e.changedTouches[i]);\n\t\t\t\t}\n\t\t\t}, false);\n\t\t} else {\n\t\t\tself._container.addEventListener(\"mousedown\", function(e) {\n\t\t\t\tif (e.target.tagName.match(/input|textarea|select/i)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (self.scroller.__clientWidth === 0) {\n\t\t\t\t\tself._onResize();\n\t\t\t\t}\n\t\t\t\tself.scroller.doTouchStart([{\n\t\t\t\t\tpageX: e.pageX,\n\t\t\t\t\tpageY: e.pageY\n\t\t\t\t}], e.timeStamp);\n\n\t\t\t\tclickTracker.onDown(e);\n\t\t\t}, false);\n\n\t\t\tdocument.addEventListener(\"mousemove\", function(e) {\n\t\t\t\tif (!clickTracker.isDown) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tself.scroller.doTouchMove([{\n\t\t\t\t\tpageX: e.pageX,\n\t\t\t\t\tpageY: e.pageY\n\t\t\t\t}], e.timeStamp);\n\n\t\t\t\tclickTracker.onMove();\n\t\t\t}, false);\n\n\t\t\tdocument.addEventListener(\"mouseup\", function(e) {\n\t\t\t\tif (!clickTracker.isDown) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tself.scroller.doTouchEnd(e.timeStamp);\n\t\t\t\tclickTracker.onUp(e);\n\t\t\t}, false);\n\n\t\t\t// self._container.addEventListener(navigator.userAgent.indexOf(\"Firefox\") > -1 ? \"DOMMouseScroll\" : \"mousewheel\", function(e) {\n\t\t\t// \te.preventDefault();\n\t\t\t// \tself.scroller.doMouseZoom(e.detail ? (e.detail * -120) : e.wheelDelta, e.timeStamp, e.pageX, e.pageY);\n\t\t\t// }, false);\n\t\t}\n\t};\n\n\tMagnifierImplScroller.prototype._updateButtonStates = function(){\n\t\tif (this._magnification === 1) {\n\t\t\t$(this._$el).addClass('scroller-zoom-out-max');\n\t\t\t$(this._$el).removeClass('scroller-zoom-in-max');\n\t\t} else if (this._magnification === this._options.magnification) {\n\t\t\t$(this._$el).addClass('scroller-zoom-in-max');\n\t\t\t$(this._$el).removeClass('scroller-zoom-out-max');\n\t\t} else {\n\t\t\t$(this._$el).removeClass('scroller-zoom-in-max');\n\t\t\t$(this._$el).removeClass('scroller-zoom-out-max');\n\t\t}\n\t};\n\n\tvar ex = (typeof exports === 'undefined') ? window : exports;\n\tex.Akamai = ex.Akamai || {};\n\tex.Akamai.MagnifierImplScroller = MagnifierImplScroller;\n})();\n(function(exports, $){\n\t/**\n\t * Image magnifier\n\t * @class\n\t * @alias Akamai.Magnifier\n\t * @param {HTMLElement} element - the DOM element representing the component markup\n\t * @param {Object} options - configuration options\n\t */\n\tvar Magnifier = Akamai.Util.component(\"Magnifier\", function(element, options){\n\t\t// compat with enlarge `disabled` option\n\t\tthis._options.disabled = !this._options.enabled;\n\t\tif (this._options.mode === Magnifier.MODE_ANIMATED_ZOOM) {\n\t\t\tthis._impl = new Akamai.MagnifierImplScroller(element, options);\n\t\t} else {\n\t\t\tthis._impl = new Akamai.MagnifierImplEnlarge(element, options);\n\t\t}\n\t});\n\n\tMagnifier.prototype._updateOptions = function(options){\n\t\tif( !options ) {\n\t\t\tthis._options = this._originalOptions;\n\t\t}\n\n\t\tthis._options = Akamai.Util.extend(true, this._options, options);\n\n\t\t// compat with enlarge `disabled` option\n\t\tthis._options.disabled = !this._options.enabled;\n\n\t\t// push the final options down to the dom element so that CSS that keys off\n\t\t// of the attributes can apply when JS config is used\n\t\tAkamai.Util.setDataAttrOptions(this._$el, Magnifier.defaultOptions, this._options, \"Magnifier\");\n\n\t\tthis._impl.updateOptions(this._options);\n\t};\n\n\t// Used in preflight to \"rename\" events based on the child component events\n\tMagnifier._componentEventMapping = {\n\t\t\"enlarge.after-zoom-in\": \"in\",\n\t\t\"enlarge.after-zoom-out\": \"out\",\n\t\t\"scroller.after-zoom-in\": \"in\",\n\t\t\"scroller.after-zoom-out\": \"out\"\n\t};\n\n\tMagnifier.MODE_HOVER_ZOOM = 'hoverzoom';\n\tMagnifier.MODE_ANIMATED_ZOOM = 'animatedzoom';\n\n\t/**\n\t * Defines the global default options for all Magnifiers on the page\n\t * @static\n\t * @property {String} mode - Set what mode to run the magnifier in. There are two modes available: `hoverzoom` and `animatedzoom`. The `hoverzoom` mode provides the ability to magnify and pan the image by just hovering your mouse over the image. It also provides a `flyout` option where a clip of the zoomed in image is displayed on a separate widget floating somewhere around (configurable) the image. The `animatedzoom` mode only does inline magnification but provides smooth animation between magnification levels, it also allows for incremental zooming.\n\t * @property {Boolean} button - Whether to show a button for toggling magnification (default: true)\n\t * @property {Boolean} enabled - Enabled/disable magnification (default: true, breakpoints supported)\n\t * @property {Integer} magnification - The scale factor to magnify the image: `2`, `3` (default), `4`, `4.5`, etc\n\n\t * @property {Array} image.widths - List of available widths for an image (to be combined with image.widthParam) - (default: [\"320\",\"640\",\"800\",\"1024\",\"2048\",\"5000\"])\n\t * @property {String} image.sizes - Value for image sizes attribute. Default is set dynamically to viewer width when rendered with JS, and updated dynamically. Values: `100vw` (default), `200px`, `(min-width:1000px) 500px, 100vw` - (default: `100vw`, breakpoints supported)\n\t * @property {String} image.policy - Query param value for policy, appended to &policy= per image url when specified. Values: `foo`. (default: undefined)\n\n\t * @property {Integer} delay - Only applicable in `hoverzoom` mode. The time delay in milliseconds between mouse hover and magnification (default: 300, breakpoints supported)\n\t * @property {String} buttonText - Only applicable in `hoverzoom` mode. Text for the zoom button. Also used for its title attribute. (default: \"Toggle Image Magnification\")\n\t * @property {Integer} flyout.width - Only applicable in `hoverzoom` mode. Width of the flyout image (default: 200)\n\t * @property {Integer} flyout.height - Only applicable in `hoverzoom` mode. Height of the flyout image (default: 200)\n\t * @property {Boolean} hoverZoomWithoutClick - Only applicable in `hoverzoom` mode. Zoom starts on mouse hover with no click needed (default: true; false will require a click to hover-zoom)\n\t * @property {String} placement - Only applicable in `hoverzoom` mode. Placement of the magnified image: `inline` , `flyoutloupe`, `flyouttopleft`,`flyoutbottomleft` ,`flyouttopright` and `flyoutbottomright` - (default: inline, breakpoins supported)\n\n\t * @property {Float} incrementalZoomFactor - Only applicable in `animatedzoom` mode. A number by which to incrementally zoom up until the specified `magnification`, default `3`. For example a `magnification` of `4` and an `incrementalZoomFactor` of `2` will zoom the image in `2` steps\n\t * @property {Boolean} animateZoom - Only applicable in `animatedzoom` mode. Animates the magnification process. Default `true`\n\t * @property {Integer} animationDuration - Only applicable in `animatedzoom` mode. If `animateZoom` is true, this specifies the length of the animation in milliseconds. Default `250`\n\t * @property {String} zoomInBtnText - Only applicable in `animatedzoom` mode. Hover text to display on the zoom in button. Default `Zoom In`\n\t * @property {String} zoomOutBtnText - Only applicable in `animatedzoom` mode. Hover text to display on the zoom out button. Default `Zoom Out`\n\t */\n\tMagnifier.defaultOptions = {\n\t\t// general options\n\t\tmode: Magnifier.MODE_HOVER_ZOOM,\n\t\tbutton: true,\n\t\tenabled: true,\n\t\tmagnification: 3,\n\n\t\t// image options\n\t\timage: Akamai.Image.defaultConfig,\n\n\t\t// hoverzoom options\n\t\tdelay: 300,\n\t\tbuttonText: \"Toggle Image Magnification\",\n\t\tflyout: {\n\t\t\twidth: 200,\n\t\t\theight: 200\n\t\t},\n\t\thoverZoomWithoutClick: true,\n\t\tplacement: \"inline\",\n\n\t\t// animatedzoom options\n\t\tincrementalZoomFactor: 3,\n\t\tanimateZoom: true,\n\t\tanimationDuration: 250,\n\t\tzoomInBtnText: 'Zoom In',\n\t\tzoomOutBtnText: 'Zoom Out'\n\t};\n\n\t// srcset stuff\n\tAkamai.Sourceable.extendStatic(Magnifier);\n\n\tMagnifier.render = function(json, options){\n\t\tvar finalOptions = Akamai.Util.options(Magnifier.defaultOptions, options);\n\t\tvar dataAttr = Magnifier._dataAttr;\n\t\tvar fallbackSrc = Magnifier._fallbackSrc(json.url, finalOptions.image);\n\t\tvar largestSrc = Magnifier._largestSrc(json.url, finalOptions.image);\n\t\tvar srcSet = Magnifier._srcset(json.url, finalOptions.image)\n\t\tvar sizes = finalOptions.image.sizes;\n\t\tvar impl = (finalOptions.mode === Magnifier.MODE_ANIMATED_ZOOM) ? Akamai.MagnifierImplScroller : Akamai.MagnifierImplEnlarge;\n\t\treturn impl.render(finalOptions, dataAttr, fallbackSrc, largestSrc, srcSet, sizes);\n\t};\n\n\t/**\n\t * Enter magnifier mode\n\t * @method\n\t * @fires Akamai.Magnifier#akamai-magnifier-in\n\t * @returns {undefined}\n\t */\n\tMagnifier.prototype.in = function(){\n\t\tthis._impl.zoomIn();\n\t};\n\n\t/**\n\t * Exit magnifier mode\n\t * @method\n\t * @fires Akamai.Magnifier#akamai-magnifier-out\n\t * @returns {undefined}\n\t */\n\tMagnifier.prototype.out = function(){\n\t\tthis._impl.zoomOut();\n\t};\n\n\t/**\n\t * Return the current state of the magnifier\n\t * @method\n\t * @returns {Boolean}\n\t */\n\tMagnifier.prototype.isMagnified = function(){\n\t\treturn this._impl.isMagnified();\n\t};\n\n\t/**\n\t * Toggle the state of the magnifier\n\t * @method\n\t * @fires Akamai.Magnifier#akamai-magnifier-in\n\t * @fires Akamai.Magnifier#akamai-magnifier-out\n\t * @returns {undefined}\n\t */\n\tMagnifier.prototype.toggle = function(){\n\t\tthis._impl.toggleZoom();\n\t};\n\n\t/**\n\t * Triggered when the magnifier has completed it transition to\n\t * a new index due to user interaction or a call to {@link Akamai.Carouse#in}.\n\t *\n\t * @event Akamai.Magnifier#akamai-magnifier-in\n\t */\n\n\t/**\n\t * Triggered when the magnifier has completed it transition to\n\t * a new index due to user interaction or a call to {@link Akamai.Carouse#out}.\n\t *\n\t * @event Akamai.Magnifier#akamai-magnifier-out\n\t */\n\n\t/**\n\t * Triggered when initialization finishes\n\t * {@link Akamai.Magnifier}.\n\t *\n\t * @event Akamai.Magnifier#akamai-magnifier-init\n\t */\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.Magnifier = Magnifier;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n(function(exports, $){\n\tvar VideoImpl = Akamai.Util.component(\"VideoImpl\", function(element, options){\n\t\tthrow new Error('Not allowed to instantiate VideoImpl');\n\t});\n\n\tVideoImpl.render = function(json, options){\n\t\tthrow new Error('VideoImpl.render not implemented');\n\t};\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.VideoImpl = VideoImpl;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n(function(exports, $){\n\tvar VideoImplPristine = Akamai.Util.component(\"VideoImplPristine\", function(element, options){\n\t});\n\n\tVideoImplPristine.prototype = Object.create(Akamai.VideoImpl.prototype);\n\tVideoImplPristine.prototype.constructor = VideoImplPristine;\n\n\tVideoImplPristine.render = function(json, options){\n\t\tvar finalOptions = Akamai.Util.options(Akamai.Video.defaultOptions, options);\n\n\t\tvar url = json.url;\n\t\tvar poster = json.poster || \"\";\n\t\tvar mime = (json.mime) ? 'type=\"' + json.mime + '\"' : '';\n\n\t\tvar attrs = [\n\t\t\tfinalOptions.loop ? \"loop\" : \"\",\n\t\t\tfinalOptions.autoplay ? \"autoplay\" : \"\",\n\t\t\tfinalOptions.controls ? \"controls\" : \"\",\n\t\t\tfinalOptions.muted ? \"muted\" : \"\",\n\t\t\t\"playsinline\"\n\t\t];\n\n\t\treturn Akamai.Util.trim(`\n\t\t\t<div ${Akamai.Video._dataAttr}>\n\t\t\t\t<video ${attrs.join(\" \")} poster=\"${poster}\" preload=\"metadata\">\n\t\t\t\t\t<source src=\"${url}\" ${mime} />\n\t\t\t\t</video>\n\t\t\t</div>\n\t\t`);\n\t};\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.VideoImplPristine = VideoImplPristine;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n(function(exports, $){\n\tvar VideoImplIm = Akamai.Util.component(\"VideoImplIm\", function(element, options){\n\t\tvar finalOptions = Akamai.Util.options(Akamai.Video.defaultOptions, options);\n\t\tVideoImplIm._validateOptions(finalOptions);\n\t});\n\n\tVideoImplIm.prototype = Object.create(Akamai.VideoImpl.prototype);\n\tVideoImplIm.prototype.constructor = VideoImplIm;\n\n\tVideoImplIm._validateOptions = function(options){\n\t\tif (!Array.isArray(options.sizes) || options.sizes.length !== 3) {\n\t\t\tthrow new Error('Akamai.Video sizes must have three entries');\n\t\t}\n\n\t\tif (options.sizes.some(function (size) {\n\t\t\treturn isNaN(size);\n\t\t})) {\n\t\t\tthrow new Error('Akamai.VideoImplIm all sizes must be numbers');\n\t\t}\n\t}\n\n\tVideoImplIm.render = function(json, options){\n\t\tvar finalOptions = Akamai.Util.options(Akamai.Video.defaultOptions, options);\n\t\tVideoImplIm._validateOptions(finalOptions);\n\n\t\tvar url = json.url;\n\t\tvar poster = json.poster || \"\";\n\t\tvar width;\n\n\t\tvar viewPortWidth = window.innerWidth;\n\n\t\tif (viewPortWidth < 992) {\n\t\t\twidth = finalOptions.sizes[0];\n\t\t} else if (viewPortWidth < 1200) {\n\t\t\twidth = finalOptions.sizes[1];\n\t\t} else {\n\t\t\twidth = finalOptions.sizes[2];\n\t\t}\n\n\t\tvar attrs = [\n\t\t\tfinalOptions.loop ? \"loop\" : \"\",\n\t\t\tfinalOptions.autoplay ? \"autoplay\" : \"\",\n\t\t\tfinalOptions.controls ? \"controls\" : \"\",\n\t\t\tfinalOptions.muted ? \"muted\" : \"\",\n\t\t\t\"playsinline\"\n\t\t];\n\n\t\tvar joiner = url.indexOf('?') === -1 ? '?' : '&';\n\n\t\treturn Akamai.Util.trim(`\n\t\t\t<div ${Akamai.Video._dataAttr}>\n\t\t\t\t<video ${attrs.join(\" \")} poster=\"${poster}\" preload=\"metadata\">\n\t\t\t\t\t<source src=\"${url}${joiner}imformat=vp9&imwidth=${width}\" type=\"video/webm\" />\n\t\t\t\t\t<source src=\"${url}${joiner}imformat=h265&imwidth=${width}\" type=\"video/mp4; codecs=hevc\" />\n\t\t\t\t\t<source src=\"${url}${joiner}imformat=h264&imwidth=${width}\" type=\"video/mp4\" />\n\t\t\t\t</video>\n\t\t\t</div>\n\t\t`);\n\t};\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.VideoImplIm = VideoImplIm;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n(function(exports, $){\n\t/**\n\t * Video component\n\t * @class\n\t * @alias Akamai.Video\n\t * @param {HTMLElement} element - the DOM element representing the component markup\n\t * @param {Object} options - configuration options\n\t */\n\tvar Video = Akamai.Util.component(\"Video\", function(element, options){\n\t\t// TODO\n\t\tthis._comp = this._$el.length && undefined;\n\t\tthis._$videoElement = this._$el.find(\"video\");\n\t\tthis._videoElement = this._$videoElement[0];\n\n\t\tif( !this._videoElement ){\n\t\t\tthrow new Error( \"Akamai.Video requires a child HTML Video element\" );\n\t\t}\n\n\t\tif( !this._videoElement.play || !this._videoElement.pause ){\n\t\t\tthis._unsupportedAPI = true;\n\t\t\tthis._unsupported();\n\t\t\treturn;\n\t\t}\n\n\t\t// get the initial state (could be autoplaying on render)\n\t\tthis._setState(this._videoElement.paused ? Video.States.Paused : Video.States.Playing);\n\n\t\t// state bindings\n\t\tthis._$el\n\t\t\t.bind(\"akamai-video-play\", function(){\n\t\t\t\tthis._setState(Video.States.Playing);\n\t\t\t}.bind(this))\n\t\t\t.bind(\"akamai-video-pause\", function(){\n\t\t\t\tthis._setState(Video.States.Paused);\n\t\t\t}.bind(this));\n\n\t\tthis._createPlayButton();\n\t});\n\n\tVideo.MODE_IM = 'im';\n\tVideo.MODE_PRISTINE = 'pristine';\n\n\tVideo._componentEventMapping = {\n\t\t\"play\": {\n\t\t\tto: \"play\",\n\t\t\tselector: \"video\"\n\t\t},\n\n\t\t\"pause\": {\n\t\t\tto: \"pause\",\n\t\t\tselector: \"video\"\n\t\t},\n\n\t\t\"seeked\": {\n\t\t\tto: \"seek\",\n\t\t\tselector: \"video\"\n\t\t }\n\t};\n\n\tVideo.prototype._updateOptions = function(options){\n\t\tif( !options ) {\n\t\t\tthis._options = this._originalOptions;\n\t\t}\n\n\t\tthis._options = Akamai.Util.extend(true, this._options, options);\n\n\t\t// push the final options down to the dom element so that CSS that keys off\n\t\t// of the attributes can apply when JS config is used\n\t\tAkamai.Util.setDataAttrOptions(this._$el, Video.defaultOptions, this._options, \"Video\");\n\n\t\t// TODO see Magnifier for example\n\t};\n\n\t/**\n\t * Defines the global default options for all Spin360s on the page\n\t * @static\n\t * @property {Boolean} autoplay - Automatically play the video on load (default: false)\n\t * @property {Boolean} controls - Display the video controls (default: true)\n\t * @property {Boolean} loop - Restart the video when it reaches the end (default: false)\n\t * @property {Boolean} muted - Mute the video (default: true)\n\t * @property {String} mode - What video component to use. `im` will let you use any size pristine video and will automatically request & generate the right size when the page is loaded. `pristine` just passes through the original video into the video player and this is what will always play on the users device. Default: `pristine`\n\t * @property {Array} sizes - Video sizes (widths) to use for different screen widths. Defaults: [1920 (large screens), 1280 (tablet), 854 (mobile), ]\n\t */\n\tVideo.defaultOptions = {\n\t\tautoplay: false,\n\t\tcontrols: true,\n\t\tloop: false,\n\t\tmuted: true,\n\t\tmode: Video.MODE_PRISTINE,\n\t\tsizes: [854, 1280, 1920]\n\t};\n\n\tVideo.render = function(json, options){\n\t\tvar impl = (options && options.mode === Video.MODE_IM) ? Akamai.VideoImplIm : Akamai.VideoImplPristine;\n\t\treturn impl.render(json, options);\n\t};\n\n\tVideo.States = {\n\t\tPlaying: 0,\n\t\tPaused: 1\n\t};\n\n\tVideo.prototype._unsupported = function(){\n\t\tif( this._unsupportedAPI ){\n\t\t\tAkamai.Util.log(\"Video: video API not supported\", 'error');\n\t\t}\n\n\t\treturn this._unsupportedAPI;\n\t};\n\n\t/**\n\t * Play the video, idempotent\n\t * @method\n\t * @fires Akamai.Video#akamai-video-play\n\t * @returns {undefined}\n\t */\n\tVideo.prototype.play = function(){\n\t\tif( this._unsupported() ) { return; }\n\t\tthis._videoElement.play();\n\t};\n\n\t/**\n\t * Pause the video\n\t * @method\n\t * @fires Akamai.Video#akamai-video-pause\n\t * @returns {undefined}\n\t */\n\tVideo.prototype.pause = function(){\n\t\tif( this._unsupported() ) { return; }\n\t\tthis._videoElement.pause();\n\t};\n\n\t/**\n\t * Return the current state of the video\n\t * @example <caption>Video states</caption>\n\t * Akamai.Video.States = {\n\t *\tPlaying: 0,\n\t *\tPaused: 1\n\t * };\n\t *\n\t * @example <caption>Conditioning on states</caption>\n\t * if( video.getState() === Akamai.Video.States.Paused ) {\n\t *\t video.play()\n\t * }\n\t * @method\n\t * @returns {Akamai.Video.State}\n\t */\n\tVideo.prototype.getState = function(){\n\t\treturn this._state;\n\t};\n\n\tVideo.prototype._setState = function(value){\n\t\tthis._state = value;\n\t};\n\n\t/**\n\t * Seek to the input percentage.\n\t * @method\n\t * @fires Akamai.Video#akamai-video-seek\n\t * @param {Integer} percent - value between 0 and 100 percent for seeking\n\t * @returns {undefined}\n\t */\n\tVideo.prototype.seek = function(percent){\n\t\tif( percent < 0 || 100 < percent ) {\n\t\t\tthrow new Error( \"seek takes a an integer between 0 and 100\" );\n\t\t}\n\n\t\tvar newTime = (percent / 100) * (this._videoElement.duration || 1);\n\t\tthis._videoElement.currentTime = newTime;\n\t};\n\n\t/**\n\t * Set whether the video should loop or not\n\t * @method\n\t * @param {Boolean} value - The value true or false\n\t * @returns {undefined}\n\t */\n\tVideo.prototype.setLoop = function(value){\n\t\tthis._videoElement.loop = value;\n\t};\n\n\tVideo.prototype.getElement = function(){\n\t\treturn this._$el[0];\n\t};\n\n\t// Borrowed from https://codepen.io/chrisnager/pen/jPrJgQ\n\tVideo.prototype._createPlayButton = function(){\n\t\tvar videoPlayButton;\n\t\tvar videoWrapper = this._$el[0];\n\t\tvar video = this._videoElement;\n\n\t\tif(this._options.autoplay){\n\t\t\treturn;\n\t\t}\n\n\t\t// TODO move to render?\n\t\tvideoWrapper.insertAdjacentHTML('beforeend', `\n\t\t\t<svg viewBox=\"0 0 200 200\" alt=\"Play video\">\n\t\t\t\t<circle cx=\"100\" cy=\"100\" r=\"90\" fill=\"none\" stroke-width=\"15\" stroke=\"#fff\"/>\n\t\t\t\t<polygon points=\"70, 55 70, 145 145, 100\" fill=\"#fff\"/>\n\t\t\t</svg>\n\t\t`);\n\n\t\tvideo.removeAttribute('controls');\n\t\tvideoPlayButton = this._$el.find('svg')[0];\n\n\t\tvideoPlayButton.addEventListener('click', function(){\n\t\t\tvideo.play();\n\t\t\tvideoPlayButton.classList.add('is-hidden');\n\t\t\tif( this._options.controls ) {\n\t\t\t\tvideo.setAttribute('controls', 'controls');\n\t\t\t}\n\t\t}.bind(this));\n\t};\n\n\t/**\n\t * Triggered when the video has been played. See {@link Akamai.Video#play}.\n\t *\n\t * @event Akamai.Video#akamai-video-play\n\t */\n\n\t/**\n\t * Triggered when the video has been paused. See {@link Akamai.Video#pause}.\n\t *\n\t * @event Akamai.Video#akamai-video-pause\n\t */\n\n\t/**\n\t * Triggered when the video has seeked to a position. See {@link Akamai.Video#seek}.\n\t *\n\t * @event Akamai.Video#akamai-video-seek\n\t */\n\n\t/**\n\t * Triggered when initialization finishes\n\t * {@link Akamai.Video}.\n\t *\n\t * @event Akamai.Video#akamai-video-init\n\t */\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.Video = Video;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n(function(exports, $){\n\t/**\n\t * Image carousel\n\t * @class\n\t * @alias Akamai.Carousel\n\t * @param {HTMLElement} element - the DOM element representing the component markup\n\t * @param {Object} options - configuration options\n\t */\n\tvar Carousel = Akamai.Util.component(\"Carousel\", function(element, options){\n\t\tthis._spins = Akamai.Spin360.createMany(this._$el[0], this._options.spin360);\n\t\tthis._magnifiers = Akamai.Magnifier.createMany(this._$el[0], this._options.magnifier);\n\t\tthis._videos = Akamai.Video.createMany(this._$el[0], this._options.video);\n\n\t\tthis._$el.snapper(this._options);\n\n\t\tthis._setAspectRatio();\n\t\tthis._bindAspectAttributes();\n\n\t\tif( this._options.slideshow.autostart ){\n\t\t\tsetTimeout(function(){\n\t\t\t\tthis.startSlideshow();\n\t\t\t}.bind(this), this._options.slideshow.interval);\n\t\t}\n\n\t\t// NOTE !! the following two bindings must happen in order, the\n\t\t// autoplayables binding relies on the attribut\n\n\t\t// add item attrs and maintain the active item attributes to determine the\n\t\t// active item state\n\t\tthis._activeItemAttributes();\n\t\tthis._$el.bind( \"akamai-carousel-goto\", this._activeItemAttributes.bind(this));\n\n\t\t// TODO pause autoplay videos that are not visible\n\t\tthis._handleAutoplayables();\n\t\tthis._$el.bind( \"akamai-carousel-goto\", this._handleAutoplayables.bind(this));\n\n\t\tthis._$el\n\t\t\t.bind( \"tau.touch-tracking-start\", function(){\n\t\t\t\tthis._$el.find(\".snapper_pane\").addClass(\"no-scroll\");\n\t\t\t}.bind(this))\n\t\t\t.bind( \"tau.touch-tracking-stop\", function(){\n\t\t\t\tthis._$el.find(\".snapper_pane\").removeClass(\"no-scroll\");\n\t\t\t}.bind(this));\n\n\t\t// when child components are doing things, stop the carousel from\n\t\t// automatically advancing\n\t\tthis._$el.bind( this.constructor._stopSlideshowEvents.join(\" \"), this.stopSlideshow.bind(this));\n\t});\n\n\tCarousel._stopSlideshowEvents = [\n\t\t\"akamai-magnifier-in\",\n\t\t\"akamai-magnifier-out\",\n\t\t\"akamai-spin360-goto\",\n\t\t\"akamai-video-play\",\n\t\t\"akamai-video-seek\"\n\t];\n\n\t// clearly there should be an autoplayable interface\n\tCarousel.prototype._handleAutoplayables = function(){\n\t\tvar isParentActive = function(comp){\n\t\t\treturn !!$(comp.getElement())\n\t\t\t\t.closest(\"[\" + this.constructor.activeItemAttr + \"]\")\n\t\t\t\t.length;\n\t\t}.bind(this);\n\n\t\tthis._videos.concat(this._spins).forEach(function(comp){\n\t\t\tif( isParentActive(comp) && comp._carouselWasPlaying ) {\n\t\t\t\tcomp.play();\n\t\t\t} else {\n\t\t\t\tif( comp.getState() == comp.constructor.States.Playing ){\n\t\t\t\t\tcomp._carouselWasPlaying = true;\n\t\t\t\t\tcomp.pause();\n\t\t\t\t} else {\n\t\t\t\t\tcomp._carouselWasPlaying = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this));\n\t};\n\n\t// Unique counter for IDs\n\tCarousel.counter = 0;\n\n\tCarousel.prototype._updateOptions = function(options){\n\t\tif( !options ) {\n\t\t\tthis._options = this._originalOptions;\n\t\t}\n\n\t\t// update the current options\n\t\tthis._options = Akamai.Util.extend(true, this._options, options);\n\n\t\t// update the options for each of the subcomponents\n\t\tvar update = function(comp, name){\n\t\t\tcomp._updateOptions(this._options[name]);\n\t\t}.bind(this);\n\n\t\t// push the final options down to the dom element so that CSS that keys off\n\t\t// of the attributes can apply when JS config is used\n\t\tAkamai.Util.setDataAttrOptions(this._$el, Carousel.defaultOptions, this._options, \"Carousel\");\n\t\tthis._$el.snapper( \"updateOptions\", options );\n\n\t\tthis._spins.forEach(function(c){ update(c, \"spin360\"); });\n\t\tthis._magnifiers.forEach(function(c){ update(c, \"magnifier\"); });\n\t\tthis._videos.forEach(function(c){ update(c, \"video\"); });\n\n\t\tthis._setAspectRatio();\n\t};\n\n\t// Used in preflight to \"rename\" events based on the child component events\n\tCarousel._componentEventMapping = {\n\t\t\"snapper.after-snap\": \"goto\",\n\t\t\"snapper.snap\": \"snap\",\n\t\t\"snapper.after-next\": \"next\",\n\t\t\"snapper.after-prev\": \"previous\"\n\t};\n\n\t/**\n\t * Defines the global default options for all Carousels on the page\n\t * @static\n\t * @property {Boolean} arrows - Show carousel controls - (default: true)\n\t * @property {Number} aspectratio - Specify a percentage-based height for the carousel, relative to the width. Values: `false`, `100`, `45.6`, `78` - (default `false`, breakpoints supported)\n\t * @property {Integer} slideshow.interval - Time in milliseconds between slide advances - (default: 4000, breakpoints supported)\n\t * @property {Integer} slideshow.autostart - Start the slideshow on instantiation - (default: false)\n\t * @property {String} thumbnail.placement - Placement relative to the slide container: `left`, `right`, `bottom` (default: `bottom`, breakpoints supported)\n\t * @property {String} thumbnail.type - Type of thumbnail: `dots`, `none`, `images` - (default: `images`, breakpoints supported)\n\t * @property {String} thumbnail.policy - String to use for query parameter, ex: \"&policy=\" (default: undefined)\n\t * @property {String} thumbnail.sizes - Sizes attribute value to use if thumbnail policy is set. Values: `300px`, `200px`, `(min-width:1000px) 300px, 100px` - (default: `300px`)\n\t * @property {Object} images - Defaults to the Magnifier image option's settings\n\t */\n\tCarousel.defaultOptions = {\n\t\tarrows: true,\n\n\t\taspectratio: false,\n\n\t\tslideshow: {\n\t\t\tinterval: 4000,\n\t\t\tautostart: false\n\t\t},\n\n\t\tthumbnail: {\n\t\t\tplacement: \"bottom\",\n\t\t\ttype: \"images\",\n\t\t\tpolicy: undefined,\n\t\t\tsizes: \"300px\"\n\t\t},\n\n\t\timages: Akamai.Image.defaultConfig\n\t};\n\n\tCarousel.renderMapping = {\n\t\timage: Akamai.Magnifier,\n\t\tspin360: Akamai.Spin360,\n\t\tvideo: Akamai.Video\n\t};\n\n\tCarousel._typeMapping = {\n\t\timage: \"magnifier\"\n\t};\n\n\tCarousel._uniqueItemId = function(item, i) {\n\t\treturn \"akamai-carousel-\" + Carousel.counter + \"-\" + item.type + \"-\" + i;\n\t};\n\n\t// srcset stuff\n\tAkamai.Sourceable.extendStatic(Carousel);\n\n\tCarousel._renderItem = function(item, i, options) {\n\t\tvar mappedType = Carousel._typeMapping[item.type] || item.type;\n\n\t\tif( !Carousel.renderMapping[item.type] ){\n\t\t\tthrow new Error(`\n\t\t\t\titem type ${item.type} at index ${i} must be 'image', 'spin360', or 'video'\n\t\t\t`);\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"snapper_item\" id=\"${Carousel._uniqueItemId(item, i)}\">\n\t\t\t\t${Carousel.renderMapping[item.type].render(item, options[mappedType])}\n\t\t\t</div>\n\t\t`;\n\t};\n\n\tCarousel._renderThumbnailAnchor = function(item, data, i, options) {\n\t\tvar thumbUrl = \"\";\n\t\tvar altText = item.alt || \"\";\n\n\t\t// use the video poster, the canonical url, or the first in a sequence\n\t\tif( item.type === 'video' ){\n\t\t\tthumbUrl = item.poster || data.reduce(function(acc, i){\n\t\t\t\treturn acc || Carousel._thumbUrl(i);\n\t\t\t}, \"\");\n\t\t} else {\n\t\t\tthumbUrl = Carousel._thumbUrl(item);\n\t\t}\n\n\t\t// TODO this sucks\n\t\toptions.images.policy = options.thumbnail.policy;\n\n\t\tvar src = Carousel._fallbackSrc( thumbUrl, options.images );\n\t\tvar srcset = Carousel._srcset( thumbUrl, options.images );\n\t\tvar sizes = options.images.sizes;\n\n\t\t// if there's a thumbnail policy, the thumbnails will be fresh image requests,\n\t\t// so they should have better sizes attribute values\n\t\tif( options.thumbnail.policy ){\n\t\t\tsizes = options.thumbnail.sizes;\n\t\t}\n\n\t\tvar attrs = [\n\t\t\t`${Carousel._dataAttr}-thumb-type=\"${item.type}\"`,\n\t\t\titem.type == \"video\" && !item.poster ? \"${Carousel._dataAttr}-thumb-noposter\" : \"\"\n\t\t];\n\n\t\treturn `\n\t\t\t<a href=\"#${Carousel._uniqueItemId(item, i)}\" ${attrs.join(\" \")}>\n\t\t\t\t<img src=\"${src}\" srcset=\"${srcset}\" sizes=\"${sizes}\" alt=\"${altText}\" title=\"Scroll to ${item.type} ${i}\" />\n\t\t\t</a>\n\t\t`;\n\t};\n\n\tCarousel._thumbUrl = function(item){\n\t\treturn item.type === 'video' ? item.poster : item.url || (item.urls && item.urls[0]);\n\t};\n\n\tCarousel._renderThumbnails = function(data, options) {\n\t\tif(data.length <= 1 ){\n\t\t\treturn \"\";\n\t\t};\n\n\t\treturn `\n\t\t\t<div class=\"snapper_nav\">\n\t\t\t\t<div class=\"snapper_nav_inner\">\n\t\t\t\t\t${Akamai.Util.map(data, function(item, i){\n\t\t\t\t\t\treturn Carousel._renderThumbnailAnchor(item, data, i, options);\n\t\t\t\t\t}).join(\"\\n\")}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t};\n\n\tCarousel.prototype._setAspectAttributes = function( $el ){\n\t\tvar orientationAttr = `${Carousel._dataAttr}-aspectratio-orientation`;\n\t\tif( $el.height() > $el.width() ) {\n\t\t\t$el.attr( orientationAttr, \"portrait\" );\n\t\t} else if( $el.height() < $el.width() ) {\n\t\t\t$el.attr( orientationAttr, \"landscape\" );\n\t\t} else {\n\t\t\tif ($el.parent().height() >= $el.parent().width()) {\n\t\t\t\t$el.attr( orientationAttr, \"landscape\" );\n\t\t\t} else {\n\t\t\t\t$el.attr( orientationAttr, \"portrait\" );\n\t\t\t}\n\t\t}\n\t};\n\n\tCarousel.prototype._setAspectRatio = function(){\n\t\tvar value = this._options.aspectratio || 0;\n\t\tvar $items = this._$el.find( \".snapper_item\" );\n\t\t$items.css( \"padding-top\", (value / $items.length) + \"%\" );\n\t};\n\n\tCarousel.prototype._bindAspectAttributes = function(){\n\t\tif( this._options.aspectratio === false ){\n\t\t\treturn;\n\t\t}\n\n\t\tvar value = this._options.aspectratio || 0;\n\t\tvar self = this;\n\t\tvar $items = this._$el.find( \".snapper_item\" );\n\n\t\t$items.each(function(){\n\t\t\tvar loadBound;\n\t\t\tvar $item = $(this);\n\n\t\t\tvar $loadable = $item.find( \"img, video\" ).eq(0);\n\n\t\t\t$loadable.bind(\"load loadedmetadata\", loadBinding = function(){\n\t\t\t\tclearTimeout(loadBound);\n\n\t\t\t\tif( $item.is(`[${Akamai.Spin360._dataAttr}]`) ){\n\t\t\t\t\t// TODO it's not always a canvas, sometimes it's a collection of\n\t\t\t\t\t// images based on settings\n\t\t\t\t\tself._setAspectAttributes( $item.find( \"canvas\" ) );\n\t\t\t\t}\telse{\n\t\t\t\t\tself._setAspectAttributes( $loadable );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tloadBound = setTimeout(loadBinding, 5000);\n\t\t});\n\n\t\t$items.eq(0).find( \"img,video\" ).eq(0).bind( \"load loadedmetadata\", function(){\n\t\t\tself._trigger( \"first-media-load\" );\n\t\t});\n\t};\n\n\tCarousel.render = function(data, options){\n\t\toptions = options || {};\n\n\t\t// establish the extended default options for the carousel\n\t\tvar carouselOptions = Akamai.Util.options(Carousel.defaultOptions, options);\n\n\t\tvar templateAttrs = [\n\t\t\t`${Carousel._dataAttr}`,\n\t\t\t`${Carousel._dataAttr}-item-count=\"${(data || []).length}\"`,\n\t\t\t`data-snapper-deeplinking=\"false\"`,\n\t\t\tcarouselOptions.arrows ? \"data-snapper-nextprev\" : \"\"\n\t\t];\n\n\t\tCarousel.counter++;\n\n\t\t// TODO can we do something about the `enlarge_pane` class here, seems it\n\t\t// could be conditioned on at least one regular image type in the json\n\t\t// TODO options should dictate `data-snapper-nextprev`\n\t\treturn Akamai.Util.trim(`\n\t\t\t<div ${templateAttrs.join(\" \")} class=\"snapper\">\n\t\t\t\t<div class=\"snapper_nextprev_contain\">\n\t\t\t\t\t<div class=\"snapper_pane_crop\">\n\t\t\t\t\t\t<div class=\"snapper_pane enlarge_pane\">\n\t\t\t\t\t\t\t<div class=\"snapper_items\">\n\t\t\t\t\t\t\t\t${Akamai.Util.map(data, function(item, i){\n\t\t\t\t\t\t\t\t\treturn Carousel._renderItem(item, i, carouselOptions);\n\t\t\t\t\t\t\t\t}).join(\"\\n\")}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t${Carousel._renderThumbnails(data, carouselOptions)}\n\t\t\t</div>\n\t\t`);\n\t};\n\n\t/**\n\t * Instantiate Carousels by looking for children matching\n\t * [data-akamai-carousel] in `element` param\n\t * @method\n\t * @static\n\t * @param {HTMLElement} element - the element to search in for\n\t * @returns {Akamai.Carousel[]}\n\t */\n\n\n\t/**\n\t * @method\n\t * @returns {Akamai.Spin360[]}\n\t */\n\tCarousel.prototype.getSpin360s = function(){\n\t\treturn this._spins;\n\t};\n\n\t/**\n\t * @method\n\t * @returns {Akamai.Magnifier[]}\n\t */\n\tCarousel.prototype.getMagnifiers = function(){\n\t\treturn this._magnifiers;\n\t};\n\n\t/**\n\t * @method\n\t * @returns {Akamai.Video[]}\n\t */\n\tCarousel.prototype.getVideos = function(){\n\t\treturn this._videos;\n\t};\n\n\t/**\n\t * Go to a particular slide.\n\t *\n\t * Note that the state of the DOM on the page and thus the index of the\n\t * carousel will not be up-to-date until the {@link\n\t * Akamai.Carousel#akamai-carousel-goto} event has been fired. That is,\n\t * calling this method and the calling `getIndex` will not necessarily result\n\t * in an updated index value. Either bind to the event or supply a callback.\n\t *\n\t * @method\n\t * @fires Akamai.Carousel#akamai-carousel-goto\n\t * @param {Integer} index - The zero-based slide index to go to\n\t * @param {Function?} callback - callback invoked after the action has completed in the DOM\n\t * @returns {undefined}\n\t */\n\tCarousel.prototype.goto = function(index, callback){\n\t\tthis._$el.snapper( \"goto\", index, callback );\n\t};\n\n\tCarousel._itemAttr = `${Carousel._dataAttr}-item`;\n\tCarousel._activeItemAttr = `${Carousel._itemAttr}-active`;\n\n\t/**\n\t * Add an attribute to all carousel items,\n\t * and additionally maintain an active attribute on the active carousel item\n\t *\n\t * @method\n\t * @returns {undefined}\n\t */\n\tCarousel.prototype._activeItemAttributes = function(){\n\t\tvar attrAllItems = this.constructor._itemAttr;\n\t\tvar attrActiveItem = this.constructor._activeItemAttr;\n\n\t\tthis._$el\n\t\t\t.find( \".snapper_item\" )\n\t\t\t.attr( attrAllItems, true )\n\t\t\t.removeAttr( attrActiveItem )\n\t\t\t.eq( this.getIndex() ).attr( attrActiveItem, true );\n\t};\n\n\t/**\n\t * Return the current slide index\n\t * @method\n\t * @returns {undefined}\n\t */\n\tCarousel.prototype.getIndex = function(){\n\t\treturn this._$el.snapper( \"getIndex\" );\n\t};\n\n\t// Extend Carousel with Advanceabl interface\n\tAkamai.Advanceable.extend(Carousel);\n\n\t/**\n\t * Advance to the next item\n\t * @method\n\t * @fires Akamai.Carousel#akamai-carousel-next\n\t * @param {Function?} callback - callback invoked after the action has completed in the DOM\n\t * @returns {undefined}\n\t */\n\tCarousel.prototype.next;\n\t// required for JSDocs, implementation in Advanceable\n\n\t/**\n\t * Retreat to the previous item\n\t * @method\n\t * @fires Akamai.Carousel#akamai-carousel-previous\n\t * @param {Function?} callback - callback invoked after the action has completed in the DOM\n\t * @returns {undefined}\n\t */\n\tCarousel.prototype.previous;\n\t// required for JSDocs, implementation in Advanceable\n\n\t/**\n\t * Start automatic advancement of the carousel items\n\t * @method\n\t * @fires Akamai.Carousel#akamai-carousel-start-slideshow\n\t * @returns {undefined}\n\t */\n\tCarousel.prototype.startSlideshow\t= function(){\n\t\tthis._$el.one(\"mousedown touchstart\", this.stopSlideshow.bind(this));\n\n\t\tthis.next(function(){\n\t\t\tthis._trigger(\"start-slideshow\");\n\t\t\tthis._slideshowTimer = setTimeout(function(){\n\t\t\t\tthis.startSlideshow();\n\n\t\t\t\t// TODO remove || when default options are added\n\t\t\t}.bind(this), this._options.slideshow.interval );\n\t\t}.bind(this));\n\t};\n\n\t/**\n\t * Start automatic advancement of the carousel items\n\t * @method\n\t * @fires Akamai.Carousel#akamai-carousel-stop-slideshow\n\t * @returns {undefined}\n\t */\n\tCarousel.prototype.stopSlideshow = function(){\n\t\tclearTimeout(this._slideshowTimer);\n\t\tthis._slideshowTimer = undefined;\n\t\tthis._trigger(\"stop-slideshow\");\n\t};\n\n\t/**\n\t * Triggered when the carousel has completed it transition to\n\t * a new index due to user interaction or a call to {@link Akamai.Carousel#goto}.\n\t *\n\t * @event Akamai.Carousel#akamai-carousel-goto\n\t */\n\n\t/**\n\t * Triggered when the carousel has completed it transition to\n\t * a new index due to user interaction or a call to {@link Akamai.Carousel#next}.\n\t *\n\t * @event Akamai.Carousel#akamai-carousel-next\n\t */\n\n\t/**\n\t * Triggered when the carousel has completed it transition to\n\t * a new index due to user interaction or a call to {@link Akamai.Carousel#previous}.\n\t *\n\t * @event Akamai.Carousel#akamai-carousel-previous\n\t */\n\n\t/**\n\t * Triggered when the carousel has started the slide show due to a call to\n\t * {@link Akamai.Carousel#startSlideshow}.\n\t *\n\t * @event Akamai.Carousel#akamai-carousel-start-slideshow\n\t */\n\n\t/**\n\t * Triggered when the carousel has stoped the slide show due to a call to\n\t * {@link Akamai.Carousel#stopSlideshow}.\n\t *\n\t * @event Akamai.Carousel#akamai-carousel-stop-slideshow\n\t */\n\n\t/**\n\t * Triggered when initialization finishes\n\t * {@link Akamai.Carousel}.\n\t *\n\t * @event Akamai.Carousel#akamai-carousel-init\n\t */\n\n\tCarousel.prototype.refresh = function(){\n\t\tthis._$el.snapper(\"updateWidths\");\n\t};\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.Carousel = Carousel;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n(function(exports, $){\n\t/**\n\t * Image Fullscreen\n\t * @class\n\t * @alias Akamai.Fullscreen\n\t * @param {HTMLElement} element - the DOM element representing the component markup\n\t * @param {Object} options - configuration options\n\t */\n\n\t// TODO JSDocs\n\t// TODO Tests\n\tvar Fullscreen = Akamai.Util.component(\"Fullscreen\", function(element, options){\n\t\tif( this._options.enabled ) {\n\t\t\tthis._init();\n\t\t}\n\t});\n\n\tFullscreen.prototype._init = function(){\n\t\tthis._$fullscreen = this._$el;\n\n\t\t// parent container does not allow widths to be set (Firefox, fullscreen), so well adjust the children\n\t\tthis.addButton();\n\n\t\tthis._fullscreenApiKeys = Fullscreen._keys();\n\n\t\tif( this._options.native ) {\n\t\t\tthis._useNativeApi = !!this._fullscreenApiKeys;\n\t\t} else {\n\t\t\tthis._useNativeApi = false;\n\t\t}\n\n\t\t// Fullscreen API is disabled and the fallback behavior is active\n\t\tthis._fullscreenFallbackEnabled = false;\n\t\tthis._$placeholder = $( \"<div>\" );\n\n\t\tthis._isFullscreen = false;\n\t\tthis.addEvents();\n\t};\n\n\tFullscreen.classes = {\n\t\tbtn: \"akamai-fullscreen-btn\",\n\t\tbtnContainer: \"akamai-fullscreen-btncontainer\",\n\t\tenterBtn: \"akamai-fullscreen-btn-enter\",\n\t\texitBtn: \"akamai-fullscreen-btn-exit\",\n\t\tactive: \"akamai-fullscreen-active\",\n\t\tfallback: \"akamai-fullscreen-fallback\"\n\t};\n\n\tFullscreen.attr = {\n\t\twidth: \"data-akamai-fullscreen-width\",\n\t\tenterBtn: \"data-akamai-fullscreen-btn\",\n\t\texitBtn: \"data-akamai-fullscreen-exit-btn\"\n\t};\n\n\tFullscreen.defaultOptions = {\n\t\tenabled: false,\n\t\tnative: false\n\t};\n\n\tFullscreen.prototype.addButton = function(){\n\t\tthis._$widthAdjust = this._$fullscreen.children().filter(\".focused\");\n\n\t\tif( !this._$widthAdjust.length ) {\n\t\t\tthis._$widthAdjust = this._$fullscreen\n\t\t\t\t.children()\n\t\t\t\t.eq(0);\n\t\t}\n\n\t\tif( this._$widthAdjust.attr(Fullscreen.attr.width) === null ){\n\t\t\tthis._$widthAdjust.attr( Fullscreen.attr.width, \"\" );\n\t\t}\n\n\t\tif( this._$widthAdjust.find(\"[\" + Fullscreen.attr.enterBtn + \"]\").length ){\n\t\t\treturn;\n\t\t}\n\n\t\t// buttons parent\n\t\tthis._$buttonContainer = this._$widthAdjust;\n\t\tthis._$buttonContainer.addClass( Fullscreen.classes.btnContainer );\n\n\t\tthis._$buttonContainer.append(this.render());\n\t};\n\n\tFullscreen.prototype.addEvents = function() {\n\t\tthis._$fullscreen.on( \"click\", function( e ) {\n\t\t\tvar $target = $( e.target );\n\t\t\tif( !$target.is(\"[\" + Fullscreen.attr.enterBtn + \"]\") ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.enter();\n\t\t\te.preventDefault();\n\t\t}.bind( this ));\n\n\t\tthis._$fullscreen.on( \"click\", function( e ) {\n\t\t\tvar $target = $( e.target );\n\n\t\t\tif( !$target.is( \"[\" + Fullscreen.attr.exitBtn + \"]\" ) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.exit();\n\t\t\te.preventDefault();\n\t\t}.bind( this ));\n\n\t\tif( this._useNativeApi ) {\n\t\t\tdocument.addEventListener( this._fullscreenApiKeys.onchange, function() {\n\t\t\t\t// exiting fullscreen using native method (ESC or menu option)\n\t\t\t\tif( !document[ this._fullscreenApiKeys.element ] ) {\n\t\t\t\t\tthis._exit();\n\t\t\t\t}\n\t\t\t}.bind( this ), false );\n\t\t}\n\n\t\t// ESC to close\n\t\t$( document ).on( \"keydown\", function( e ) {\n\t\t\tvar code = e.keyCode || e.which;\n\t\t\tif( code === 27 ) {\n\t\t\t\tthis._exit();\n\t\t\t}\n\t\t}.bind( this ));\n\t};\n\n\tFullscreen.prototype.render = function() {\n\t\treturn Akamai.Util.trim(`\n\t\t\t<button ${Fullscreen.attr.enterBtn} class=\"${Fullscreen.classes.btn} ${Fullscreen.classes.enterBtn} icon-fullscreen\">Full Screen</button>\n\t\t\t<button ${Fullscreen.attr.exitBtn} class=\"${Fullscreen.classes.btn} ${Fullscreen.classes.exitBtn} icon-close-light\">Exit Full Screen</button>\n\t\t`);\n\t};\n\n\tFullscreen._keyLookup = [\n\t\t{\n\t\t\tenter: \"requestFullscreen\",\n\t\t\texit: \"exitFullscreen\",\n\t\t\telement: \"fullscreenElement\",\n\t\t\tonchange: \"fullscreenchange\"\n\t\t},\n\t\t{\n\t\t\tenter: \"webkitRequestFullscreen\",\n\t\t\texit: \"webkitExitFullscreen\",\n\t\t\telement: \"webkitFullscreenElement\",\n\t\t\tonchange: \"webkitfullscreenchange\"\n\t\t},\n\t\t{\n\t\t\tenter: \"webkitRequestFullScreen\",\n\t\t\texit: \"webkitCancelFullScreen\",\n\t\t\telement: \"webkitCurrentFullScreenElement\",\n\t\t\tonchange: \"webkitfullscreenchange\"\n\t\t},\n\t\t{\n\t\t\tenter: \"mozRequestFullScreen\",\n\t\t\texit: \"mozCancelFullScreen\",\n\t\t\telement: \"mozFullScreenElement\",\n\t\t\tonchange: \"mozfullscreenchange\"\n\t\t},\n\t\t{\n\t\t\tenter: \"msRequestFullscreen\",\n\t\t\texit: \"msExitFullscreen\",\n\t\t\telement: \"msFullscreenElement\",\n\t\t\tonchange: \"MSFullscreenChange\"\n\t\t}\n\t];\n\n\tFullscreen._keys = function( el ) {\n\t\tvar keys = Fullscreen._keyLookup;\n\n\t\tvar el = document.body;\n\t\tfor( var j = 0, k = keys.length; j < k; j++ ) {\n\t\t\tif( keys[ j ].enter in el ) {\n\t\t\t\treturn keys[ j ];\n\t\t\t}\n\t\t}\n\t};\n\n\tFullscreen.prototype._maximizePlacement = function(){\n\t\tthis._fullscreenFallbackEnabled = true;\n\t\tthis._$fullscreen.addClass( Fullscreen.classes.fallback );\n\t\tthis._$placeholder.insertAfter( this._$fullscreen );\n\t\tthis._$fullscreen.appendTo( document.body );\n\t};\n\n\tFullscreen.prototype._restorePlacement = function(){\n\t\tif( !this._fullscreenFallbackEnabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._fullscreenFallbackEnabled = false;\n\t\tthis._$fullscreen.removeClass( Fullscreen.classes.fallback );\n\t\tthis._$fullscreen.insertAfter( this._$placeholder );\n\t\tthis._$placeholder.remove();\n\t};\n\n\tFullscreen.prototype._adjustWidth = function() {\n\t\tthis._$fullscreen.css( \"width\", \"auto !important\" );\n\t\t// wish this could go into the change event above, but alas the dimensions dont measure right\n\t\tvar widthSmall = this._$fullscreen.width();\n\t\tvar heightSmall = this._$fullscreen.height();\n\n\t\tvar viewportWidth = this._useNativeApi ? window.screen.width : Math.max( document.documentElement.clientWidth, window.innerWidth || 0 );\n\t\tvar viewportHeight = this._useNativeApi ? window.screen.height : Math.max( document.documentElement.clientHeight, window.innerHeight || 0 );\n\n\t\t// calculate the maximum width we can use to fill the viewportHeight\n\t\tvar widthBig = widthSmall * viewportHeight / heightSmall;\n\n\t\t// if the width is bigger than the maximum, just set to 100% (wont fill the entire height, but thats ok)\n\t\tif( widthBig > viewportWidth ) {\n\t\t\twidthBig = \"100%\";\n\t\t}\n\n\t\tthis._$widthAdjust.width( widthBig );\n\t};\n\n\tFullscreen.prototype._revertWidth = function() {\n\t\tthis._$widthAdjust.css( \"width\", \"\" );\n\t};\n\n\t/**\n\t * Enter full screen mode\n\t * @method\n\t * @returns {undefined}\n\t */\n\tFullscreen.prototype.enter = function(){\n\t\tvar activeIndex = this._$fullscreen[0].shoestringData.Viewer._carousels[0].getIndex();\n\t\tthis._$fullscreen.addClass( Fullscreen.classes.active );\n\n\n\t\tif( this._useNativeApi ) {\n\t\t\tthis._$fullscreen[ 0 ][ this._fullscreenApiKeys.enter ]();\n\t\t\tthis._adjustWidth();\n\t\t} else {\n\t\t\tthis._adjustWidth();\n\t\t\tthis._maximizePlacement();\n\t\t}\n\t\tthis._isFullscreen = true;\n\t\tthis._$fullscreen[0].shoestringData.Viewer._carousels[0].goto(activeIndex);\n\t\tthis._trigger(\"enter\");\n\t};\n\n\tFullscreen.prototype._exit = function(){\n\t\tvar activeIndex = this._$fullscreen[0].shoestringData.Viewer._carousels[0].getIndex();\n\t\tthis._$fullscreen.removeClass( Fullscreen.classes.active );\n\n\t\tif( !this._useNativeApi ) {\n\t\t\tthis._restorePlacement();\n\t\t}\n\n\t\tthis._revertWidth();\n\t\tthis._isFullscreen = false;\n\t\tthis._$fullscreen[0].shoestringData.Viewer._carousels[0].goto(activeIndex);\n\t\tthis._trigger(\"exit\");\n\t};\n\n\t/**\n\t * Exits full screen mode\n\t * @method\n\t * @returns {undefined}\n\t */\n\tFullscreen.prototype.exit = function(){\n\t\tif( this._useNativeApi ) {\n\t\t\t// note some close behavior happens in the onchange event handler above\n\t\t\tdocument[ this._fullscreenApiKeys.exit ]();\n\t\t}\n\n\t\tthis._exit();\n\t};\n\n\tFullscreen.prototype.isFullscreen = function(){\n\t\treturn this._isFullscreen;\n\t};\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.Fullscreen = Fullscreen;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n(function(exports, $){\n\t/**\n\t * Akamai Viewer omni-component\n\t * @class\n\t * @alias Akamai.Viewer\n\t * @param {HTMLElement} element - the DOM element representing the component markup\n\t * @param {Object} options - configuration options\n\t *\n\t * @example <caption>Instatiation</caption>\n\t * var element = document.querySelector( \"[data-akamai-viewer]\" );\n\t * var viewer = Akamai.Viewer( element );\n\t */\n\tvar Viewer = Akamai.Util.component(\"Viewer\", true, function(element, options){\n\t\t// try to update the carousel and magnifier sizes options to the width of\n\t\t// the viewer for more accurate srcset selection\n\t\tthis._updateSizesOptions(true);\n\t\tthis._onResizeComplete(this._updateSizesOptions.bind(this));\n\n\t\t// move all the flattened component options (spin, zoom, video) onto the carousel\n\t\tthis._options.carousel =\n\t\t\tViewer._extendCarouselOptions(this._options);\n\n\t\tthis._withData(function(data){\n\t\t\tif( data ) {\n\t\t\t\t// check all of the urls agains the hostname and whitelist\n\t\t\t\tthis._checkJSONUrls(data);\n\n\t\t\t\t// prevent XSS / injection attacks by escaping string values\n\t\t\t\tdata = Akamai.Util.escapeJSONVals(data);\n\n\t\t\t\t// store escaped data for later reference\n\t\t\t\tthis._options.items.data = data;\n\t\t\t}\n\n\t\t\tthis._tagMapping = {};\n\n\t\t\t// TODO if the element is empty and/or options has `items` render into element\n\t\t\tif( this._$el.children().length == 0 && data ) {\n\t\t\t\tthis._tagMapping = this.constructor._tagSplit(data, this._options.items);\n\t\t\t\tthis._$el.append(this.constructor.render(data, this._options, true));\n\t\t\t}\n\n\t\t\t// intantiate all child carousels\n\t\t\tthis._carousels = Akamai.Carousel.createMany(element, this._options.carousel);\n\t\t\tthis._fullscreen = new Akamai.Fullscreen(element, this._options.fullscreen);\n\n\t\t\t// on enter and exit of fullscreen resolve the breakpoints and update options\n\t\t\tthis._$el.bind( \"akamai-fullscreen-enter akamai-fullscreen-exit\", function(){\n\t\t\t\tthis._updateOptions(this._resolveBreakpointOptions());\n\t\t\t}.bind(this));\n\n\t\t\t// use the breakpoints to set match media listeners\n\t\t\tthis._setBreakpoints();\n\n\t\t\t// have to trigger init explicitly for async constructors\n\t\t\tthis._trigger(\"init\");\n\t\t}.bind(this), function(msg){\n\t\t\tthrow new Error(msg);\n\t\t});\n\t});\n\n\tViewer.prototype._updateSizesOptions = function(localUpdateOnly){\n\t\t// update sizes option to something more specific if possible\n\t\tvar elWidth = this._$el.width();\n\t\tif( elWidth && elWidth > 0 ){\n\t\t\telWidth += \"px\";\n\t\t\tthis._options = Akamai.Util.extend(true, this._options, {\n\t\t\t\tcarousel: {\n\t\t\t\t\timages: {\n\t\t\t\t\t\tsizes: elWidth\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif( !localUpdateOnly ){\n\t\t\tthis._updateOptions(this._options);\n\t\t}\n\t};\n\n\tViewer.prototype._withData = function(after, fail){\n\t\tif(!this._options.items.uri){\n\t\t\tif( this._exceedsLimit(this._options.items.data, fail)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tafter(this._options.items.data);\n\t\t}\n\n\t\telse if (typeof(this._options.items.uri) !== 'undefined' && this._options.items.uri.length > 0)\n\t\t{\n\t\t\t$.get(this._options.items.uri, function(data){\n\t\t\t\t// make sure the data gets sorted out regardless of `get` impl\n\t\t\t\tdata = (typeof data === \"string\" ? JSON.parse(data) : data);\n\n\t\t\t\tif( this._exceedsLimit(data.items, fail) ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tafter(data.items);\n\t\t\t}.bind(this));\n\t\t}\n\t};\n\n\t// value in kibibytes\n\tViewer.prototype._exceedsLimit = function(data, fail){\n\t\t// TODO some tests don't provide data\n\t\tif( !data ) { return false; }\n\n\t\t// 1 unicode character = 4 bytes\n\t\t// length = # of chars\n\t\t// kibibyte = 1024 bytes\n\t\t// # of chars * 4 / 1024\n\t\tvar kb = JSON.stringify(data).length * 4 / 1024;\n\n\t\tif( kb > this._options.items.limit ) {\n\t\t\tfail = fail || function(){};\n\t\t\tfail(`JSON data size exceeds ${this._options.items.limit} KiB. Limit can be configured with items.limit Akamai.Viewer options.`);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tViewer.prototype._setBreakpoints = function(){\n\t\tthis._breakpoints = this._reduceBreakpoints(this._options.breakpoints || {});\n\t\tthis._fullscreenBreakpoints =\n\t\t\tthis._reduceBreakpoints(this._options.fullscreenBreakpoints || {});\n\n\t\tthis._bindBreakpoints();\n\t};\n\n\tViewer.prototype._reduceBreakpoints = function(breakpoints){\n\t\tvar bps = [];\n\n\t\tfor( var bp in breakpoints ){\n\t\t\tif(breakpoints.hasOwnProperty(bp)){\n\t\t\t\ttry {\n\t\t\t\t\tbps.push(parseInt(bp, 10));\n\t\t\t\t} catch(e){\n\t\t\t\t\tAkamai.Util.log(e, 'error');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbps.sort(function(a, b){ return b < a;});\n\n\t\treturn bps;\n\t};\n\n\tViewer.prototype._bindBreakpoints = function(){\n\t\t[this._breakpoints, this._fullscreenBreakpoints].forEach(function(bps){\n\t\t\t// bind using the minwidth and the next breakpoint as the maxwidth\n\t\t\t// adds a range from 0 to the first breakpoint and from the last\n\t\t\t// breakpoint to a very large number\n\t\t\tif(!bps.length) { return; }\n\n\t\t\tfor( var i = -1; i < bps.length; i++ ){\n\t\t\t\tthis._bindMatchMedia(bps[i], bps[i+1]);\n\t\t\t}\n\t\t}.bind(this));\n\t};\n\n\t// bind a callback to run after resize completes\n\tViewer.prototype._onResizeComplete = function( callback ){\n\t\tvar cbtimer;\n\t\tvar self = this;\n\t\twindow.addEventListener( \"resize\", function(){\n\t\t\tclearTimeout( cbtimer );\n\t\t\tcbtimer = setTimeout( callback, 500 );\n\t\t});\n\t};\n\n\tViewer.prototype._bindMatchMedia = function(minWidth, maxWidth){\n\t\tminWidth = minWidth || 0;\n\n\t\t// large number so we can use one media query template\n\t\tmaxWidth = maxWidth || 1000000000;\n\n\t\tif( window.matchMedia ){\n\t\t\t// bind using the minwidth and maxwidth so we get the events at the boundaries\n\t\t\t// so we can asses which set of options applies.\n\t\t\tvar query = `(min-width: ${minWidth}px) and (max-width: ${maxWidth}px)`;\n\n\t\t\t// create a media list to bind to\n\t\t\tvar initList = window.matchMedia(query);\n\n\t\t\tif(initList && initList.addListener) {\n\t\t\t\t// handle a match on instantiation\n\t\t\t\tthis._mediaMatch(initList, minWidth, true);\n\n\t\t\t\t// bind for later changes in whether the media query matches\n\t\t\t\tinitList.addListener(function(list){\n\t\t\t\t\tthis._mediaMatch(list, minWidth);\n\t\t\t\t}.bind(this));\n\t\t\t}\n\t\t}\n\t};\n\n\tViewer.prototype._mediaMatch = function(list, minWidth, ignoreDefault){\n\t\t// If there is a match for the breakpoint (we're in the bp range)\n\t\t// Then set the options based on that breakpoint\n\t\t// Else if there is not a match and the client width is below the\n\t\t// breakpoint that's being disabled, then use the original options\n\t\tif(list.matches){\n\t\t\tvar resolvedOptions = this._resolveBreakpointOptions(minWidth);\n\t\t\tthis._updateOptions(resolvedOptions);\n\t\t}\n\t};\n\n\t// TODO a ton of duplication with bindMatchmedia\n\tViewer.prototype._getCurrentMinWidth = function(bps){\n\t\t// bind using the minwidth and the next breakpoint as the maxwidth\n\t\t// adds a range from 0 to the first breakpoint and from the last\n\t\t// breakpoint to a very large number\n\t\tfor( var i = -1; i < bps.length; i++ ){\n\t\t\tminWidth = bps[i] || 0;\n\t\t\tmaxWidth = bps[i+1] || 100000000;\n\n\t\t\tif( window.matchMedia ){\n\t\t\t\t// bind using the minwidth and maxwidth so we get the events at the boundaries\n\t\t\t\t// so we can asses which set of options applies.\n\t\t\t\tvar query = `(min-width: ${minWidth}px) and (max-width: ${maxWidth}px)`;\n\n\t\t\t\t// create a media list to bind to\n\t\t\t\tvar initList = window.matchMedia(query);\n\n\t\t\t\tif(initList && initList.matches) {\n\t\t\t\t\treturn minWidth;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tViewer.prototype._resolveBreakpointOptions = function(minWidth){\n\t\t// TODO bind on the reduce callback was not working\n\t\tvar self = this;\n\t\tvar bps, bpConfig;\n\n\t\tif( this._fullscreen.isFullscreen() ) {\n\t\t\tbps = this._fullscreenBreakpoints;\n\t\t\tbpConfig = self._options.fullscreenBreakpoints;\n\t\t} else {\n\t\t\tbps = this._breakpoints;\n\t\t\tbpConfig = self._options.breakpoints;\n\t\t}\n\n\t\tif(!minWidth){\n\t\t\tminWidth = self._getCurrentMinWidth(bps);\n\t\t}\n\n\t\t// There may be no matching breakpoints when this method is called to\n\t\t// resolve the current options. If that's the case then we need to default\n\t\t// to the top level options\n\t\tif(!bps.length){ return self._originalOptions; }\n\n\t\treturn bps.reduce(function(acc, bp){\n\t\t\tvar cloned = Akamai.Util.extend(true, {}, acc);\n\t\t\tvar ptions;\n\n\n\t\t\tif(bp <= minWidth){\n\t\t\t\tcloned = Akamai.Util.extend(true, cloned, bpConfig[bp]);\n\t\t\t}\n\n\t\t\treturn cloned;\n\t\t}, Akamai.Util.extend(true, {}, this._originalOptions));\n\t};\n\n\tViewer._extendCarouselOptions = function(options){\n\t\t// clone the carousel options for the given breakpoint\n\t\tvar clonedCarousel = Akamai.Util.extend(true, {}, options.carousel || {});\n\n\t\t// TODO shared code with constructor\n\t\t// extend the cloned options with the breakpoint options so that all the\n\t\t// child component config is attached to the carousel config (also happens\n\t\t// in the constructor )\n\t\treturn Akamai.Util.extend(true, clonedCarousel, {\n\t\t\tmagnifier: options.magnifier,\n\t\t\tspin360: options.spin360,\n\t\t\tvideo: options.video,\n\t\t\tfullscreen: options.fullscreen\n\t\t});\n\t};\n\n\tViewer.prototype._updateOptions = function(options){\n\t\tthis._options = Akamai.Util.extend(true, this._options, options);\n\n\t\t// extend the carousel options for the given breakpoint\n\t\tvar carouselOptions = Viewer._extendCarouselOptions(options);\n\n\t\t// push the final options down to the dom element so that CSS that keys off\n\t\t// of the attributes can apply when JS config is used\n\t\tAkamai.Util.setDataAttrOptions(this._$el, Viewer.defaultOptions, options, \"Viewer\");\n\n\t\t// pass the new options down to all child carousels\n\t\tthis._carousels.forEach(function(comp){\n\t\t\tcomp._updateOptions(carouselOptions);\n\t\t}.bind(this));\n\t};\n\n\tViewer.prototype._checkJSONUrls = function(obj){\n\t\tvar hostnames = this._options.items.hostnames;\n\n\t\treturn Akamai.Util.mapJSONVals(obj,function(val, key){\n\t\t\tif(key === \"url\" && !this._urlHostnameMatch(val)){\n\t\t\t\tthrow new Error(`The URL \\`${val}\\` does not match this page's hostname or the whitelist defined in Akamai.Viewer option \\`hostnames\\` which is:\n\n${hostnames.length ? hostnames.join(\"\\n\") : \"No hostnames\"}\n`);\n\t\t\t}\n\n\t\t\treturn val;\n\t\t}.bind(this));\n\t};\n\n\tViewer.prototype._urlHostnameMatch = function(url){\n\t\tvar parser = document.createElement('a');\n\t\tparser.href = url;\n\n\t\treturn parser.hostname === \"\" || parser.hostname === window.location.hostname ||\n\t\t\tthis._options.items.hostnames.indexOf(parser.hostname) >= 0;\n\t};\n\n\t/**\n\t * Defines the global default options for all Viewers on the page\n\t * @static\n\t * @property {Object} breakpoints - configuration changes for child components at breakpoints (no default)\n\t * @property {Object} fullscreenBreakpoints - configuration changes for child components at breakpoints when in fullscreen mode (no default)\n\t * @property {Object[]} items.data - array of items from the Akamai JSON (default: undefined)\n\t * @property {String} items.defaultTag - (default: \"akamai-untagged\")\n\t * @property {String[]} items.hostnames - whitelist of URL hostnames to check for in JSON, (default: empty array)\n\t * @property {Integer} items.limit - size limit of JSON data in kibibytes (default: 100)\n\t * @property {String} items.renderAll - (default: false)\n\t * @property {String[]} items.tags - Set of tags to match against the Akamai JSON data (default: undefined)\n\t * @property {String} items.uri - URI at which to retrieve the Akamai JSON (default: undefined)\n\t * @property {Object} carousel - child {@link Akamai.Carousel} options\n\t * @property {Object} magnifier - child {@link Akamai.Magnifier} options\n\t * @property {Object} spin360 - child {@link Akamai.Spin360} options\n\t * @property {Object} video - child {@link Akamai.Video} options\n\t * @property {Object} fullscreen - child {@link Akamai.Fullscreen} options\n\t */\n\tViewer.defaultOptions = {\n\t\tbreakpoints: {},\n\t\titems: {\n\t\t\tdata: undefined,\n\t\t\tdefaultTag: \"akamai-untagged\",\n\t\t\thostnames: [],\n\t\t\tlimit: 100,\n\t\t\trenderAll: false,\n\t\t\ttags: undefined,\n\t\t\turi: undefined\n\t\t},\n\t\tcarousel: Akamai.Carousel.defaultOptions,\n\t\tmagnifier: Akamai.Magnifier.defaultOptions,\n\t\tspin360: Akamai.Spin360.defaultOptions,\n\t\tvideo: Akamai.Video.defaultOptions,\n\t\tfullscreen: Akamai.Fullscreen.defaultOptions\n\t};\n\n\tViewer._tagSplit = function(data, options){\n\t\tvar items = options;\n\n\t\t// set all items without a tag to the default\n\t\tdata = data.map(function(item){\n\t\t\titem.tags = (item.tags && item.tags.length) ? item.tags : [items.defaultTag];\n\t\t\treturn item;\n\t\t});\n\n\t\t// if the tags option was set, filter items out that don't match\n\t\tif( items.tags ) {\n\t\t\tdata = items.data.filter(function(item){\n\t\t\t\treturn item.tags.reduce(function(acc, tag){\n\t\t\t\t\treturn acc || items.tags.indexOf(tag) >= 0;\n\t\t\t\t}, false);\n\t\t\t});\n\t\t}\n\n\t\t// from the filtered get the first (may be default tag)\n\t\tvar def = data[0].tags[0];\n\n\t\t// create a mapping from tags to items in the set\n\t\tvar tagMapping = data.reduce(function(acc, item){\n\t\t\t(item.tags || []).forEach(function(tag){\n\t\t\t\tacc[tag] = acc[tag] || [];\n\t\t\t\tacc[tag].push(item);\n\t\t\t});\n\n\t\t\treturn acc;\n\t\t}, {});\n\n\t\t// set the first (default) object to the first tag\n\t\ttagMapping[Viewer._firstRenderTag] = tagMapping[def];\n\n\t\treturn tagMapping;\n\t};\n\n\tViewer._firstRenderTag = \"akamai-first-render\";\n\tViewer._tagAttr = `${Viewer._dataAttr}-tag`;\n\n\tViewer._renderTag = function(data, options){\n\t\t// get the first item and it's tag\n\t\t// NOTE this assumes that the data has been normalized to have a default tag\n\t\tvar tag = data[0].tags[0];\n\n\t\t// TODO shoestring doesn't treat html correctly unless the leading `<` has\n\t\t// no whitepsace in front of it:\n\t\t// shoestring/issues/94\n\t\treturn Akamai.Util.trim(`\n\t\t\t<div ${Viewer._tagAttr}=\"${tag}\">\n\t\t\t\t${Akamai.Carousel.render(data, options)}\n\t\t\t</div>\n\t\t`);\n\t};\n\n\t/**\n\t * Takes standard options including an `items` attribute and renders HTML\n\t * that conforms to the component expectations\n\t * @method\n\t * @static\n\t * @params {Object[]} json - Akamai JSON data\n\t * @params {Object} options - options object with an `items` attribute, see default options\n\t * @params {Boolean} options.items - configuration for how the items should be\n\t * rendered, see {@link Akamai.Viewer.defaultOptions} default options items sub-configuration\n\t * @returns { String }\n\t */\n\tViewer.render = function(json, options, unwrapped){\n\t\t// NOTE we do not extend the default options here because it has no bearing\n\t\t// on the rendering of the Viewer markup or child markup. This is contrast\n\t\t// to the carousel which does extend the passed options with defaults so the\n\t\t// markup can make use of them\n\t\tvar data = Viewer._tagSplit(json, options.items);\n\t\tvar carouselOptions = Viewer._extendCarouselOptions(options);\n\n\t\tvar childMarkup;\n\n\t\tif( options.items.renderAll ) {\n\t\t\tchildMarkup = data.map(function(acc, datum){\n\t\t\t\treturn Viewer._renderTag(datum, carouselOptions);\n\t\t\t}).join(\" \");\n\t\t} else {\n\t\t\tchildMarkup = Viewer._renderTag(data[Viewer._firstRenderTag], carouselOptions);\n\t\t}\n\n\t\tvar wrapped = `\n\t\t\t<div ${Viewer._dataAttr}>\n\t\t\t\t${childMarkup}\n\t\t\t</div>\n\t\t`;\n\n\t\treturn unwrapped ? childMarkup : wrapped ;\n\t};\n\n\t/**\n\t * Accessor for child carousel components.\n\t * @method\n\t * @returns { Akamai.Carousel[] }\n\t */\n\tViewer.prototype.getCarousels = function(){\n\t\treturn this._carousels;\n\t};\n\n\t/**\n\t * Set the visible carousel based on the tag. Note the method activity does\n\t * not complete until all the images from the relevant viewer have loaded, use\n\t * the `akamai-viewer-switch-tag` event\n\t * @method\n\t * @fires Akamai.Viewer#akamai-viewer-switch-tag\n\t * @params {String} tag - The tag corresponding to the desired carousel\n\t * @returns {undefined}\n\t */\n\tViewer.prototype.switchTag = function(tag){\n\t\tvar tags = this.getTags();\n\n\t\t// if the passed tag isn't in the data set return early and log an error in\n\t\t// the console\n\t\tif( tags.indexOf(tag) == -1){\n\t\t\tAkamai.Util.log(`tag: ${tag} is not present in the data for this viewer`, 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tvar selector = `[${this.constructor._tagAttr}=\"${tag}\"]`;\n\n\t\t// try to find an existing element with the tag\n\t\tvar $taggedViewer = this._$el.find(selector);\n\n\t\t// if there's no element append the newly rendered tag markup\n\t\tif( !$taggedViewer.length ){\n\t\t\t// make sure the config takes into account the current breakpoint\n\t\t\tvar options = this._resolveBreakpointOptions();\n\t\t\tvar carouselOptions = Viewer._extendCarouselOptions(options);\n\n\t\t\t// create the markup that will be inserted\n\t\t\tvar $markup = $(this.constructor._renderTag(this._tagMapping[tag], carouselOptions, true));\n\t\t\tvar $imgs = $markup.find(\"img\");\n\t\t\tvar imgCount = $imgs.length;\n\t\t\tvar loaded = 0;\n\n\t\t\t// hide the new carousel initially\n\t\t\t$markup.css(\"display\", \"none\");\n\n\t\t\t$imgs.bind(\"load\", function(){\n\t\t\t\tif( ++loaded !== imgCount ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// TODO namespace?\n\t\t\t\t$imgs.unbind(\"load\");\n\n\t\t\t\tvar carousels = Akamai.Carousel.createMany($markup[0], carouselOptions);\n\n\t\t\t\tcarousels.forEach(function(c){\n\t\t\t\t\t// TODO figure out why the carousel constructor doesn't apply the\n\t\t\t\t\t// active index class we want on instantiation, likely due to the fact\n\t\t\t\t\t// that the carousel is hidden so the \"getIndex\" calc is broken\n\t\t\t\t\t// mark the carousel item as active\n\t\t\t\t\tc.goto(c.getIndex());\n\t\t\t\t});\n\n\t\t\t\t// create and store the new carousels (should be one)\n\t\t\t\tthis._carousels = this._carousels.concat(carousels);\n\t\t\t\tthis._showViewer($markup, carousels);\n\t\t\t}.bind(this));\n\n\t\t\t// append the new markup to the existing viewer\n\t\t\tthis._$el.append($markup);\n\t\t} else {\n\t\t\tthis._showViewer($taggedViewer);\n\t\t}\n\t};\n\n\t// TODO should be handled in CSS\n\tViewer.prototype._showViewer = function($viewer, carousels){\n\t\tthis._$el\n\t\t\t.find(`[${this.constructor._tagAttr}]`)\n\t\t\t.css(\"display\", \"none\")\n\t\t\t.removeClass(\"focused\");\n\n\t\t$viewer\n\t\t\t.css(\"display\", \"block\")\n\t\t\t.addClass(\"focused\");\n\n\t\tif( carousels ){\n\t\t\tcarousels.map(function(c) { c.refresh(); });\n\t\t}\n\n\t\t// TODO the placement here seems arbitrary, probably belongs in `_showViewer`\n\t\t// TODO also sucks to be so tightly coupled\n\t\tthis._fullscreen.addButton();\n\n\t\tthis._trigger( \"switch-tag\" );\n\t};\n\n\t/**\n\t * Accessor for tags derived from Akamai JSON data\n\t * @method\n\t * @returns { String[] }\n\t */\n\tViewer.prototype.getTags = function(){\n\t\tif( this._tags ) {\n\t\t\treturn this._tags;\n\t\t};\n\n\t\tvar tags = [];\n\n\t\t// map and store all the carousel tags\n\t\tfor(var tag in this._tagMapping){\n\t\t\tif(this._tagMapping.hasOwnProperty(tag) && tag !== Viewer._firstRenderTag ) {\n\t\t\t\t// otherwise grab the list of tags\n\t\t\t\ttags.push(tag);\n\t\t\t}\n\t\t}\n\n\t\treturn this._tags = tags;\n\t};\n\n\t/**\n\t * Triggered when the viewer switches tag views. This includes waiting for\n\t * images to load for carousels dedicated to previously unviewed tags.\n\t * {@link Akamai.Viewer#switchTag}.\n\t *\n\t * @event Akamai.Viewer#akamai-viewer-switch-tag\n\t */\n\n\t/**\n\t * Triggered when initialization finishes\n\t * {@link Akamai.Viewer}.\n\t *\n\t * @event Akamai.Viewer#akamai-viewer-init\n\t */\n\n\texports.Akamai = exports.Akamai || {};\n\texports.Akamai.Viewer = Viewer;\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n\n(function(exports, $){\n\t$.fn.akamaiViewer = function(options){\n\t\tthis.each(function(i, element){\n\t\t\tnew Akamai.Viewer(element, options);\n\t\t});\n\t};\n})(typeof exports === 'undefined'? window : exports, this.jQuery);\n"]}