{"version":3,"file":"fancybox-jJnPjVC2.js","sources":["../../../../../plugins/soil/node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js","../../../../../plugins/soil/assets/js/fancybox.js"],"sourcesContent":["// ==================================================\n// fancyBox v3.5.7\n//\n// Licensed GPLv3 for open source use\n// or fancyBox Commercial License for commercial use\n//\n// http://fancyapps.com/fancybox/\n// Copyright 2019 fancyApps\n//\n// ==================================================\n(function (window, document, $, undefined) {\r\n \"use strict\";\r\n\r\n window.console = window.console || {\r\n info: function (stuff) {}\r\n };\r\n\r\n // If there's no jQuery, fancyBox can't work\r\n // =========================================\r\n\r\n if (!$) {\r\n return;\r\n }\r\n\r\n // Check if fancyBox is already initialized\r\n // ========================================\r\n\r\n if ($.fn.fancybox) {\r\n console.info(\"fancyBox already initialized\");\r\n\r\n return;\r\n }\r\n\r\n // Private default settings\r\n // ========================\r\n\r\n var defaults = {\r\n // Close existing modals\r\n // Set this to false if you do not need to stack multiple instances\r\n closeExisting: false,\r\n\r\n // Enable infinite gallery navigation\r\n loop: false,\r\n\r\n // Horizontal space between slides\r\n gutter: 50,\r\n\r\n // Enable keyboard navigation\r\n keyboard: true,\r\n\r\n // Should allow caption to overlap the content\r\n preventCaptionOverlap: true,\r\n\r\n // Should display navigation arrows at the screen edges\r\n arrows: true,\r\n\r\n // Should display counter at the top left corner\r\n infobar: true,\r\n\r\n // Should display close button (using `btnTpl.smallBtn` template) over the content\r\n // Can be true, false, \"auto\"\r\n // If \"auto\" - will be automatically enabled for \"html\", \"inline\" or \"ajax\" items\r\n smallBtn: \"auto\",\r\n\r\n // Should display toolbar (buttons at the top)\r\n // Can be true, false, \"auto\"\r\n // If \"auto\" - will be automatically hidden if \"smallBtn\" is enabled\r\n toolbar: \"auto\",\r\n\r\n // What buttons should appear in the top right corner.\r\n // Buttons will be created using templates from `btnTpl` option\r\n // and they will be placed into toolbar (class=\"fancybox-toolbar\"` element)\r\n buttons: [\r\n \"zoom\",\r\n //\"share\",\r\n \"slideShow\",\r\n //\"fullScreen\",\r\n //\"download\",\r\n \"thumbs\",\r\n \"close\"\r\n ],\r\n\r\n // Detect \"idle\" time in seconds\r\n idleTime: 3,\r\n\r\n // Disable right-click and use simple image protection for images\r\n protect: false,\r\n\r\n // Shortcut to make content \"modal\" - disable keyboard navigtion, hide buttons, etc\r\n modal: false,\r\n\r\n image: {\r\n // Wait for images to load before displaying\r\n // true - wait for image to load and then display;\r\n // false - display thumbnail and load the full-sized image over top,\r\n // requires predefined image dimensions (`data-width` and `data-height` attributes)\r\n preload: false\r\n },\r\n\r\n ajax: {\r\n // Object containing settings for ajax request\r\n settings: {\r\n // This helps to indicate that request comes from the modal\r\n // Feel free to change naming\r\n data: {\r\n fancybox: true\r\n }\r\n }\r\n },\r\n\r\n iframe: {\r\n // Iframe template\r\n tpl: '',\r\n\r\n // Preload iframe before displaying it\r\n // This allows to calculate iframe content width and height\r\n // (note: Due to \"Same Origin Policy\", you can't get cross domain data).\r\n preload: true,\r\n\r\n // Custom CSS styling for iframe wrapping element\r\n // You can use this to set custom iframe dimensions\r\n css: {},\r\n\r\n // Iframe tag attributes\r\n attr: {\r\n scrolling: \"auto\"\r\n }\r\n },\r\n\r\n // For HTML5 video only\r\n video: {\r\n tpl: '\",\r\n format: \"\", // custom video format\r\n autoStart: true\r\n },\r\n\r\n // Default content type if cannot be detected automatically\r\n defaultType: \"image\",\r\n\r\n // Open/close animation type\r\n // Possible values:\r\n // false - disable\r\n // \"zoom\" - zoom images from/to thumbnail\r\n // \"fade\"\r\n // \"zoom-in-out\"\r\n //\r\n animationEffect: \"zoom\",\r\n\r\n // Duration in ms for open/close animation\r\n animationDuration: 366,\r\n\r\n // Should image change opacity while zooming\r\n // If opacity is \"auto\", then opacity will be changed if image and thumbnail have different aspect ratios\r\n zoomOpacity: \"auto\",\r\n\r\n // Transition effect between slides\r\n //\r\n // Possible values:\r\n // false - disable\r\n // \"fade'\r\n // \"slide'\r\n // \"circular'\r\n // \"tube'\r\n // \"zoom-in-out'\r\n // \"rotate'\r\n //\r\n transitionEffect: \"fade\",\r\n\r\n // Duration in ms for transition animation\r\n transitionDuration: 366,\r\n\r\n // Custom CSS class for slide element\r\n slideClass: \"\",\r\n\r\n // Custom CSS class for layout\r\n baseClass: \"\",\r\n\r\n // Base template for layout\r\n baseTpl: '
' +\r\n '
' +\r\n '
' +\r\n '
 / 
' +\r\n '
{{buttons}}
' +\r\n '
{{arrows}}
' +\r\n '
' +\r\n '
' +\r\n \"
\" +\r\n \"
\",\r\n\r\n // Loading indicator template\r\n spinnerTpl: '
',\r\n\r\n // Error message template\r\n errorTpl: '

{{ERROR}}

',\r\n\r\n btnTpl: {\r\n download: '' +\r\n '' +\r\n \"\",\r\n\r\n zoom: '\",\r\n\r\n close: '\",\r\n\r\n // Arrows\r\n arrowLeft: '\",\r\n\r\n arrowRight: '\",\r\n\r\n // This small close button will be appended to your html/inline/ajax content by default,\r\n // if \"smallBtn\" option is not set to false\r\n smallBtn: '\"\r\n },\r\n\r\n // Container is injected into this element\r\n parentEl: \"body\",\r\n\r\n // Hide browser vertical scrollbars; use at your own risk\r\n hideScrollbar: true,\r\n\r\n // Focus handling\r\n // ==============\r\n\r\n // Try to focus on the first focusable element after opening\r\n autoFocus: true,\r\n\r\n // Put focus back to active element after closing\r\n backFocus: true,\r\n\r\n // Do not let user to focus on element outside modal content\r\n trapFocus: true,\r\n\r\n // Module specific options\r\n // =======================\r\n\r\n fullScreen: {\r\n autoStart: false\r\n },\r\n\r\n // Set `touch: false` to disable panning/swiping\r\n touch: {\r\n vertical: true, // Allow to drag content vertically\r\n momentum: true // Continue movement after releasing mouse/touch when panning\r\n },\r\n\r\n // Hash value when initializing manually,\r\n // set `false` to disable hash change\r\n hash: null,\r\n\r\n // Customize or add new media types\r\n // Example:\r\n /*\r\n media : {\r\n youtube : {\r\n params : {\r\n autoplay : 0\r\n }\r\n }\r\n }\r\n */\r\n media: {},\r\n\r\n slideShow: {\r\n autoStart: false,\r\n speed: 3000\r\n },\r\n\r\n thumbs: {\r\n autoStart: false, // Display thumbnails on opening\r\n hideOnClose: true, // Hide thumbnail grid when closing animation starts\r\n parentEl: \".fancybox-container\", // Container is injected into this element\r\n axis: \"y\" // Vertical (y) or horizontal (x) scrolling\r\n },\r\n\r\n // Use mousewheel to navigate gallery\r\n // If 'auto' - enabled for images only\r\n wheel: \"auto\",\r\n\r\n // Callbacks\r\n //==========\r\n\r\n // See Documentation/API/Events for more information\r\n // Example:\r\n /*\r\n afterShow: function( instance, current ) {\r\n console.info( 'Clicked element:' );\r\n console.info( current.opts.$orig );\r\n }\r\n */\r\n\r\n onInit: $.noop, // When instance has been initialized\r\n\r\n beforeLoad: $.noop, // Before the content of a slide is being loaded\r\n afterLoad: $.noop, // When the content of a slide is done loading\r\n\r\n beforeShow: $.noop, // Before open animation starts\r\n afterShow: $.noop, // When content is done loading and animating\r\n\r\n beforeClose: $.noop, // Before the instance attempts to close. Return false to cancel the close.\r\n afterClose: $.noop, // After instance has been closed\r\n\r\n onActivate: $.noop, // When instance is brought to front\r\n onDeactivate: $.noop, // When other instance has been activated\r\n\r\n // Interaction\r\n // ===========\r\n\r\n // Use options below to customize taken action when user clicks or double clicks on the fancyBox area,\r\n // each option can be string or method that returns value.\r\n //\r\n // Possible values:\r\n // \"close\" - close instance\r\n // \"next\" - move to next gallery item\r\n // \"nextOrClose\" - move to next gallery item or close if gallery has only one item\r\n // \"toggleControls\" - show/hide controls\r\n // \"zoom\" - zoom image (if loaded)\r\n // false - do nothing\r\n\r\n // Clicked on the content\r\n clickContent: function (current, event) {\r\n return current.type === \"image\" ? \"zoom\" : false;\r\n },\r\n\r\n // Clicked on the slide\r\n clickSlide: \"close\",\r\n\r\n // Clicked on the background (backdrop) element;\r\n // if you have not changed the layout, then most likely you need to use `clickSlide` option\r\n clickOutside: \"close\",\r\n\r\n // Same as previous two, but for double click\r\n dblclickContent: false,\r\n dblclickSlide: false,\r\n dblclickOutside: false,\r\n\r\n // Custom options when mobile device is detected\r\n // =============================================\r\n\r\n mobile: {\r\n preventCaptionOverlap: false,\r\n idleTime: false,\r\n clickContent: function (current, event) {\r\n return current.type === \"image\" ? \"toggleControls\" : false;\r\n },\r\n clickSlide: function (current, event) {\r\n return current.type === \"image\" ? \"toggleControls\" : \"close\";\r\n },\r\n dblclickContent: function (current, event) {\r\n return current.type === \"image\" ? \"zoom\" : false;\r\n },\r\n dblclickSlide: function (current, event) {\r\n return current.type === \"image\" ? \"zoom\" : false;\r\n }\r\n },\r\n\r\n // Internationalization\r\n // ====================\r\n\r\n lang: \"en\",\r\n i18n: {\r\n en: {\r\n CLOSE: \"Close\",\r\n NEXT: \"Next\",\r\n PREV: \"Previous\",\r\n ERROR: \"The requested content cannot be loaded.
Please try again later.\",\r\n PLAY_START: \"Start slideshow\",\r\n PLAY_STOP: \"Pause slideshow\",\r\n FULL_SCREEN: \"Full screen\",\r\n THUMBS: \"Thumbnails\",\r\n DOWNLOAD: \"Download\",\r\n SHARE: \"Share\",\r\n ZOOM: \"Zoom\"\r\n },\r\n de: {\r\n CLOSE: \"Schließen\",\r\n NEXT: \"Weiter\",\r\n PREV: \"Zurück\",\r\n ERROR: \"Die angeforderten Daten konnten nicht geladen werden.
Bitte versuchen Sie es später nochmal.\",\r\n PLAY_START: \"Diaschau starten\",\r\n PLAY_STOP: \"Diaschau beenden\",\r\n FULL_SCREEN: \"Vollbild\",\r\n THUMBS: \"Vorschaubilder\",\r\n DOWNLOAD: \"Herunterladen\",\r\n SHARE: \"Teilen\",\r\n ZOOM: \"Vergrößern\"\r\n }\r\n }\r\n };\r\n\r\n // Few useful variables and methods\r\n // ================================\r\n\r\n var $W = $(window);\r\n var $D = $(document);\r\n\r\n var called = 0;\r\n\r\n // Check if an object is a jQuery object and not a native JavaScript object\r\n // ========================================================================\r\n var isQuery = function (obj) {\r\n return obj && obj.hasOwnProperty && obj instanceof $;\r\n };\r\n\r\n // Handle multiple browsers for \"requestAnimationFrame\" and \"cancelAnimationFrame\"\r\n // ===============================================================================\r\n var requestAFrame = (function () {\r\n return (\r\n window.requestAnimationFrame ||\r\n window.webkitRequestAnimationFrame ||\r\n window.mozRequestAnimationFrame ||\r\n window.oRequestAnimationFrame ||\r\n // if all else fails, use setTimeout\r\n function (callback) {\r\n return window.setTimeout(callback, 1000 / 60);\r\n }\r\n );\r\n })();\r\n\r\n var cancelAFrame = (function () {\r\n return (\r\n window.cancelAnimationFrame ||\r\n window.webkitCancelAnimationFrame ||\r\n window.mozCancelAnimationFrame ||\r\n window.oCancelAnimationFrame ||\r\n function (id) {\r\n window.clearTimeout(id);\r\n }\r\n );\r\n })();\r\n\r\n // Detect the supported transition-end event property name\r\n // =======================================================\r\n var transitionEnd = (function () {\r\n var el = document.createElement(\"fakeelement\"),\r\n t;\r\n\r\n var transitions = {\r\n transition: \"transitionend\",\r\n OTransition: \"oTransitionEnd\",\r\n MozTransition: \"transitionend\",\r\n WebkitTransition: \"webkitTransitionEnd\"\r\n };\r\n\r\n for (t in transitions) {\r\n if (el.style[t] !== undefined) {\r\n return transitions[t];\r\n }\r\n }\r\n\r\n return \"transitionend\";\r\n })();\r\n\r\n // Force redraw on an element.\r\n // This helps in cases where the browser doesn't redraw an updated element properly\r\n // ================================================================================\r\n var forceRedraw = function ($el) {\r\n return $el && $el.length && $el[0].offsetHeight;\r\n };\r\n\r\n // Exclude array (`buttons`) options from deep merging\r\n // ===================================================\r\n var mergeOpts = function (opts1, opts2) {\r\n var rez = $.extend(true, {}, opts1, opts2);\r\n\r\n $.each(opts2, function (key, value) {\r\n if ($.isArray(value)) {\r\n rez[key] = value;\r\n }\r\n });\r\n\r\n return rez;\r\n };\r\n\r\n // How much of an element is visible in viewport\r\n // =============================================\r\n\r\n var inViewport = function (elem) {\r\n var elemCenter, rez;\r\n\r\n if (!elem || elem.ownerDocument !== document) {\r\n return false;\r\n }\r\n\r\n $(\".fancybox-container\").css(\"pointer-events\", \"none\");\r\n\r\n elemCenter = {\r\n x: elem.getBoundingClientRect().left + elem.offsetWidth / 2,\r\n y: elem.getBoundingClientRect().top + elem.offsetHeight / 2\r\n };\r\n\r\n rez = document.elementFromPoint(elemCenter.x, elemCenter.y) === elem;\r\n\r\n $(\".fancybox-container\").css(\"pointer-events\", \"\");\r\n\r\n return rez;\r\n };\r\n\r\n // Class definition\r\n // ================\r\n\r\n var FancyBox = function (content, opts, index) {\r\n var self = this;\r\n\r\n self.opts = mergeOpts({\r\n index: index\r\n }, $.fancybox.defaults);\r\n\r\n if ($.isPlainObject(opts)) {\r\n self.opts = mergeOpts(self.opts, opts);\r\n }\r\n\r\n if ($.fancybox.isMobile) {\r\n self.opts = mergeOpts(self.opts, self.opts.mobile);\r\n }\r\n\r\n self.id = self.opts.id || ++called;\r\n\r\n self.currIndex = parseInt(self.opts.index, 10) || 0;\r\n self.prevIndex = null;\r\n\r\n self.prevPos = null;\r\n self.currPos = 0;\r\n\r\n self.firstRun = true;\r\n\r\n // All group items\r\n self.group = [];\r\n\r\n // Existing slides (for current, next and previous gallery items)\r\n self.slides = {};\r\n\r\n // Create group elements\r\n self.addContent(content);\r\n\r\n if (!self.group.length) {\r\n return;\r\n }\r\n\r\n self.init();\r\n };\r\n\r\n $.extend(FancyBox.prototype, {\r\n // Create DOM structure\r\n // ====================\r\n\r\n init: function () {\r\n var self = this,\r\n firstItem = self.group[self.currIndex],\r\n firstItemOpts = firstItem.opts,\r\n $container,\r\n buttonStr;\r\n\r\n if (firstItemOpts.closeExisting) {\r\n $.fancybox.close(true);\r\n }\r\n\r\n // Hide scrollbars\r\n // ===============\r\n\r\n $(\"body\").addClass(\"fancybox-active\");\r\n\r\n if (\r\n !$.fancybox.getInstance() &&\r\n firstItemOpts.hideScrollbar !== false &&\r\n !$.fancybox.isMobile &&\r\n document.body.scrollHeight > window.innerHeight\r\n ) {\r\n $(\"head\").append(\r\n '\"\r\n );\r\n\r\n $(\"body\").addClass(\"compensate-for-scrollbar\");\r\n }\r\n\r\n // Build html markup and set references\r\n // ====================================\r\n\r\n // Build html code for buttons and insert into main template\r\n buttonStr = \"\";\r\n\r\n $.each(firstItemOpts.buttons, function (index, value) {\r\n buttonStr += firstItemOpts.btnTpl[value] || \"\";\r\n });\r\n\r\n // Create markup from base template, it will be initially hidden to\r\n // avoid unnecessary work like painting while initializing is not complete\r\n $container = $(\r\n self.translate(\r\n self,\r\n firstItemOpts.baseTpl\r\n .replace(\"{{buttons}}\", buttonStr)\r\n .replace(\"{{arrows}}\", firstItemOpts.btnTpl.arrowLeft + firstItemOpts.btnTpl.arrowRight)\r\n )\r\n )\r\n .attr(\"id\", \"fancybox-container-\" + self.id)\r\n .addClass(firstItemOpts.baseClass)\r\n .data(\"FancyBox\", self)\r\n .appendTo(firstItemOpts.parentEl);\r\n\r\n // Create object holding references to jQuery wrapped nodes\r\n self.$refs = {\r\n container: $container\r\n };\r\n\r\n [\"bg\", \"inner\", \"infobar\", \"toolbar\", \"stage\", \"caption\", \"navigation\"].forEach(function (item) {\r\n self.$refs[item] = $container.find(\".fancybox-\" + item);\r\n });\r\n\r\n self.trigger(\"onInit\");\r\n\r\n // Enable events, deactive previous instances\r\n self.activate();\r\n\r\n // Build slides, load and reveal content\r\n self.jumpTo(self.currIndex);\r\n },\r\n\r\n // Simple i18n support - replaces object keys found in template\r\n // with corresponding values\r\n // ============================================================\r\n\r\n translate: function (obj, str) {\r\n var arr = obj.opts.i18n[obj.opts.lang] || obj.opts.i18n.en;\r\n\r\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, function (match, n) {\r\n return arr[n] === undefined ? match : arr[n];\r\n });\r\n },\r\n\r\n // Populate current group with fresh content\r\n // Check if each object has valid type and content\r\n // ===============================================\r\n\r\n addContent: function (content) {\r\n var self = this,\r\n items = $.makeArray(content),\r\n thumbs;\r\n\r\n $.each(items, function (i, item) {\r\n var obj = {},\r\n opts = {},\r\n $item,\r\n type,\r\n found,\r\n src,\r\n srcParts;\r\n\r\n // Step 1 - Make sure we have an object\r\n // ====================================\r\n\r\n if ($.isPlainObject(item)) {\r\n // We probably have manual usage here, something like\r\n // $.fancybox.open( [ { src : \"image.jpg\", type : \"image\" } ] )\r\n\r\n obj = item;\r\n opts = item.opts || item;\r\n } else if ($.type(item) === \"object\" && $(item).length) {\r\n // Here we probably have jQuery collection returned by some selector\r\n $item = $(item);\r\n\r\n // Support attributes like `data-options='{\"touch\" : false}'` and `data-touch='false'`\r\n opts = $item.data() || {};\r\n opts = $.extend(true, {}, opts, opts.options);\r\n\r\n // Here we store clicked element\r\n opts.$orig = $item;\r\n\r\n obj.src = self.opts.src || opts.src || $item.attr(\"href\");\r\n\r\n // Assume that simple syntax is used, for example:\r\n // `$.fancybox.open( $(\"#test\"), {} );`\r\n if (!obj.type && !obj.src) {\r\n obj.type = \"inline\";\r\n obj.src = item;\r\n }\r\n } else {\r\n // Assume we have a simple html code, for example:\r\n // $.fancybox.open( '

Hi!

' );\r\n obj = {\r\n type: \"html\",\r\n src: item + \"\"\r\n };\r\n }\r\n\r\n // Each gallery object has full collection of options\r\n obj.opts = $.extend(true, {}, self.opts, opts);\r\n\r\n // Do not merge buttons array\r\n if ($.isArray(opts.buttons)) {\r\n obj.opts.buttons = opts.buttons;\r\n }\r\n\r\n if ($.fancybox.isMobile && obj.opts.mobile) {\r\n obj.opts = mergeOpts(obj.opts, obj.opts.mobile);\r\n }\r\n\r\n // Step 2 - Make sure we have content type, if not - try to guess\r\n // ==============================================================\r\n\r\n type = obj.type || obj.opts.type;\r\n src = obj.src || \"\";\r\n\r\n if (!type && src) {\r\n if ((found = src.match(/\\.(mp4|mov|ogv|webm)((\\?|#).*)?$/i))) {\r\n type = \"video\";\r\n\r\n if (!obj.opts.video.format) {\r\n obj.opts.video.format = \"video/\" + (found[1] === \"ogv\" ? \"ogg\" : found[1]);\r\n }\r\n } else if (src.match(/(^data:image\\/[a-z0-9+\\/=]*,)|(\\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\\?|#).*)?$)/i)) {\r\n type = \"image\";\r\n } else if (src.match(/\\.(pdf)((\\?|#).*)?$/i)) {\r\n type = \"iframe\";\r\n obj = $.extend(true, obj, {\r\n contentType: \"pdf\",\r\n opts: {\r\n iframe: {\r\n preload: false\r\n }\r\n }\r\n });\r\n } else if (src.charAt(0) === \"#\") {\r\n type = \"inline\";\r\n }\r\n }\r\n\r\n if (type) {\r\n obj.type = type;\r\n } else {\r\n self.trigger(\"objectNeedsType\", obj);\r\n }\r\n\r\n if (!obj.contentType) {\r\n obj.contentType = $.inArray(obj.type, [\"html\", \"inline\", \"ajax\"]) > -1 ? \"html\" : obj.type;\r\n }\r\n\r\n // Step 3 - Some adjustments\r\n // =========================\r\n\r\n obj.index = self.group.length;\r\n\r\n if (obj.opts.smallBtn == \"auto\") {\r\n obj.opts.smallBtn = $.inArray(obj.type, [\"html\", \"inline\", \"ajax\"]) > -1;\r\n }\r\n\r\n if (obj.opts.toolbar === \"auto\") {\r\n obj.opts.toolbar = !obj.opts.smallBtn;\r\n }\r\n\r\n // Find thumbnail image, check if exists and if is in the viewport\r\n obj.$thumb = obj.opts.$thumb || null;\r\n\r\n if (obj.opts.$trigger && obj.index === self.opts.index) {\r\n obj.$thumb = obj.opts.$trigger.find(\"img:first\");\r\n\r\n if (obj.$thumb.length) {\r\n obj.opts.$orig = obj.opts.$trigger;\r\n }\r\n }\r\n\r\n if (!(obj.$thumb && obj.$thumb.length) && obj.opts.$orig) {\r\n obj.$thumb = obj.opts.$orig.find(\"img:first\");\r\n }\r\n\r\n if (obj.$thumb && !obj.$thumb.length) {\r\n obj.$thumb = null;\r\n }\r\n\r\n obj.thumb = obj.opts.thumb || (obj.$thumb ? obj.$thumb[0].src : null);\r\n\r\n // \"caption\" is a \"special\" option, it can be used to customize caption per gallery item\r\n if ($.type(obj.opts.caption) === \"function\") {\r\n obj.opts.caption = obj.opts.caption.apply(item, [self, obj]);\r\n }\r\n\r\n if ($.type(self.opts.caption) === \"function\") {\r\n obj.opts.caption = self.opts.caption.apply(item, [self, obj]);\r\n }\r\n\r\n // Make sure we have caption as a string or jQuery object\r\n if (!(obj.opts.caption instanceof $)) {\r\n obj.opts.caption = obj.opts.caption === undefined ? \"\" : obj.opts.caption + \"\";\r\n }\r\n\r\n // Check if url contains \"filter\" used to filter the content\r\n // Example: \"ajax.html #something\"\r\n if (obj.type === \"ajax\") {\r\n srcParts = src.split(/\\s+/, 2);\r\n\r\n if (srcParts.length > 1) {\r\n obj.src = srcParts.shift();\r\n\r\n obj.opts.filter = srcParts.shift();\r\n }\r\n }\r\n\r\n // Hide all buttons and disable interactivity for modal items\r\n if (obj.opts.modal) {\r\n obj.opts = $.extend(true, obj.opts, {\r\n trapFocus: true,\r\n // Remove buttons\r\n infobar: 0,\r\n toolbar: 0,\r\n\r\n smallBtn: 0,\r\n\r\n // Disable keyboard navigation\r\n keyboard: 0,\r\n\r\n // Disable some modules\r\n slideShow: 0,\r\n fullScreen: 0,\r\n thumbs: 0,\r\n touch: 0,\r\n\r\n // Disable click event handlers\r\n clickContent: false,\r\n clickSlide: false,\r\n clickOutside: false,\r\n dblclickContent: false,\r\n dblclickSlide: false,\r\n dblclickOutside: false\r\n });\r\n }\r\n\r\n // Step 4 - Add processed object to group\r\n // ======================================\r\n\r\n self.group.push(obj);\r\n });\r\n\r\n // Update controls if gallery is already opened\r\n if (Object.keys(self.slides).length) {\r\n self.updateControls();\r\n\r\n // Update thumbnails, if needed\r\n thumbs = self.Thumbs;\r\n\r\n if (thumbs && thumbs.isActive) {\r\n thumbs.create();\r\n\r\n thumbs.focus();\r\n }\r\n }\r\n },\r\n\r\n // Attach an event handler functions for:\r\n // - navigation buttons\r\n // - browser scrolling, resizing;\r\n // - focusing\r\n // - keyboard\r\n // - detecting inactivity\r\n // ======================================\r\n\r\n addEvents: function () {\r\n var self = this;\r\n\r\n self.removeEvents();\r\n\r\n // Make navigation elements clickable\r\n // ==================================\r\n\r\n self.$refs.container\r\n .on(\"click.fb-close\", \"[data-fancybox-close]\", function (e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n self.close(e);\r\n })\r\n .on(\"touchstart.fb-prev click.fb-prev\", \"[data-fancybox-prev]\", function (e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n self.previous();\r\n })\r\n .on(\"touchstart.fb-next click.fb-next\", \"[data-fancybox-next]\", function (e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n self.next();\r\n })\r\n .on(\"click.fb\", \"[data-fancybox-zoom]\", function (e) {\r\n // Click handler for zoom button\r\n self[self.isScaledDown() ? \"scaleToActual\" : \"scaleToFit\"]();\r\n });\r\n\r\n // Handle page scrolling and browser resizing\r\n // ==========================================\r\n\r\n $W.on(\"orientationchange.fb resize.fb\", function (e) {\r\n if (e && e.originalEvent && e.originalEvent.type === \"resize\") {\r\n if (self.requestId) {\r\n cancelAFrame(self.requestId);\r\n }\r\n\r\n self.requestId = requestAFrame(function () {\r\n self.update(e);\r\n });\r\n } else {\r\n if (self.current && self.current.type === \"iframe\") {\r\n self.$refs.stage.hide();\r\n }\r\n\r\n setTimeout(\r\n function () {\r\n self.$refs.stage.show();\r\n\r\n self.update(e);\r\n },\r\n $.fancybox.isMobile ? 600 : 250\r\n );\r\n }\r\n });\r\n\r\n $D.on(\"keydown.fb\", function (e) {\r\n var instance = $.fancybox ? $.fancybox.getInstance() : null,\r\n current = instance.current,\r\n keycode = e.keyCode || e.which;\r\n\r\n // Trap keyboard focus inside of the modal\r\n // =======================================\r\n\r\n if (keycode == 9) {\r\n if (current.opts.trapFocus) {\r\n self.focus(e);\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Enable keyboard navigation\r\n // ==========================\r\n\r\n if (!current.opts.keyboard || e.ctrlKey || e.altKey || e.shiftKey || $(e.target).is(\"input,textarea,video,audio,select\")) {\r\n return;\r\n }\r\n\r\n // Backspace and Esc keys\r\n if (keycode === 8 || keycode === 27) {\r\n e.preventDefault();\r\n\r\n self.close(e);\r\n\r\n return;\r\n }\r\n\r\n // Left arrow and Up arrow\r\n if (keycode === 37 || keycode === 38) {\r\n e.preventDefault();\r\n\r\n self.previous();\r\n\r\n return;\r\n }\r\n\r\n // Righ arrow and Down arrow\r\n if (keycode === 39 || keycode === 40) {\r\n e.preventDefault();\r\n\r\n self.next();\r\n\r\n return;\r\n }\r\n\r\n self.trigger(\"afterKeydown\", e, keycode);\r\n });\r\n\r\n // Hide controls after some inactivity period\r\n if (self.group[self.currIndex].opts.idleTime) {\r\n self.idleSecondsCounter = 0;\r\n\r\n $D.on(\r\n \"mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle\",\r\n function (e) {\r\n self.idleSecondsCounter = 0;\r\n\r\n if (self.isIdle) {\r\n self.showControls();\r\n }\r\n\r\n self.isIdle = false;\r\n }\r\n );\r\n\r\n self.idleInterval = window.setInterval(function () {\r\n self.idleSecondsCounter++;\r\n\r\n if (self.idleSecondsCounter >= self.group[self.currIndex].opts.idleTime && !self.isDragging) {\r\n self.isIdle = true;\r\n self.idleSecondsCounter = 0;\r\n\r\n self.hideControls();\r\n }\r\n }, 1000);\r\n }\r\n },\r\n\r\n // Remove events added by the core\r\n // ===============================\r\n\r\n removeEvents: function () {\r\n var self = this;\r\n\r\n $W.off(\"orientationchange.fb resize.fb\");\r\n $D.off(\"keydown.fb .fb-idle\");\r\n\r\n this.$refs.container.off(\".fb-close .fb-prev .fb-next\");\r\n\r\n if (self.idleInterval) {\r\n window.clearInterval(self.idleInterval);\r\n\r\n self.idleInterval = null;\r\n }\r\n },\r\n\r\n // Change to previous gallery item\r\n // ===============================\r\n\r\n previous: function (duration) {\r\n return this.jumpTo(this.currPos - 1, duration);\r\n },\r\n\r\n // Change to next gallery item\r\n // ===========================\r\n\r\n next: function (duration) {\r\n return this.jumpTo(this.currPos + 1, duration);\r\n },\r\n\r\n // Switch to selected gallery item\r\n // ===============================\r\n\r\n jumpTo: function (pos, duration) {\r\n var self = this,\r\n groupLen = self.group.length,\r\n firstRun,\r\n isMoved,\r\n loop,\r\n current,\r\n previous,\r\n slidePos,\r\n stagePos,\r\n prop,\r\n diff;\r\n\r\n if (self.isDragging || self.isClosing || (self.isAnimating && self.firstRun)) {\r\n return;\r\n }\r\n\r\n // Should loop?\r\n pos = parseInt(pos, 10);\r\n loop = self.current ? self.current.opts.loop : self.opts.loop;\r\n\r\n if (!loop && (pos < 0 || pos >= groupLen)) {\r\n return false;\r\n }\r\n\r\n // Check if opening for the first time; this helps to speed things up\r\n firstRun = self.firstRun = !Object.keys(self.slides).length;\r\n\r\n // Create slides\r\n previous = self.current;\r\n\r\n self.prevIndex = self.currIndex;\r\n self.prevPos = self.currPos;\r\n\r\n current = self.createSlide(pos);\r\n\r\n if (groupLen > 1) {\r\n if (loop || current.index < groupLen - 1) {\r\n self.createSlide(pos + 1);\r\n }\r\n\r\n if (loop || current.index > 0) {\r\n self.createSlide(pos - 1);\r\n }\r\n }\r\n\r\n self.current = current;\r\n self.currIndex = current.index;\r\n self.currPos = current.pos;\r\n\r\n self.trigger(\"beforeShow\", firstRun);\r\n\r\n self.updateControls();\r\n\r\n // Validate duration length\r\n current.forcedDuration = undefined;\r\n\r\n if ($.isNumeric(duration)) {\r\n current.forcedDuration = duration;\r\n } else {\r\n duration = current.opts[firstRun ? \"animationDuration\" : \"transitionDuration\"];\r\n }\r\n\r\n duration = parseInt(duration, 10);\r\n\r\n // Check if user has swiped the slides or if still animating\r\n isMoved = self.isMoved(current);\r\n\r\n // Make sure current slide is visible\r\n current.$slide.addClass(\"fancybox-slide--current\");\r\n\r\n // Fresh start - reveal container, current slide and start loading content\r\n if (firstRun) {\r\n if (current.opts.animationEffect && duration) {\r\n self.$refs.container.css(\"transition-duration\", duration + \"ms\");\r\n }\r\n\r\n self.$refs.container.addClass(\"fancybox-is-open\").trigger(\"focus\");\r\n\r\n // Attempt to load content into slide\r\n // This will later call `afterLoad` -> `revealContent`\r\n self.loadSlide(current);\r\n\r\n self.preload(\"image\");\r\n\r\n return;\r\n }\r\n\r\n // Get actual slide/stage positions (before cleaning up)\r\n slidePos = $.fancybox.getTranslate(previous.$slide);\r\n stagePos = $.fancybox.getTranslate(self.$refs.stage);\r\n\r\n // Clean up all slides\r\n $.each(self.slides, function (index, slide) {\r\n $.fancybox.stop(slide.$slide, true);\r\n });\r\n\r\n if (previous.pos !== current.pos) {\r\n previous.isComplete = false;\r\n }\r\n\r\n previous.$slide.removeClass(\"fancybox-slide--complete fancybox-slide--current\");\r\n\r\n // If slides are out of place, then animate them to correct position\r\n if (isMoved) {\r\n // Calculate horizontal swipe distance\r\n diff = slidePos.left - (previous.pos * slidePos.width + previous.pos * previous.opts.gutter);\r\n\r\n $.each(self.slides, function (index, slide) {\r\n slide.$slide.removeClass(\"fancybox-animated\").removeClass(function (index, className) {\r\n return (className.match(/(^|\\s)fancybox-fx-\\S+/g) || []).join(\" \");\r\n });\r\n\r\n // Make sure that each slide is in equal distance\r\n // This is mostly needed for freshly added slides, because they are not yet positioned\r\n var leftPos = slide.pos * slidePos.width + slide.pos * slide.opts.gutter;\r\n\r\n $.fancybox.setTranslate(slide.$slide, {\r\n top: 0,\r\n left: leftPos - stagePos.left + diff\r\n });\r\n\r\n if (slide.pos !== current.pos) {\r\n slide.$slide.addClass(\"fancybox-slide--\" + (slide.pos > current.pos ? \"next\" : \"previous\"));\r\n }\r\n\r\n // Redraw to make sure that transition will start\r\n forceRedraw(slide.$slide);\r\n\r\n // Animate the slide\r\n $.fancybox.animate(\r\n slide.$slide, {\r\n top: 0,\r\n left: (slide.pos - current.pos) * slidePos.width + (slide.pos - current.pos) * slide.opts.gutter\r\n },\r\n duration,\r\n function () {\r\n slide.$slide\r\n .css({\r\n transform: \"\",\r\n opacity: \"\"\r\n })\r\n .removeClass(\"fancybox-slide--next fancybox-slide--previous\");\r\n\r\n if (slide.pos === self.currPos) {\r\n self.complete();\r\n }\r\n }\r\n );\r\n });\r\n } else if (duration && current.opts.transitionEffect) {\r\n // Set transition effect for previously active slide\r\n prop = \"fancybox-animated fancybox-fx-\" + current.opts.transitionEffect;\r\n\r\n previous.$slide.addClass(\"fancybox-slide--\" + (previous.pos > current.pos ? \"next\" : \"previous\"));\r\n\r\n $.fancybox.animate(\r\n previous.$slide,\r\n prop,\r\n duration,\r\n function () {\r\n previous.$slide.removeClass(prop).removeClass(\"fancybox-slide--next fancybox-slide--previous\");\r\n },\r\n false\r\n );\r\n }\r\n\r\n if (current.isLoaded) {\r\n self.revealContent(current);\r\n } else {\r\n self.loadSlide(current);\r\n }\r\n\r\n self.preload(\"image\");\r\n },\r\n\r\n // Create new \"slide\" element\r\n // These are gallery items that are actually added to DOM\r\n // =======================================================\r\n\r\n createSlide: function (pos) {\r\n var self = this,\r\n $slide,\r\n index;\r\n\r\n index = pos % self.group.length;\r\n index = index < 0 ? self.group.length + index : index;\r\n\r\n if (!self.slides[pos] && self.group[index]) {\r\n $slide = $('
').appendTo(self.$refs.stage);\r\n\r\n self.slides[pos] = $.extend(true, {}, self.group[index], {\r\n pos: pos,\r\n $slide: $slide,\r\n isLoaded: false\r\n });\r\n\r\n self.updateSlide(self.slides[pos]);\r\n }\r\n\r\n return self.slides[pos];\r\n },\r\n\r\n // Scale image to the actual size of the image;\r\n // x and y values should be relative to the slide\r\n // ==============================================\r\n\r\n scaleToActual: function (x, y, duration) {\r\n var self = this,\r\n current = self.current,\r\n $content = current.$content,\r\n canvasWidth = $.fancybox.getTranslate(current.$slide).width,\r\n canvasHeight = $.fancybox.getTranslate(current.$slide).height,\r\n newImgWidth = current.width,\r\n newImgHeight = current.height,\r\n imgPos,\r\n posX,\r\n posY,\r\n scaleX,\r\n scaleY;\r\n\r\n if (self.isAnimating || self.isMoved() || !$content || !(current.type == \"image\" && current.isLoaded && !current.hasError)) {\r\n return;\r\n }\r\n\r\n self.isAnimating = true;\r\n\r\n $.fancybox.stop($content);\r\n\r\n x = x === undefined ? canvasWidth * 0.5 : x;\r\n y = y === undefined ? canvasHeight * 0.5 : y;\r\n\r\n imgPos = $.fancybox.getTranslate($content);\r\n\r\n imgPos.top -= $.fancybox.getTranslate(current.$slide).top;\r\n imgPos.left -= $.fancybox.getTranslate(current.$slide).left;\r\n\r\n scaleX = newImgWidth / imgPos.width;\r\n scaleY = newImgHeight / imgPos.height;\r\n\r\n // Get center position for original image\r\n posX = canvasWidth * 0.5 - newImgWidth * 0.5;\r\n posY = canvasHeight * 0.5 - newImgHeight * 0.5;\r\n\r\n // Make sure image does not move away from edges\r\n if (newImgWidth > canvasWidth) {\r\n posX = imgPos.left * scaleX - (x * scaleX - x);\r\n\r\n if (posX > 0) {\r\n posX = 0;\r\n }\r\n\r\n if (posX < canvasWidth - newImgWidth) {\r\n posX = canvasWidth - newImgWidth;\r\n }\r\n }\r\n\r\n if (newImgHeight > canvasHeight) {\r\n posY = imgPos.top * scaleY - (y * scaleY - y);\r\n\r\n if (posY > 0) {\r\n posY = 0;\r\n }\r\n\r\n if (posY < canvasHeight - newImgHeight) {\r\n posY = canvasHeight - newImgHeight;\r\n }\r\n }\r\n\r\n self.updateCursor(newImgWidth, newImgHeight);\r\n\r\n $.fancybox.animate(\r\n $content, {\r\n top: posY,\r\n left: posX,\r\n scaleX: scaleX,\r\n scaleY: scaleY\r\n },\r\n duration || 366,\r\n function () {\r\n self.isAnimating = false;\r\n }\r\n );\r\n\r\n // Stop slideshow\r\n if (self.SlideShow && self.SlideShow.isActive) {\r\n self.SlideShow.stop();\r\n }\r\n },\r\n\r\n // Scale image to fit inside parent element\r\n // ========================================\r\n\r\n scaleToFit: function (duration) {\r\n var self = this,\r\n current = self.current,\r\n $content = current.$content,\r\n end;\r\n\r\n if (self.isAnimating || self.isMoved() || !$content || !(current.type == \"image\" && current.isLoaded && !current.hasError)) {\r\n return;\r\n }\r\n\r\n self.isAnimating = true;\r\n\r\n $.fancybox.stop($content);\r\n\r\n end = self.getFitPos(current);\r\n\r\n self.updateCursor(end.width, end.height);\r\n\r\n $.fancybox.animate(\r\n $content, {\r\n top: end.top,\r\n left: end.left,\r\n scaleX: end.width / $content.width(),\r\n scaleY: end.height / $content.height()\r\n },\r\n duration || 366,\r\n function () {\r\n self.isAnimating = false;\r\n }\r\n );\r\n },\r\n\r\n // Calculate image size to fit inside viewport\r\n // ===========================================\r\n\r\n getFitPos: function (slide) {\r\n var self = this,\r\n $content = slide.$content,\r\n $slide = slide.$slide,\r\n width = slide.width || slide.opts.width,\r\n height = slide.height || slide.opts.height,\r\n maxWidth,\r\n maxHeight,\r\n minRatio,\r\n aspectRatio,\r\n rez = {};\r\n\r\n if (!slide.isLoaded || !$content || !$content.length) {\r\n return false;\r\n }\r\n\r\n maxWidth = $.fancybox.getTranslate(self.$refs.stage).width;\r\n maxHeight = $.fancybox.getTranslate(self.$refs.stage).height;\r\n\r\n maxWidth -=\r\n parseFloat($slide.css(\"paddingLeft\")) +\r\n parseFloat($slide.css(\"paddingRight\")) +\r\n parseFloat($content.css(\"marginLeft\")) +\r\n parseFloat($content.css(\"marginRight\"));\r\n\r\n maxHeight -=\r\n parseFloat($slide.css(\"paddingTop\")) +\r\n parseFloat($slide.css(\"paddingBottom\")) +\r\n parseFloat($content.css(\"marginTop\")) +\r\n parseFloat($content.css(\"marginBottom\"));\r\n\r\n if (!width || !height) {\r\n width = maxWidth;\r\n height = maxHeight;\r\n }\r\n\r\n minRatio = Math.min(1, maxWidth / width, maxHeight / height);\r\n\r\n width = minRatio * width;\r\n height = minRatio * height;\r\n\r\n // Adjust width/height to precisely fit into container\r\n if (width > maxWidth - 0.5) {\r\n width = maxWidth;\r\n }\r\n\r\n if (height > maxHeight - 0.5) {\r\n height = maxHeight;\r\n }\r\n\r\n if (slide.type === \"image\") {\r\n rez.top = Math.floor((maxHeight - height) * 0.5) + parseFloat($slide.css(\"paddingTop\"));\r\n rez.left = Math.floor((maxWidth - width) * 0.5) + parseFloat($slide.css(\"paddingLeft\"));\r\n } else if (slide.contentType === \"video\") {\r\n // Force aspect ratio for the video\r\n // \"I say the whole world must learn of our peaceful ways… by force!\"\r\n aspectRatio = slide.opts.width && slide.opts.height ? width / height : slide.opts.ratio || 16 / 9;\r\n\r\n if (height > width / aspectRatio) {\r\n height = width / aspectRatio;\r\n } else if (width > height * aspectRatio) {\r\n width = height * aspectRatio;\r\n }\r\n }\r\n\r\n rez.width = width;\r\n rez.height = height;\r\n\r\n return rez;\r\n },\r\n\r\n // Update content size and position for all slides\r\n // ==============================================\r\n\r\n update: function (e) {\r\n var self = this;\r\n\r\n $.each(self.slides, function (key, slide) {\r\n self.updateSlide(slide, e);\r\n });\r\n },\r\n\r\n // Update slide content position and size\r\n // ======================================\r\n\r\n updateSlide: function (slide, e) {\r\n var self = this,\r\n $content = slide && slide.$content,\r\n width = slide.width || slide.opts.width,\r\n height = slide.height || slide.opts.height,\r\n $slide = slide.$slide;\r\n\r\n // First, prevent caption overlap, if needed\r\n self.adjustCaption(slide);\r\n\r\n // Then resize content to fit inside the slide\r\n if ($content && (width || height || slide.contentType === \"video\") && !slide.hasError) {\r\n $.fancybox.stop($content);\r\n\r\n $.fancybox.setTranslate($content, self.getFitPos(slide));\r\n\r\n if (slide.pos === self.currPos) {\r\n self.isAnimating = false;\r\n\r\n self.updateCursor();\r\n }\r\n }\r\n\r\n // Then some adjustments\r\n self.adjustLayout(slide);\r\n\r\n if ($slide.length) {\r\n $slide.trigger(\"refresh\");\r\n\r\n if (slide.pos === self.currPos) {\r\n self.$refs.toolbar\r\n .add(self.$refs.navigation.find(\".fancybox-button--arrow_right\"))\r\n .toggleClass(\"compensate-for-scrollbar\", $slide.get(0).scrollHeight > $slide.get(0).clientHeight);\r\n }\r\n }\r\n\r\n self.trigger(\"onUpdate\", slide, e);\r\n },\r\n\r\n // Horizontally center slide\r\n // =========================\r\n\r\n centerSlide: function (duration) {\r\n var self = this,\r\n current = self.current,\r\n $slide = current.$slide;\r\n\r\n if (self.isClosing || !current) {\r\n return;\r\n }\r\n\r\n $slide.siblings().css({\r\n transform: \"\",\r\n opacity: \"\"\r\n });\r\n\r\n $slide\r\n .parent()\r\n .children()\r\n .removeClass(\"fancybox-slide--previous fancybox-slide--next\");\r\n\r\n $.fancybox.animate(\r\n $slide, {\r\n top: 0,\r\n left: 0,\r\n opacity: 1\r\n },\r\n duration === undefined ? 0 : duration,\r\n function () {\r\n // Clean up\r\n $slide.css({\r\n transform: \"\",\r\n opacity: \"\"\r\n });\r\n\r\n if (!current.isComplete) {\r\n self.complete();\r\n }\r\n },\r\n false\r\n );\r\n },\r\n\r\n // Check if current slide is moved (swiped)\r\n // ========================================\r\n\r\n isMoved: function (slide) {\r\n var current = slide || this.current,\r\n slidePos,\r\n stagePos;\r\n\r\n if (!current) {\r\n return false;\r\n }\r\n\r\n stagePos = $.fancybox.getTranslate(this.$refs.stage);\r\n slidePos = $.fancybox.getTranslate(current.$slide);\r\n\r\n return (\r\n !current.$slide.hasClass(\"fancybox-animated\") &&\r\n (Math.abs(slidePos.top - stagePos.top) > 0.5 || Math.abs(slidePos.left - stagePos.left) > 0.5)\r\n );\r\n },\r\n\r\n // Update cursor style depending if content can be zoomed\r\n // ======================================================\r\n\r\n updateCursor: function (nextWidth, nextHeight) {\r\n var self = this,\r\n current = self.current,\r\n $container = self.$refs.container,\r\n canPan,\r\n isZoomable;\r\n\r\n if (!current || self.isClosing || !self.Guestures) {\r\n return;\r\n }\r\n\r\n $container.removeClass(\"fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan\");\r\n\r\n canPan = self.canPan(nextWidth, nextHeight);\r\n\r\n isZoomable = canPan ? true : self.isZoomable();\r\n\r\n $container.toggleClass(\"fancybox-is-zoomable\", isZoomable);\r\n\r\n $(\"[data-fancybox-zoom]\").prop(\"disabled\", !isZoomable);\r\n\r\n if (canPan) {\r\n $container.addClass(\"fancybox-can-pan\");\r\n } else if (\r\n isZoomable &&\r\n (current.opts.clickContent === \"zoom\" || ($.isFunction(current.opts.clickContent) && current.opts.clickContent(current) == \"zoom\"))\r\n ) {\r\n $container.addClass(\"fancybox-can-zoomIn\");\r\n } else if (current.opts.touch && (current.opts.touch.vertical || self.group.length > 1) && current.contentType !== \"video\") {\r\n $container.addClass(\"fancybox-can-swipe\");\r\n }\r\n },\r\n\r\n // Check if current slide is zoomable\r\n // ==================================\r\n\r\n isZoomable: function () {\r\n var self = this,\r\n current = self.current,\r\n fitPos;\r\n\r\n // Assume that slide is zoomable if:\r\n // - image is still loading\r\n // - actual size of the image is smaller than available area\r\n if (current && !self.isClosing && current.type === \"image\" && !current.hasError) {\r\n if (!current.isLoaded) {\r\n return true;\r\n }\r\n\r\n fitPos = self.getFitPos(current);\r\n\r\n if (fitPos && (current.width > fitPos.width || current.height > fitPos.height)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n\r\n // Check if current image dimensions are smaller than actual\r\n // =========================================================\r\n\r\n isScaledDown: function (nextWidth, nextHeight) {\r\n var self = this,\r\n rez = false,\r\n current = self.current,\r\n $content = current.$content;\r\n\r\n if (nextWidth !== undefined && nextHeight !== undefined) {\r\n rez = nextWidth < current.width && nextHeight < current.height;\r\n } else if ($content) {\r\n rez = $.fancybox.getTranslate($content);\r\n rez = rez.width < current.width && rez.height < current.height;\r\n }\r\n\r\n return rez;\r\n },\r\n\r\n // Check if image dimensions exceed parent element\r\n // ===============================================\r\n\r\n canPan: function (nextWidth, nextHeight) {\r\n var self = this,\r\n current = self.current,\r\n pos = null,\r\n rez = false;\r\n\r\n if (current.type === \"image\" && (current.isComplete || (nextWidth && nextHeight)) && !current.hasError) {\r\n rez = self.getFitPos(current);\r\n\r\n if (nextWidth !== undefined && nextHeight !== undefined) {\r\n pos = {\r\n width: nextWidth,\r\n height: nextHeight\r\n };\r\n } else if (current.isComplete) {\r\n pos = $.fancybox.getTranslate(current.$content);\r\n }\r\n\r\n if (pos && rez) {\r\n rez = Math.abs(pos.width - rez.width) > 1.5 || Math.abs(pos.height - rez.height) > 1.5;\r\n }\r\n }\r\n\r\n return rez;\r\n },\r\n\r\n // Load content into the slide\r\n // ===========================\r\n\r\n loadSlide: function (slide) {\r\n var self = this,\r\n type,\r\n $slide,\r\n ajaxLoad;\r\n\r\n if (slide.isLoading || slide.isLoaded) {\r\n return;\r\n }\r\n\r\n slide.isLoading = true;\r\n\r\n if (self.trigger(\"beforeLoad\", slide) === false) {\r\n slide.isLoading = false;\r\n\r\n return false;\r\n }\r\n\r\n type = slide.type;\r\n $slide = slide.$slide;\r\n\r\n $slide\r\n .off(\"refresh\")\r\n .trigger(\"onReset\")\r\n .addClass(slide.opts.slideClass);\r\n\r\n // Create content depending on the type\r\n switch (type) {\r\n case \"image\":\r\n self.setImage(slide);\r\n\r\n break;\r\n\r\n case \"iframe\":\r\n self.setIframe(slide);\r\n\r\n break;\r\n\r\n case \"html\":\r\n self.setContent(slide, slide.src || slide.content);\r\n\r\n break;\r\n\r\n case \"video\":\r\n self.setContent(\r\n slide,\r\n slide.opts.video.tpl\r\n .replace(/\\{\\{src\\}\\}/gi, slide.src)\r\n .replace(\"{{format}}\", slide.opts.videoFormat || slide.opts.video.format || \"\")\r\n .replace(\"{{poster}}\", slide.thumb || \"\")\r\n );\r\n\r\n break;\r\n\r\n case \"inline\":\r\n if ($(slide.src).length) {\r\n self.setContent(slide, $(slide.src));\r\n } else {\r\n self.setError(slide);\r\n }\r\n\r\n break;\r\n\r\n case \"ajax\":\r\n self.showLoading(slide);\r\n\r\n ajaxLoad = $.ajax(\r\n $.extend({}, slide.opts.ajax.settings, {\r\n url: slide.src,\r\n success: function (data, textStatus) {\r\n if (textStatus === \"success\") {\r\n self.setContent(slide, data);\r\n }\r\n },\r\n error: function (jqXHR, textStatus) {\r\n if (jqXHR && textStatus !== \"abort\") {\r\n self.setError(slide);\r\n }\r\n }\r\n })\r\n );\r\n\r\n $slide.one(\"onReset\", function () {\r\n ajaxLoad.abort();\r\n });\r\n\r\n break;\r\n\r\n default:\r\n self.setError(slide);\r\n\r\n break;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n // Use thumbnail image, if possible\r\n // ================================\r\n\r\n setImage: function (slide) {\r\n var self = this,\r\n ghost;\r\n\r\n // Check if need to show loading icon\r\n setTimeout(function () {\r\n var $img = slide.$image;\r\n\r\n if (!self.isClosing && slide.isLoading && (!$img || !$img.length || !$img[0].complete) && !slide.hasError) {\r\n self.showLoading(slide);\r\n }\r\n }, 50);\r\n\r\n //Check if image has srcset\r\n self.checkSrcset(slide);\r\n\r\n // This will be wrapper containing both ghost and actual image\r\n slide.$content = $('
')\r\n .addClass(\"fancybox-is-hidden\")\r\n .appendTo(slide.$slide.addClass(\"fancybox-slide--image\"));\r\n\r\n // If we have a thumbnail, we can display it while actual image is loading\r\n // Users will not stare at black screen and actual image will appear gradually\r\n if (slide.opts.preload !== false && slide.opts.width && slide.opts.height && slide.thumb) {\r\n slide.width = slide.opts.width;\r\n slide.height = slide.opts.height;\r\n\r\n ghost = document.createElement(\"img\");\r\n\r\n ghost.onerror = function () {\r\n $(this).remove();\r\n\r\n slide.$ghost = null;\r\n };\r\n\r\n ghost.onload = function () {\r\n self.afterLoad(slide);\r\n };\r\n\r\n slide.$ghost = $(ghost)\r\n .addClass(\"fancybox-image\")\r\n .appendTo(slide.$content)\r\n .attr(\"src\", slide.thumb);\r\n }\r\n\r\n // Start loading actual image\r\n self.setBigImage(slide);\r\n },\r\n\r\n // Check if image has srcset and get the source\r\n // ============================================\r\n checkSrcset: function (slide) {\r\n var srcset = slide.opts.srcset || slide.opts.image.srcset,\r\n found,\r\n temp,\r\n pxRatio,\r\n windowWidth;\r\n\r\n // If we have \"srcset\", then we need to find first matching \"src\" value.\r\n // This is necessary, because when you set an src attribute, the browser will preload the image\r\n // before any javascript or even CSS is applied.\r\n if (srcset) {\r\n pxRatio = window.devicePixelRatio || 1;\r\n windowWidth = window.innerWidth * pxRatio;\r\n\r\n temp = srcset.split(\",\").map(function (el) {\r\n var ret = {};\r\n\r\n el.trim()\r\n .split(/\\s+/)\r\n .forEach(function (el, i) {\r\n var value = parseInt(el.substring(0, el.length - 1), 10);\r\n\r\n if (i === 0) {\r\n return (ret.url = el);\r\n }\r\n\r\n if (value) {\r\n ret.value = value;\r\n ret.postfix = el[el.length - 1];\r\n }\r\n });\r\n\r\n return ret;\r\n });\r\n\r\n // Sort by value\r\n temp.sort(function (a, b) {\r\n return a.value - b.value;\r\n });\r\n\r\n // Ok, now we have an array of all srcset values\r\n for (var j = 0; j < temp.length; j++) {\r\n var el = temp[j];\r\n\r\n if ((el.postfix === \"w\" && el.value >= windowWidth) || (el.postfix === \"x\" && el.value >= pxRatio)) {\r\n found = el;\r\n break;\r\n }\r\n }\r\n\r\n // If not found, take the last one\r\n if (!found && temp.length) {\r\n found = temp[temp.length - 1];\r\n }\r\n\r\n if (found) {\r\n slide.src = found.url;\r\n\r\n // If we have default width/height values, we can calculate height for matching source\r\n if (slide.width && slide.height && found.postfix == \"w\") {\r\n slide.height = (slide.width / slide.height) * found.value;\r\n slide.width = found.value;\r\n }\r\n\r\n slide.opts.srcset = srcset;\r\n }\r\n }\r\n },\r\n\r\n // Create full-size image\r\n // ======================\r\n\r\n setBigImage: function (slide) {\r\n var self = this,\r\n img = document.createElement(\"img\"),\r\n $img = $(img);\r\n\r\n slide.$image = $img\r\n .one(\"error\", function () {\r\n self.setError(slide);\r\n })\r\n .one(\"load\", function () {\r\n var sizes;\r\n\r\n if (!slide.$ghost) {\r\n self.resolveImageSlideSize(slide, this.naturalWidth, this.naturalHeight);\r\n\r\n self.afterLoad(slide);\r\n }\r\n\r\n if (self.isClosing) {\r\n return;\r\n }\r\n\r\n if (slide.opts.srcset) {\r\n sizes = slide.opts.sizes;\r\n\r\n if (!sizes || sizes === \"auto\") {\r\n sizes =\r\n (slide.width / slide.height > 1 && $W.width() / $W.height() > 1 ? \"100\" : Math.round((slide.width / slide.height) * 100)) +\r\n \"vw\";\r\n }\r\n\r\n $img.attr(\"sizes\", sizes).attr(\"srcset\", slide.opts.srcset);\r\n }\r\n\r\n // Hide temporary image after some delay\r\n if (slide.$ghost) {\r\n setTimeout(function () {\r\n if (slide.$ghost && !self.isClosing) {\r\n slide.$ghost.hide();\r\n }\r\n }, Math.min(300, Math.max(1000, slide.height / 1600)));\r\n }\r\n\r\n self.hideLoading(slide);\r\n })\r\n .addClass(\"fancybox-image\")\r\n .attr(\"src\", slide.src)\r\n .appendTo(slide.$content);\r\n\r\n if ((img.complete || img.readyState == \"complete\") && $img.naturalWidth && $img.naturalHeight) {\r\n $img.trigger(\"load\");\r\n } else if (img.error) {\r\n $img.trigger(\"error\");\r\n }\r\n },\r\n\r\n // Computes the slide size from image size and maxWidth/maxHeight\r\n // ==============================================================\r\n\r\n resolveImageSlideSize: function (slide, imgWidth, imgHeight) {\r\n var maxWidth = parseInt(slide.opts.width, 10),\r\n maxHeight = parseInt(slide.opts.height, 10);\r\n\r\n // Sets the default values from the image\r\n slide.width = imgWidth;\r\n slide.height = imgHeight;\r\n\r\n if (maxWidth > 0) {\r\n slide.width = maxWidth;\r\n slide.height = Math.floor((maxWidth * imgHeight) / imgWidth);\r\n }\r\n\r\n if (maxHeight > 0) {\r\n slide.width = Math.floor((maxHeight * imgWidth) / imgHeight);\r\n slide.height = maxHeight;\r\n }\r\n },\r\n\r\n // Create iframe wrapper, iframe and bindings\r\n // ==========================================\r\n\r\n setIframe: function (slide) {\r\n var self = this,\r\n opts = slide.opts.iframe,\r\n $slide = slide.$slide,\r\n $iframe;\r\n\r\n slide.$content = $('
')\r\n .css(opts.css)\r\n .appendTo($slide);\r\n\r\n $slide.addClass(\"fancybox-slide--\" + slide.contentType);\r\n\r\n slide.$iframe = $iframe = $(opts.tpl.replace(/\\{rnd\\}/g, new Date().getTime()))\r\n .attr(opts.attr)\r\n .appendTo(slide.$content);\r\n\r\n if (opts.preload) {\r\n self.showLoading(slide);\r\n\r\n // Unfortunately, it is not always possible to determine if iframe is successfully loaded\r\n // (due to browser security policy)\r\n\r\n $iframe.on(\"load.fb error.fb\", function (e) {\r\n this.isReady = 1;\r\n\r\n slide.$slide.trigger(\"refresh\");\r\n\r\n self.afterLoad(slide);\r\n });\r\n\r\n // Recalculate iframe content size\r\n // ===============================\r\n\r\n $slide.on(\"refresh.fb\", function () {\r\n var $content = slide.$content,\r\n frameWidth = opts.css.width,\r\n frameHeight = opts.css.height,\r\n $contents,\r\n $body;\r\n\r\n if ($iframe[0].isReady !== 1) {\r\n return;\r\n }\r\n\r\n try {\r\n $contents = $iframe.contents();\r\n $body = $contents.find(\"body\");\r\n } catch (ignore) {}\r\n\r\n // Calculate content dimensions, if it is accessible\r\n if ($body && $body.length && $body.children().length) {\r\n // Avoid scrolling to top (if multiple instances)\r\n $slide.css(\"overflow\", \"visible\");\r\n\r\n $content.css({\r\n width: \"100%\",\r\n \"max-width\": \"100%\",\r\n height: \"9999px\"\r\n });\r\n\r\n if (frameWidth === undefined) {\r\n frameWidth = Math.ceil(Math.max($body[0].clientWidth, $body.outerWidth(true)));\r\n }\r\n\r\n $content.css(\"width\", frameWidth ? frameWidth : \"\").css(\"max-width\", \"\");\r\n\r\n if (frameHeight === undefined) {\r\n frameHeight = Math.ceil(Math.max($body[0].clientHeight, $body.outerHeight(true)));\r\n }\r\n\r\n $content.css(\"height\", frameHeight ? frameHeight : \"\");\r\n\r\n $slide.css(\"overflow\", \"auto\");\r\n }\r\n\r\n $content.removeClass(\"fancybox-is-hidden\");\r\n });\r\n } else {\r\n self.afterLoad(slide);\r\n }\r\n\r\n $iframe.attr(\"src\", slide.src);\r\n\r\n // Remove iframe if closing or changing gallery item\r\n $slide.one(\"onReset\", function () {\r\n // This helps IE not to throw errors when closing\r\n try {\r\n $(this)\r\n .find(\"iframe\")\r\n .hide()\r\n .unbind()\r\n .attr(\"src\", \"//about:blank\");\r\n } catch (ignore) {}\r\n\r\n $(this)\r\n .off(\"refresh.fb\")\r\n .empty();\r\n\r\n slide.isLoaded = false;\r\n slide.isRevealed = false;\r\n });\r\n },\r\n\r\n // Wrap and append content to the slide\r\n // ======================================\r\n\r\n setContent: function (slide, content) {\r\n var self = this;\r\n\r\n if (self.isClosing) {\r\n return;\r\n }\r\n\r\n self.hideLoading(slide);\r\n\r\n if (slide.$content) {\r\n $.fancybox.stop(slide.$content);\r\n }\r\n\r\n slide.$slide.empty();\r\n\r\n // If content is a jQuery object, then it will be moved to the slide.\r\n // The placeholder is created so we will know where to put it back.\r\n if (isQuery(content) && content.parent().length) {\r\n // Make sure content is not already moved to fancyBox\r\n if (content.hasClass(\"fancybox-content\") || content.parent().hasClass(\"fancybox-content\")) {\r\n content.parents(\".fancybox-slide\").trigger(\"onReset\");\r\n }\r\n\r\n // Create temporary element marking original place of the content\r\n slide.$placeholder = $(\"
\")\r\n .hide()\r\n .insertAfter(content);\r\n\r\n // Make sure content is visible\r\n content.css(\"display\", \"inline-block\");\r\n } else if (!slide.hasError) {\r\n // If content is just a plain text, try to convert it to html\r\n if ($.type(content) === \"string\") {\r\n content = $(\"
\")\r\n .append($.trim(content))\r\n .contents();\r\n }\r\n\r\n // If \"filter\" option is provided, then filter content\r\n if (slide.opts.filter) {\r\n content = $(\"
\")\r\n .html(content)\r\n .find(slide.opts.filter);\r\n }\r\n }\r\n\r\n slide.$slide.one(\"onReset\", function () {\r\n // Pause all html5 video/audio\r\n $(this)\r\n .find(\"video,audio\")\r\n .trigger(\"pause\");\r\n\r\n // Put content back\r\n if (slide.$placeholder) {\r\n slide.$placeholder.after(content.removeClass(\"fancybox-content\").hide()).remove();\r\n\r\n slide.$placeholder = null;\r\n }\r\n\r\n // Remove custom close button\r\n if (slide.$smallBtn) {\r\n slide.$smallBtn.remove();\r\n\r\n slide.$smallBtn = null;\r\n }\r\n\r\n // Remove content and mark slide as not loaded\r\n if (!slide.hasError) {\r\n $(this).empty();\r\n\r\n slide.isLoaded = false;\r\n slide.isRevealed = false;\r\n }\r\n });\r\n\r\n $(content).appendTo(slide.$slide);\r\n\r\n if ($(content).is(\"video,audio\")) {\r\n $(content).addClass(\"fancybox-video\");\r\n\r\n $(content).wrap(\"
\");\r\n\r\n slide.contentType = \"video\";\r\n\r\n slide.opts.width = slide.opts.width || $(content).attr(\"width\");\r\n slide.opts.height = slide.opts.height || $(content).attr(\"height\");\r\n }\r\n\r\n slide.$content = slide.$slide\r\n .children()\r\n .filter(\"div,form,main,video,audio,article,.fancybox-content\")\r\n .first();\r\n\r\n slide.$content.siblings().hide();\r\n\r\n // Re-check if there is a valid content\r\n // (in some cases, ajax response can contain various elements or plain text)\r\n if (!slide.$content.length) {\r\n slide.$content = slide.$slide\r\n .wrapInner(\"
\")\r\n .children()\r\n .first();\r\n }\r\n\r\n slide.$content.addClass(\"fancybox-content\");\r\n\r\n slide.$slide.addClass(\"fancybox-slide--\" + slide.contentType);\r\n\r\n self.afterLoad(slide);\r\n },\r\n\r\n // Display error message\r\n // =====================\r\n\r\n setError: function (slide) {\r\n slide.hasError = true;\r\n\r\n slide.$slide\r\n .trigger(\"onReset\")\r\n .removeClass(\"fancybox-slide--\" + slide.contentType)\r\n .addClass(\"fancybox-slide--error\");\r\n\r\n slide.contentType = \"html\";\r\n\r\n this.setContent(slide, this.translate(slide, slide.opts.errorTpl));\r\n\r\n if (slide.pos === this.currPos) {\r\n this.isAnimating = false;\r\n }\r\n },\r\n\r\n // Show loading icon inside the slide\r\n // ==================================\r\n\r\n showLoading: function (slide) {\r\n var self = this;\r\n\r\n slide = slide || self.current;\r\n\r\n if (slide && !slide.$spinner) {\r\n slide.$spinner = $(self.translate(self, self.opts.spinnerTpl))\r\n .appendTo(slide.$slide)\r\n .hide()\r\n .fadeIn(\"fast\");\r\n }\r\n },\r\n\r\n // Remove loading icon from the slide\r\n // ==================================\r\n\r\n hideLoading: function (slide) {\r\n var self = this;\r\n\r\n slide = slide || self.current;\r\n\r\n if (slide && slide.$spinner) {\r\n slide.$spinner.stop().remove();\r\n\r\n delete slide.$spinner;\r\n }\r\n },\r\n\r\n // Adjustments after slide content has been loaded\r\n // ===============================================\r\n\r\n afterLoad: function (slide) {\r\n var self = this;\r\n\r\n if (self.isClosing) {\r\n return;\r\n }\r\n\r\n slide.isLoading = false;\r\n slide.isLoaded = true;\r\n\r\n self.trigger(\"afterLoad\", slide);\r\n\r\n self.hideLoading(slide);\r\n\r\n // Add small close button\r\n if (slide.opts.smallBtn && (!slide.$smallBtn || !slide.$smallBtn.length)) {\r\n slide.$smallBtn = $(self.translate(slide, slide.opts.btnTpl.smallBtn)).appendTo(slide.$content);\r\n }\r\n\r\n // Disable right click\r\n if (slide.opts.protect && slide.$content && !slide.hasError) {\r\n slide.$content.on(\"contextmenu.fb\", function (e) {\r\n if (e.button == 2) {\r\n e.preventDefault();\r\n }\r\n\r\n return true;\r\n });\r\n\r\n // Add fake element on top of the image\r\n // This makes a bit harder for user to select image\r\n if (slide.type === \"image\") {\r\n $('
').appendTo(slide.$content);\r\n }\r\n }\r\n\r\n self.adjustCaption(slide);\r\n\r\n self.adjustLayout(slide);\r\n\r\n if (slide.pos === self.currPos) {\r\n self.updateCursor();\r\n }\r\n\r\n self.revealContent(slide);\r\n },\r\n\r\n // Prevent caption overlap,\r\n // fix css inconsistency across browsers\r\n // =====================================\r\n\r\n adjustCaption: function (slide) {\r\n var self = this,\r\n current = slide || self.current,\r\n caption = current.opts.caption,\r\n preventOverlap = current.opts.preventCaptionOverlap,\r\n $caption = self.$refs.caption,\r\n $clone,\r\n captionH = false;\r\n\r\n $caption.toggleClass(\"fancybox-caption--separate\", preventOverlap);\r\n\r\n if (preventOverlap && caption && caption.length) {\r\n if (current.pos !== self.currPos) {\r\n $clone = $caption.clone().appendTo($caption.parent());\r\n\r\n $clone\r\n .children()\r\n .eq(0)\r\n .empty()\r\n .html(caption);\r\n\r\n captionH = $clone.outerHeight(true);\r\n\r\n $clone.empty().remove();\r\n } else if (self.$caption) {\r\n captionH = self.$caption.outerHeight(true);\r\n }\r\n\r\n current.$slide.css(\"padding-bottom\", captionH || \"\");\r\n }\r\n },\r\n\r\n // Simple hack to fix inconsistency across browsers, described here (affects Edge, too):\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=748518\r\n // ====================================================================================\r\n\r\n adjustLayout: function (slide) {\r\n var self = this,\r\n current = slide || self.current,\r\n scrollHeight,\r\n marginBottom,\r\n inlinePadding,\r\n actualPadding;\r\n\r\n if (current.isLoaded && current.opts.disableLayoutFix !== true) {\r\n current.$content.css(\"margin-bottom\", \"\");\r\n\r\n // If we would always set margin-bottom for the content,\r\n // then it would potentially break vertical align\r\n if (current.$content.outerHeight() > current.$slide.height() + 0.5) {\r\n inlinePadding = current.$slide[0].style[\"padding-bottom\"];\r\n actualPadding = current.$slide.css(\"padding-bottom\");\r\n\r\n if (parseFloat(actualPadding) > 0) {\r\n scrollHeight = current.$slide[0].scrollHeight;\r\n\r\n current.$slide.css(\"padding-bottom\", 0);\r\n\r\n if (Math.abs(scrollHeight - current.$slide[0].scrollHeight) < 1) {\r\n marginBottom = actualPadding;\r\n }\r\n\r\n current.$slide.css(\"padding-bottom\", inlinePadding);\r\n }\r\n }\r\n\r\n current.$content.css(\"margin-bottom\", marginBottom);\r\n }\r\n },\r\n\r\n // Make content visible\r\n // This method is called right after content has been loaded or\r\n // user navigates gallery and transition should start\r\n // ============================================================\r\n\r\n revealContent: function (slide) {\r\n var self = this,\r\n $slide = slide.$slide,\r\n end = false,\r\n start = false,\r\n isMoved = self.isMoved(slide),\r\n isRevealed = slide.isRevealed,\r\n effect,\r\n effectClassName,\r\n duration,\r\n opacity;\r\n\r\n slide.isRevealed = true;\r\n\r\n effect = slide.opts[self.firstRun ? \"animationEffect\" : \"transitionEffect\"];\r\n duration = slide.opts[self.firstRun ? \"animationDuration\" : \"transitionDuration\"];\r\n\r\n duration = parseInt(slide.forcedDuration === undefined ? duration : slide.forcedDuration, 10);\r\n\r\n if (isMoved || slide.pos !== self.currPos || !duration) {\r\n effect = false;\r\n }\r\n\r\n // Check if can zoom\r\n if (effect === \"zoom\") {\r\n if (slide.pos === self.currPos && duration && slide.type === \"image\" && !slide.hasError && (start = self.getThumbPos(slide))) {\r\n end = self.getFitPos(slide);\r\n } else {\r\n effect = \"fade\";\r\n }\r\n }\r\n\r\n // Zoom animation\r\n // ==============\r\n if (effect === \"zoom\") {\r\n self.isAnimating = true;\r\n\r\n end.scaleX = end.width / start.width;\r\n end.scaleY = end.height / start.height;\r\n\r\n // Check if we need to animate opacity\r\n opacity = slide.opts.zoomOpacity;\r\n\r\n if (opacity == \"auto\") {\r\n opacity = Math.abs(slide.width / slide.height - start.width / start.height) > 0.1;\r\n }\r\n\r\n if (opacity) {\r\n start.opacity = 0.1;\r\n end.opacity = 1;\r\n }\r\n\r\n // Draw image at start position\r\n $.fancybox.setTranslate(slide.$content.removeClass(\"fancybox-is-hidden\"), start);\r\n\r\n forceRedraw(slide.$content);\r\n\r\n // Start animation\r\n $.fancybox.animate(slide.$content, end, duration, function () {\r\n self.isAnimating = false;\r\n\r\n self.complete();\r\n });\r\n\r\n return;\r\n }\r\n\r\n self.updateSlide(slide);\r\n\r\n // Simply show content if no effect\r\n // ================================\r\n if (!effect) {\r\n slide.$content.removeClass(\"fancybox-is-hidden\");\r\n\r\n if (!isRevealed && isMoved && slide.type === \"image\" && !slide.hasError) {\r\n slide.$content.hide().fadeIn(\"fast\");\r\n }\r\n\r\n if (slide.pos === self.currPos) {\r\n self.complete();\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Prepare for CSS transiton\r\n // =========================\r\n $.fancybox.stop($slide);\r\n\r\n //effectClassName = \"fancybox-animated fancybox-slide--\" + (slide.pos >= self.prevPos ? \"next\" : \"previous\") + \" fancybox-fx-\" + effect;\r\n effectClassName = \"fancybox-slide--\" + (slide.pos >= self.prevPos ? \"next\" : \"previous\") + \" fancybox-animated fancybox-fx-\" + effect;\r\n\r\n $slide.addClass(effectClassName).removeClass(\"fancybox-slide--current\"); //.addClass(effectClassName);\r\n\r\n slide.$content.removeClass(\"fancybox-is-hidden\");\r\n\r\n // Force reflow\r\n forceRedraw($slide);\r\n\r\n if (slide.type !== \"image\") {\r\n slide.$content.hide().show(0);\r\n }\r\n\r\n $.fancybox.animate(\r\n $slide,\r\n \"fancybox-slide--current\",\r\n duration,\r\n function () {\r\n $slide.removeClass(effectClassName).css({\r\n transform: \"\",\r\n opacity: \"\"\r\n });\r\n\r\n if (slide.pos === self.currPos) {\r\n self.complete();\r\n }\r\n },\r\n true\r\n );\r\n },\r\n\r\n // Check if we can and have to zoom from thumbnail\r\n //================================================\r\n\r\n getThumbPos: function (slide) {\r\n var rez = false,\r\n $thumb = slide.$thumb,\r\n thumbPos,\r\n btw,\r\n brw,\r\n bbw,\r\n blw;\r\n\r\n if (!$thumb || !inViewport($thumb[0])) {\r\n return false;\r\n }\r\n\r\n thumbPos = $.fancybox.getTranslate($thumb);\r\n\r\n btw = parseFloat($thumb.css(\"border-top-width\") || 0);\r\n brw = parseFloat($thumb.css(\"border-right-width\") || 0);\r\n bbw = parseFloat($thumb.css(\"border-bottom-width\") || 0);\r\n blw = parseFloat($thumb.css(\"border-left-width\") || 0);\r\n\r\n rez = {\r\n top: thumbPos.top + btw,\r\n left: thumbPos.left + blw,\r\n width: thumbPos.width - brw - blw,\r\n height: thumbPos.height - btw - bbw,\r\n scaleX: 1,\r\n scaleY: 1\r\n };\r\n\r\n return thumbPos.width > 0 && thumbPos.height > 0 ? rez : false;\r\n },\r\n\r\n // Final adjustments after current gallery item is moved to position\r\n // and it`s content is loaded\r\n // ==================================================================\r\n\r\n complete: function () {\r\n var self = this,\r\n current = self.current,\r\n slides = {},\r\n $el;\r\n\r\n if (self.isMoved() || !current.isLoaded) {\r\n return;\r\n }\r\n\r\n if (!current.isComplete) {\r\n current.isComplete = true;\r\n\r\n current.$slide.siblings().trigger(\"onReset\");\r\n\r\n self.preload(\"inline\");\r\n\r\n // Trigger any CSS transiton inside the slide\r\n forceRedraw(current.$slide);\r\n\r\n current.$slide.addClass(\"fancybox-slide--complete\");\r\n\r\n // Remove unnecessary slides\r\n $.each(self.slides, function (key, slide) {\r\n if (slide.pos >= self.currPos - 1 && slide.pos <= self.currPos + 1) {\r\n slides[slide.pos] = slide;\r\n } else if (slide) {\r\n $.fancybox.stop(slide.$slide);\r\n\r\n slide.$slide.off().remove();\r\n }\r\n });\r\n\r\n self.slides = slides;\r\n }\r\n\r\n self.isAnimating = false;\r\n\r\n self.updateCursor();\r\n\r\n self.trigger(\"afterShow\");\r\n\r\n // Autoplay first html5 video/audio\r\n if (!!current.opts.video.autoStart) {\r\n current.$slide\r\n .find(\"video,audio\")\r\n .filter(\":visible:first\")\r\n .trigger(\"play\")\r\n .one(\"ended\", function () {\r\n if (Document.exitFullscreen) {\r\n Document.exitFullscreen();\r\n } else if (this.webkitExitFullscreen) {\r\n this.webkitExitFullscreen();\r\n }\r\n\r\n self.next();\r\n });\r\n }\r\n\r\n // Try to focus on the first focusable element\r\n if (current.opts.autoFocus && current.contentType === \"html\") {\r\n // Look for the first input with autofocus attribute\r\n $el = current.$content.find(\"input[autofocus]:enabled:visible:first\");\r\n\r\n if ($el.length) {\r\n $el.trigger(\"focus\");\r\n } else {\r\n self.focus(null, true);\r\n }\r\n }\r\n\r\n // Avoid jumping\r\n current.$slide.scrollTop(0).scrollLeft(0);\r\n },\r\n\r\n // Preload next and previous slides\r\n // ================================\r\n\r\n preload: function (type) {\r\n var self = this,\r\n prev,\r\n next;\r\n\r\n if (self.group.length < 2) {\r\n return;\r\n }\r\n\r\n next = self.slides[self.currPos + 1];\r\n prev = self.slides[self.currPos - 1];\r\n\r\n if (prev && prev.type === type) {\r\n self.loadSlide(prev);\r\n }\r\n\r\n if (next && next.type === type) {\r\n self.loadSlide(next);\r\n }\r\n },\r\n\r\n // Try to find and focus on the first focusable element\r\n // ====================================================\r\n\r\n focus: function (e, firstRun) {\r\n var self = this,\r\n focusableStr = [\r\n \"a[href]\",\r\n \"area[href]\",\r\n 'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])',\r\n \"select:not([disabled]):not([aria-hidden])\",\r\n \"textarea:not([disabled]):not([aria-hidden])\",\r\n \"button:not([disabled]):not([aria-hidden])\",\r\n \"iframe\",\r\n \"object\",\r\n \"embed\",\r\n \"video\",\r\n \"audio\",\r\n \"[contenteditable]\",\r\n '[tabindex]:not([tabindex^=\"-\"])'\r\n ].join(\",\"),\r\n focusableItems,\r\n focusedItemIndex;\r\n\r\n if (self.isClosing) {\r\n return;\r\n }\r\n\r\n if (e || !self.current || !self.current.isComplete) {\r\n // Focus on any element inside fancybox\r\n focusableItems = self.$refs.container.find(\"*:visible\");\r\n } else {\r\n // Focus inside current slide\r\n focusableItems = self.current.$slide.find(\"*:visible\" + (firstRun ? \":not(.fancybox-close-small)\" : \"\"));\r\n }\r\n\r\n focusableItems = focusableItems.filter(focusableStr).filter(function () {\r\n return $(this).css(\"visibility\") !== \"hidden\" && !$(this).hasClass(\"disabled\");\r\n });\r\n\r\n if (focusableItems.length) {\r\n focusedItemIndex = focusableItems.index(document.activeElement);\r\n\r\n if (e && e.shiftKey) {\r\n // Back tab\r\n if (focusedItemIndex < 0 || focusedItemIndex == 0) {\r\n e.preventDefault();\r\n\r\n focusableItems.eq(focusableItems.length - 1).trigger(\"focus\");\r\n }\r\n } else {\r\n // Outside or Forward tab\r\n if (focusedItemIndex < 0 || focusedItemIndex == focusableItems.length - 1) {\r\n if (e) {\r\n e.preventDefault();\r\n }\r\n\r\n focusableItems.eq(0).trigger(\"focus\");\r\n }\r\n }\r\n } else {\r\n self.$refs.container.trigger(\"focus\");\r\n }\r\n },\r\n\r\n // Activates current instance - brings container to the front and enables keyboard,\r\n // notifies other instances about deactivating\r\n // =================================================================================\r\n\r\n activate: function () {\r\n var self = this;\r\n\r\n // Deactivate all instances\r\n $(\".fancybox-container\").each(function () {\r\n var instance = $(this).data(\"FancyBox\");\r\n\r\n // Skip self and closing instances\r\n if (instance && instance.id !== self.id && !instance.isClosing) {\r\n instance.trigger(\"onDeactivate\");\r\n\r\n instance.removeEvents();\r\n\r\n instance.isVisible = false;\r\n }\r\n });\r\n\r\n self.isVisible = true;\r\n\r\n if (self.current || self.isIdle) {\r\n self.update();\r\n\r\n self.updateControls();\r\n }\r\n\r\n self.trigger(\"onActivate\");\r\n\r\n self.addEvents();\r\n },\r\n\r\n // Start closing procedure\r\n // This will start \"zoom-out\" animation if needed and clean everything up afterwards\r\n // =================================================================================\r\n\r\n close: function (e, d) {\r\n var self = this,\r\n current = self.current,\r\n effect,\r\n duration,\r\n $content,\r\n domRect,\r\n opacity,\r\n start,\r\n end;\r\n\r\n var done = function () {\r\n self.cleanUp(e);\r\n };\r\n\r\n if (self.isClosing) {\r\n return false;\r\n }\r\n\r\n self.isClosing = true;\r\n\r\n // If beforeClose callback prevents closing, make sure content is centered\r\n if (self.trigger(\"beforeClose\", e) === false) {\r\n self.isClosing = false;\r\n\r\n requestAFrame(function () {\r\n self.update();\r\n });\r\n\r\n return false;\r\n }\r\n\r\n // Remove all events\r\n // If there are multiple instances, they will be set again by \"activate\" method\r\n self.removeEvents();\r\n\r\n $content = current.$content;\r\n effect = current.opts.animationEffect;\r\n duration = $.isNumeric(d) ? d : effect ? current.opts.animationDuration : 0;\r\n\r\n current.$slide.removeClass(\"fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated\");\r\n\r\n if (e !== true) {\r\n $.fancybox.stop(current.$slide);\r\n } else {\r\n effect = false;\r\n }\r\n\r\n // Remove other slides\r\n current.$slide\r\n .siblings()\r\n .trigger(\"onReset\")\r\n .remove();\r\n\r\n // Trigger animations\r\n if (duration) {\r\n self.$refs.container\r\n .removeClass(\"fancybox-is-open\")\r\n .addClass(\"fancybox-is-closing\")\r\n .css(\"transition-duration\", duration + \"ms\");\r\n }\r\n\r\n // Clean up\r\n self.hideLoading(current);\r\n\r\n self.hideControls(true);\r\n\r\n self.updateCursor();\r\n\r\n // Check if possible to zoom-out\r\n if (\r\n effect === \"zoom\" &&\r\n !($content && duration && current.type === \"image\" && !self.isMoved() && !current.hasError && (end = self.getThumbPos(current)))\r\n ) {\r\n effect = \"fade\";\r\n }\r\n\r\n if (effect === \"zoom\") {\r\n $.fancybox.stop($content);\r\n\r\n domRect = $.fancybox.getTranslate($content);\r\n\r\n start = {\r\n top: domRect.top,\r\n left: domRect.left,\r\n scaleX: domRect.width / end.width,\r\n scaleY: domRect.height / end.height,\r\n width: end.width,\r\n height: end.height\r\n };\r\n\r\n // Check if we need to animate opacity\r\n opacity = current.opts.zoomOpacity;\r\n\r\n if (opacity == \"auto\") {\r\n opacity = Math.abs(current.width / current.height - end.width / end.height) > 0.1;\r\n }\r\n\r\n if (opacity) {\r\n end.opacity = 0;\r\n }\r\n\r\n $.fancybox.setTranslate($content, start);\r\n\r\n forceRedraw($content);\r\n\r\n $.fancybox.animate($content, end, duration, done);\r\n\r\n return true;\r\n }\r\n\r\n if (effect && duration) {\r\n $.fancybox.animate(\r\n current.$slide.addClass(\"fancybox-slide--previous\").removeClass(\"fancybox-slide--current\"),\r\n \"fancybox-animated fancybox-fx-\" + effect,\r\n duration,\r\n done\r\n );\r\n } else {\r\n // If skip animation\r\n if (e === true) {\r\n setTimeout(done, duration);\r\n } else {\r\n done();\r\n }\r\n }\r\n\r\n return true;\r\n },\r\n\r\n // Final adjustments after removing the instance\r\n // =============================================\r\n\r\n cleanUp: function (e) {\r\n var self = this,\r\n instance,\r\n $focus = self.current.opts.$orig,\r\n x,\r\n y;\r\n\r\n self.current.$slide.trigger(\"onReset\");\r\n\r\n self.$refs.container.empty().remove();\r\n\r\n self.trigger(\"afterClose\", e);\r\n\r\n // Place back focus\r\n if (!!self.current.opts.backFocus) {\r\n if (!$focus || !$focus.length || !$focus.is(\":visible\")) {\r\n $focus = self.$trigger;\r\n }\r\n\r\n if ($focus && $focus.length) {\r\n x = window.scrollX;\r\n y = window.scrollY;\r\n\r\n $focus.trigger(\"focus\");\r\n\r\n $(\"html, body\")\r\n .scrollTop(y)\r\n .scrollLeft(x);\r\n }\r\n }\r\n\r\n self.current = null;\r\n\r\n // Check if there are other instances\r\n instance = $.fancybox.getInstance();\r\n\r\n if (instance) {\r\n instance.activate();\r\n } else {\r\n $(\"body\").removeClass(\"fancybox-active compensate-for-scrollbar\");\r\n\r\n $(\"#fancybox-style-noscroll\").remove();\r\n }\r\n },\r\n\r\n // Call callback and trigger an event\r\n // ==================================\r\n\r\n trigger: function (name, slide) {\r\n var args = Array.prototype.slice.call(arguments, 1),\r\n self = this,\r\n obj = slide && slide.opts ? slide : self.current,\r\n rez;\r\n\r\n if (obj) {\r\n args.unshift(obj);\r\n } else {\r\n obj = self;\r\n }\r\n\r\n args.unshift(self);\r\n\r\n if ($.isFunction(obj.opts[name])) {\r\n rez = obj.opts[name].apply(obj, args);\r\n }\r\n\r\n if (rez === false) {\r\n return rez;\r\n }\r\n\r\n if (name === \"afterClose\" || !self.$refs) {\r\n $D.trigger(name + \".fb\", args);\r\n } else {\r\n self.$refs.container.trigger(name + \".fb\", args);\r\n }\r\n },\r\n\r\n // Update infobar values, navigation button states and reveal caption\r\n // ==================================================================\r\n\r\n updateControls: function () {\r\n var self = this,\r\n current = self.current,\r\n index = current.index,\r\n $container = self.$refs.container,\r\n $caption = self.$refs.caption,\r\n caption = current.opts.caption;\r\n\r\n // Recalculate content dimensions\r\n current.$slide.trigger(\"refresh\");\r\n\r\n // Set caption\r\n if (caption && caption.length) {\r\n self.$caption = $caption;\r\n\r\n $caption\r\n .children()\r\n .eq(0)\r\n .html(caption);\r\n } else {\r\n self.$caption = null;\r\n }\r\n\r\n if (!self.hasHiddenControls && !self.isIdle) {\r\n self.showControls();\r\n }\r\n\r\n // Update info and navigation elements\r\n $container.find(\"[data-fancybox-count]\").html(self.group.length);\r\n $container.find(\"[data-fancybox-index]\").html(index + 1);\r\n\r\n $container.find(\"[data-fancybox-prev]\").prop(\"disabled\", !current.opts.loop && index <= 0);\r\n $container.find(\"[data-fancybox-next]\").prop(\"disabled\", !current.opts.loop && index >= self.group.length - 1);\r\n\r\n if (current.type === \"image\") {\r\n // Re-enable buttons; update download button source\r\n $container\r\n .find(\"[data-fancybox-zoom]\")\r\n .show()\r\n .end()\r\n .find(\"[data-fancybox-download]\")\r\n .attr(\"href\", current.opts.image.src || current.src)\r\n .show();\r\n } else if (current.opts.toolbar) {\r\n $container.find(\"[data-fancybox-download],[data-fancybox-zoom]\").hide();\r\n }\r\n\r\n // Make sure focus is not on disabled button/element\r\n if ($(document.activeElement).is(\":hidden,[disabled]\")) {\r\n self.$refs.container.trigger(\"focus\");\r\n }\r\n },\r\n\r\n // Hide toolbar and caption\r\n // ========================\r\n\r\n hideControls: function (andCaption) {\r\n var self = this,\r\n arr = [\"infobar\", \"toolbar\", \"nav\"];\r\n\r\n if (andCaption || !self.current.opts.preventCaptionOverlap) {\r\n arr.push(\"caption\");\r\n }\r\n\r\n this.$refs.container.removeClass(\r\n arr\r\n .map(function (i) {\r\n return \"fancybox-show-\" + i;\r\n })\r\n .join(\" \")\r\n );\r\n\r\n this.hasHiddenControls = true;\r\n },\r\n\r\n showControls: function () {\r\n var self = this,\r\n opts = self.current ? self.current.opts : self.opts,\r\n $container = self.$refs.container;\r\n\r\n self.hasHiddenControls = false;\r\n self.idleSecondsCounter = 0;\r\n\r\n $container\r\n .toggleClass(\"fancybox-show-toolbar\", !!(opts.toolbar && opts.buttons))\r\n .toggleClass(\"fancybox-show-infobar\", !!(opts.infobar && self.group.length > 1))\r\n .toggleClass(\"fancybox-show-caption\", !!self.$caption)\r\n .toggleClass(\"fancybox-show-nav\", !!(opts.arrows && self.group.length > 1))\r\n .toggleClass(\"fancybox-is-modal\", !!opts.modal);\r\n },\r\n\r\n // Toggle toolbar and caption\r\n // ==========================\r\n\r\n toggleControls: function () {\r\n if (this.hasHiddenControls) {\r\n this.showControls();\r\n } else {\r\n this.hideControls();\r\n }\r\n }\r\n });\r\n\r\n $.fancybox = {\r\n version: \"3.5.7\",\r\n defaults: defaults,\r\n\r\n // Get current instance and execute a command.\r\n //\r\n // Examples of usage:\r\n //\r\n // $instance = $.fancybox.getInstance();\r\n // $.fancybox.getInstance().jumpTo( 1 );\r\n // $.fancybox.getInstance( 'jumpTo', 1 );\r\n // $.fancybox.getInstance( function() {\r\n // console.info( this.currIndex );\r\n // });\r\n // ======================================================\r\n\r\n getInstance: function (command) {\r\n var instance = $('.fancybox-container:not(\".fancybox-is-closing\"):last').data(\"FancyBox\"),\r\n args = Array.prototype.slice.call(arguments, 1);\r\n\r\n if (instance instanceof FancyBox) {\r\n if ($.type(command) === \"string\") {\r\n instance[command].apply(instance, args);\r\n } else if ($.type(command) === \"function\") {\r\n command.apply(instance, args);\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n return false;\r\n },\r\n\r\n // Create new instance\r\n // ===================\r\n\r\n open: function (items, opts, index) {\r\n return new FancyBox(items, opts, index);\r\n },\r\n\r\n // Close current or all instances\r\n // ==============================\r\n\r\n close: function (all) {\r\n var instance = this.getInstance();\r\n\r\n if (instance) {\r\n instance.close();\r\n\r\n // Try to find and close next instance\r\n if (all === true) {\r\n this.close(all);\r\n }\r\n }\r\n },\r\n\r\n // Close all instances and unbind all events\r\n // =========================================\r\n\r\n destroy: function () {\r\n this.close(true);\r\n\r\n $D.add(\"body\").off(\"click.fb-start\", \"**\");\r\n },\r\n\r\n // Try to detect mobile devices\r\n // ============================\r\n\r\n isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),\r\n\r\n // Detect if 'translate3d' support is available\r\n // ============================================\r\n\r\n use3d: (function () {\r\n var div = document.createElement(\"div\");\r\n\r\n return (\r\n window.getComputedStyle &&\r\n window.getComputedStyle(div) &&\r\n window.getComputedStyle(div).getPropertyValue(\"transform\") &&\r\n !(document.documentMode && document.documentMode < 11)\r\n );\r\n })(),\r\n\r\n // Helper function to get current visual state of an element\r\n // returns array[ top, left, horizontal-scale, vertical-scale, opacity ]\r\n // =====================================================================\r\n\r\n getTranslate: function ($el) {\r\n var domRect;\r\n\r\n if (!$el || !$el.length) {\r\n return false;\r\n }\r\n\r\n domRect = $el[0].getBoundingClientRect();\r\n\r\n return {\r\n top: domRect.top || 0,\r\n left: domRect.left || 0,\r\n width: domRect.width,\r\n height: domRect.height,\r\n opacity: parseFloat($el.css(\"opacity\"))\r\n };\r\n },\r\n\r\n // Shortcut for setting \"translate3d\" properties for element\r\n // Can set be used to set opacity, too\r\n // ========================================================\r\n\r\n setTranslate: function ($el, props) {\r\n var str = \"\",\r\n css = {};\r\n\r\n if (!$el || !props) {\r\n return;\r\n }\r\n\r\n if (props.left !== undefined || props.top !== undefined) {\r\n str =\r\n (props.left === undefined ? $el.position().left : props.left) +\r\n \"px, \" +\r\n (props.top === undefined ? $el.position().top : props.top) +\r\n \"px\";\r\n\r\n if (this.use3d) {\r\n str = \"translate3d(\" + str + \", 0px)\";\r\n } else {\r\n str = \"translate(\" + str + \")\";\r\n }\r\n }\r\n\r\n if (props.scaleX !== undefined && props.scaleY !== undefined) {\r\n str += \" scale(\" + props.scaleX + \", \" + props.scaleY + \")\";\r\n } else if (props.scaleX !== undefined) {\r\n str += \" scaleX(\" + props.scaleX + \")\";\r\n }\r\n\r\n if (str.length) {\r\n css.transform = str;\r\n }\r\n\r\n if (props.opacity !== undefined) {\r\n css.opacity = props.opacity;\r\n }\r\n\r\n if (props.width !== undefined) {\r\n css.width = props.width;\r\n }\r\n\r\n if (props.height !== undefined) {\r\n css.height = props.height;\r\n }\r\n\r\n return $el.css(css);\r\n },\r\n\r\n // Simple CSS transition handler\r\n // =============================\r\n\r\n animate: function ($el, to, duration, callback, leaveAnimationName) {\r\n var self = this,\r\n from;\r\n\r\n if ($.isFunction(duration)) {\r\n callback = duration;\r\n duration = null;\r\n }\r\n\r\n self.stop($el);\r\n\r\n from = self.getTranslate($el);\r\n\r\n $el.on(transitionEnd, function (e) {\r\n // Skip events from child elements and z-index change\r\n if (e && e.originalEvent && (!$el.is(e.originalEvent.target) || e.originalEvent.propertyName == \"z-index\")) {\r\n return;\r\n }\r\n\r\n self.stop($el);\r\n\r\n if ($.isNumeric(duration)) {\r\n $el.css(\"transition-duration\", \"\");\r\n }\r\n\r\n if ($.isPlainObject(to)) {\r\n if (to.scaleX !== undefined && to.scaleY !== undefined) {\r\n self.setTranslate($el, {\r\n top: to.top,\r\n left: to.left,\r\n width: from.width * to.scaleX,\r\n height: from.height * to.scaleY,\r\n scaleX: 1,\r\n scaleY: 1\r\n });\r\n }\r\n } else if (leaveAnimationName !== true) {\r\n $el.removeClass(to);\r\n }\r\n\r\n if ($.isFunction(callback)) {\r\n callback(e);\r\n }\r\n });\r\n\r\n if ($.isNumeric(duration)) {\r\n $el.css(\"transition-duration\", duration + \"ms\");\r\n }\r\n\r\n // Start animation by changing CSS properties or class name\r\n if ($.isPlainObject(to)) {\r\n if (to.scaleX !== undefined && to.scaleY !== undefined) {\r\n delete to.width;\r\n delete to.height;\r\n\r\n if ($el.parent().hasClass(\"fancybox-slide--image\")) {\r\n $el.parent().addClass(\"fancybox-is-scaling\");\r\n }\r\n }\r\n\r\n $.fancybox.setTranslate($el, to);\r\n } else {\r\n $el.addClass(to);\r\n }\r\n\r\n // Make sure that `transitionend` callback gets fired\r\n $el.data(\r\n \"timer\",\r\n setTimeout(function () {\r\n $el.trigger(transitionEnd);\r\n }, duration + 33)\r\n );\r\n },\r\n\r\n stop: function ($el, callCallback) {\r\n if ($el && $el.length) {\r\n clearTimeout($el.data(\"timer\"));\r\n\r\n if (callCallback) {\r\n $el.trigger(transitionEnd);\r\n }\r\n\r\n $el.off(transitionEnd).css(\"transition-duration\", \"\");\r\n\r\n $el.parent().removeClass(\"fancybox-is-scaling\");\r\n }\r\n }\r\n };\r\n\r\n // Default click handler for \"fancyboxed\" links\r\n // ============================================\r\n\r\n function _run(e, opts) {\r\n var items = [],\r\n index = 0,\r\n $target,\r\n value,\r\n instance;\r\n\r\n // Avoid opening multiple times\r\n if (e && e.isDefaultPrevented()) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n\r\n opts = opts || {};\r\n\r\n if (e && e.data) {\r\n opts = mergeOpts(e.data.options, opts);\r\n }\r\n\r\n $target = opts.$target || $(e.currentTarget).trigger(\"blur\");\r\n instance = $.fancybox.getInstance();\r\n\r\n if (instance && instance.$trigger && instance.$trigger.is($target)) {\r\n return;\r\n }\r\n\r\n if (opts.selector) {\r\n items = $(opts.selector);\r\n } else {\r\n // Get all related items and find index for clicked one\r\n value = $target.attr(\"data-fancybox\") || \"\";\r\n\r\n if (value) {\r\n items = e.data ? e.data.items : [];\r\n items = items.length ? items.filter('[data-fancybox=\"' + value + '\"]') : $('[data-fancybox=\"' + value + '\"]');\r\n } else {\r\n items = [$target];\r\n }\r\n }\r\n\r\n index = $(items).index($target);\r\n\r\n // Sometimes current item can not be found\r\n if (index < 0) {\r\n index = 0;\r\n }\r\n\r\n instance = $.fancybox.open(items, opts, index);\r\n\r\n // Save last active element\r\n instance.$trigger = $target;\r\n }\r\n\r\n // Create a jQuery plugin\r\n // ======================\r\n\r\n $.fn.fancybox = function (options) {\r\n var selector;\r\n\r\n options = options || {};\r\n selector = options.selector || false;\r\n\r\n if (selector) {\r\n // Use body element instead of document so it executes first\r\n $(\"body\")\r\n .off(\"click.fb-start\", selector)\r\n .on(\"click.fb-start\", selector, {\r\n options: options\r\n }, _run);\r\n } else {\r\n this.off(\"click.fb-start\").on(\r\n \"click.fb-start\", {\r\n items: this,\r\n options: options\r\n },\r\n _run\r\n );\r\n }\r\n\r\n return this;\r\n };\r\n\r\n // Self initializing plugin for all elements having `data-fancybox` attribute\r\n // ==========================================================================\r\n\r\n $D.on(\"click.fb-start\", \"[data-fancybox]\", _run);\r\n\r\n // Enable \"trigger elements\"\r\n // =========================\r\n\r\n $D.on(\"click.fb-start\", \"[data-fancybox-trigger]\", function (e) {\r\n $('[data-fancybox=\"' + $(this).attr(\"data-fancybox-trigger\") + '\"]')\r\n .eq($(this).attr(\"data-fancybox-index\") || 0)\r\n .trigger(\"click.fb-start\", {\r\n $trigger: $(this)\r\n });\r\n });\r\n\r\n // Track focus event for better accessibility styling\r\n // ==================================================\r\n (function () {\r\n var buttonStr = \".fancybox-button\",\r\n focusStr = \"fancybox-focus\",\r\n $pressed = null;\r\n\r\n $D.on(\"mousedown mouseup focus blur\", buttonStr, function (e) {\r\n switch (e.type) {\r\n case \"mousedown\":\r\n $pressed = $(this);\r\n break;\r\n case \"mouseup\":\r\n $pressed = null;\r\n break;\r\n case \"focusin\":\r\n $(buttonStr).removeClass(focusStr);\r\n\r\n if (!$(this).is($pressed) && !$(this).is(\"[disabled]\")) {\r\n $(this).addClass(focusStr);\r\n }\r\n break;\r\n case \"focusout\":\r\n $(buttonStr).removeClass(focusStr);\r\n break;\r\n }\r\n });\r\n })();\r\n})(window, document, jQuery);\n// ==========================================================================\r\n//\r\n// Media\r\n// Adds additional media type support\r\n//\r\n// ==========================================================================\r\n(function ($) {\r\n \"use strict\";\r\n\r\n // Object containing properties for each media type\r\n var defaults = {\r\n youtube: {\r\n matcher: /(youtube\\.com|youtu\\.be|youtube\\-nocookie\\.com)\\/(watch\\?(.*&)?v=|v\\/|u\\/|embed\\/?)?(videoseries\\?list=(.*)|[\\w-]{11}|\\?listType=(.*)&list=(.*))(.*)/i,\r\n params: {\r\n autoplay: 1,\r\n autohide: 1,\r\n fs: 1,\r\n rel: 0,\r\n hd: 1,\r\n wmode: \"transparent\",\r\n enablejsapi: 1,\r\n html5: 1\r\n },\r\n paramPlace: 8,\r\n type: \"iframe\",\r\n url: \"https://www.youtube-nocookie.com/embed/$4\",\r\n thumb: \"https://img.youtube.com/vi/$4/hqdefault.jpg\"\r\n },\r\n\r\n vimeo: {\r\n matcher: /^.+vimeo.com\\/(.*\\/)?([\\d]+)(.*)?/,\r\n params: {\r\n autoplay: 1,\r\n hd: 1,\r\n show_title: 1,\r\n show_byline: 1,\r\n show_portrait: 0,\r\n fullscreen: 1\r\n },\r\n paramPlace: 3,\r\n type: \"iframe\",\r\n url: \"//player.vimeo.com/video/$2\"\r\n },\r\n\r\n instagram: {\r\n matcher: /(instagr\\.am|instagram\\.com)\\/p\\/([a-zA-Z0-9_\\-]+)\\/?/i,\r\n type: \"image\",\r\n url: \"//$1/p/$2/media/?size=l\"\r\n },\r\n\r\n // Examples:\r\n // http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16\r\n // https://www.google.com/maps/@37.7852006,-122.4146355,14.65z\r\n // https://www.google.com/maps/@52.2111123,2.9237542,6.61z?hl=en\r\n // https://www.google.com/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572\r\n gmap_place: {\r\n matcher: /(maps\\.)?google\\.([a-z]{2,3}(\\.[a-z]{2})?)\\/(((maps\\/(place\\/(.*)\\/)?\\@(.*),(\\d+.?\\d+?)z))|(\\?ll=))(.*)?/i,\r\n type: \"iframe\",\r\n url: function (rez) {\r\n return (\r\n \"//maps.google.\" +\r\n rez[2] +\r\n \"/?ll=\" +\r\n (rez[9] ? rez[9] + \"&z=\" + Math.floor(rez[10]) + (rez[12] ? rez[12].replace(/^\\//, \"&\") : \"\") : rez[12] + \"\").replace(/\\?/, \"&\") +\r\n \"&output=\" +\r\n (rez[12] && rez[12].indexOf(\"layer=c\") > 0 ? \"svembed\" : \"embed\")\r\n );\r\n }\r\n },\r\n\r\n // Examples:\r\n // https://www.google.com/maps/search/Empire+State+Building/\r\n // https://www.google.com/maps/search/?api=1&query=centurylink+field\r\n // https://www.google.com/maps/search/?api=1&query=47.5951518,-122.3316393\r\n gmap_search: {\r\n matcher: /(maps\\.)?google\\.([a-z]{2,3}(\\.[a-z]{2})?)\\/(maps\\/search\\/)(.*)/i,\r\n type: \"iframe\",\r\n url: function (rez) {\r\n return \"//maps.google.\" + rez[2] + \"/maps?q=\" + rez[5].replace(\"query=\", \"q=\").replace(\"api=1\", \"\") + \"&output=embed\";\r\n }\r\n }\r\n };\r\n\r\n // Formats matching url to final form\r\n var format = function (url, rez, params) {\r\n if (!url) {\r\n return;\r\n }\r\n\r\n params = params || \"\";\r\n\r\n if ($.type(params) === \"object\") {\r\n params = $.param(params, true);\r\n }\r\n\r\n $.each(rez, function (key, value) {\r\n url = url.replace(\"$\" + key, value || \"\");\r\n });\r\n\r\n if (params.length) {\r\n url += (url.indexOf(\"?\") > 0 ? \"&\" : \"?\") + params;\r\n }\r\n\r\n return url;\r\n };\r\n\r\n $(document).on(\"objectNeedsType.fb\", function (e, instance, item) {\r\n var url = item.src || \"\",\r\n type = false,\r\n media,\r\n thumb,\r\n rez,\r\n params,\r\n urlParams,\r\n paramObj,\r\n provider;\r\n\r\n media = $.extend(true, {}, defaults, item.opts.media);\r\n\r\n // Look for any matching media type\r\n $.each(media, function (providerName, providerOpts) {\r\n rez = url.match(providerOpts.matcher);\r\n\r\n if (!rez) {\r\n return;\r\n }\r\n\r\n type = providerOpts.type;\r\n provider = providerName;\r\n paramObj = {};\r\n\r\n if (providerOpts.paramPlace && rez[providerOpts.paramPlace]) {\r\n urlParams = rez[providerOpts.paramPlace];\r\n\r\n if (urlParams[0] == \"?\") {\r\n urlParams = urlParams.substring(1);\r\n }\r\n\r\n urlParams = urlParams.split(\"&\");\r\n\r\n for (var m = 0; m < urlParams.length; ++m) {\r\n var p = urlParams[m].split(\"=\", 2);\r\n\r\n if (p.length == 2) {\r\n paramObj[p[0]] = decodeURIComponent(p[1].replace(/\\+/g, \" \"));\r\n }\r\n }\r\n }\r\n\r\n params = $.extend(true, {}, providerOpts.params, item.opts[providerName], paramObj);\r\n\r\n url =\r\n $.type(providerOpts.url) === \"function\" ? providerOpts.url.call(this, rez, params, item) : format(providerOpts.url, rez, params);\r\n\r\n thumb =\r\n $.type(providerOpts.thumb) === \"function\" ? providerOpts.thumb.call(this, rez, params, item) : format(providerOpts.thumb, rez);\r\n\r\n if (providerName === \"youtube\") {\r\n url = url.replace(/&t=((\\d+)m)?(\\d+)s/, function (match, p1, m, s) {\r\n return \"&start=\" + ((m ? parseInt(m, 10) * 60 : 0) + parseInt(s, 10));\r\n });\r\n } else if (providerName === \"vimeo\") {\r\n url = url.replace(\"&%23\", \"#\");\r\n }\r\n\r\n return false;\r\n });\r\n\r\n // If it is found, then change content type and update the url\r\n\r\n if (type) {\r\n if (!item.opts.thumb && !(item.opts.$thumb && item.opts.$thumb.length)) {\r\n item.opts.thumb = thumb;\r\n }\r\n\r\n if (type === \"iframe\") {\r\n item.opts = $.extend(true, item.opts, {\r\n iframe: {\r\n preload: false,\r\n attr: {\r\n scrolling: \"no\"\r\n }\r\n }\r\n });\r\n }\r\n\r\n $.extend(item, {\r\n type: type,\r\n src: url,\r\n origSrc: item.src,\r\n contentSource: provider,\r\n contentType: type === \"image\" ? \"image\" : provider == \"gmap_place\" || provider == \"gmap_search\" ? \"map\" : \"video\"\r\n });\r\n } else if (url) {\r\n item.type = item.opts.defaultType;\r\n }\r\n });\r\n\r\n // Load YouTube/Video API on request to detect when video finished playing\r\n var VideoAPILoader = {\r\n youtube: {\r\n src: \"https://www.youtube.com/iframe_api\",\r\n class: \"YT\",\r\n loading: false,\r\n loaded: false\r\n },\r\n\r\n vimeo: {\r\n src: \"https://player.vimeo.com/api/player.js\",\r\n class: \"Vimeo\",\r\n loading: false,\r\n loaded: false\r\n },\r\n\r\n load: function (vendor) {\r\n var _this = this,\r\n script;\r\n\r\n if (this[vendor].loaded) {\r\n setTimeout(function () {\r\n _this.done(vendor);\r\n });\r\n return;\r\n }\r\n\r\n if (this[vendor].loading) {\r\n return;\r\n }\r\n\r\n this[vendor].loading = true;\r\n\r\n script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = this[vendor].src;\r\n\r\n if (vendor === \"youtube\") {\r\n window.onYouTubeIframeAPIReady = function () {\r\n _this[vendor].loaded = true;\r\n _this.done(vendor);\r\n };\r\n } else {\r\n script.onload = function () {\r\n _this[vendor].loaded = true;\r\n _this.done(vendor);\r\n };\r\n }\r\n\r\n document.body.appendChild(script);\r\n },\r\n done: function (vendor) {\r\n var instance, $el, player;\r\n\r\n if (vendor === \"youtube\") {\r\n delete window.onYouTubeIframeAPIReady;\r\n }\r\n\r\n instance = $.fancybox.getInstance();\r\n\r\n if (instance) {\r\n $el = instance.current.$content.find(\"iframe\");\r\n\r\n if (vendor === \"youtube\" && YT !== undefined && YT) {\r\n player = new YT.Player($el.attr(\"id\"), {\r\n events: {\r\n onStateChange: function (e) {\r\n if (e.data == 0) {\r\n instance.next();\r\n }\r\n }\r\n }\r\n });\r\n } else if (vendor === \"vimeo\" && Vimeo !== undefined && Vimeo) {\r\n player = new Vimeo.Player($el);\r\n\r\n player.on(\"ended\", function () {\r\n instance.next();\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n $(document).on({\r\n \"afterShow.fb\": function (e, instance, current) {\r\n if (instance.group.length > 1 && (current.contentSource === \"youtube\" || current.contentSource === \"vimeo\")) {\r\n VideoAPILoader.load(current.contentSource);\r\n }\r\n }\r\n });\r\n})(jQuery);\n// ==========================================================================\r\n//\r\n// Guestures\r\n// Adds touch guestures, handles click and tap events\r\n//\r\n// ==========================================================================\r\n(function (window, document, $) {\r\n \"use strict\";\r\n\r\n var requestAFrame = (function () {\r\n return (\r\n window.requestAnimationFrame ||\r\n window.webkitRequestAnimationFrame ||\r\n window.mozRequestAnimationFrame ||\r\n window.oRequestAnimationFrame ||\r\n // if all else fails, use setTimeout\r\n function (callback) {\r\n return window.setTimeout(callback, 1000 / 60);\r\n }\r\n );\r\n })();\r\n\r\n var cancelAFrame = (function () {\r\n return (\r\n window.cancelAnimationFrame ||\r\n window.webkitCancelAnimationFrame ||\r\n window.mozCancelAnimationFrame ||\r\n window.oCancelAnimationFrame ||\r\n function (id) {\r\n window.clearTimeout(id);\r\n }\r\n );\r\n })();\r\n\r\n var getPointerXY = function (e) {\r\n var result = [];\r\n\r\n e = e.originalEvent || e || window.e;\r\n e = e.touches && e.touches.length ? e.touches : e.changedTouches && e.changedTouches.length ? e.changedTouches : [e];\r\n\r\n for (var key in e) {\r\n if (e[key].pageX) {\r\n result.push({\r\n x: e[key].pageX,\r\n y: e[key].pageY\r\n });\r\n } else if (e[key].clientX) {\r\n result.push({\r\n x: e[key].clientX,\r\n y: e[key].clientY\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n var distance = function (point2, point1, what) {\r\n if (!point1 || !point2) {\r\n return 0;\r\n }\r\n\r\n if (what === \"x\") {\r\n return point2.x - point1.x;\r\n } else if (what === \"y\") {\r\n return point2.y - point1.y;\r\n }\r\n\r\n return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2));\r\n };\r\n\r\n var isClickable = function ($el) {\r\n if (\r\n $el.is('a,area,button,[role=\"button\"],input,label,select,summary,textarea,video,audio,iframe') ||\r\n $.isFunction($el.get(0).onclick) ||\r\n $el.data(\"selectable\")\r\n ) {\r\n return true;\r\n }\r\n\r\n // Check for attributes like data-fancybox-next or data-fancybox-close\r\n for (var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++) {\r\n if (atts[i].nodeName.substr(0, 14) === \"data-fancybox-\") {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n var hasScrollbars = function (el) {\r\n var overflowY = window.getComputedStyle(el)[\"overflow-y\"],\r\n overflowX = window.getComputedStyle(el)[\"overflow-x\"],\r\n vertical = (overflowY === \"scroll\" || overflowY === \"auto\") && el.scrollHeight > el.clientHeight,\r\n horizontal = (overflowX === \"scroll\" || overflowX === \"auto\") && el.scrollWidth > el.clientWidth;\r\n\r\n return vertical || horizontal;\r\n };\r\n\r\n var isScrollable = function ($el) {\r\n var rez = false;\r\n\r\n while (true) {\r\n rez = hasScrollbars($el.get(0));\r\n\r\n if (rez) {\r\n break;\r\n }\r\n\r\n $el = $el.parent();\r\n\r\n if (!$el.length || $el.hasClass(\"fancybox-stage\") || $el.is(\"body\")) {\r\n break;\r\n }\r\n }\r\n\r\n return rez;\r\n };\r\n\r\n var Guestures = function (instance) {\r\n var self = this;\r\n\r\n self.instance = instance;\r\n\r\n self.$bg = instance.$refs.bg;\r\n self.$stage = instance.$refs.stage;\r\n self.$container = instance.$refs.container;\r\n\r\n self.destroy();\r\n\r\n self.$container.on(\"touchstart.fb.touch mousedown.fb.touch\", $.proxy(self, \"ontouchstart\"));\r\n };\r\n\r\n Guestures.prototype.destroy = function () {\r\n var self = this;\r\n\r\n self.$container.off(\".fb.touch\");\r\n\r\n $(document).off(\".fb.touch\");\r\n\r\n if (self.requestId) {\r\n cancelAFrame(self.requestId);\r\n self.requestId = null;\r\n }\r\n\r\n if (self.tapped) {\r\n clearTimeout(self.tapped);\r\n self.tapped = null;\r\n }\r\n };\r\n\r\n Guestures.prototype.ontouchstart = function (e) {\r\n var self = this,\r\n $target = $(e.target),\r\n instance = self.instance,\r\n current = instance.current,\r\n $slide = current.$slide,\r\n $content = current.$content,\r\n isTouchDevice = e.type == \"touchstart\";\r\n\r\n // Do not respond to both (touch and mouse) events\r\n if (isTouchDevice) {\r\n self.$container.off(\"mousedown.fb.touch\");\r\n }\r\n\r\n // Ignore right click\r\n if (e.originalEvent && e.originalEvent.button == 2) {\r\n return;\r\n }\r\n\r\n // Ignore taping on links, buttons, input elements\r\n if (!$slide.length || !$target.length || isClickable($target) || isClickable($target.parent())) {\r\n return;\r\n }\r\n // Ignore clicks on the scrollbar\r\n if (!$target.is(\"img\") && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left) {\r\n return;\r\n }\r\n\r\n // Ignore clicks while zooming or closing\r\n if (!current || instance.isAnimating || current.$slide.hasClass(\"fancybox-animated\")) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n return;\r\n }\r\n\r\n self.realPoints = self.startPoints = getPointerXY(e);\r\n\r\n if (!self.startPoints.length) {\r\n return;\r\n }\r\n\r\n // Allow other scripts to catch touch event if \"touch\" is set to false\r\n if (current.touch) {\r\n e.stopPropagation();\r\n }\r\n\r\n self.startEvent = e;\r\n\r\n self.canTap = true;\r\n self.$target = $target;\r\n self.$content = $content;\r\n self.opts = current.opts.touch;\r\n\r\n self.isPanning = false;\r\n self.isSwiping = false;\r\n self.isZooming = false;\r\n self.isScrolling = false;\r\n self.canPan = instance.canPan();\r\n\r\n self.startTime = new Date().getTime();\r\n self.distanceX = self.distanceY = self.distance = 0;\r\n\r\n self.canvasWidth = Math.round($slide[0].clientWidth);\r\n self.canvasHeight = Math.round($slide[0].clientHeight);\r\n\r\n self.contentLastPos = null;\r\n self.contentStartPos = $.fancybox.getTranslate(self.$content) || {\r\n top: 0,\r\n left: 0\r\n };\r\n self.sliderStartPos = $.fancybox.getTranslate($slide);\r\n\r\n // Since position will be absolute, but we need to make it relative to the stage\r\n self.stagePos = $.fancybox.getTranslate(instance.$refs.stage);\r\n\r\n self.sliderStartPos.top -= self.stagePos.top;\r\n self.sliderStartPos.left -= self.stagePos.left;\r\n\r\n self.contentStartPos.top -= self.stagePos.top;\r\n self.contentStartPos.left -= self.stagePos.left;\r\n\r\n $(document)\r\n .off(\".fb.touch\")\r\n .on(isTouchDevice ? \"touchend.fb.touch touchcancel.fb.touch\" : \"mouseup.fb.touch mouseleave.fb.touch\", $.proxy(self, \"ontouchend\"))\r\n .on(isTouchDevice ? \"touchmove.fb.touch\" : \"mousemove.fb.touch\", $.proxy(self, \"ontouchmove\"));\r\n\r\n if ($.fancybox.isMobile) {\r\n document.addEventListener(\"scroll\", self.onscroll, true);\r\n }\r\n\r\n // Skip if clicked outside the sliding area\r\n if (!(self.opts || self.canPan) || !($target.is(self.$stage) || self.$stage.find($target).length)) {\r\n if ($target.is(\".fancybox-image\")) {\r\n e.preventDefault();\r\n }\r\n\r\n if (!($.fancybox.isMobile && $target.parents(\".fancybox-caption\").length)) {\r\n return;\r\n }\r\n }\r\n\r\n self.isScrollable = isScrollable($target) || isScrollable($target.parent());\r\n\r\n // Check if element is scrollable and try to prevent default behavior (scrolling)\r\n if (!($.fancybox.isMobile && self.isScrollable)) {\r\n e.preventDefault();\r\n }\r\n\r\n // One finger or mouse click - swipe or pan an image\r\n if (self.startPoints.length === 1 || current.hasError) {\r\n if (self.canPan) {\r\n $.fancybox.stop(self.$content);\r\n\r\n self.isPanning = true;\r\n } else {\r\n self.isSwiping = true;\r\n }\r\n\r\n self.$container.addClass(\"fancybox-is-grabbing\");\r\n }\r\n\r\n // Two fingers - zoom image\r\n if (self.startPoints.length === 2 && current.type === \"image\" && (current.isLoaded || current.$ghost)) {\r\n self.canTap = false;\r\n self.isSwiping = false;\r\n self.isPanning = false;\r\n\r\n self.isZooming = true;\r\n\r\n $.fancybox.stop(self.$content);\r\n\r\n self.centerPointStartX = (self.startPoints[0].x + self.startPoints[1].x) * 0.5 - $(window).scrollLeft();\r\n self.centerPointStartY = (self.startPoints[0].y + self.startPoints[1].y) * 0.5 - $(window).scrollTop();\r\n\r\n self.percentageOfImageAtPinchPointX = (self.centerPointStartX - self.contentStartPos.left) / self.contentStartPos.width;\r\n self.percentageOfImageAtPinchPointY = (self.centerPointStartY - self.contentStartPos.top) / self.contentStartPos.height;\r\n\r\n self.startDistanceBetweenFingers = distance(self.startPoints[0], self.startPoints[1]);\r\n }\r\n };\r\n\r\n Guestures.prototype.onscroll = function (e) {\r\n var self = this;\r\n\r\n self.isScrolling = true;\r\n\r\n document.removeEventListener(\"scroll\", self.onscroll, true);\r\n };\r\n\r\n Guestures.prototype.ontouchmove = function (e) {\r\n var self = this;\r\n\r\n // Make sure user has not released over iframe or disabled element\r\n if (e.originalEvent.buttons !== undefined && e.originalEvent.buttons === 0) {\r\n self.ontouchend(e);\r\n return;\r\n }\r\n\r\n if (self.isScrolling) {\r\n self.canTap = false;\r\n return;\r\n }\r\n\r\n self.newPoints = getPointerXY(e);\r\n\r\n if (!(self.opts || self.canPan) || !self.newPoints.length || !self.newPoints.length) {\r\n return;\r\n }\r\n\r\n if (!(self.isSwiping && self.isSwiping === true)) {\r\n e.preventDefault();\r\n }\r\n\r\n self.distanceX = distance(self.newPoints[0], self.startPoints[0], \"x\");\r\n self.distanceY = distance(self.newPoints[0], self.startPoints[0], \"y\");\r\n\r\n self.distance = distance(self.newPoints[0], self.startPoints[0]);\r\n\r\n // Skip false ontouchmove events (Chrome)\r\n if (self.distance > 0) {\r\n if (self.isSwiping) {\r\n self.onSwipe(e);\r\n } else if (self.isPanning) {\r\n self.onPan();\r\n } else if (self.isZooming) {\r\n self.onZoom();\r\n }\r\n }\r\n };\r\n\r\n Guestures.prototype.onSwipe = function (e) {\r\n var self = this,\r\n instance = self.instance,\r\n swiping = self.isSwiping,\r\n left = self.sliderStartPos.left || 0,\r\n angle;\r\n\r\n // If direction is not yet determined\r\n if (swiping === true) {\r\n // We need at least 10px distance to correctly calculate an angle\r\n if (Math.abs(self.distance) > 10) {\r\n self.canTap = false;\r\n\r\n if (instance.group.length < 2 && self.opts.vertical) {\r\n self.isSwiping = \"y\";\r\n } else if (instance.isDragging || self.opts.vertical === false || (self.opts.vertical === \"auto\" && $(window).width() > 800)) {\r\n self.isSwiping = \"x\";\r\n } else {\r\n angle = Math.abs((Math.atan2(self.distanceY, self.distanceX) * 180) / Math.PI);\r\n\r\n self.isSwiping = angle > 45 && angle < 135 ? \"y\" : \"x\";\r\n }\r\n\r\n if (self.isSwiping === \"y\" && $.fancybox.isMobile && self.isScrollable) {\r\n self.isScrolling = true;\r\n\r\n return;\r\n }\r\n\r\n instance.isDragging = self.isSwiping;\r\n\r\n // Reset points to avoid jumping, because we dropped first swipes to calculate the angle\r\n self.startPoints = self.newPoints;\r\n\r\n $.each(instance.slides, function (index, slide) {\r\n var slidePos, stagePos;\r\n\r\n $.fancybox.stop(slide.$slide);\r\n\r\n slidePos = $.fancybox.getTranslate(slide.$slide);\r\n stagePos = $.fancybox.getTranslate(instance.$refs.stage);\r\n\r\n slide.$slide\r\n .css({\r\n transform: \"\",\r\n opacity: \"\",\r\n \"transition-duration\": \"\"\r\n })\r\n .removeClass(\"fancybox-animated\")\r\n .removeClass(function (index, className) {\r\n return (className.match(/(^|\\s)fancybox-fx-\\S+/g) || []).join(\" \");\r\n });\r\n\r\n if (slide.pos === instance.current.pos) {\r\n self.sliderStartPos.top = slidePos.top - stagePos.top;\r\n self.sliderStartPos.left = slidePos.left - stagePos.left;\r\n }\r\n\r\n $.fancybox.setTranslate(slide.$slide, {\r\n top: slidePos.top - stagePos.top,\r\n left: slidePos.left - stagePos.left\r\n });\r\n });\r\n\r\n // Stop slideshow\r\n if (instance.SlideShow && instance.SlideShow.isActive) {\r\n instance.SlideShow.stop();\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Sticky edges\r\n if (swiping == \"x\") {\r\n if (\r\n self.distanceX > 0 &&\r\n (self.instance.group.length < 2 || (self.instance.current.index === 0 && !self.instance.current.opts.loop))\r\n ) {\r\n left = left + Math.pow(self.distanceX, 0.8);\r\n } else if (\r\n self.distanceX < 0 &&\r\n (self.instance.group.length < 2 ||\r\n (self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop))\r\n ) {\r\n left = left - Math.pow(-self.distanceX, 0.8);\r\n } else {\r\n left = left + self.distanceX;\r\n }\r\n }\r\n\r\n self.sliderLastPos = {\r\n top: swiping == \"x\" ? 0 : self.sliderStartPos.top + self.distanceY,\r\n left: left\r\n };\r\n\r\n if (self.requestId) {\r\n cancelAFrame(self.requestId);\r\n\r\n self.requestId = null;\r\n }\r\n\r\n self.requestId = requestAFrame(function () {\r\n if (self.sliderLastPos) {\r\n $.each(self.instance.slides, function (index, slide) {\r\n var pos = slide.pos - self.instance.currPos;\r\n\r\n $.fancybox.setTranslate(slide.$slide, {\r\n top: self.sliderLastPos.top,\r\n left: self.sliderLastPos.left + pos * self.canvasWidth + pos * slide.opts.gutter\r\n });\r\n });\r\n\r\n self.$container.addClass(\"fancybox-is-sliding\");\r\n }\r\n });\r\n };\r\n\r\n Guestures.prototype.onPan = function () {\r\n var self = this;\r\n\r\n // Prevent accidental movement (sometimes, when tapping casually, finger can move a bit)\r\n if (distance(self.newPoints[0], self.realPoints[0]) < ($.fancybox.isMobile ? 10 : 5)) {\r\n self.startPoints = self.newPoints;\r\n return;\r\n }\r\n\r\n self.canTap = false;\r\n\r\n self.contentLastPos = self.limitMovement();\r\n\r\n if (self.requestId) {\r\n cancelAFrame(self.requestId);\r\n }\r\n\r\n self.requestId = requestAFrame(function () {\r\n $.fancybox.setTranslate(self.$content, self.contentLastPos);\r\n });\r\n };\r\n\r\n // Make panning sticky to the edges\r\n Guestures.prototype.limitMovement = function () {\r\n var self = this;\r\n\r\n var canvasWidth = self.canvasWidth;\r\n var canvasHeight = self.canvasHeight;\r\n\r\n var distanceX = self.distanceX;\r\n var distanceY = self.distanceY;\r\n\r\n var contentStartPos = self.contentStartPos;\r\n\r\n var currentOffsetX = contentStartPos.left;\r\n var currentOffsetY = contentStartPos.top;\r\n\r\n var currentWidth = contentStartPos.width;\r\n var currentHeight = contentStartPos.height;\r\n\r\n var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY, newOffsetX, newOffsetY;\r\n\r\n if (currentWidth > canvasWidth) {\r\n newOffsetX = currentOffsetX + distanceX;\r\n } else {\r\n newOffsetX = currentOffsetX;\r\n }\r\n\r\n newOffsetY = currentOffsetY + distanceY;\r\n\r\n // Slow down proportionally to traveled distance\r\n minTranslateX = Math.max(0, canvasWidth * 0.5 - currentWidth * 0.5);\r\n minTranslateY = Math.max(0, canvasHeight * 0.5 - currentHeight * 0.5);\r\n\r\n maxTranslateX = Math.min(canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5);\r\n maxTranslateY = Math.min(canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5);\r\n\r\n // ->\r\n if (distanceX > 0 && newOffsetX > minTranslateX) {\r\n newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8) || 0;\r\n }\r\n\r\n // <-\r\n if (distanceX < 0 && newOffsetX < maxTranslateX) {\r\n newOffsetX = maxTranslateX + 1 - Math.pow(maxTranslateX - currentOffsetX - distanceX, 0.8) || 0;\r\n }\r\n\r\n // \\/\r\n if (distanceY > 0 && newOffsetY > minTranslateY) {\r\n newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8) || 0;\r\n }\r\n\r\n // /\\\r\n if (distanceY < 0 && newOffsetY < maxTranslateY) {\r\n newOffsetY = maxTranslateY + 1 - Math.pow(maxTranslateY - currentOffsetY - distanceY, 0.8) || 0;\r\n }\r\n\r\n return {\r\n top: newOffsetY,\r\n left: newOffsetX\r\n };\r\n };\r\n\r\n Guestures.prototype.limitPosition = function (newOffsetX, newOffsetY, newWidth, newHeight) {\r\n var self = this;\r\n\r\n var canvasWidth = self.canvasWidth;\r\n var canvasHeight = self.canvasHeight;\r\n\r\n if (newWidth > canvasWidth) {\r\n newOffsetX = newOffsetX > 0 ? 0 : newOffsetX;\r\n newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX;\r\n } else {\r\n // Center horizontally\r\n newOffsetX = Math.max(0, canvasWidth / 2 - newWidth / 2);\r\n }\r\n\r\n if (newHeight > canvasHeight) {\r\n newOffsetY = newOffsetY > 0 ? 0 : newOffsetY;\r\n newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY;\r\n } else {\r\n // Center vertically\r\n newOffsetY = Math.max(0, canvasHeight / 2 - newHeight / 2);\r\n }\r\n\r\n return {\r\n top: newOffsetY,\r\n left: newOffsetX\r\n };\r\n };\r\n\r\n Guestures.prototype.onZoom = function () {\r\n var self = this;\r\n\r\n // Calculate current distance between points to get pinch ratio and new width and height\r\n var contentStartPos = self.contentStartPos;\r\n\r\n var currentWidth = contentStartPos.width;\r\n var currentHeight = contentStartPos.height;\r\n\r\n var currentOffsetX = contentStartPos.left;\r\n var currentOffsetY = contentStartPos.top;\r\n\r\n var endDistanceBetweenFingers = distance(self.newPoints[0], self.newPoints[1]);\r\n\r\n var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers;\r\n\r\n var newWidth = Math.floor(currentWidth * pinchRatio);\r\n var newHeight = Math.floor(currentHeight * pinchRatio);\r\n\r\n // This is the translation due to pinch-zooming\r\n var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX;\r\n var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY;\r\n\r\n // Point between the two touches\r\n var centerPointEndX = (self.newPoints[0].x + self.newPoints[1].x) / 2 - $(window).scrollLeft();\r\n var centerPointEndY = (self.newPoints[0].y + self.newPoints[1].y) / 2 - $(window).scrollTop();\r\n\r\n // And this is the translation due to translation of the centerpoint\r\n // between the two fingers\r\n var translateFromTranslatingX = centerPointEndX - self.centerPointStartX;\r\n var translateFromTranslatingY = centerPointEndY - self.centerPointStartY;\r\n\r\n // The new offset is the old/current one plus the total translation\r\n var newOffsetX = currentOffsetX + (translateFromZoomingX + translateFromTranslatingX);\r\n var newOffsetY = currentOffsetY + (translateFromZoomingY + translateFromTranslatingY);\r\n\r\n var newPos = {\r\n top: newOffsetY,\r\n left: newOffsetX,\r\n scaleX: pinchRatio,\r\n scaleY: pinchRatio\r\n };\r\n\r\n self.canTap = false;\r\n\r\n self.newWidth = newWidth;\r\n self.newHeight = newHeight;\r\n\r\n self.contentLastPos = newPos;\r\n\r\n if (self.requestId) {\r\n cancelAFrame(self.requestId);\r\n }\r\n\r\n self.requestId = requestAFrame(function () {\r\n $.fancybox.setTranslate(self.$content, self.contentLastPos);\r\n });\r\n };\r\n\r\n Guestures.prototype.ontouchend = function (e) {\r\n var self = this;\r\n\r\n var swiping = self.isSwiping;\r\n var panning = self.isPanning;\r\n var zooming = self.isZooming;\r\n var scrolling = self.isScrolling;\r\n\r\n self.endPoints = getPointerXY(e);\r\n self.dMs = Math.max(new Date().getTime() - self.startTime, 1);\r\n\r\n self.$container.removeClass(\"fancybox-is-grabbing\");\r\n\r\n $(document).off(\".fb.touch\");\r\n\r\n document.removeEventListener(\"scroll\", self.onscroll, true);\r\n\r\n if (self.requestId) {\r\n cancelAFrame(self.requestId);\r\n\r\n self.requestId = null;\r\n }\r\n\r\n self.isSwiping = false;\r\n self.isPanning = false;\r\n self.isZooming = false;\r\n self.isScrolling = false;\r\n\r\n self.instance.isDragging = false;\r\n\r\n if (self.canTap) {\r\n return self.onTap(e);\r\n }\r\n\r\n self.speed = 100;\r\n\r\n // Speed in px/ms\r\n self.velocityX = (self.distanceX / self.dMs) * 0.5;\r\n self.velocityY = (self.distanceY / self.dMs) * 0.5;\r\n\r\n if (panning) {\r\n self.endPanning();\r\n } else if (zooming) {\r\n self.endZooming();\r\n } else {\r\n self.endSwiping(swiping, scrolling);\r\n }\r\n\r\n return;\r\n };\r\n\r\n Guestures.prototype.endSwiping = function (swiping, scrolling) {\r\n var self = this,\r\n ret = false,\r\n len = self.instance.group.length,\r\n distanceX = Math.abs(self.distanceX),\r\n canAdvance = swiping == \"x\" && len > 1 && ((self.dMs > 130 && distanceX > 10) || distanceX > 50),\r\n speedX = 300;\r\n\r\n self.sliderLastPos = null;\r\n\r\n // Close if swiped vertically / navigate if horizontally\r\n if (swiping == \"y\" && !scrolling && Math.abs(self.distanceY) > 50) {\r\n // Continue vertical movement\r\n $.fancybox.animate(\r\n self.instance.current.$slide, {\r\n top: self.sliderStartPos.top + self.distanceY + self.velocityY * 150,\r\n opacity: 0\r\n },\r\n 200\r\n );\r\n ret = self.instance.close(true, 250);\r\n } else if (canAdvance && self.distanceX > 0) {\r\n ret = self.instance.previous(speedX);\r\n } else if (canAdvance && self.distanceX < 0) {\r\n ret = self.instance.next(speedX);\r\n }\r\n\r\n if (ret === false && (swiping == \"x\" || swiping == \"y\")) {\r\n self.instance.centerSlide(200);\r\n }\r\n\r\n self.$container.removeClass(\"fancybox-is-sliding\");\r\n };\r\n\r\n // Limit panning from edges\r\n // ========================\r\n Guestures.prototype.endPanning = function () {\r\n var self = this,\r\n newOffsetX,\r\n newOffsetY,\r\n newPos;\r\n\r\n if (!self.contentLastPos) {\r\n return;\r\n }\r\n\r\n if (self.opts.momentum === false || self.dMs > 350) {\r\n newOffsetX = self.contentLastPos.left;\r\n newOffsetY = self.contentLastPos.top;\r\n } else {\r\n // Continue movement\r\n newOffsetX = self.contentLastPos.left + self.velocityX * 500;\r\n newOffsetY = self.contentLastPos.top + self.velocityY * 500;\r\n }\r\n\r\n newPos = self.limitPosition(newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height);\r\n\r\n newPos.width = self.contentStartPos.width;\r\n newPos.height = self.contentStartPos.height;\r\n\r\n $.fancybox.animate(self.$content, newPos, 366);\r\n };\r\n\r\n Guestures.prototype.endZooming = function () {\r\n var self = this;\r\n\r\n var current = self.instance.current;\r\n\r\n var newOffsetX, newOffsetY, newPos, reset;\r\n\r\n var newWidth = self.newWidth;\r\n var newHeight = self.newHeight;\r\n\r\n if (!self.contentLastPos) {\r\n return;\r\n }\r\n\r\n newOffsetX = self.contentLastPos.left;\r\n newOffsetY = self.contentLastPos.top;\r\n\r\n reset = {\r\n top: newOffsetY,\r\n left: newOffsetX,\r\n width: newWidth,\r\n height: newHeight,\r\n scaleX: 1,\r\n scaleY: 1\r\n };\r\n\r\n // Reset scalex/scaleY values; this helps for perfomance and does not break animation\r\n $.fancybox.setTranslate(self.$content, reset);\r\n\r\n if (newWidth < self.canvasWidth && newHeight < self.canvasHeight) {\r\n self.instance.scaleToFit(150);\r\n } else if (newWidth > current.width || newHeight > current.height) {\r\n self.instance.scaleToActual(self.centerPointStartX, self.centerPointStartY, 150);\r\n } else {\r\n newPos = self.limitPosition(newOffsetX, newOffsetY, newWidth, newHeight);\r\n\r\n $.fancybox.animate(self.$content, newPos, 150);\r\n }\r\n };\r\n\r\n Guestures.prototype.onTap = function (e) {\r\n var self = this;\r\n var $target = $(e.target);\r\n\r\n var instance = self.instance;\r\n var current = instance.current;\r\n\r\n var endPoints = (e && getPointerXY(e)) || self.startPoints;\r\n\r\n var tapX = endPoints[0] ? endPoints[0].x - $(window).scrollLeft() - self.stagePos.left : 0;\r\n var tapY = endPoints[0] ? endPoints[0].y - $(window).scrollTop() - self.stagePos.top : 0;\r\n\r\n var where;\r\n\r\n var process = function (prefix) {\r\n var action = current.opts[prefix];\r\n\r\n if ($.isFunction(action)) {\r\n action = action.apply(instance, [current, e]);\r\n }\r\n\r\n if (!action) {\r\n return;\r\n }\r\n\r\n switch (action) {\r\n case \"close\":\r\n instance.close(self.startEvent);\r\n\r\n break;\r\n\r\n case \"toggleControls\":\r\n instance.toggleControls();\r\n\r\n break;\r\n\r\n case \"next\":\r\n instance.next();\r\n\r\n break;\r\n\r\n case \"nextOrClose\":\r\n if (instance.group.length > 1) {\r\n instance.next();\r\n } else {\r\n instance.close(self.startEvent);\r\n }\r\n\r\n break;\r\n\r\n case \"zoom\":\r\n if (current.type == \"image\" && (current.isLoaded || current.$ghost)) {\r\n if (instance.canPan()) {\r\n instance.scaleToFit();\r\n } else if (instance.isScaledDown()) {\r\n instance.scaleToActual(tapX, tapY);\r\n } else if (instance.group.length < 2) {\r\n instance.close(self.startEvent);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n };\r\n\r\n // Ignore right click\r\n if (e.originalEvent && e.originalEvent.button == 2) {\r\n return;\r\n }\r\n\r\n // Skip if clicked on the scrollbar\r\n if (!$target.is(\"img\") && tapX > $target[0].clientWidth + $target.offset().left) {\r\n return;\r\n }\r\n\r\n // Check where is clicked\r\n if ($target.is(\".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container\")) {\r\n where = \"Outside\";\r\n } else if ($target.is(\".fancybox-slide\")) {\r\n where = \"Slide\";\r\n } else if (\r\n instance.current.$content &&\r\n instance.current.$content\r\n .find($target)\r\n .addBack()\r\n .filter($target).length\r\n ) {\r\n where = \"Content\";\r\n } else {\r\n return;\r\n }\r\n\r\n // Check if this is a double tap\r\n if (self.tapped) {\r\n // Stop previously created single tap\r\n clearTimeout(self.tapped);\r\n self.tapped = null;\r\n\r\n // Skip if distance between taps is too big\r\n if (Math.abs(tapX - self.tapX) > 50 || Math.abs(tapY - self.tapY) > 50) {\r\n return this;\r\n }\r\n\r\n // OK, now we assume that this is a double-tap\r\n process(\"dblclick\" + where);\r\n } else {\r\n // Single tap will be processed if user has not clicked second time within 300ms\r\n // or there is no need to wait for double-tap\r\n self.tapX = tapX;\r\n self.tapY = tapY;\r\n\r\n if (current.opts[\"dblclick\" + where] && current.opts[\"dblclick\" + where] !== current.opts[\"click\" + where]) {\r\n self.tapped = setTimeout(function () {\r\n self.tapped = null;\r\n\r\n if (!instance.isAnimating) {\r\n process(\"click\" + where);\r\n }\r\n }, 500);\r\n } else {\r\n process(\"click\" + where);\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n $(document)\r\n .on(\"onActivate.fb\", function (e, instance) {\r\n if (instance && !instance.Guestures) {\r\n instance.Guestures = new Guestures(instance);\r\n }\r\n })\r\n .on(\"beforeClose.fb\", function (e, instance) {\r\n if (instance && instance.Guestures) {\r\n instance.Guestures.destroy();\r\n }\r\n });\r\n})(window, document, jQuery);\n// ==========================================================================\r\n//\r\n// SlideShow\r\n// Enables slideshow functionality\r\n//\r\n// Example of usage:\r\n// $.fancybox.getInstance().SlideShow.start()\r\n//\r\n// ==========================================================================\r\n(function (document, $) {\r\n \"use strict\";\r\n\r\n $.extend(true, $.fancybox.defaults, {\r\n btnTpl: {\r\n slideShow: '\"\r\n },\r\n slideShow: {\r\n autoStart: false,\r\n speed: 3000,\r\n progress: true\r\n }\r\n });\r\n\r\n var SlideShow = function (instance) {\r\n this.instance = instance;\r\n this.init();\r\n };\r\n\r\n $.extend(SlideShow.prototype, {\r\n timer: null,\r\n isActive: false,\r\n $button: null,\r\n\r\n init: function () {\r\n var self = this,\r\n instance = self.instance,\r\n opts = instance.group[instance.currIndex].opts.slideShow;\r\n\r\n self.$button = instance.$refs.toolbar.find(\"[data-fancybox-play]\").on(\"click\", function () {\r\n self.toggle();\r\n });\r\n\r\n if (instance.group.length < 2 || !opts) {\r\n self.$button.hide();\r\n } else if (opts.progress) {\r\n self.$progress = $('
').appendTo(instance.$refs.inner);\r\n }\r\n },\r\n\r\n set: function (force) {\r\n var self = this,\r\n instance = self.instance,\r\n current = instance.current;\r\n\r\n // Check if reached last element\r\n if (current && (force === true || current.opts.loop || instance.currIndex < instance.group.length - 1)) {\r\n if (self.isActive && current.contentType !== \"video\") {\r\n if (self.$progress) {\r\n $.fancybox.animate(self.$progress.show(), {\r\n scaleX: 1\r\n }, current.opts.slideShow.speed);\r\n }\r\n\r\n self.timer = setTimeout(function () {\r\n if (!instance.current.opts.loop && instance.current.index == instance.group.length - 1) {\r\n instance.jumpTo(0);\r\n } else {\r\n instance.next();\r\n }\r\n }, current.opts.slideShow.speed);\r\n }\r\n } else {\r\n self.stop();\r\n instance.idleSecondsCounter = 0;\r\n instance.showControls();\r\n }\r\n },\r\n\r\n clear: function () {\r\n var self = this;\r\n\r\n clearTimeout(self.timer);\r\n\r\n self.timer = null;\r\n\r\n if (self.$progress) {\r\n self.$progress.removeAttr(\"style\").hide();\r\n }\r\n },\r\n\r\n start: function () {\r\n var self = this,\r\n current = self.instance.current;\r\n\r\n if (current) {\r\n self.$button\r\n .attr(\"title\", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_STOP)\r\n .removeClass(\"fancybox-button--play\")\r\n .addClass(\"fancybox-button--pause\");\r\n\r\n self.isActive = true;\r\n\r\n if (current.isComplete) {\r\n self.set(true);\r\n }\r\n\r\n self.instance.trigger(\"onSlideShowChange\", true);\r\n }\r\n },\r\n\r\n stop: function () {\r\n var self = this,\r\n current = self.instance.current;\r\n\r\n self.clear();\r\n\r\n self.$button\r\n .attr(\"title\", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_START)\r\n .removeClass(\"fancybox-button--pause\")\r\n .addClass(\"fancybox-button--play\");\r\n\r\n self.isActive = false;\r\n\r\n self.instance.trigger(\"onSlideShowChange\", false);\r\n\r\n if (self.$progress) {\r\n self.$progress.removeAttr(\"style\").hide();\r\n }\r\n },\r\n\r\n toggle: function () {\r\n var self = this;\r\n\r\n if (self.isActive) {\r\n self.stop();\r\n } else {\r\n self.start();\r\n }\r\n }\r\n });\r\n\r\n $(document).on({\r\n \"onInit.fb\": function (e, instance) {\r\n if (instance && !instance.SlideShow) {\r\n instance.SlideShow = new SlideShow(instance);\r\n }\r\n },\r\n\r\n \"beforeShow.fb\": function (e, instance, current, firstRun) {\r\n var SlideShow = instance && instance.SlideShow;\r\n\r\n if (firstRun) {\r\n if (SlideShow && current.opts.slideShow.autoStart) {\r\n SlideShow.start();\r\n }\r\n } else if (SlideShow && SlideShow.isActive) {\r\n SlideShow.clear();\r\n }\r\n },\r\n\r\n \"afterShow.fb\": function (e, instance, current) {\r\n var SlideShow = instance && instance.SlideShow;\r\n\r\n if (SlideShow && SlideShow.isActive) {\r\n SlideShow.set();\r\n }\r\n },\r\n\r\n \"afterKeydown.fb\": function (e, instance, current, keypress, keycode) {\r\n var SlideShow = instance && instance.SlideShow;\r\n\r\n // \"P\" or Spacebar\r\n if (SlideShow && current.opts.slideShow && (keycode === 80 || keycode === 32) && !$(document.activeElement).is(\"button,a,input\")) {\r\n keypress.preventDefault();\r\n\r\n SlideShow.toggle();\r\n }\r\n },\r\n\r\n \"beforeClose.fb onDeactivate.fb\": function (e, instance) {\r\n var SlideShow = instance && instance.SlideShow;\r\n\r\n if (SlideShow) {\r\n SlideShow.stop();\r\n }\r\n }\r\n });\r\n\r\n // Page Visibility API to pause slideshow when window is not active\r\n $(document).on(\"visibilitychange\", function () {\r\n var instance = $.fancybox.getInstance(),\r\n SlideShow = instance && instance.SlideShow;\r\n\r\n if (SlideShow && SlideShow.isActive) {\r\n if (document.hidden) {\r\n SlideShow.clear();\r\n } else {\r\n SlideShow.set();\r\n }\r\n }\r\n });\r\n})(document, jQuery);\n// ==========================================================================\r\n//\r\n// FullScreen\r\n// Adds fullscreen functionality\r\n//\r\n// ==========================================================================\r\n(function (document, $) {\r\n \"use strict\";\r\n\r\n // Collection of methods supported by user browser\r\n var fn = (function () {\r\n var fnMap = [\r\n [\"requestFullscreen\", \"exitFullscreen\", \"fullscreenElement\", \"fullscreenEnabled\", \"fullscreenchange\", \"fullscreenerror\"],\r\n // new WebKit\r\n [\r\n \"webkitRequestFullscreen\",\r\n \"webkitExitFullscreen\",\r\n \"webkitFullscreenElement\",\r\n \"webkitFullscreenEnabled\",\r\n \"webkitfullscreenchange\",\r\n \"webkitfullscreenerror\"\r\n ],\r\n // old WebKit (Safari 5.1)\r\n [\r\n \"webkitRequestFullScreen\",\r\n \"webkitCancelFullScreen\",\r\n \"webkitCurrentFullScreenElement\",\r\n \"webkitCancelFullScreen\",\r\n \"webkitfullscreenchange\",\r\n \"webkitfullscreenerror\"\r\n ],\r\n [\r\n \"mozRequestFullScreen\",\r\n \"mozCancelFullScreen\",\r\n \"mozFullScreenElement\",\r\n \"mozFullScreenEnabled\",\r\n \"mozfullscreenchange\",\r\n \"mozfullscreenerror\"\r\n ],\r\n [\"msRequestFullscreen\", \"msExitFullscreen\", \"msFullscreenElement\", \"msFullscreenEnabled\", \"MSFullscreenChange\", \"MSFullscreenError\"]\r\n ];\r\n\r\n var ret = {};\r\n\r\n for (var i = 0; i < fnMap.length; i++) {\r\n var val = fnMap[i];\r\n\r\n if (val && val[1] in document) {\r\n for (var j = 0; j < val.length; j++) {\r\n ret[fnMap[0][j]] = val[j];\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n\r\n return false;\r\n })();\r\n\r\n if (fn) {\r\n var FullScreen = {\r\n request: function (elem) {\r\n elem = elem || document.documentElement;\r\n\r\n elem[fn.requestFullscreen](elem.ALLOW_KEYBOARD_INPUT);\r\n },\r\n exit: function () {\r\n document[fn.exitFullscreen]();\r\n },\r\n toggle: function (elem) {\r\n elem = elem || document.documentElement;\r\n\r\n if (this.isFullscreen()) {\r\n this.exit();\r\n } else {\r\n this.request(elem);\r\n }\r\n },\r\n isFullscreen: function () {\r\n return Boolean(document[fn.fullscreenElement]);\r\n },\r\n enabled: function () {\r\n return Boolean(document[fn.fullscreenEnabled]);\r\n }\r\n };\r\n\r\n $.extend(true, $.fancybox.defaults, {\r\n btnTpl: {\r\n fullScreen: '\"\r\n },\r\n fullScreen: {\r\n autoStart: false\r\n }\r\n });\r\n\r\n $(document).on(fn.fullscreenchange, function () {\r\n var isFullscreen = FullScreen.isFullscreen(),\r\n instance = $.fancybox.getInstance();\r\n\r\n if (instance) {\r\n // If image is zooming, then force to stop and reposition properly\r\n if (instance.current && instance.current.type === \"image\" && instance.isAnimating) {\r\n instance.isAnimating = false;\r\n\r\n instance.update(true, true, 0);\r\n\r\n if (!instance.isComplete) {\r\n instance.complete();\r\n }\r\n }\r\n\r\n instance.trigger(\"onFullscreenChange\", isFullscreen);\r\n\r\n instance.$refs.container.toggleClass(\"fancybox-is-fullscreen\", isFullscreen);\r\n\r\n instance.$refs.toolbar\r\n .find(\"[data-fancybox-fullscreen]\")\r\n .toggleClass(\"fancybox-button--fsenter\", !isFullscreen)\r\n .toggleClass(\"fancybox-button--fsexit\", isFullscreen);\r\n }\r\n });\r\n }\r\n\r\n $(document).on({\r\n \"onInit.fb\": function (e, instance) {\r\n var $container;\r\n\r\n if (!fn) {\r\n instance.$refs.toolbar.find(\"[data-fancybox-fullscreen]\").remove();\r\n\r\n return;\r\n }\r\n\r\n if (instance && instance.group[instance.currIndex].opts.fullScreen) {\r\n $container = instance.$refs.container;\r\n\r\n $container.on(\"click.fb-fullscreen\", \"[data-fancybox-fullscreen]\", function (e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n FullScreen.toggle();\r\n });\r\n\r\n if (instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true) {\r\n FullScreen.request();\r\n }\r\n\r\n // Expose API\r\n instance.FullScreen = FullScreen;\r\n } else if (instance) {\r\n instance.$refs.toolbar.find(\"[data-fancybox-fullscreen]\").hide();\r\n }\r\n },\r\n\r\n \"afterKeydown.fb\": function (e, instance, current, keypress, keycode) {\r\n // \"F\"\r\n if (instance && instance.FullScreen && keycode === 70) {\r\n keypress.preventDefault();\r\n\r\n instance.FullScreen.toggle();\r\n }\r\n },\r\n\r\n \"beforeClose.fb\": function (e, instance) {\r\n if (instance && instance.FullScreen && instance.$refs.container.hasClass(\"fancybox-is-fullscreen\")) {\r\n FullScreen.exit();\r\n }\r\n }\r\n });\r\n})(document, jQuery);\n// ==========================================================================\r\n//\r\n// Thumbs\r\n// Displays thumbnails in a grid\r\n//\r\n// ==========================================================================\r\n(function (document, $) {\r\n \"use strict\";\r\n\r\n var CLASS = \"fancybox-thumbs\",\r\n CLASS_ACTIVE = CLASS + \"-active\";\r\n\r\n // Make sure there are default values\r\n $.fancybox.defaults = $.extend(\r\n true, {\r\n btnTpl: {\r\n thumbs: '\"\r\n },\r\n thumbs: {\r\n autoStart: false, // Display thumbnails on opening\r\n hideOnClose: true, // Hide thumbnail grid when closing animation starts\r\n parentEl: \".fancybox-container\", // Container is injected into this element\r\n axis: \"y\" // Vertical (y) or horizontal (x) scrolling\r\n }\r\n },\r\n $.fancybox.defaults\r\n );\r\n\r\n var FancyThumbs = function (instance) {\r\n this.init(instance);\r\n };\r\n\r\n $.extend(FancyThumbs.prototype, {\r\n $button: null,\r\n $grid: null,\r\n $list: null,\r\n isVisible: false,\r\n isActive: false,\r\n\r\n init: function (instance) {\r\n var self = this,\r\n group = instance.group,\r\n enabled = 0;\r\n\r\n self.instance = instance;\r\n self.opts = group[instance.currIndex].opts.thumbs;\r\n\r\n instance.Thumbs = self;\r\n\r\n self.$button = instance.$refs.toolbar.find(\"[data-fancybox-thumbs]\");\r\n\r\n // Enable thumbs if at least two group items have thumbnails\r\n for (var i = 0, len = group.length; i < len; i++) {\r\n if (group[i].thumb) {\r\n enabled++;\r\n }\r\n\r\n if (enabled > 1) {\r\n break;\r\n }\r\n }\r\n\r\n if (enabled > 1 && !!self.opts) {\r\n self.$button.removeAttr(\"style\").on(\"click\", function () {\r\n self.toggle();\r\n });\r\n\r\n self.isActive = true;\r\n } else {\r\n self.$button.hide();\r\n }\r\n },\r\n\r\n create: function () {\r\n var self = this,\r\n instance = self.instance,\r\n parentEl = self.opts.parentEl,\r\n list = [],\r\n src;\r\n\r\n if (!self.$grid) {\r\n // Create main element\r\n self.$grid = $('
').appendTo(\r\n instance.$refs.container\r\n .find(parentEl)\r\n .addBack()\r\n .filter(parentEl)\r\n );\r\n\r\n // Add \"click\" event that performs gallery navigation\r\n self.$grid.on(\"click\", \"a\", function () {\r\n instance.jumpTo($(this).attr(\"data-index\"));\r\n });\r\n }\r\n\r\n // Build the list\r\n if (!self.$list) {\r\n self.$list = $('
').appendTo(self.$grid);\r\n }\r\n\r\n $.each(instance.group, function (i, item) {\r\n src = item.thumb;\r\n\r\n if (!src && item.type === \"image\") {\r\n src = item.src;\r\n }\r\n\r\n list.push(\r\n '\"\r\n );\r\n });\r\n\r\n self.$list[0].innerHTML = list.join(\"\");\r\n\r\n if (self.opts.axis === \"x\") {\r\n // Set fixed width for list element to enable horizontal scrolling\r\n self.$list.width(\r\n parseInt(self.$grid.css(\"padding-right\"), 10) +\r\n instance.group.length *\r\n self.$list\r\n .children()\r\n .eq(0)\r\n .outerWidth(true)\r\n );\r\n }\r\n },\r\n\r\n focus: function (duration) {\r\n var self = this,\r\n $list = self.$list,\r\n $grid = self.$grid,\r\n thumb,\r\n thumbPos;\r\n\r\n if (!self.instance.current) {\r\n return;\r\n }\r\n\r\n thumb = $list\r\n .children()\r\n .removeClass(CLASS_ACTIVE)\r\n .filter('[data-index=\"' + self.instance.current.index + '\"]')\r\n .addClass(CLASS_ACTIVE);\r\n\r\n thumbPos = thumb.position();\r\n\r\n // Check if need to scroll to make current thumb visible\r\n if (self.opts.axis === \"y\" && (thumbPos.top < 0 || thumbPos.top > $list.height() - thumb.outerHeight())) {\r\n $list.stop().animate({\r\n scrollTop: $list.scrollTop() + thumbPos.top\r\n },\r\n duration\r\n );\r\n } else if (\r\n self.opts.axis === \"x\" &&\r\n (thumbPos.left < $grid.scrollLeft() || thumbPos.left > $grid.scrollLeft() + ($grid.width() - thumb.outerWidth()))\r\n ) {\r\n $list\r\n .parent()\r\n .stop()\r\n .animate({\r\n scrollLeft: thumbPos.left\r\n },\r\n duration\r\n );\r\n }\r\n },\r\n\r\n update: function () {\r\n var that = this;\r\n that.instance.$refs.container.toggleClass(\"fancybox-show-thumbs\", this.isVisible);\r\n\r\n if (that.isVisible) {\r\n if (!that.$grid) {\r\n that.create();\r\n }\r\n\r\n that.instance.trigger(\"onThumbsShow\");\r\n\r\n that.focus(0);\r\n } else if (that.$grid) {\r\n that.instance.trigger(\"onThumbsHide\");\r\n }\r\n\r\n // Update content position\r\n that.instance.update();\r\n },\r\n\r\n hide: function () {\r\n this.isVisible = false;\r\n this.update();\r\n },\r\n\r\n show: function () {\r\n this.isVisible = true;\r\n this.update();\r\n },\r\n\r\n toggle: function () {\r\n this.isVisible = !this.isVisible;\r\n this.update();\r\n }\r\n });\r\n\r\n $(document).on({\r\n \"onInit.fb\": function (e, instance) {\r\n var Thumbs;\r\n\r\n if (instance && !instance.Thumbs) {\r\n Thumbs = new FancyThumbs(instance);\r\n\r\n if (Thumbs.isActive && Thumbs.opts.autoStart === true) {\r\n Thumbs.show();\r\n }\r\n }\r\n },\r\n\r\n \"beforeShow.fb\": function (e, instance, item, firstRun) {\r\n var Thumbs = instance && instance.Thumbs;\r\n\r\n if (Thumbs && Thumbs.isVisible) {\r\n Thumbs.focus(firstRun ? 0 : 250);\r\n }\r\n },\r\n\r\n \"afterKeydown.fb\": function (e, instance, current, keypress, keycode) {\r\n var Thumbs = instance && instance.Thumbs;\r\n\r\n // \"G\"\r\n if (Thumbs && Thumbs.isActive && keycode === 71) {\r\n keypress.preventDefault();\r\n\r\n Thumbs.toggle();\r\n }\r\n },\r\n\r\n \"beforeClose.fb\": function (e, instance) {\r\n var Thumbs = instance && instance.Thumbs;\r\n\r\n if (Thumbs && Thumbs.isVisible && Thumbs.opts.hideOnClose !== false) {\r\n Thumbs.$grid.hide();\r\n }\r\n }\r\n });\r\n})(document, jQuery);\n//// ==========================================================================\r\n//\r\n// Share\r\n// Displays simple form for sharing current url\r\n//\r\n// ==========================================================================\r\n(function (document, $) {\r\n \"use strict\";\r\n\r\n $.extend(true, $.fancybox.defaults, {\r\n btnTpl: {\r\n share: '\"\r\n },\r\n share: {\r\n url: function (instance, item) {\r\n return (\r\n (!instance.currentHash && !(item.type === \"inline\" || item.type === \"html\") ? item.origSrc || item.src : false) || window.location\r\n );\r\n },\r\n tpl: '
' +\r\n \"

{{SHARE}}

\" +\r\n \"

\" +\r\n '' +\r\n '' +\r\n \"Facebook\" +\r\n \"\" +\r\n '' +\r\n '' +\r\n \"Twitter\" +\r\n \"\" +\r\n '' +\r\n '' +\r\n \"Pinterest\" +\r\n \"\" +\r\n \"

\" +\r\n '

' +\r\n \"
\"\r\n }\r\n });\r\n\r\n function escapeHtml(string) {\r\n var entityMap = {\r\n \"&\": \"&\",\r\n \"<\": \"<\",\r\n \">\": \">\",\r\n '\"': \""\",\r\n \"'\": \"'\",\r\n \"/\": \"/\",\r\n \"`\": \"`\",\r\n \"=\": \"=\"\r\n };\r\n\r\n return String(string).replace(/[&<>\"'`=\\/]/g, function (s) {\r\n return entityMap[s];\r\n });\r\n }\r\n\r\n $(document).on(\"click\", \"[data-fancybox-share]\", function () {\r\n var instance = $.fancybox.getInstance(),\r\n current = instance.current || null,\r\n url,\r\n tpl;\r\n\r\n if (!current) {\r\n return;\r\n }\r\n\r\n if ($.type(current.opts.share.url) === \"function\") {\r\n url = current.opts.share.url.apply(current, [instance, current]);\r\n }\r\n\r\n tpl = current.opts.share.tpl\r\n .replace(/\\{\\{media\\}\\}/g, current.type === \"image\" ? encodeURIComponent(current.src) : \"\")\r\n .replace(/\\{\\{url\\}\\}/g, encodeURIComponent(url))\r\n .replace(/\\{\\{url_raw\\}\\}/g, escapeHtml(url))\r\n .replace(/\\{\\{descr\\}\\}/g, instance.$caption ? encodeURIComponent(instance.$caption.text()) : \"\");\r\n\r\n $.fancybox.open({\r\n src: instance.translate(instance, tpl),\r\n type: \"html\",\r\n opts: {\r\n touch: false,\r\n animationEffect: false,\r\n afterLoad: function (shareInstance, shareCurrent) {\r\n // Close self if parent instance is closing\r\n instance.$refs.container.one(\"beforeClose.fb\", function () {\r\n shareInstance.close(null, 0);\r\n });\r\n\r\n // Opening links in a popup window\r\n shareCurrent.$content.find(\".fancybox-share__button\").click(function () {\r\n window.open(this.href, \"Share\", \"width=550, height=450\");\r\n return false;\r\n });\r\n },\r\n mobile: {\r\n autoFocus: false\r\n }\r\n }\r\n });\r\n });\r\n})(document, jQuery);\n// ==========================================================================\r\n//\r\n// Hash\r\n// Enables linking to each modal\r\n//\r\n// ==========================================================================\r\n(function (window, document, $) {\r\n \"use strict\";\r\n\r\n // Simple $.escapeSelector polyfill (for jQuery prior v3)\r\n if (!$.escapeSelector) {\r\n $.escapeSelector = function (sel) {\r\n var rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\r\n var fcssescape = function (ch, asCodePoint) {\r\n if (asCodePoint) {\r\n // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\r\n if (ch === \"\\0\") {\r\n return \"\\uFFFD\";\r\n }\r\n\r\n // Control characters and (dependent upon position) numbers get escaped as code points\r\n return ch.slice(0, -1) + \"\\\\\" + ch.charCodeAt(ch.length - 1).toString(16) + \" \";\r\n }\r\n\r\n // Other potentially-special ASCII characters get backslash-escaped\r\n return \"\\\\\" + ch;\r\n };\r\n\r\n return (sel + \"\").replace(rcssescape, fcssescape);\r\n };\r\n }\r\n\r\n // Get info about gallery name and current index from url\r\n function parseUrl() {\r\n var hash = window.location.hash.substr(1),\r\n rez = hash.split(\"-\"),\r\n index = rez.length > 1 && /^\\+?\\d+$/.test(rez[rez.length - 1]) ? parseInt(rez.pop(-1), 10) || 1 : 1,\r\n gallery = rez.join(\"-\");\r\n\r\n return {\r\n hash: hash,\r\n /* Index is starting from 1 */\r\n index: index < 1 ? 1 : index,\r\n gallery: gallery\r\n };\r\n }\r\n\r\n // Trigger click evnt on links to open new fancyBox instance\r\n function triggerFromUrl(url) {\r\n if (url.gallery !== \"\") {\r\n // If we can find element matching 'data-fancybox' atribute,\r\n // then triggering click event should start fancyBox\r\n $(\"[data-fancybox='\" + $.escapeSelector(url.gallery) + \"']\")\r\n .eq(url.index - 1)\r\n .focus()\r\n .trigger(\"click.fb-start\");\r\n }\r\n }\r\n\r\n // Get gallery name from current instance\r\n function getGalleryID(instance) {\r\n var opts, ret;\r\n\r\n if (!instance) {\r\n return false;\r\n }\r\n\r\n opts = instance.current ? instance.current.opts : instance.opts;\r\n ret = opts.hash || (opts.$orig ? opts.$orig.data(\"fancybox\") || opts.$orig.data(\"fancybox-trigger\") : \"\");\r\n\r\n return ret === \"\" ? false : ret;\r\n }\r\n\r\n // Start when DOM becomes ready\r\n $(function () {\r\n // Check if user has disabled this module\r\n if ($.fancybox.defaults.hash === false) {\r\n return;\r\n }\r\n\r\n // Update hash when opening/closing fancyBox\r\n $(document).on({\r\n \"onInit.fb\": function (e, instance) {\r\n var url, gallery;\r\n\r\n if (instance.group[instance.currIndex].opts.hash === false) {\r\n return;\r\n }\r\n\r\n url = parseUrl();\r\n gallery = getGalleryID(instance);\r\n\r\n // Make sure gallery start index matches index from hash\r\n if (gallery && url.gallery && gallery == url.gallery) {\r\n instance.currIndex = url.index - 1;\r\n }\r\n },\r\n\r\n \"beforeShow.fb\": function (e, instance, current, firstRun) {\r\n var gallery;\r\n\r\n if (!current || current.opts.hash === false) {\r\n return;\r\n }\r\n\r\n // Check if need to update window hash\r\n gallery = getGalleryID(instance);\r\n\r\n if (!gallery) {\r\n return;\r\n }\r\n\r\n // Variable containing last hash value set by fancyBox\r\n // It will be used to determine if fancyBox needs to close after hash change is detected\r\n instance.currentHash = gallery + (instance.group.length > 1 ? \"-\" + (current.index + 1) : \"\");\r\n\r\n // If current hash is the same (this instance most likely is opened by hashchange), then do nothing\r\n if (window.location.hash === \"#\" + instance.currentHash) {\r\n return;\r\n }\r\n\r\n if (firstRun && !instance.origHash) {\r\n instance.origHash = window.location.hash;\r\n }\r\n\r\n if (instance.hashTimer) {\r\n clearTimeout(instance.hashTimer);\r\n }\r\n\r\n // Update hash\r\n instance.hashTimer = setTimeout(function () {\r\n if (\"replaceState\" in window.history) {\r\n window.history[firstRun ? \"pushState\" : \"replaceState\"]({},\r\n document.title,\r\n window.location.pathname + window.location.search + \"#\" + instance.currentHash\r\n );\r\n\r\n if (firstRun) {\r\n instance.hasCreatedHistory = true;\r\n }\r\n } else {\r\n window.location.hash = instance.currentHash;\r\n }\r\n\r\n instance.hashTimer = null;\r\n }, 300);\r\n },\r\n\r\n \"beforeClose.fb\": function (e, instance, current) {\r\n if (!current || current.opts.hash === false) {\r\n return;\r\n }\r\n\r\n clearTimeout(instance.hashTimer);\r\n\r\n // Goto previous history entry\r\n if (instance.currentHash && instance.hasCreatedHistory) {\r\n window.history.back();\r\n } else if (instance.currentHash) {\r\n if (\"replaceState\" in window.history) {\r\n window.history.replaceState({}, document.title, window.location.pathname + window.location.search + (instance.origHash || \"\"));\r\n } else {\r\n window.location.hash = instance.origHash;\r\n }\r\n }\r\n\r\n instance.currentHash = null;\r\n }\r\n });\r\n\r\n // Check if need to start/close after url has changed\r\n $(window).on(\"hashchange.fb\", function () {\r\n var url = parseUrl(),\r\n fb = null;\r\n\r\n // Find last fancyBox instance that has \"hash\"\r\n $.each(\r\n $(\".fancybox-container\")\r\n .get()\r\n .reverse(),\r\n function (index, value) {\r\n var tmp = $(value).data(\"FancyBox\");\r\n\r\n if (tmp && tmp.currentHash) {\r\n fb = tmp;\r\n return false;\r\n }\r\n }\r\n );\r\n\r\n if (fb) {\r\n // Now, compare hash values\r\n if (fb.currentHash !== url.gallery + \"-\" + url.index && !(url.index === 1 && fb.currentHash == url.gallery)) {\r\n fb.currentHash = null;\r\n\r\n fb.close();\r\n }\r\n } else if (url.gallery !== \"\") {\r\n triggerFromUrl(url);\r\n }\r\n });\r\n\r\n // Check current hash and trigger click event on matching element to start fancyBox, if needed\r\n setTimeout(function () {\r\n if (!$.fancybox.getInstance()) {\r\n triggerFromUrl(parseUrl());\r\n }\r\n }, 50);\r\n });\r\n})(window, document, jQuery);\n// ==========================================================================\r\n//\r\n// Wheel\r\n// Basic mouse weheel support for gallery navigation\r\n//\r\n// ==========================================================================\r\n(function (document, $) {\r\n \"use strict\";\r\n\r\n var prevTime = new Date().getTime();\r\n\r\n $(document).on({\r\n \"onInit.fb\": function (e, instance, current) {\r\n instance.$refs.stage.on(\"mousewheel DOMMouseScroll wheel MozMousePixelScroll\", function (e) {\r\n var current = instance.current,\r\n currTime = new Date().getTime();\r\n\r\n if (instance.group.length < 2 || current.opts.wheel === false || (current.opts.wheel === \"auto\" && current.type !== \"image\")) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if (current.$slide.hasClass(\"fancybox-animated\")) {\r\n return;\r\n }\r\n\r\n e = e.originalEvent || e;\r\n\r\n if (currTime - prevTime < 250) {\r\n return;\r\n }\r\n\r\n prevTime = currTime;\r\n\r\n instance[(-e.deltaY || -e.deltaX || e.wheelDelta || -e.detail) < 0 ? \"next\" : \"previous\"]();\r\n });\r\n }\r\n });\r\n})(document, jQuery);","import fancybox from \"@fancyapps/fancybox\";\n\nimport '@fancyapps/fancybox/dist/jquery.fancybox.min.css';\n\n// Initialize Fancybox\n$.fancybox.defaults.loop = true;\n$.fancybox.defaults.buttons = [\n \"zoom\",\n // 'share',\n \"slideShow\",\n \"fullScreen\",\n // 'download',\n \"thumbs\",\n \"close\",\n];\n$.fancybox.defaults.protect = true;\n$.fancybox.defaults.transitionEffect = \"slide\";\n$.fancybox.defaults.lang = \"nl\";\n$.fancybox.defaults.i18n = {\n nl: {\n CLOSE: \"Sluiten\",\n NEXT: \"Volgende\",\n PREV: \"Vorige\",\n ERROR: \"De aangevraagde inhoud kan niet worden geladen.
Probeer het later opnieuw.\",\n PLAY_START: \"Start slideshow\",\n PLAY_STOP: \"Pauzeer slideshow\",\n FULL_SCREEN: \"Volledig scherm\",\n THUMBS: \"Thumbnails\",\n DOWNLOAD: \"Download\",\n SHARE: \"Delen\",\n ZOOM: \"Zoomen\",\n },\n};\n"],"names":["window","document","$","undefined","stuff","defaults","current","event","$W","$D","called","isQuery","obj","requestAFrame","callback","cancelAFrame","id","transitionEnd","el","t","transitions","forceRedraw","$el","mergeOpts","opts1","opts2","rez","key","value","inViewport","elem","elemCenter","FancyBox","content","opts","index","self","firstItem","firstItemOpts","$container","buttonStr","item","str","arr","match","n","items","thumbs","i","$item","type","found","src","srcParts","instance","keycode","duration","pos","groupLen","firstRun","isMoved","loop","previous","slidePos","stagePos","prop","diff","slide","className","leftPos","$slide","x","y","$content","canvasWidth","canvasHeight","newImgWidth","newImgHeight","imgPos","posX","posY","scaleX","scaleY","end","width","height","maxWidth","maxHeight","minRatio","aspectRatio","e","nextWidth","nextHeight","canPan","isZoomable","fitPos","ajaxLoad","data","textStatus","jqXHR","ghost","$img","srcset","temp","pxRatio","windowWidth","ret","a","b","j","img","sizes","imgWidth","imgHeight","$iframe","frameWidth","frameHeight","$contents","$body","caption","preventOverlap","$caption","$clone","captionH","scrollHeight","marginBottom","inlinePadding","actualPadding","start","isRevealed","effect","effectClassName","opacity","$thumb","thumbPos","btw","brw","bbw","blw","slides","prev","next","focusableStr","focusableItems","focusedItemIndex","d","domRect","done","$focus","name","args","andCaption","command","all","div","props","css","to","leaveAnimationName","from","callCallback","_run","$target","options","selector","focusStr","$pressed","format","url","params","media","thumb","urlParams","paramObj","provider","providerName","providerOpts","m","p","p1","s","VideoAPILoader","vendor","_this","script","player","getPointerXY","result","distance","point2","point1","what","isClickable","atts","hasScrollbars","overflowY","overflowX","vertical","horizontal","isScrollable","Guestures","isTouchDevice","swiping","left","angle","distanceX","distanceY","contentStartPos","currentOffsetX","currentOffsetY","currentWidth","currentHeight","minTranslateX","minTranslateY","maxTranslateX","maxTranslateY","newOffsetX","newOffsetY","newWidth","newHeight","endDistanceBetweenFingers","pinchRatio","translateFromZoomingX","translateFromZoomingY","centerPointEndX","centerPointEndY","translateFromTranslatingX","translateFromTranslatingY","newPos","panning","zooming","scrolling","len","canAdvance","speedX","reset","endPoints","tapX","tapY","where","process","prefix","action","SlideShow","force","keypress","fn","fnMap","val","FullScreen","isFullscreen","CLASS","CLASS_ACTIVE","FancyThumbs","group","enabled","parentEl","list","$list","$grid","that","Thumbs","escapeHtml","string","entityMap","tpl","shareInstance","shareCurrent","sel","rcssescape","fcssescape","ch","asCodePoint","parseUrl","hash","gallery","triggerFromUrl","getGalleryID","fb","tmp","prevTime","currTime"],"mappings":"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","x_google_ignoreList":[0]}