{"version":3,"sources":["webpack:///./node_modules/viewerjs/dist/viewer.js"],"names":["global","factory","module","exports","this","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread2","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_typeof","Symbol","iterator","constructor","prototype","_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","descriptor","configurable","writable","_toPropertyKey","key","_createClass","protoProps","staticProps","obj","value","_toPrimitive","input","hint","prim","toPrimitive","undefined","res","call","String","Number","arg","DEFAULTS","backdrop","button","navbar","title","toolbar","className","container","fullscreen","inheritedAttributes","initialCoverage","initialViewIndex","inline","interval","keyboard","focus","loading","loop","minWidth","minHeight","movable","rotatable","scalable","zoomable","zoomOnTouch","zoomOnWheel","slideOnTouch","toggleOnDblclick","tooltip","transition","zIndex","zIndexInline","zoomRatio","minZoomRatio","maxZoomRatio","url","ready","show","shown","hide","hidden","view","viewed","move","moved","rotate","rotated","scale","scaled","zoom","zoomed","play","stop","TEMPLATE","IS_BROWSER","window","document","WINDOW","IS_TOUCH_DEVICE","documentElement","HAS_POINTER_EVENT","NAMESPACE","ACTION_MOVE","ACTION_SWITCH","ACTION_ZOOM","CLASS_ACTIVE","concat","CLASS_CLOSE","CLASS_FADE","CLASS_FIXED","CLASS_FULLSCREEN","CLASS_FULLSCREEN_EXIT","CLASS_HIDE","CLASS_HIDE_MD_DOWN","CLASS_HIDE_SM_DOWN","CLASS_HIDE_XS_DOWN","CLASS_IN","CLASS_INVISIBLE","CLASS_LOADING","CLASS_MOVE","CLASS_OPEN","CLASS_SHOW","CLASS_TRANSITION","EVENT_CLICK","EVENT_DBLCLICK","EVENT_DRAG_START","EVENT_FOCUSIN","EVENT_KEY_DOWN","EVENT_LOAD","EVENT_ERROR","EVENT_TOUCH_END","EVENT_TOUCH_MOVE","EVENT_TOUCH_START","EVENT_POINTER_DOWN","EVENT_POINTER_MOVE","EVENT_POINTER_UP","EVENT_RESIZE","EVENT_TRANSITION_END","EVENT_WHEEL","EVENT_READY","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","EVENT_VIEW","EVENT_VIEWED","EVENT_MOVE","EVENT_MOVED","EVENT_ROTATE","EVENT_ROTATED","EVENT_SCALE","EVENT_SCALED","EVENT_ZOOM","EVENT_ZOOMED","EVENT_PLAY","EVENT_STOP","DATA_ACTION","REGEXP_SPACES","BUTTONS","isString","isNaN","isNumber","isUndefined","isObject","hasOwnProperty","isPlainObject","_constructor","error","isFunction","data","callback","Array","isArray","assign","_len","args","_key","REGEXP_SUFFIX","setStyle","element","styles","style","property","test","escapeHTMLEntities","replace","hasClass","classList","contains","indexOf","addClass","elem","add","trim","removeClass","remove","toggleClass","added","REGEXP_HYPHENATE","hyphenate","toLowerCase","getData","name","dataset","getAttribute","setData","setAttribute","onceSupported","supported","once","listener","options","get","set","addEventListener","removeEventListener","removeListener","type","handler","split","event","listeners","addListener","_handler","_element$listeners","_len2","_key2","dispatchEvent","Event","CustomEvent","bubbles","cancelable","detail","createEvent","initCustomEvent","getOffset","box","getBoundingClientRect","left","pageXOffset","clientLeft","top","pageYOffset","clientTop","getTransforms","_ref","scaleX","scaleY","translateX","translateY","values","transform","join","WebkitTransform","msTransform","getImageNameFromURL","decodeURIComponent","IS_SAFARI","navigator","userAgent","getImageNaturalSizes","image","newImage","createElement","naturalWidth","naturalHeight","body","onload","width","height","removeChild","src","cssText","appendChild","getResponsiveClass","getMaxZoomRatio","pointers","pointers2","ratios","pointer","pointerId","pointer2","x1","Math","abs","startX","y1","startY","x2","endX","y2","endY","z1","sqrt","z2","ratio","sort","a","b","getPointer","_ref2","endOnly","pageX","pageY","end","timeStamp","Date","now","getPointersCenter","count","_ref3","render","initContainer","initViewer","initList","renderViewer","initBody","ownerDocument","scrollbarWidth","innerWidth","clientWidth","initialBodyPaddingRight","paddingRight","initialBodyComputedPaddingRight","getComputedStyle","containerData","innerHeight","viewerData","parent","max","offsetWidth","offsetHeight","parentData","fulled","viewer","_this","list","items","innerHTML","images","index","alt","getImageURL","item","img","onLoad","onError","firstElementChild","loadImage","renderList","next","nextElementSibling","gutter","parseInt","marginLeft","outerWidth","resetList","initImage","done","sizingImage","_this2","footerHeight","footer","viewerWidth","viewerHeight","oldImageData","imageData","imageInitializing","abort","aspectRatio","min","x","y","oldRatio","initialImageData","renderImage","_this3","marginTop","viewing","moving","rotating","scaling","zooming","onTransitionEnd","imageRendering","resetImage","parentNode","events","bind","canvas","onClick","click","onDragStart","dragstart","onPointerDown","pointerdown","onPointerMove","pointermove","onPointerUp","pointerup","onKeyDown","keydown","onResize","resize","onWheel","wheel","passive","capture","onDblclick","dblclick","unbind","handlers","action","localName","parentElement","isTrusted","clearTimeout","clickCanvasTimeout","played","exit","full","pointerMoved","toggle","reset","prev","preventDefault","doubleClickImageTimeout","originalEvent","load","timeout","originalImage","parentWidth","parentHeight","filled","keyCode","which","charCode","playing","ctrlKey","buttons","showing","hiding","pointerType","changedTouches","touch","identifier","isSwitchable","change","imageClicked","setTimeout","isShown","close","open","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","player","getElementsByTagName","_this4","wheeling","delta","deltaY","wheelDelta","methods","immediate","build","transitioning","id","removeAttribute","initialOffsetWidth","hideImmediately","onViewerTransitionEnd","onImageTransitionEnd","zoomTo","querySelector","activeItem","onViewed","complete","maxIndex","moveTo","_originalEvent","oldX","oldY","changed","degree","rotateTo","oldDegree","_scaleX","_scaleY","_this5","oldScaleX","oldScaleY","showTooltip","pivot","_this6","_zoomable","newWidth","newHeight","offset","center","_this7","total","onLoadWhenPlay","requestFullscreen","referrerPolicy","_this8","exitFullscreen","_this9","enforceFocus","_this10","clearEnforceFocus","_this11","tooltipBox","textContent","round","tooltipping","fading","update","_this12","isImg","destroy","querySelectorAll","changedIndexes","changedIndex","destroyed","delaying","initializing","onStart","others","onFocusin","parseFloat","fucus","webkitRequestFullscreen","Element","ALLOW_KEYBOARD_INPUT","mozRequestFullScreen","msRequestFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","offsetX","offsetY","absoluteOffsetX","p","AnotherViewer","Viewer","getUniqueID","nodeType","Error","init","progress","template","custom","zoomButtons","slice","rotateButtons","scaleButtons","deep","size","rotates","position","insertBefore","nextSibling"],"mappings":"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","file":"js/chunk-bb1985a8.db8cbfe1.js","sourcesContent":["/*!\n * Viewer.js v1.11.6\n * https://fengyuanchen.github.io/viewerjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2023-09-17T03:16:38.052Z\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Viewer = factory());\n})(this, (function () { 'use strict';\n\n function ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n }\n function _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n }\n function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n }\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n }\n }\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n }\n function _defineProperty(obj, key, value) {\n key = _toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n }\n function _toPrimitive(input, hint) {\n if (typeof input !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (typeof res !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n }\n function _toPropertyKey(arg) {\n var key = _toPrimitive(arg, \"string\");\n return typeof key === \"symbol\" ? key : String(key);\n }\n\n var DEFAULTS = {\n /**\n * Enable a modal backdrop, specify `static` for a backdrop\n * which doesn't close the modal on click.\n * @type {boolean}\n */\n backdrop: true,\n /**\n * Show the button on the top-right of the viewer.\n * @type {boolean}\n */\n button: true,\n /**\n * Show the navbar.\n * @type {boolean | number}\n */\n navbar: true,\n /**\n * Specify the visibility and the content of the title.\n * @type {boolean | number | Function | Array}\n */\n title: true,\n /**\n * Show the toolbar.\n * @type {boolean | number | Object}\n */\n toolbar: true,\n /**\n * Custom class name(s) to add to the viewer's root element.\n * @type {string}\n */\n className: '',\n /**\n * Define where to put the viewer in modal mode.\n * @type {string | Element}\n */\n container: 'body',\n /**\n * Filter the images for viewing. Return true if the image is viewable.\n * @type {Function}\n */\n filter: null,\n /**\n * Enable to request fullscreen when play.\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/FullscreenOptions}\n * @type {boolean|FullscreenOptions}\n */\n fullscreen: true,\n /**\n * Define the extra attributes to inherit from the original image.\n * @type {Array}\n */\n inheritedAttributes: ['crossOrigin', 'decoding', 'isMap', 'loading', 'referrerPolicy', 'sizes', 'srcset', 'useMap'],\n /**\n * Define the initial coverage of the viewing image.\n * @type {number}\n */\n initialCoverage: 0.9,\n /**\n * Define the initial index of the image for viewing.\n * @type {number}\n */\n initialViewIndex: 0,\n /**\n * Enable inline mode.\n * @type {boolean}\n */\n inline: false,\n /**\n * The amount of time to delay between automatically cycling an image when playing.\n * @type {number}\n */\n interval: 5000,\n /**\n * Enable keyboard support.\n * @type {boolean}\n */\n keyboard: true,\n /**\n * Focus the viewer when initialized.\n * @type {boolean}\n */\n focus: true,\n /**\n * Indicate if show a loading spinner when load image or not.\n * @type {boolean}\n */\n loading: true,\n /**\n * Indicate if enable loop viewing or not.\n * @type {boolean}\n */\n loop: true,\n /**\n * Min width of the viewer in inline mode.\n * @type {number}\n */\n minWidth: 200,\n /**\n * Min height of the viewer in inline mode.\n * @type {number}\n */\n minHeight: 100,\n /**\n * Enable to move the image.\n * @type {boolean}\n */\n movable: true,\n /**\n * Enable to rotate the image.\n * @type {boolean}\n */\n rotatable: true,\n /**\n * Enable to scale the image.\n * @type {boolean}\n */\n scalable: true,\n /**\n * Enable to zoom the image.\n * @type {boolean}\n */\n zoomable: true,\n /**\n * Enable to zoom the current image by dragging on the touch screen.\n * @type {boolean}\n */\n zoomOnTouch: true,\n /**\n * Enable to zoom the image by wheeling mouse.\n * @type {boolean}\n */\n zoomOnWheel: true,\n /**\n * Enable to slide to the next or previous image by swiping on the touch screen.\n * @type {boolean}\n */\n slideOnTouch: true,\n /**\n * Indicate if toggle the image size between its natural size\n * and initial size when double click on the image or not.\n * @type {boolean}\n */\n toggleOnDblclick: true,\n /**\n * Show the tooltip with image ratio (percentage) when zoom in or zoom out.\n * @type {boolean}\n */\n tooltip: true,\n /**\n * Enable CSS3 Transition for some special elements.\n * @type {boolean}\n */\n transition: true,\n /**\n * Define the CSS `z-index` value of viewer in modal mode.\n * @type {number}\n */\n zIndex: 2015,\n /**\n * Define the CSS `z-index` value of viewer in inline mode.\n * @type {number}\n */\n zIndexInline: 0,\n /**\n * Define the ratio when zoom the image by wheeling mouse.\n * @type {number}\n */\n zoomRatio: 0.1,\n /**\n * Define the min ratio of the image when zoom out.\n * @type {number}\n */\n minZoomRatio: 0.01,\n /**\n * Define the max ratio of the image when zoom in.\n * @type {number}\n */\n maxZoomRatio: 100,\n /**\n * Define where to get the original image URL for viewing.\n * @type {string | Function}\n */\n url: 'src',\n /**\n * Event shortcuts.\n * @type {Function}\n */\n ready: null,\n show: null,\n shown: null,\n hide: null,\n hidden: null,\n view: null,\n viewed: null,\n move: null,\n moved: null,\n rotate: null,\n rotated: null,\n scale: null,\n scaled: null,\n zoom: null,\n zoomed: null,\n play: null,\n stop: null\n };\n\n var TEMPLATE = '
' + '
' + '
' + '
' + '
' + '
' + '
    ' + '
    ' + '
    ' + '
    ' + '
    ' + '
    ' + '
    ';\n\n var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n var WINDOW = IS_BROWSER ? window : {};\n var IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\n var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\n var NAMESPACE = 'viewer';\n\n // Actions\n var ACTION_MOVE = 'move';\n var ACTION_SWITCH = 'switch';\n var ACTION_ZOOM = 'zoom';\n\n // Classes\n var CLASS_ACTIVE = \"\".concat(NAMESPACE, \"-active\");\n var CLASS_CLOSE = \"\".concat(NAMESPACE, \"-close\");\n var CLASS_FADE = \"\".concat(NAMESPACE, \"-fade\");\n var CLASS_FIXED = \"\".concat(NAMESPACE, \"-fixed\");\n var CLASS_FULLSCREEN = \"\".concat(NAMESPACE, \"-fullscreen\");\n var CLASS_FULLSCREEN_EXIT = \"\".concat(NAMESPACE, \"-fullscreen-exit\");\n var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n var CLASS_HIDE_MD_DOWN = \"\".concat(NAMESPACE, \"-hide-md-down\");\n var CLASS_HIDE_SM_DOWN = \"\".concat(NAMESPACE, \"-hide-sm-down\");\n var CLASS_HIDE_XS_DOWN = \"\".concat(NAMESPACE, \"-hide-xs-down\");\n var CLASS_IN = \"\".concat(NAMESPACE, \"-in\");\n var CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\n var CLASS_LOADING = \"\".concat(NAMESPACE, \"-loading\");\n var CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\");\n var CLASS_OPEN = \"\".concat(NAMESPACE, \"-open\");\n var CLASS_SHOW = \"\".concat(NAMESPACE, \"-show\");\n var CLASS_TRANSITION = \"\".concat(NAMESPACE, \"-transition\");\n\n // Native events\n var EVENT_CLICK = 'click';\n var EVENT_DBLCLICK = 'dblclick';\n var EVENT_DRAG_START = 'dragstart';\n var EVENT_FOCUSIN = 'focusin';\n var EVENT_KEY_DOWN = 'keydown';\n var EVENT_LOAD = 'load';\n var EVENT_ERROR = 'error';\n var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\n var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\n var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\n var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\n var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\n var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\n var EVENT_RESIZE = 'resize';\n var EVENT_TRANSITION_END = 'transitionend';\n var EVENT_WHEEL = 'wheel';\n\n // Custom events\n var EVENT_READY = 'ready';\n var EVENT_SHOW = 'show';\n var EVENT_SHOWN = 'shown';\n var EVENT_HIDE = 'hide';\n var EVENT_HIDDEN = 'hidden';\n var EVENT_VIEW = 'view';\n var EVENT_VIEWED = 'viewed';\n var EVENT_MOVE = 'move';\n var EVENT_MOVED = 'moved';\n var EVENT_ROTATE = 'rotate';\n var EVENT_ROTATED = 'rotated';\n var EVENT_SCALE = 'scale';\n var EVENT_SCALED = 'scaled';\n var EVENT_ZOOM = 'zoom';\n var EVENT_ZOOMED = 'zoomed';\n var EVENT_PLAY = 'play';\n var EVENT_STOP = 'stop';\n\n // Data keys\n var DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\n\n // RegExps\n var REGEXP_SPACES = /\\s\\s*/;\n\n // Misc\n var BUTTONS = ['zoom-in', 'zoom-out', 'one-to-one', 'reset', 'prev', 'play', 'next', 'rotate-left', 'rotate-right', 'flip-horizontal', 'flip-vertical'];\n\n /**\n * Check if the given value is a string.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a string, else `false`.\n */\n function isString(value) {\n return typeof value === 'string';\n }\n\n /**\n * Check if the given value is not a number.\n */\n var isNaN = Number.isNaN || WINDOW.isNaN;\n\n /**\n * Check if the given value is a number.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n */\n function isNumber(value) {\n return typeof value === 'number' && !isNaN(value);\n }\n\n /**\n * Check if the given value is undefined.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n */\n function isUndefined(value) {\n return typeof value === 'undefined';\n }\n\n /**\n * Check if the given value is an object.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n */\n function isObject(value) {\n return _typeof(value) === 'object' && value !== null;\n }\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n /**\n * Check if the given value is a plain object.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n */\n function isPlainObject(value) {\n if (!isObject(value)) {\n return false;\n }\n try {\n var _constructor = value.constructor;\n var prototype = _constructor.prototype;\n return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Check if the given value is a function.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n */\n function isFunction(value) {\n return typeof value === 'function';\n }\n\n /**\n * Iterate the given data.\n * @param {*} data - The data to iterate.\n * @param {Function} callback - The process function for each element.\n * @returns {*} The original data.\n */\n function forEach(data, callback) {\n if (data && isFunction(callback)) {\n if (Array.isArray(data) || isNumber(data.length) /* array-like */) {\n var length = data.length;\n var i;\n for (i = 0; i < length; i += 1) {\n if (callback.call(data, data[i], i, data) === false) {\n break;\n }\n }\n } else if (isObject(data)) {\n Object.keys(data).forEach(function (key) {\n callback.call(data, data[key], key, data);\n });\n }\n }\n return data;\n }\n\n /**\n * Extend the given object.\n * @param {*} obj - The object to be extended.\n * @param {*} args - The rest objects which will be merged to the first object.\n * @returns {Object} The extended object.\n */\n var assign = Object.assign || function assign(obj) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (isObject(obj) && args.length > 0) {\n args.forEach(function (arg) {\n if (isObject(arg)) {\n Object.keys(arg).forEach(function (key) {\n obj[key] = arg[key];\n });\n }\n });\n }\n return obj;\n };\n var REGEXP_SUFFIX = /^(?:width|height|left|top|marginLeft|marginTop)$/;\n\n /**\n * Apply styles to the given element.\n * @param {Element} element - The target element.\n * @param {Object} styles - The styles for applying.\n */\n function setStyle(element, styles) {\n var style = element.style;\n forEach(styles, function (value, property) {\n if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n value += 'px';\n }\n style[property] = value;\n });\n }\n\n /**\n * Escape a string for using in HTML.\n * @param {String} value - The string to escape.\n * @returns {String} Returns the escaped string.\n */\n function escapeHTMLEntities(value) {\n return isString(value) ? value.replace(/&(?!amp;|quot;|#39;|lt;|gt;)/g, '&').replace(/\"/g, '"').replace(/'/g, ''').replace(//g, '>') : value;\n }\n\n /**\n * Check if the given element has a special class.\n * @param {Element} element - The element to check.\n * @param {string} value - The class to search.\n * @returns {boolean} Returns `true` if the special class was found.\n */\n function hasClass(element, value) {\n if (!element || !value) {\n return false;\n }\n return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n }\n\n /**\n * Add classes to the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be added.\n */\n function addClass(element, value) {\n if (!element || !value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n addClass(elem, value);\n });\n return;\n }\n if (element.classList) {\n element.classList.add(value);\n return;\n }\n var className = element.className.trim();\n if (!className) {\n element.className = value;\n } else if (className.indexOf(value) < 0) {\n element.className = \"\".concat(className, \" \").concat(value);\n }\n }\n\n /**\n * Remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be removed.\n */\n function removeClass(element, value) {\n if (!element || !value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n removeClass(elem, value);\n });\n return;\n }\n if (element.classList) {\n element.classList.remove(value);\n return;\n }\n if (element.className.indexOf(value) >= 0) {\n element.className = element.className.replace(value, '');\n }\n }\n\n /**\n * Add or remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be toggled.\n * @param {boolean} added - Add only.\n */\n function toggleClass(element, value, added) {\n if (!value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n toggleClass(elem, value, added);\n });\n return;\n }\n\n // IE10-11 doesn't support the second parameter of `classList.toggle`\n if (added) {\n addClass(element, value);\n } else {\n removeClass(element, value);\n }\n }\n var REGEXP_HYPHENATE = /([a-z\\d])([A-Z])/g;\n\n /**\n * Transform the given string from camelCase to kebab-case\n * @param {string} value - The value to transform.\n * @returns {string} The transformed value.\n */\n function hyphenate(value) {\n return value.replace(REGEXP_HYPHENATE, '$1-$2').toLowerCase();\n }\n\n /**\n * Get data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to get.\n * @returns {string} The data value.\n */\n function getData(element, name) {\n if (isObject(element[name])) {\n return element[name];\n }\n if (element.dataset) {\n return element.dataset[name];\n }\n return element.getAttribute(\"data-\".concat(hyphenate(name)));\n }\n\n /**\n * Set data to the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to set.\n * @param {string} data - The data value.\n */\n function setData(element, name, data) {\n if (isObject(data)) {\n element[name] = data;\n } else if (element.dataset) {\n element.dataset[name] = data;\n } else {\n element.setAttribute(\"data-\".concat(hyphenate(name)), data);\n }\n }\n var onceSupported = function () {\n var supported = false;\n if (IS_BROWSER) {\n var once = false;\n var listener = function listener() {};\n var options = Object.defineProperty({}, 'once', {\n get: function get() {\n supported = true;\n return once;\n },\n /**\n * This setter can fix a `TypeError` in strict mode\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n * @param {boolean} value - The value to set\n */\n set: function set(value) {\n once = value;\n }\n });\n WINDOW.addEventListener('test', listener, options);\n WINDOW.removeEventListener('test', listener, options);\n }\n return supported;\n }();\n\n /**\n * Remove event listener from the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Function} listener - The event listener.\n * @param {Object} options - The event options.\n */\n function removeListener(element, type, listener) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var handler = listener;\n type.trim().split(REGEXP_SPACES).forEach(function (event) {\n if (!onceSupported) {\n var listeners = element.listeners;\n if (listeners && listeners[event] && listeners[event][listener]) {\n handler = listeners[event][listener];\n delete listeners[event][listener];\n if (Object.keys(listeners[event]).length === 0) {\n delete listeners[event];\n }\n if (Object.keys(listeners).length === 0) {\n delete element.listeners;\n }\n }\n }\n element.removeEventListener(event, handler, options);\n });\n }\n\n /**\n * Add event listener to the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Function} listener - The event listener.\n * @param {Object} options - The event options.\n */\n function addListener(element, type, listener) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var _handler = listener;\n type.trim().split(REGEXP_SPACES).forEach(function (event) {\n if (options.once && !onceSupported) {\n var _element$listeners = element.listeners,\n listeners = _element$listeners === void 0 ? {} : _element$listeners;\n _handler = function handler() {\n delete listeners[event][listener];\n element.removeEventListener(event, _handler, options);\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n listener.apply(element, args);\n };\n if (!listeners[event]) {\n listeners[event] = {};\n }\n if (listeners[event][listener]) {\n element.removeEventListener(event, listeners[event][listener], options);\n }\n listeners[event][listener] = _handler;\n element.listeners = listeners;\n }\n element.addEventListener(event, _handler, options);\n });\n }\n\n /**\n * Dispatch event on the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Object} data - The additional event data.\n * @param {Object} options - The additional event options.\n * @returns {boolean} Indicate if the event is default prevented or not.\n */\n function dispatchEvent(element, type, data, options) {\n var event;\n\n // Event and CustomEvent on IE9-11 are global objects, not constructors\n if (isFunction(Event) && isFunction(CustomEvent)) {\n event = new CustomEvent(type, _objectSpread2({\n bubbles: true,\n cancelable: true,\n detail: data\n }, options));\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, data);\n }\n return element.dispatchEvent(event);\n }\n\n /**\n * Get the offset base on the document.\n * @param {Element} element - The target element.\n * @returns {Object} The offset data.\n */\n function getOffset(element) {\n var box = element.getBoundingClientRect();\n return {\n left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n };\n }\n\n /**\n * Get transforms base on the given object.\n * @param {Object} obj - The target object.\n * @returns {string} A string contains transform values.\n */\n function getTransforms(_ref) {\n var rotate = _ref.rotate,\n scaleX = _ref.scaleX,\n scaleY = _ref.scaleY,\n translateX = _ref.translateX,\n translateY = _ref.translateY;\n var values = [];\n if (isNumber(translateX) && translateX !== 0) {\n values.push(\"translateX(\".concat(translateX, \"px)\"));\n }\n if (isNumber(translateY) && translateY !== 0) {\n values.push(\"translateY(\".concat(translateY, \"px)\"));\n }\n\n // Rotate should come first before scale to match orientation transform\n if (isNumber(rotate) && rotate !== 0) {\n values.push(\"rotate(\".concat(rotate, \"deg)\"));\n }\n if (isNumber(scaleX) && scaleX !== 1) {\n values.push(\"scaleX(\".concat(scaleX, \")\"));\n }\n if (isNumber(scaleY) && scaleY !== 1) {\n values.push(\"scaleY(\".concat(scaleY, \")\"));\n }\n var transform = values.length ? values.join(' ') : 'none';\n return {\n WebkitTransform: transform,\n msTransform: transform,\n transform: transform\n };\n }\n\n /**\n * Get an image name from an image url.\n * @param {string} url - The target url.\n * @example\n * // picture.jpg\n * getImageNameFromURL('https://domain.com/path/to/picture.jpg?size=1280×960')\n * @returns {string} A string contains the image name.\n */\n function getImageNameFromURL(url) {\n return isString(url) ? decodeURIComponent(url.replace(/^.*\\//, '').replace(/[?&#].*$/, '')) : '';\n }\n var IS_SAFARI = WINDOW.navigator && /Version\\/\\d+(\\.\\d+)+?\\s+Safari/i.test(WINDOW.navigator.userAgent);\n\n /**\n * Get an image's natural sizes.\n * @param {string} image - The target image.\n * @param {Object} options - The viewer options.\n * @param {Function} callback - The callback function.\n * @returns {HTMLImageElement} The new image.\n */\n function getImageNaturalSizes(image, options, callback) {\n var newImage = document.createElement('img');\n\n // Modern browsers (except Safari)\n if (image.naturalWidth && !IS_SAFARI) {\n callback(image.naturalWidth, image.naturalHeight);\n return newImage;\n }\n var body = document.body || document.documentElement;\n newImage.onload = function () {\n callback(newImage.width, newImage.height);\n if (!IS_SAFARI) {\n body.removeChild(newImage);\n }\n };\n forEach(options.inheritedAttributes, function (name) {\n var value = image.getAttribute(name);\n if (value !== null) {\n newImage.setAttribute(name, value);\n }\n });\n newImage.src = image.src;\n\n // iOS Safari will convert the image automatically\n // with its orientation once append it into DOM\n if (!IS_SAFARI) {\n newImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n body.appendChild(newImage);\n }\n return newImage;\n }\n\n /**\n * Get the related class name of a responsive type number.\n * @param {string} type - The responsive type.\n * @returns {string} The related class name.\n */\n function getResponsiveClass(type) {\n switch (type) {\n case 2:\n return CLASS_HIDE_XS_DOWN;\n case 3:\n return CLASS_HIDE_SM_DOWN;\n case 4:\n return CLASS_HIDE_MD_DOWN;\n default:\n return '';\n }\n }\n\n /**\n * Get the max ratio of a group of pointers.\n * @param {string} pointers - The target pointers.\n * @returns {number} The result ratio.\n */\n function getMaxZoomRatio(pointers) {\n var pointers2 = _objectSpread2({}, pointers);\n var ratios = [];\n forEach(pointers, function (pointer, pointerId) {\n delete pointers2[pointerId];\n forEach(pointers2, function (pointer2) {\n var x1 = Math.abs(pointer.startX - pointer2.startX);\n var y1 = Math.abs(pointer.startY - pointer2.startY);\n var x2 = Math.abs(pointer.endX - pointer2.endX);\n var y2 = Math.abs(pointer.endY - pointer2.endY);\n var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n var ratio = (z2 - z1) / z1;\n ratios.push(ratio);\n });\n });\n ratios.sort(function (a, b) {\n return Math.abs(a) < Math.abs(b);\n });\n return ratios[0];\n }\n\n /**\n * Get a pointer from an event object.\n * @param {Object} event - The target event object.\n * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n * @returns {Object} The result pointer contains start and/or end point coordinates.\n */\n function getPointer(_ref2, endOnly) {\n var pageX = _ref2.pageX,\n pageY = _ref2.pageY;\n var end = {\n endX: pageX,\n endY: pageY\n };\n return endOnly ? end : _objectSpread2({\n timeStamp: Date.now(),\n startX: pageX,\n startY: pageY\n }, end);\n }\n\n /**\n * Get the center point coordinate of a group of pointers.\n * @param {Object} pointers - The target pointers.\n * @returns {Object} The center point coordinate.\n */\n function getPointersCenter(pointers) {\n var pageX = 0;\n var pageY = 0;\n var count = 0;\n forEach(pointers, function (_ref3) {\n var startX = _ref3.startX,\n startY = _ref3.startY;\n pageX += startX;\n pageY += startY;\n count += 1;\n });\n pageX /= count;\n pageY /= count;\n return {\n pageX: pageX,\n pageY: pageY\n };\n }\n\n var render = {\n render: function render() {\n this.initContainer();\n this.initViewer();\n this.initList();\n this.renderViewer();\n },\n initBody: function initBody() {\n var ownerDocument = this.element.ownerDocument;\n var body = ownerDocument.body || ownerDocument.documentElement;\n this.body = body;\n this.scrollbarWidth = window.innerWidth - ownerDocument.documentElement.clientWidth;\n this.initialBodyPaddingRight = body.style.paddingRight;\n this.initialBodyComputedPaddingRight = window.getComputedStyle(body).paddingRight;\n },\n initContainer: function initContainer() {\n this.containerData = {\n width: window.innerWidth,\n height: window.innerHeight\n };\n },\n initViewer: function initViewer() {\n var options = this.options,\n parent = this.parent;\n var viewerData;\n if (options.inline) {\n viewerData = {\n width: Math.max(parent.offsetWidth, options.minWidth),\n height: Math.max(parent.offsetHeight, options.minHeight)\n };\n this.parentData = viewerData;\n }\n if (this.fulled || !viewerData) {\n viewerData = this.containerData;\n }\n this.viewerData = assign({}, viewerData);\n },\n renderViewer: function renderViewer() {\n if (this.options.inline && !this.fulled) {\n setStyle(this.viewer, this.viewerData);\n }\n },\n initList: function initList() {\n var _this = this;\n var element = this.element,\n options = this.options,\n list = this.list;\n var items = [];\n\n // initList may be called in this.update, so should keep idempotent\n list.innerHTML = '';\n forEach(this.images, function (image, index) {\n var src = image.src;\n var alt = image.alt || getImageNameFromURL(src);\n var url = _this.getImageURL(image);\n if (src || url) {\n var item = document.createElement('li');\n var img = document.createElement('img');\n forEach(options.inheritedAttributes, function (name) {\n var value = image.getAttribute(name);\n if (value !== null) {\n img.setAttribute(name, value);\n }\n });\n if (options.navbar) {\n img.src = src || url;\n }\n img.alt = alt;\n img.setAttribute('data-original-url', url || src);\n item.setAttribute('data-index', index);\n item.setAttribute('data-viewer-action', 'view');\n item.setAttribute('role', 'button');\n if (options.keyboard) {\n item.setAttribute('tabindex', 0);\n }\n item.appendChild(img);\n list.appendChild(item);\n items.push(item);\n }\n });\n this.items = items;\n forEach(items, function (item) {\n var image = item.firstElementChild;\n var onLoad;\n var onError;\n setData(image, 'filled', true);\n if (options.loading) {\n addClass(item, CLASS_LOADING);\n }\n addListener(image, EVENT_LOAD, onLoad = function onLoad(event) {\n removeListener(image, EVENT_ERROR, onError);\n if (options.loading) {\n removeClass(item, CLASS_LOADING);\n }\n _this.loadImage(event);\n }, {\n once: true\n });\n addListener(image, EVENT_ERROR, onError = function onError() {\n removeListener(image, EVENT_LOAD, onLoad);\n if (options.loading) {\n removeClass(item, CLASS_LOADING);\n }\n }, {\n once: true\n });\n });\n if (options.transition) {\n addListener(element, EVENT_VIEWED, function () {\n addClass(list, CLASS_TRANSITION);\n }, {\n once: true\n });\n }\n },\n renderList: function renderList() {\n var index = this.index;\n var item = this.items[index];\n if (!item) {\n return;\n }\n var next = item.nextElementSibling;\n var gutter = parseInt(window.getComputedStyle(next || item).marginLeft, 10);\n var offsetWidth = item.offsetWidth;\n var outerWidth = offsetWidth + gutter;\n\n // Place the active item in the center of the screen\n setStyle(this.list, assign({\n width: outerWidth * this.length - gutter\n }, getTransforms({\n translateX: (this.viewerData.width - offsetWidth) / 2 - outerWidth * index\n })));\n },\n resetList: function resetList() {\n var list = this.list;\n list.innerHTML = '';\n removeClass(list, CLASS_TRANSITION);\n setStyle(list, getTransforms({\n translateX: 0\n }));\n },\n initImage: function initImage(done) {\n var _this2 = this;\n var options = this.options,\n image = this.image,\n viewerData = this.viewerData;\n var footerHeight = this.footer.offsetHeight;\n var viewerWidth = viewerData.width;\n var viewerHeight = Math.max(viewerData.height - footerHeight, footerHeight);\n var oldImageData = this.imageData || {};\n var sizingImage;\n this.imageInitializing = {\n abort: function abort() {\n sizingImage.onload = null;\n }\n };\n sizingImage = getImageNaturalSizes(image, options, function (naturalWidth, naturalHeight) {\n var aspectRatio = naturalWidth / naturalHeight;\n var initialCoverage = Math.max(0, Math.min(1, options.initialCoverage));\n var width = viewerWidth;\n var height = viewerHeight;\n _this2.imageInitializing = false;\n if (viewerHeight * aspectRatio > viewerWidth) {\n height = viewerWidth / aspectRatio;\n } else {\n width = viewerHeight * aspectRatio;\n }\n initialCoverage = isNumber(initialCoverage) ? initialCoverage : 0.9;\n width = Math.min(width * initialCoverage, naturalWidth);\n height = Math.min(height * initialCoverage, naturalHeight);\n var left = (viewerWidth - width) / 2;\n var top = (viewerHeight - height) / 2;\n var imageData = {\n left: left,\n top: top,\n x: left,\n y: top,\n width: width,\n height: height,\n oldRatio: 1,\n ratio: width / naturalWidth,\n aspectRatio: aspectRatio,\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight\n };\n var initialImageData = assign({}, imageData);\n if (options.rotatable) {\n imageData.rotate = oldImageData.rotate || 0;\n initialImageData.rotate = 0;\n }\n if (options.scalable) {\n imageData.scaleX = oldImageData.scaleX || 1;\n imageData.scaleY = oldImageData.scaleY || 1;\n initialImageData.scaleX = 1;\n initialImageData.scaleY = 1;\n }\n _this2.imageData = imageData;\n _this2.initialImageData = initialImageData;\n if (done) {\n done();\n }\n });\n },\n renderImage: function renderImage(done) {\n var _this3 = this;\n var image = this.image,\n imageData = this.imageData;\n setStyle(image, assign({\n width: imageData.width,\n height: imageData.height,\n // XXX: Not to use translateX/Y to avoid image shaking when zooming\n marginLeft: imageData.x,\n marginTop: imageData.y\n }, getTransforms(imageData)));\n if (done) {\n if ((this.viewing || this.moving || this.rotating || this.scaling || this.zooming) && this.options.transition && hasClass(image, CLASS_TRANSITION)) {\n var onTransitionEnd = function onTransitionEnd() {\n _this3.imageRendering = false;\n done();\n };\n this.imageRendering = {\n abort: function abort() {\n removeListener(image, EVENT_TRANSITION_END, onTransitionEnd);\n }\n };\n addListener(image, EVENT_TRANSITION_END, onTransitionEnd, {\n once: true\n });\n } else {\n done();\n }\n }\n },\n resetImage: function resetImage() {\n var image = this.image;\n if (image) {\n if (this.viewing) {\n this.viewing.abort();\n }\n image.parentNode.removeChild(image);\n this.image = null;\n this.title.innerHTML = '';\n }\n }\n };\n\n var events = {\n bind: function bind() {\n var options = this.options,\n viewer = this.viewer,\n canvas = this.canvas;\n var document = this.element.ownerDocument;\n addListener(viewer, EVENT_CLICK, this.onClick = this.click.bind(this));\n addListener(viewer, EVENT_DRAG_START, this.onDragStart = this.dragstart.bind(this));\n addListener(canvas, EVENT_POINTER_DOWN, this.onPointerDown = this.pointerdown.bind(this));\n addListener(document, EVENT_POINTER_MOVE, this.onPointerMove = this.pointermove.bind(this));\n addListener(document, EVENT_POINTER_UP, this.onPointerUp = this.pointerup.bind(this));\n addListener(document, EVENT_KEY_DOWN, this.onKeyDown = this.keydown.bind(this));\n addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n if (options.zoomable && options.zoomOnWheel) {\n addListener(viewer, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n passive: false,\n capture: true\n });\n }\n if (options.toggleOnDblclick) {\n addListener(canvas, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n }\n },\n unbind: function unbind() {\n var options = this.options,\n viewer = this.viewer,\n canvas = this.canvas;\n var document = this.element.ownerDocument;\n removeListener(viewer, EVENT_CLICK, this.onClick);\n removeListener(viewer, EVENT_DRAG_START, this.onDragStart);\n removeListener(canvas, EVENT_POINTER_DOWN, this.onPointerDown);\n removeListener(document, EVENT_POINTER_MOVE, this.onPointerMove);\n removeListener(document, EVENT_POINTER_UP, this.onPointerUp);\n removeListener(document, EVENT_KEY_DOWN, this.onKeyDown);\n removeListener(window, EVENT_RESIZE, this.onResize);\n if (options.zoomable && options.zoomOnWheel) {\n removeListener(viewer, EVENT_WHEEL, this.onWheel, {\n passive: false,\n capture: true\n });\n }\n if (options.toggleOnDblclick) {\n removeListener(canvas, EVENT_DBLCLICK, this.onDblclick);\n }\n }\n };\n\n var handlers = {\n click: function click(event) {\n var options = this.options,\n imageData = this.imageData;\n var target = event.target;\n var action = getData(target, DATA_ACTION);\n if (!action && target.localName === 'img' && target.parentElement.localName === 'li') {\n target = target.parentElement;\n action = getData(target, DATA_ACTION);\n }\n\n // Cancel the emulated click when the native click event was triggered.\n if (IS_TOUCH_DEVICE && event.isTrusted && target === this.canvas) {\n clearTimeout(this.clickCanvasTimeout);\n }\n switch (action) {\n case 'mix':\n if (this.played) {\n this.stop();\n } else if (options.inline) {\n if (this.fulled) {\n this.exit();\n } else {\n this.full();\n }\n } else {\n this.hide();\n }\n break;\n case 'hide':\n if (!this.pointerMoved) {\n this.hide();\n }\n break;\n case 'view':\n this.view(getData(target, 'index'));\n break;\n case 'zoom-in':\n this.zoom(0.1, true);\n break;\n case 'zoom-out':\n this.zoom(-0.1, true);\n break;\n case 'one-to-one':\n this.toggle();\n break;\n case 'reset':\n this.reset();\n break;\n case 'prev':\n this.prev(options.loop);\n break;\n case 'play':\n this.play(options.fullscreen);\n break;\n case 'next':\n this.next(options.loop);\n break;\n case 'rotate-left':\n this.rotate(-90);\n break;\n case 'rotate-right':\n this.rotate(90);\n break;\n case 'flip-horizontal':\n this.scaleX(-imageData.scaleX || -1);\n break;\n case 'flip-vertical':\n this.scaleY(-imageData.scaleY || -1);\n break;\n default:\n if (this.played) {\n this.stop();\n }\n }\n },\n dblclick: function dblclick(event) {\n event.preventDefault();\n if (this.viewed && event.target === this.image) {\n // Cancel the emulated double click when the native dblclick event was triggered.\n if (IS_TOUCH_DEVICE && event.isTrusted) {\n clearTimeout(this.doubleClickImageTimeout);\n }\n\n // XXX: No pageX/Y properties in custom event, fallback to the original event.\n this.toggle(event.isTrusted ? event : event.detail && event.detail.originalEvent);\n }\n },\n load: function load() {\n var _this = this;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = false;\n }\n var element = this.element,\n options = this.options,\n image = this.image,\n index = this.index,\n viewerData = this.viewerData;\n removeClass(image, CLASS_INVISIBLE);\n if (options.loading) {\n removeClass(this.canvas, CLASS_LOADING);\n }\n image.style.cssText = 'height:0;' + \"margin-left:\".concat(viewerData.width / 2, \"px;\") + \"margin-top:\".concat(viewerData.height / 2, \"px;\") + 'max-width:none!important;' + 'position:relative;' + 'width:0;';\n this.initImage(function () {\n toggleClass(image, CLASS_MOVE, options.movable);\n toggleClass(image, CLASS_TRANSITION, options.transition);\n _this.renderImage(function () {\n _this.viewed = true;\n _this.viewing = false;\n if (isFunction(options.viewed)) {\n addListener(element, EVENT_VIEWED, options.viewed, {\n once: true\n });\n }\n dispatchEvent(element, EVENT_VIEWED, {\n originalImage: _this.images[index],\n index: index,\n image: image\n }, {\n cancelable: false\n });\n });\n });\n },\n loadImage: function loadImage(event) {\n var image = event.target;\n var parent = image.parentNode;\n var parentWidth = parent.offsetWidth || 30;\n var parentHeight = parent.offsetHeight || 50;\n var filled = !!getData(image, 'filled');\n getImageNaturalSizes(image, this.options, function (naturalWidth, naturalHeight) {\n var aspectRatio = naturalWidth / naturalHeight;\n var width = parentWidth;\n var height = parentHeight;\n if (parentHeight * aspectRatio > parentWidth) {\n if (filled) {\n width = parentHeight * aspectRatio;\n } else {\n height = parentWidth / aspectRatio;\n }\n } else if (filled) {\n height = parentWidth / aspectRatio;\n } else {\n width = parentHeight * aspectRatio;\n }\n setStyle(image, assign({\n width: width,\n height: height\n }, getTransforms({\n translateX: (parentWidth - width) / 2,\n translateY: (parentHeight - height) / 2\n })));\n });\n },\n keydown: function keydown(event) {\n var options = this.options;\n if (!options.keyboard) {\n return;\n }\n var keyCode = event.keyCode || event.which || event.charCode;\n switch (keyCode) {\n // Enter\n case 13:\n if (this.viewer.contains(event.target)) {\n this.click(event);\n }\n break;\n }\n if (!this.fulled) {\n return;\n }\n switch (keyCode) {\n // Escape\n case 27:\n if (this.played) {\n this.stop();\n } else if (options.inline) {\n if (this.fulled) {\n this.exit();\n }\n } else {\n this.hide();\n }\n break;\n\n // Space\n case 32:\n if (this.played) {\n this.stop();\n }\n break;\n\n // ArrowLeft\n case 37:\n if (this.played && this.playing) {\n this.playing.prev();\n } else {\n this.prev(options.loop);\n }\n break;\n\n // ArrowUp\n case 38:\n // Prevent scroll on Firefox\n event.preventDefault();\n\n // Zoom in\n this.zoom(options.zoomRatio, true);\n break;\n\n // ArrowRight\n case 39:\n if (this.played && this.playing) {\n this.playing.next();\n } else {\n this.next(options.loop);\n }\n break;\n\n // ArrowDown\n case 40:\n // Prevent scroll on Firefox\n event.preventDefault();\n\n // Zoom out\n this.zoom(-options.zoomRatio, true);\n break;\n\n // Ctrl + 0\n case 48:\n // Fall through\n\n // Ctrl + 1\n // eslint-disable-next-line no-fallthrough\n case 49:\n if (event.ctrlKey) {\n event.preventDefault();\n this.toggle();\n }\n break;\n }\n },\n dragstart: function dragstart(event) {\n if (event.target.localName === 'img') {\n event.preventDefault();\n }\n },\n pointerdown: function pointerdown(event) {\n var options = this.options,\n pointers = this.pointers;\n var buttons = event.buttons,\n button = event.button;\n this.pointerMoved = false;\n if (!this.viewed || this.showing || this.viewing || this.hiding\n\n // Handle mouse event and pointer event and ignore touch event\n || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && (\n // No primary button (Usually the left button)\n isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0\n\n // Open context menu\n || event.ctrlKey)) {\n return;\n }\n\n // Prevent default behaviours as page zooming in touch devices.\n event.preventDefault();\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n pointers[touch.identifier] = getPointer(touch);\n });\n } else {\n pointers[event.pointerId || 0] = getPointer(event);\n }\n var action = options.movable ? ACTION_MOVE : false;\n if (options.zoomOnTouch && options.zoomable && Object.keys(pointers).length > 1) {\n action = ACTION_ZOOM;\n } else if (options.slideOnTouch && (event.pointerType === 'touch' || event.type === 'touchstart') && this.isSwitchable()) {\n action = ACTION_SWITCH;\n }\n if (options.transition && (action === ACTION_MOVE || action === ACTION_ZOOM)) {\n removeClass(this.image, CLASS_TRANSITION);\n }\n this.action = action;\n },\n pointermove: function pointermove(event) {\n var pointers = this.pointers,\n action = this.action;\n if (!this.viewed || !action) {\n return;\n }\n event.preventDefault();\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n });\n } else {\n assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n }\n this.change(event);\n },\n pointerup: function pointerup(event) {\n var _this2 = this;\n var options = this.options,\n action = this.action,\n pointers = this.pointers;\n var pointer;\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n pointer = pointers[touch.identifier];\n delete pointers[touch.identifier];\n });\n } else {\n pointer = pointers[event.pointerId || 0];\n delete pointers[event.pointerId || 0];\n }\n if (!action) {\n return;\n }\n event.preventDefault();\n if (options.transition && (action === ACTION_MOVE || action === ACTION_ZOOM)) {\n addClass(this.image, CLASS_TRANSITION);\n }\n this.action = false;\n\n // Emulate click and double click in touch devices to support backdrop and image zooming (#210).\n if (IS_TOUCH_DEVICE && action !== ACTION_ZOOM && pointer && Date.now() - pointer.timeStamp < 500) {\n clearTimeout(this.clickCanvasTimeout);\n clearTimeout(this.doubleClickImageTimeout);\n if (options.toggleOnDblclick && this.viewed && event.target === this.image) {\n if (this.imageClicked) {\n this.imageClicked = false;\n\n // This timeout will be cleared later when a native dblclick event is triggering\n this.doubleClickImageTimeout = setTimeout(function () {\n dispatchEvent(_this2.image, EVENT_DBLCLICK, {\n originalEvent: event\n });\n }, 50);\n } else {\n this.imageClicked = true;\n\n // The default timing of a double click in Windows is 500 ms\n this.doubleClickImageTimeout = setTimeout(function () {\n _this2.imageClicked = false;\n }, 500);\n }\n } else {\n this.imageClicked = false;\n if (options.backdrop && options.backdrop !== 'static' && event.target === this.canvas) {\n // This timeout will be cleared later when a native click event is triggering\n this.clickCanvasTimeout = setTimeout(function () {\n dispatchEvent(_this2.canvas, EVENT_CLICK, {\n originalEvent: event\n });\n }, 50);\n }\n }\n }\n },\n resize: function resize() {\n var _this3 = this;\n if (!this.isShown || this.hiding) {\n return;\n }\n if (this.fulled) {\n this.close();\n this.initBody();\n this.open();\n }\n this.initContainer();\n this.initViewer();\n this.renderViewer();\n this.renderList();\n if (this.viewed) {\n this.initImage(function () {\n _this3.renderImage();\n });\n }\n if (this.played) {\n if (this.options.fullscreen && this.fulled && !(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement)) {\n this.stop();\n return;\n }\n forEach(this.player.getElementsByTagName('img'), function (image) {\n addListener(image, EVENT_LOAD, _this3.loadImage.bind(_this3), {\n once: true\n });\n dispatchEvent(image, EVENT_LOAD);\n });\n }\n },\n wheel: function wheel(event) {\n var _this4 = this;\n if (!this.viewed) {\n return;\n }\n event.preventDefault();\n\n // Limit wheel speed to prevent zoom too fast\n if (this.wheeling) {\n return;\n }\n this.wheeling = true;\n setTimeout(function () {\n _this4.wheeling = false;\n }, 50);\n var ratio = Number(this.options.zoomRatio) || 0.1;\n var delta = 1;\n if (event.deltaY) {\n delta = event.deltaY > 0 ? 1 : -1;\n } else if (event.wheelDelta) {\n delta = -event.wheelDelta / 120;\n } else if (event.detail) {\n delta = event.detail > 0 ? 1 : -1;\n }\n this.zoom(-delta * ratio, true, null, event);\n }\n };\n\n var methods = {\n /** Show the viewer (only available in modal mode)\n * @param {boolean} [immediate=false] - Indicates if show the viewer immediately or not.\n * @returns {Viewer} this\n */\n show: function show() {\n var immediate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var element = this.element,\n options = this.options;\n if (options.inline || this.showing || this.isShown || this.showing) {\n return this;\n }\n if (!this.ready) {\n this.build();\n if (this.ready) {\n this.show(immediate);\n }\n return this;\n }\n if (isFunction(options.show)) {\n addListener(element, EVENT_SHOW, options.show, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_SHOW) === false || !this.ready) {\n return this;\n }\n if (this.hiding) {\n this.transitioning.abort();\n }\n this.showing = true;\n this.open();\n var viewer = this.viewer;\n removeClass(viewer, CLASS_HIDE);\n viewer.setAttribute('role', 'dialog');\n viewer.setAttribute('aria-labelledby', this.title.id);\n viewer.setAttribute('aria-modal', true);\n viewer.removeAttribute('aria-hidden');\n if (options.transition && !immediate) {\n var shown = this.shown.bind(this);\n this.transitioning = {\n abort: function abort() {\n removeListener(viewer, EVENT_TRANSITION_END, shown);\n removeClass(viewer, CLASS_IN);\n }\n };\n addClass(viewer, CLASS_TRANSITION);\n\n // Force reflow to enable CSS3 transition\n viewer.initialOffsetWidth = viewer.offsetWidth;\n addListener(viewer, EVENT_TRANSITION_END, shown, {\n once: true\n });\n addClass(viewer, CLASS_IN);\n } else {\n addClass(viewer, CLASS_IN);\n this.shown();\n }\n return this;\n },\n /**\n * Hide the viewer (only available in modal mode)\n * @param {boolean} [immediate=false] - Indicates if hide the viewer immediately or not.\n * @returns {Viewer} this\n */\n hide: function hide() {\n var _this = this;\n var immediate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var element = this.element,\n options = this.options;\n if (options.inline || this.hiding || !(this.isShown || this.showing)) {\n return this;\n }\n if (isFunction(options.hide)) {\n addListener(element, EVENT_HIDE, options.hide, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_HIDE) === false) {\n return this;\n }\n if (this.showing) {\n this.transitioning.abort();\n }\n this.hiding = true;\n if (this.played) {\n this.stop();\n } else if (this.viewing) {\n this.viewing.abort();\n }\n var viewer = this.viewer,\n image = this.image;\n var hideImmediately = function hideImmediately() {\n removeClass(viewer, CLASS_IN);\n _this.hidden();\n };\n if (options.transition && !immediate) {\n var onViewerTransitionEnd = function onViewerTransitionEnd(event) {\n // Ignore all propagating `transitionend` events (#275).\n if (event && event.target === viewer) {\n removeListener(viewer, EVENT_TRANSITION_END, onViewerTransitionEnd);\n _this.hidden();\n }\n };\n var onImageTransitionEnd = function onImageTransitionEnd() {\n // In case of show the viewer by `viewer.show(true)` previously (#407).\n if (hasClass(viewer, CLASS_TRANSITION)) {\n addListener(viewer, EVENT_TRANSITION_END, onViewerTransitionEnd);\n removeClass(viewer, CLASS_IN);\n } else {\n hideImmediately();\n }\n };\n this.transitioning = {\n abort: function abort() {\n if (_this.viewed && hasClass(image, CLASS_TRANSITION)) {\n removeListener(image, EVENT_TRANSITION_END, onImageTransitionEnd);\n } else if (hasClass(viewer, CLASS_TRANSITION)) {\n removeListener(viewer, EVENT_TRANSITION_END, onViewerTransitionEnd);\n }\n }\n };\n\n // In case of hiding the viewer when holding on the image (#255),\n // note that the `CLASS_TRANSITION` class will be removed on pointer down.\n if (this.viewed && hasClass(image, CLASS_TRANSITION)) {\n addListener(image, EVENT_TRANSITION_END, onImageTransitionEnd, {\n once: true\n });\n this.zoomTo(0, false, null, null, true);\n } else {\n onImageTransitionEnd();\n }\n } else {\n hideImmediately();\n }\n return this;\n },\n /**\n * View one of the images with image's index\n * @param {number} index - The index of the image to view.\n * @returns {Viewer} this\n */\n view: function view() {\n var _this2 = this;\n var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.options.initialViewIndex;\n index = Number(index) || 0;\n if (this.hiding || this.played || index < 0 || index >= this.length || this.viewed && index === this.index) {\n return this;\n }\n if (!this.isShown) {\n this.index = index;\n return this.show();\n }\n if (this.viewing) {\n this.viewing.abort();\n }\n var element = this.element,\n options = this.options,\n title = this.title,\n canvas = this.canvas;\n var item = this.items[index];\n var img = item.querySelector('img');\n var url = getData(img, 'originalUrl');\n var alt = img.getAttribute('alt');\n var image = document.createElement('img');\n forEach(options.inheritedAttributes, function (name) {\n var value = img.getAttribute(name);\n if (value !== null) {\n image.setAttribute(name, value);\n }\n });\n image.src = url;\n image.alt = alt;\n if (isFunction(options.view)) {\n addListener(element, EVENT_VIEW, options.view, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_VIEW, {\n originalImage: this.images[index],\n index: index,\n image: image\n }) === false || !this.isShown || this.hiding || this.played) {\n return this;\n }\n var activeItem = this.items[this.index];\n if (activeItem) {\n removeClass(activeItem, CLASS_ACTIVE);\n activeItem.removeAttribute('aria-selected');\n }\n addClass(item, CLASS_ACTIVE);\n item.setAttribute('aria-selected', true);\n if (options.focus) {\n item.focus();\n }\n this.image = image;\n this.viewed = false;\n this.index = index;\n this.imageData = {};\n addClass(image, CLASS_INVISIBLE);\n if (options.loading) {\n addClass(canvas, CLASS_LOADING);\n }\n canvas.innerHTML = '';\n canvas.appendChild(image);\n\n // Center current item\n this.renderList();\n\n // Clear title\n title.innerHTML = '';\n\n // Generate title after viewed\n var onViewed = function onViewed() {\n var imageData = _this2.imageData;\n var render = Array.isArray(options.title) ? options.title[1] : options.title;\n title.innerHTML = escapeHTMLEntities(isFunction(render) ? render.call(_this2, image, imageData) : \"\".concat(alt, \" (\").concat(imageData.naturalWidth, \" \\xD7 \").concat(imageData.naturalHeight, \")\"));\n };\n var onLoad;\n var onError;\n addListener(element, EVENT_VIEWED, onViewed, {\n once: true\n });\n this.viewing = {\n abort: function abort() {\n removeListener(element, EVENT_VIEWED, onViewed);\n if (image.complete) {\n if (_this2.imageRendering) {\n _this2.imageRendering.abort();\n } else if (_this2.imageInitializing) {\n _this2.imageInitializing.abort();\n }\n } else {\n // Cancel download to save bandwidth.\n image.src = '';\n removeListener(image, EVENT_LOAD, onLoad);\n if (_this2.timeout) {\n clearTimeout(_this2.timeout);\n }\n }\n }\n };\n if (image.complete) {\n this.load();\n } else {\n addListener(image, EVENT_LOAD, onLoad = function onLoad() {\n removeListener(image, EVENT_ERROR, onError);\n _this2.load();\n }, {\n once: true\n });\n addListener(image, EVENT_ERROR, onError = function onError() {\n removeListener(image, EVENT_LOAD, onLoad);\n if (_this2.timeout) {\n clearTimeout(_this2.timeout);\n _this2.timeout = false;\n }\n removeClass(image, CLASS_INVISIBLE);\n if (options.loading) {\n removeClass(_this2.canvas, CLASS_LOADING);\n }\n }, {\n once: true\n });\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n\n // Make the image visible if it fails to load within 1s\n this.timeout = setTimeout(function () {\n removeClass(image, CLASS_INVISIBLE);\n _this2.timeout = false;\n }, 1000);\n }\n return this;\n },\n /**\n * View the previous image\n * @param {boolean} [loop=false] - Indicate if view the last one\n * when it is the first one at present.\n * @returns {Viewer} this\n */\n prev: function prev() {\n var loop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var index = this.index - 1;\n if (index < 0) {\n index = loop ? this.length - 1 : 0;\n }\n this.view(index);\n return this;\n },\n /**\n * View the next image\n * @param {boolean} [loop=false] - Indicate if view the first one\n * when it is the last one at present.\n * @returns {Viewer} this\n */\n next: function next() {\n var loop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var maxIndex = this.length - 1;\n var index = this.index + 1;\n if (index > maxIndex) {\n index = loop ? 0 : maxIndex;\n }\n this.view(index);\n return this;\n },\n /**\n * Move the image with relative offsets.\n * @param {number} x - The moving distance in the horizontal direction.\n * @param {number} [y=x] The moving distance in the vertical direction.\n * @returns {Viewer} this\n */\n move: function move(x) {\n var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n var imageData = this.imageData;\n this.moveTo(isUndefined(x) ? x : imageData.x + Number(x), isUndefined(y) ? y : imageData.y + Number(y));\n return this;\n },\n /**\n * Move the image to an absolute point.\n * @param {number} x - The new position in the horizontal direction.\n * @param {number} [y=x] - The new position in the vertical direction.\n * @param {Event} [_originalEvent=null] - The original event if any.\n * @returns {Viewer} this\n */\n moveTo: function moveTo(x) {\n var _this3 = this;\n var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n var _originalEvent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var element = this.element,\n options = this.options,\n imageData = this.imageData;\n x = Number(x);\n y = Number(y);\n if (this.viewed && !this.played && options.movable) {\n var oldX = imageData.x;\n var oldY = imageData.y;\n var changed = false;\n if (isNumber(x)) {\n changed = true;\n } else {\n x = oldX;\n }\n if (isNumber(y)) {\n changed = true;\n } else {\n y = oldY;\n }\n if (changed) {\n if (isFunction(options.move)) {\n addListener(element, EVENT_MOVE, options.move, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_MOVE, {\n x: x,\n y: y,\n oldX: oldX,\n oldY: oldY,\n originalEvent: _originalEvent\n }) === false) {\n return this;\n }\n imageData.x = x;\n imageData.y = y;\n imageData.left = x;\n imageData.top = y;\n this.moving = true;\n this.renderImage(function () {\n _this3.moving = false;\n if (isFunction(options.moved)) {\n addListener(element, EVENT_MOVED, options.moved, {\n once: true\n });\n }\n dispatchEvent(element, EVENT_MOVED, {\n x: x,\n y: y,\n oldX: oldX,\n oldY: oldY,\n originalEvent: _originalEvent\n }, {\n cancelable: false\n });\n });\n }\n }\n return this;\n },\n /**\n * Rotate the image with a relative degree.\n * @param {number} degree - The rotate degree.\n * @returns {Viewer} this\n */\n rotate: function rotate(degree) {\n this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n return this;\n },\n /**\n * Rotate the image to an absolute degree.\n * @param {number} degree - The rotate degree.\n * @returns {Viewer} this\n */\n rotateTo: function rotateTo(degree) {\n var _this4 = this;\n var element = this.element,\n options = this.options,\n imageData = this.imageData;\n degree = Number(degree);\n if (isNumber(degree) && this.viewed && !this.played && options.rotatable) {\n var oldDegree = imageData.rotate;\n if (isFunction(options.rotate)) {\n addListener(element, EVENT_ROTATE, options.rotate, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_ROTATE, {\n degree: degree,\n oldDegree: oldDegree\n }) === false) {\n return this;\n }\n imageData.rotate = degree;\n this.rotating = true;\n this.renderImage(function () {\n _this4.rotating = false;\n if (isFunction(options.rotated)) {\n addListener(element, EVENT_ROTATED, options.rotated, {\n once: true\n });\n }\n dispatchEvent(element, EVENT_ROTATED, {\n degree: degree,\n oldDegree: oldDegree\n }, {\n cancelable: false\n });\n });\n }\n return this;\n },\n /**\n * Scale the image on the x-axis.\n * @param {number} scaleX - The scale ratio on the x-axis.\n * @returns {Viewer} this\n */\n scaleX: function scaleX(_scaleX) {\n this.scale(_scaleX, this.imageData.scaleY);\n return this;\n },\n /**\n * Scale the image on the y-axis.\n * @param {number} scaleY - The scale ratio on the y-axis.\n * @returns {Viewer} this\n */\n scaleY: function scaleY(_scaleY) {\n this.scale(this.imageData.scaleX, _scaleY);\n return this;\n },\n /**\n * Scale the image.\n * @param {number} scaleX - The scale ratio on the x-axis.\n * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n * @returns {Viewer} this\n */\n scale: function scale(scaleX) {\n var _this5 = this;\n var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n var element = this.element,\n options = this.options,\n imageData = this.imageData;\n scaleX = Number(scaleX);\n scaleY = Number(scaleY);\n if (this.viewed && !this.played && options.scalable) {\n var oldScaleX = imageData.scaleX;\n var oldScaleY = imageData.scaleY;\n var changed = false;\n if (isNumber(scaleX)) {\n changed = true;\n } else {\n scaleX = oldScaleX;\n }\n if (isNumber(scaleY)) {\n changed = true;\n } else {\n scaleY = oldScaleY;\n }\n if (changed) {\n if (isFunction(options.scale)) {\n addListener(element, EVENT_SCALE, options.scale, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_SCALE, {\n scaleX: scaleX,\n scaleY: scaleY,\n oldScaleX: oldScaleX,\n oldScaleY: oldScaleY\n }) === false) {\n return this;\n }\n imageData.scaleX = scaleX;\n imageData.scaleY = scaleY;\n this.scaling = true;\n this.renderImage(function () {\n _this5.scaling = false;\n if (isFunction(options.scaled)) {\n addListener(element, EVENT_SCALED, options.scaled, {\n once: true\n });\n }\n dispatchEvent(element, EVENT_SCALED, {\n scaleX: scaleX,\n scaleY: scaleY,\n oldScaleX: oldScaleX,\n oldScaleY: oldScaleY\n }, {\n cancelable: false\n });\n });\n }\n }\n return this;\n },\n /**\n * Zoom the image with a relative ratio.\n * @param {number} ratio - The target ratio.\n * @param {boolean} [showTooltip=false] - Indicates whether to show the tooltip.\n * @param {Object} [pivot] - The pivot point coordinate for zooming.\n * @param {Event} [_originalEvent=null] - The original event if any.\n * @returns {Viewer} this\n */\n zoom: function zoom(ratio) {\n var showTooltip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var pivot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var _originalEvent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n var imageData = this.imageData;\n ratio = Number(ratio);\n if (ratio < 0) {\n ratio = 1 / (1 - ratio);\n } else {\n ratio = 1 + ratio;\n }\n this.zoomTo(imageData.width * ratio / imageData.naturalWidth, showTooltip, pivot, _originalEvent);\n return this;\n },\n /**\n * Zoom the image to an absolute ratio.\n * @param {number} ratio - The target ratio.\n * @param {boolean} [showTooltip] - Indicates whether to show the tooltip.\n * @param {Object} [pivot] - The pivot point coordinate for zooming.\n * @param {Event} [_originalEvent=null] - The original event if any.\n * @param {Event} [_zoomable=false] - Indicates if the current zoom is available or not.\n * @returns {Viewer} this\n */\n zoomTo: function zoomTo(ratio) {\n var _this6 = this;\n var showTooltip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var pivot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var _originalEvent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n var _zoomable = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var element = this.element,\n options = this.options,\n pointers = this.pointers,\n imageData = this.imageData;\n var x = imageData.x,\n y = imageData.y,\n width = imageData.width,\n height = imageData.height,\n naturalWidth = imageData.naturalWidth,\n naturalHeight = imageData.naturalHeight;\n ratio = Math.max(0, ratio);\n if (isNumber(ratio) && this.viewed && !this.played && (_zoomable || options.zoomable)) {\n if (!_zoomable) {\n var minZoomRatio = Math.max(0.01, options.minZoomRatio);\n var maxZoomRatio = Math.min(100, options.maxZoomRatio);\n ratio = Math.min(Math.max(ratio, minZoomRatio), maxZoomRatio);\n }\n if (_originalEvent) {\n switch (_originalEvent.type) {\n case 'wheel':\n if (options.zoomRatio >= 0.055 && ratio > 0.95 && ratio < 1.05) {\n ratio = 1;\n }\n break;\n case 'pointermove':\n case 'touchmove':\n case 'mousemove':\n if (ratio > 0.99 && ratio < 1.01) {\n ratio = 1;\n }\n break;\n }\n }\n var newWidth = naturalWidth * ratio;\n var newHeight = naturalHeight * ratio;\n var offsetWidth = newWidth - width;\n var offsetHeight = newHeight - height;\n var oldRatio = imageData.ratio;\n if (isFunction(options.zoom)) {\n addListener(element, EVENT_ZOOM, options.zoom, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_ZOOM, {\n ratio: ratio,\n oldRatio: oldRatio,\n originalEvent: _originalEvent\n }) === false) {\n return this;\n }\n this.zooming = true;\n if (_originalEvent) {\n var offset = getOffset(this.viewer);\n var center = pointers && Object.keys(pointers).length > 0 ? getPointersCenter(pointers) : {\n pageX: _originalEvent.pageX,\n pageY: _originalEvent.pageY\n };\n\n // Zoom from the triggering point of the event\n imageData.x -= offsetWidth * ((center.pageX - offset.left - x) / width);\n imageData.y -= offsetHeight * ((center.pageY - offset.top - y) / height);\n } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n imageData.x -= offsetWidth * ((pivot.x - x) / width);\n imageData.y -= offsetHeight * ((pivot.y - y) / height);\n } else {\n // Zoom from the center of the image\n imageData.x -= offsetWidth / 2;\n imageData.y -= offsetHeight / 2;\n }\n imageData.left = imageData.x;\n imageData.top = imageData.y;\n imageData.width = newWidth;\n imageData.height = newHeight;\n imageData.oldRatio = oldRatio;\n imageData.ratio = ratio;\n this.renderImage(function () {\n _this6.zooming = false;\n if (isFunction(options.zoomed)) {\n addListener(element, EVENT_ZOOMED, options.zoomed, {\n once: true\n });\n }\n dispatchEvent(element, EVENT_ZOOMED, {\n ratio: ratio,\n oldRatio: oldRatio,\n originalEvent: _originalEvent\n }, {\n cancelable: false\n });\n });\n if (showTooltip) {\n this.tooltip();\n }\n }\n return this;\n },\n /**\n * Play the images\n * @param {boolean|FullscreenOptions} [fullscreen=false] - Indicate if request fullscreen or not.\n * @returns {Viewer} this\n */\n play: function play() {\n var _this7 = this;\n var fullscreen = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n if (!this.isShown || this.played) {\n return this;\n }\n var element = this.element,\n options = this.options;\n if (isFunction(options.play)) {\n addListener(element, EVENT_PLAY, options.play, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_PLAY) === false) {\n return this;\n }\n var player = this.player;\n var onLoad = this.loadImage.bind(this);\n var list = [];\n var total = 0;\n var index = 0;\n this.played = true;\n this.onLoadWhenPlay = onLoad;\n if (fullscreen) {\n this.requestFullscreen(fullscreen);\n }\n addClass(player, CLASS_SHOW);\n forEach(this.items, function (item, i) {\n var img = item.querySelector('img');\n var image = document.createElement('img');\n image.src = getData(img, 'originalUrl');\n image.alt = img.getAttribute('alt');\n image.referrerPolicy = img.referrerPolicy;\n total += 1;\n addClass(image, CLASS_FADE);\n toggleClass(image, CLASS_TRANSITION, options.transition);\n if (hasClass(item, CLASS_ACTIVE)) {\n addClass(image, CLASS_IN);\n index = i;\n }\n list.push(image);\n addListener(image, EVENT_LOAD, onLoad, {\n once: true\n });\n player.appendChild(image);\n });\n if (isNumber(options.interval) && options.interval > 0) {\n var prev = function prev() {\n clearTimeout(_this7.playing.timeout);\n removeClass(list[index], CLASS_IN);\n index -= 1;\n index = index >= 0 ? index : total - 1;\n addClass(list[index], CLASS_IN);\n _this7.playing.timeout = setTimeout(prev, options.interval);\n };\n var next = function next() {\n clearTimeout(_this7.playing.timeout);\n removeClass(list[index], CLASS_IN);\n index += 1;\n index = index < total ? index : 0;\n addClass(list[index], CLASS_IN);\n _this7.playing.timeout = setTimeout(next, options.interval);\n };\n if (total > 1) {\n this.playing = {\n prev: prev,\n next: next,\n timeout: setTimeout(next, options.interval)\n };\n }\n }\n return this;\n },\n // Stop play\n stop: function stop() {\n var _this8 = this;\n if (!this.played) {\n return this;\n }\n var element = this.element,\n options = this.options;\n if (isFunction(options.stop)) {\n addListener(element, EVENT_STOP, options.stop, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_STOP) === false) {\n return this;\n }\n var player = this.player;\n clearTimeout(this.playing.timeout);\n this.playing = false;\n this.played = false;\n forEach(player.getElementsByTagName('img'), function (image) {\n removeListener(image, EVENT_LOAD, _this8.onLoadWhenPlay);\n });\n removeClass(player, CLASS_SHOW);\n player.innerHTML = '';\n this.exitFullscreen();\n return this;\n },\n // Enter modal mode (only available in inline mode)\n full: function full() {\n var _this9 = this;\n var options = this.options,\n viewer = this.viewer,\n image = this.image,\n list = this.list;\n if (!this.isShown || this.played || this.fulled || !options.inline) {\n return this;\n }\n this.fulled = true;\n this.open();\n addClass(this.button, CLASS_FULLSCREEN_EXIT);\n if (options.transition) {\n removeClass(list, CLASS_TRANSITION);\n if (this.viewed) {\n removeClass(image, CLASS_TRANSITION);\n }\n }\n addClass(viewer, CLASS_FIXED);\n viewer.setAttribute('role', 'dialog');\n viewer.setAttribute('aria-labelledby', this.title.id);\n viewer.setAttribute('aria-modal', true);\n viewer.removeAttribute('style');\n setStyle(viewer, {\n zIndex: options.zIndex\n });\n if (options.focus) {\n this.enforceFocus();\n }\n this.initContainer();\n this.viewerData = assign({}, this.containerData);\n this.renderList();\n if (this.viewed) {\n this.initImage(function () {\n _this9.renderImage(function () {\n if (options.transition) {\n setTimeout(function () {\n addClass(image, CLASS_TRANSITION);\n addClass(list, CLASS_TRANSITION);\n }, 0);\n }\n });\n });\n }\n return this;\n },\n // Exit modal mode (only available in inline mode)\n exit: function exit() {\n var _this10 = this;\n var options = this.options,\n viewer = this.viewer,\n image = this.image,\n list = this.list;\n if (!this.isShown || this.played || !this.fulled || !options.inline) {\n return this;\n }\n this.fulled = false;\n this.close();\n removeClass(this.button, CLASS_FULLSCREEN_EXIT);\n if (options.transition) {\n removeClass(list, CLASS_TRANSITION);\n if (this.viewed) {\n removeClass(image, CLASS_TRANSITION);\n }\n }\n if (options.focus) {\n this.clearEnforceFocus();\n }\n viewer.removeAttribute('role');\n viewer.removeAttribute('aria-labelledby');\n viewer.removeAttribute('aria-modal');\n removeClass(viewer, CLASS_FIXED);\n setStyle(viewer, {\n zIndex: options.zIndexInline\n });\n this.viewerData = assign({}, this.parentData);\n this.renderViewer();\n this.renderList();\n if (this.viewed) {\n this.initImage(function () {\n _this10.renderImage(function () {\n if (options.transition) {\n setTimeout(function () {\n addClass(image, CLASS_TRANSITION);\n addClass(list, CLASS_TRANSITION);\n }, 0);\n }\n });\n });\n }\n return this;\n },\n // Show the current ratio of the image with percentage\n tooltip: function tooltip() {\n var _this11 = this;\n var options = this.options,\n tooltipBox = this.tooltipBox,\n imageData = this.imageData;\n if (!this.viewed || this.played || !options.tooltip) {\n return this;\n }\n tooltipBox.textContent = \"\".concat(Math.round(imageData.ratio * 100), \"%\");\n if (!this.tooltipping) {\n if (options.transition) {\n if (this.fading) {\n dispatchEvent(tooltipBox, EVENT_TRANSITION_END);\n }\n addClass(tooltipBox, CLASS_SHOW);\n addClass(tooltipBox, CLASS_FADE);\n addClass(tooltipBox, CLASS_TRANSITION);\n tooltipBox.removeAttribute('aria-hidden');\n\n // Force reflow to enable CSS3 transition\n tooltipBox.initialOffsetWidth = tooltipBox.offsetWidth;\n addClass(tooltipBox, CLASS_IN);\n } else {\n addClass(tooltipBox, CLASS_SHOW);\n tooltipBox.removeAttribute('aria-hidden');\n }\n } else {\n clearTimeout(this.tooltipping);\n }\n this.tooltipping = setTimeout(function () {\n if (options.transition) {\n addListener(tooltipBox, EVENT_TRANSITION_END, function () {\n removeClass(tooltipBox, CLASS_SHOW);\n removeClass(tooltipBox, CLASS_FADE);\n removeClass(tooltipBox, CLASS_TRANSITION);\n tooltipBox.setAttribute('aria-hidden', true);\n _this11.fading = false;\n }, {\n once: true\n });\n removeClass(tooltipBox, CLASS_IN);\n _this11.fading = true;\n } else {\n removeClass(tooltipBox, CLASS_SHOW);\n tooltipBox.setAttribute('aria-hidden', true);\n }\n _this11.tooltipping = false;\n }, 1000);\n return this;\n },\n /**\n * Toggle the image size between its current size and natural size\n * @param {Event} [_originalEvent=null] - The original event if any.\n * @returns {Viewer} this\n */\n toggle: function toggle() {\n var _originalEvent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (this.imageData.ratio === 1) {\n this.zoomTo(this.imageData.oldRatio, true, null, _originalEvent);\n } else {\n this.zoomTo(1, true, null, _originalEvent);\n }\n return this;\n },\n // Reset the image to its initial state\n reset: function reset() {\n if (this.viewed && !this.played) {\n this.imageData = assign({}, this.initialImageData);\n this.renderImage();\n }\n return this;\n },\n // Update viewer when images changed\n update: function update() {\n var _this12 = this;\n var element = this.element,\n options = this.options,\n isImg = this.isImg;\n\n // Destroy viewer if the target image was deleted\n if (isImg && !element.parentNode) {\n return this.destroy();\n }\n var images = [];\n forEach(isImg ? [element] : element.querySelectorAll('img'), function (image) {\n if (isFunction(options.filter)) {\n if (options.filter.call(_this12, image)) {\n images.push(image);\n }\n } else if (_this12.getImageURL(image)) {\n images.push(image);\n }\n });\n if (!images.length) {\n return this;\n }\n this.images = images;\n this.length = images.length;\n if (this.ready) {\n var changedIndexes = [];\n forEach(this.items, function (item, i) {\n var img = item.querySelector('img');\n var image = images[i];\n if (image && img) {\n if (image.src !== img.src\n\n // Title changed (#408)\n || image.alt !== img.alt) {\n changedIndexes.push(i);\n }\n } else {\n changedIndexes.push(i);\n }\n });\n setStyle(this.list, {\n width: 'auto'\n });\n this.initList();\n if (this.isShown) {\n if (this.length) {\n if (this.viewed) {\n var changedIndex = changedIndexes.indexOf(this.index);\n if (changedIndex >= 0) {\n this.viewed = false;\n this.view(Math.max(Math.min(this.index - changedIndex, this.length - 1), 0));\n } else {\n var activeItem = this.items[this.index];\n\n // Reactivate the current viewing item after reset the list.\n addClass(activeItem, CLASS_ACTIVE);\n activeItem.setAttribute('aria-selected', true);\n }\n }\n } else {\n this.image = null;\n this.viewed = false;\n this.index = 0;\n this.imageData = {};\n this.canvas.innerHTML = '';\n this.title.innerHTML = '';\n }\n }\n } else {\n this.build();\n }\n return this;\n },\n // Destroy the viewer\n destroy: function destroy() {\n var element = this.element,\n options = this.options;\n if (!element[NAMESPACE]) {\n return this;\n }\n this.destroyed = true;\n if (this.ready) {\n if (this.played) {\n this.stop();\n }\n if (options.inline) {\n if (this.fulled) {\n this.exit();\n }\n this.unbind();\n } else if (this.isShown) {\n if (this.viewing) {\n if (this.imageRendering) {\n this.imageRendering.abort();\n } else if (this.imageInitializing) {\n this.imageInitializing.abort();\n }\n }\n if (this.hiding) {\n this.transitioning.abort();\n }\n this.hidden();\n } else if (this.showing) {\n this.transitioning.abort();\n this.hidden();\n }\n this.ready = false;\n this.viewer.parentNode.removeChild(this.viewer);\n } else if (options.inline) {\n if (this.delaying) {\n this.delaying.abort();\n } else if (this.initializing) {\n this.initializing.abort();\n }\n }\n if (!options.inline) {\n removeListener(element, EVENT_CLICK, this.onStart);\n }\n element[NAMESPACE] = undefined;\n return this;\n }\n };\n\n var others = {\n getImageURL: function getImageURL(image) {\n var url = this.options.url;\n if (isString(url)) {\n url = image.getAttribute(url);\n } else if (isFunction(url)) {\n url = url.call(this, image);\n } else {\n url = '';\n }\n return url;\n },\n enforceFocus: function enforceFocus() {\n var _this = this;\n this.clearEnforceFocus();\n addListener(document, EVENT_FOCUSIN, this.onFocusin = function (event) {\n var viewer = _this.viewer;\n var target = event.target;\n if (target === document || target === viewer || viewer.contains(target)) {\n return;\n }\n while (target) {\n // Avoid conflicts with other modals (#474, #540)\n if (target.getAttribute('tabindex') !== null || target.getAttribute('aria-modal') === 'true') {\n return;\n }\n target = target.parentElement;\n }\n viewer.focus();\n });\n },\n clearEnforceFocus: function clearEnforceFocus() {\n if (this.onFocusin) {\n removeListener(document, EVENT_FOCUSIN, this.onFocusin);\n this.onFocusin = null;\n }\n },\n open: function open() {\n var body = this.body;\n addClass(body, CLASS_OPEN);\n if (this.scrollbarWidth > 0) {\n body.style.paddingRight = \"\".concat(this.scrollbarWidth + (parseFloat(this.initialBodyComputedPaddingRight) || 0), \"px\");\n }\n },\n close: function close() {\n var body = this.body;\n removeClass(body, CLASS_OPEN);\n if (this.scrollbarWidth > 0) {\n body.style.paddingRight = this.initialBodyPaddingRight;\n }\n },\n shown: function shown() {\n var element = this.element,\n options = this.options,\n viewer = this.viewer;\n this.fulled = true;\n this.isShown = true;\n this.render();\n this.bind();\n this.showing = false;\n if (options.focus) {\n viewer.focus();\n this.enforceFocus();\n }\n if (isFunction(options.shown)) {\n addListener(element, EVENT_SHOWN, options.shown, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_SHOWN) === false) {\n return;\n }\n if (this.ready && this.isShown && !this.hiding) {\n this.view(this.index);\n }\n },\n hidden: function hidden() {\n var element = this.element,\n options = this.options,\n viewer = this.viewer;\n if (options.fucus) {\n this.clearEnforceFocus();\n }\n this.close();\n this.unbind();\n addClass(viewer, CLASS_HIDE);\n viewer.removeAttribute('role');\n viewer.removeAttribute('aria-labelledby');\n viewer.removeAttribute('aria-modal');\n viewer.setAttribute('aria-hidden', true);\n this.resetList();\n this.resetImage();\n this.fulled = false;\n this.viewed = false;\n this.isShown = false;\n this.hiding = false;\n if (!this.destroyed) {\n if (isFunction(options.hidden)) {\n addListener(element, EVENT_HIDDEN, options.hidden, {\n once: true\n });\n }\n dispatchEvent(element, EVENT_HIDDEN, null, {\n cancelable: false\n });\n }\n },\n requestFullscreen: function requestFullscreen(options) {\n var document = this.element.ownerDocument;\n if (this.fulled && !(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement)) {\n var documentElement = document.documentElement;\n\n // Element.requestFullscreen()\n if (documentElement.requestFullscreen) {\n // Avoid TypeError when convert `options` to dictionary\n if (isPlainObject(options)) {\n documentElement.requestFullscreen(options);\n } else {\n documentElement.requestFullscreen();\n }\n } else if (documentElement.webkitRequestFullscreen) {\n documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n } else if (documentElement.mozRequestFullScreen) {\n documentElement.mozRequestFullScreen();\n } else if (documentElement.msRequestFullscreen) {\n documentElement.msRequestFullscreen();\n }\n }\n },\n exitFullscreen: function exitFullscreen() {\n var document = this.element.ownerDocument;\n if (this.fulled && (document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement)) {\n // Document.exitFullscreen()\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n }\n }\n },\n change: function change(event) {\n var options = this.options,\n pointers = this.pointers;\n var pointer = pointers[Object.keys(pointers)[0]];\n\n // In the case of the `pointers` object is empty (#421)\n if (!pointer) {\n return;\n }\n var offsetX = pointer.endX - pointer.startX;\n var offsetY = pointer.endY - pointer.startY;\n switch (this.action) {\n // Move the current image\n case ACTION_MOVE:\n if (offsetX !== 0 || offsetY !== 0) {\n this.pointerMoved = true;\n this.move(offsetX, offsetY, event);\n }\n break;\n\n // Zoom the current image\n case ACTION_ZOOM:\n this.zoom(getMaxZoomRatio(pointers), false, null, event);\n break;\n case ACTION_SWITCH:\n {\n this.action = 'switched';\n var absoluteOffsetX = Math.abs(offsetX);\n if (absoluteOffsetX > 1 && absoluteOffsetX > Math.abs(offsetY)) {\n // Empty `pointers` as `touchend` event will not be fired after swiped in iOS browsers.\n this.pointers = {};\n if (offsetX > 1) {\n this.prev(options.loop);\n } else if (offsetX < -1) {\n this.next(options.loop);\n }\n }\n break;\n }\n }\n\n // Override\n forEach(pointers, function (p) {\n p.startX = p.endX;\n p.startY = p.endY;\n });\n },\n isSwitchable: function isSwitchable() {\n var imageData = this.imageData,\n viewerData = this.viewerData;\n return this.length > 1 && imageData.x >= 0 && imageData.y >= 0 && imageData.width <= viewerData.width && imageData.height <= viewerData.height;\n }\n };\n\n var AnotherViewer = WINDOW.Viewer;\n var getUniqueID = function (id) {\n return function () {\n id += 1;\n return id;\n };\n }(-1);\n var Viewer = /*#__PURE__*/function () {\n /**\n * Create a new Viewer.\n * @param {Element} element - The target element for viewing.\n * @param {Object} [options={}] - The configuration options.\n */\n function Viewer(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n _classCallCheck(this, Viewer);\n if (!element || element.nodeType !== 1) {\n throw new Error('The first argument is required and must be an element.');\n }\n this.element = element;\n this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n this.action = false;\n this.fading = false;\n this.fulled = false;\n this.hiding = false;\n this.imageClicked = false;\n this.imageData = {};\n this.index = this.options.initialViewIndex;\n this.isImg = false;\n this.isShown = false;\n this.length = 0;\n this.moving = false;\n this.played = false;\n this.playing = false;\n this.pointers = {};\n this.ready = false;\n this.rotating = false;\n this.scaling = false;\n this.showing = false;\n this.timeout = false;\n this.tooltipping = false;\n this.viewed = false;\n this.viewing = false;\n this.wheeling = false;\n this.zooming = false;\n this.pointerMoved = false;\n this.id = getUniqueID();\n this.init();\n }\n _createClass(Viewer, [{\n key: \"init\",\n value: function init() {\n var _this = this;\n var element = this.element,\n options = this.options;\n if (element[NAMESPACE]) {\n return;\n }\n element[NAMESPACE] = this;\n\n // The `focus` option requires the `keyboard` option set to `true`.\n if (options.focus && !options.keyboard) {\n options.focus = false;\n }\n var isImg = element.localName === 'img';\n var images = [];\n forEach(isImg ? [element] : element.querySelectorAll('img'), function (image) {\n if (isFunction(options.filter)) {\n if (options.filter.call(_this, image)) {\n images.push(image);\n }\n } else if (_this.getImageURL(image)) {\n images.push(image);\n }\n });\n this.isImg = isImg;\n this.length = images.length;\n this.images = images;\n this.initBody();\n\n // Override `transition` option if it is not supported\n if (isUndefined(document.createElement(NAMESPACE).style.transition)) {\n options.transition = false;\n }\n if (options.inline) {\n var count = 0;\n var progress = function progress() {\n count += 1;\n if (count === _this.length) {\n var timeout;\n _this.initializing = false;\n _this.delaying = {\n abort: function abort() {\n clearTimeout(timeout);\n }\n };\n\n // build asynchronously to keep `this.viewer` is accessible in `ready` event handler.\n timeout = setTimeout(function () {\n _this.delaying = false;\n _this.build();\n }, 0);\n }\n };\n this.initializing = {\n abort: function abort() {\n forEach(images, function (image) {\n if (!image.complete) {\n removeListener(image, EVENT_LOAD, progress);\n removeListener(image, EVENT_ERROR, progress);\n }\n });\n }\n };\n forEach(images, function (image) {\n if (image.complete) {\n progress();\n } else {\n var onLoad;\n var onError;\n addListener(image, EVENT_LOAD, onLoad = function onLoad() {\n removeListener(image, EVENT_ERROR, onError);\n progress();\n }, {\n once: true\n });\n addListener(image, EVENT_ERROR, onError = function onError() {\n removeListener(image, EVENT_LOAD, onLoad);\n progress();\n }, {\n once: true\n });\n }\n });\n } else {\n addListener(element, EVENT_CLICK, this.onStart = function (_ref) {\n var target = _ref.target;\n if (target.localName === 'img' && (!isFunction(options.filter) || options.filter.call(_this, target))) {\n _this.view(_this.images.indexOf(target));\n }\n });\n }\n }\n }, {\n key: \"build\",\n value: function build() {\n if (this.ready) {\n return;\n }\n var element = this.element,\n options = this.options;\n var parent = element.parentNode;\n var template = document.createElement('div');\n template.innerHTML = TEMPLATE;\n var viewer = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n var title = viewer.querySelector(\".\".concat(NAMESPACE, \"-title\"));\n var toolbar = viewer.querySelector(\".\".concat(NAMESPACE, \"-toolbar\"));\n var navbar = viewer.querySelector(\".\".concat(NAMESPACE, \"-navbar\"));\n var button = viewer.querySelector(\".\".concat(NAMESPACE, \"-button\"));\n var canvas = viewer.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n this.parent = parent;\n this.viewer = viewer;\n this.title = title;\n this.toolbar = toolbar;\n this.navbar = navbar;\n this.button = button;\n this.canvas = canvas;\n this.footer = viewer.querySelector(\".\".concat(NAMESPACE, \"-footer\"));\n this.tooltipBox = viewer.querySelector(\".\".concat(NAMESPACE, \"-tooltip\"));\n this.player = viewer.querySelector(\".\".concat(NAMESPACE, \"-player\"));\n this.list = viewer.querySelector(\".\".concat(NAMESPACE, \"-list\"));\n viewer.id = \"\".concat(NAMESPACE).concat(this.id);\n title.id = \"\".concat(NAMESPACE, \"Title\").concat(this.id);\n addClass(title, !options.title ? CLASS_HIDE : getResponsiveClass(Array.isArray(options.title) ? options.title[0] : options.title));\n addClass(navbar, !options.navbar ? CLASS_HIDE : getResponsiveClass(options.navbar));\n toggleClass(button, CLASS_HIDE, !options.button);\n if (options.keyboard) {\n button.setAttribute('tabindex', 0);\n }\n if (options.backdrop) {\n addClass(viewer, \"\".concat(NAMESPACE, \"-backdrop\"));\n if (!options.inline && options.backdrop !== 'static') {\n setData(canvas, DATA_ACTION, 'hide');\n }\n }\n if (isString(options.className) && options.className) {\n // In case there are multiple class names\n options.className.split(REGEXP_SPACES).forEach(function (className) {\n addClass(viewer, className);\n });\n }\n if (options.toolbar) {\n var list = document.createElement('ul');\n var custom = isPlainObject(options.toolbar);\n var zoomButtons = BUTTONS.slice(0, 3);\n var rotateButtons = BUTTONS.slice(7, 9);\n var scaleButtons = BUTTONS.slice(9);\n if (!custom) {\n addClass(toolbar, getResponsiveClass(options.toolbar));\n }\n forEach(custom ? options.toolbar : BUTTONS, function (value, index) {\n var deep = custom && isPlainObject(value);\n var name = custom ? hyphenate(index) : value;\n var show = deep && !isUndefined(value.show) ? value.show : value;\n if (!show || !options.zoomable && zoomButtons.indexOf(name) !== -1 || !options.rotatable && rotateButtons.indexOf(name) !== -1 || !options.scalable && scaleButtons.indexOf(name) !== -1) {\n return;\n }\n var size = deep && !isUndefined(value.size) ? value.size : value;\n var click = deep && !isUndefined(value.click) ? value.click : value;\n var item = document.createElement('li');\n if (options.keyboard) {\n item.setAttribute('tabindex', 0);\n }\n item.setAttribute('role', 'button');\n addClass(item, \"\".concat(NAMESPACE, \"-\").concat(name));\n if (!isFunction(click)) {\n setData(item, DATA_ACTION, name);\n }\n if (isNumber(show)) {\n addClass(item, getResponsiveClass(show));\n }\n if (['small', 'large'].indexOf(size) !== -1) {\n addClass(item, \"\".concat(NAMESPACE, \"-\").concat(size));\n } else if (name === 'play') {\n addClass(item, \"\".concat(NAMESPACE, \"-large\"));\n }\n if (isFunction(click)) {\n addListener(item, EVENT_CLICK, click);\n }\n list.appendChild(item);\n });\n toolbar.appendChild(list);\n } else {\n addClass(toolbar, CLASS_HIDE);\n }\n if (!options.rotatable) {\n var rotates = toolbar.querySelectorAll('li[class*=\"rotate\"]');\n addClass(rotates, CLASS_INVISIBLE);\n forEach(rotates, function (rotate) {\n toolbar.appendChild(rotate);\n });\n }\n if (options.inline) {\n addClass(button, CLASS_FULLSCREEN);\n setStyle(viewer, {\n zIndex: options.zIndexInline\n });\n if (window.getComputedStyle(parent).position === 'static') {\n setStyle(parent, {\n position: 'relative'\n });\n }\n parent.insertBefore(viewer, element.nextSibling);\n } else {\n addClass(button, CLASS_CLOSE);\n addClass(viewer, CLASS_FIXED);\n addClass(viewer, CLASS_FADE);\n addClass(viewer, CLASS_HIDE);\n setStyle(viewer, {\n zIndex: options.zIndex\n });\n var container = options.container;\n if (isString(container)) {\n container = element.ownerDocument.querySelector(container);\n }\n if (!container) {\n container = this.body;\n }\n container.appendChild(viewer);\n }\n if (options.inline) {\n this.render();\n this.bind();\n this.isShown = true;\n }\n this.ready = true;\n if (isFunction(options.ready)) {\n addListener(element, EVENT_READY, options.ready, {\n once: true\n });\n }\n if (dispatchEvent(element, EVENT_READY) === false) {\n this.ready = false;\n return;\n }\n if (this.ready && options.inline) {\n this.view(this.index);\n }\n }\n\n /**\n * Get the no conflict viewer class.\n * @returns {Viewer} The viewer class.\n */\n }], [{\n key: \"noConflict\",\n value: function noConflict() {\n window.Viewer = AnotherViewer;\n return Viewer;\n }\n\n /**\n * Change the default options.\n * @param {Object} options - The new default options.\n */\n }, {\n key: \"setDefaults\",\n value: function setDefaults(options) {\n assign(DEFAULTS, isPlainObject(options) && options);\n }\n }]);\n return Viewer;\n }();\n assign(Viewer.prototype, render, events, handlers, methods, others);\n\n return Viewer;\n\n}));\n"],"sourceRoot":""}