diff --git a/fancybox/.gitignore b/fancybox/.gitignore deleted file mode 100644 index fff07933..00000000 --- a/fancybox/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/dist/ -/test/ diff --git a/fancybox/CHANGELOG.md b/fancybox/CHANGELOG.md deleted file mode 100644 index d597e0bf..00000000 --- a/fancybox/CHANGELOG.md +++ /dev/null @@ -1,27 +0,0 @@ -### Version 1.05 - -* Added ALT and TITLE of original IMG to fancybox popup. - -### Version 1.04 - -* Update supporting upcoming imnagegrid in posts - -### Version 1.03 - -* imgages in body-attach with title / alt attribute get them removed while adding fancy attributes -* Added fancybox to image inlined in posts. Un-hooked the old lightbox from frio and vier and excahnged that with fancybox hooks. -* Excluded images in "type-link" divs from being "fancied" as they have no images but pages linked to. - -### Version 1.02 - -* [MrPetovan](https://github.com/MrPetovan) optimized my noob regular expression code. - -### Version 1.01 - -* One gallery for each post -* All media attached to a post are added to the posts gallery. -* Loop scrolling: You can step from last media to first and vice versa. -### Version 1.00 - -* First test version released. -* One fancybox per page displaying first media of each post. \ No newline at end of file diff --git a/fancybox/README.md b/fancybox/README.md deleted file mode 100644 index 3e342ee9..00000000 --- a/fancybox/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Post image gallery using fancybox - -Addon author: [Grischa Brockhaus](https://brockha.us) - -## Description - -This addon loads all media attachments of a post into a "fancybox" instead of linking directly to the media. - -Each post gets its own attachment library, when there are more than one media attached you can scroll through them. - -## Licenses - -### Fancybox Library - -This AddOn is using the jQuery library [fancybox](https://github.com/fancyapps/fancybox). - -The fancyBox libryry is licensed under the GPLv3 license for all open source applications. A commercial license is required for all commercial applications (including sites, themes and apps you plan to sell). - -[Read more about fancyBox license](https://github.com/fancyapps/fancybox). \ No newline at end of file diff --git a/fancybox/asset/fancybox/README.md b/fancybox/asset/fancybox/README.md deleted file mode 100644 index e32b89e1..00000000 --- a/fancybox/asset/fancybox/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# fancyBox 3.5.7 - -jQuery lightbox script for displaying images, videos and more. -Touch enabled, responsive and fully customizable. - -See the [project page](http://fancyapps.com/fancybox/3/) for documentation and a demonstration. - -Follow [@thefancyapps](//twitter.com/thefancyapps) for updates. - - -## Quick start - -1\. Add latest jQuery and fancyBox files - -```html - - - - -``` - - -2\. Create links - -```html - - - - - - - -``` - - -3\. Enjoy! - - -## License - -fancyBox is licensed under the [GPLv3](http://choosealicense.com/licenses/gpl-3.0) license for all open source applications. -A commercial license is required for all commercial applications (including sites, themes and apps you plan to sell). - -[Read more about fancyBox license](http://fancyapps.com/fancybox/3/#license). - -## Bugs and feature requests - -If you find a bug, please report it [here on Github](https://github.com/fancyapps/fancybox/issues). - -Guidelines for bug reports: - -1. Use the GitHub issue search — check if the issue has already been reported. -2. Check if the issue has been fixed — try to reproduce it using the latest master or development branch in the repository. -3. Isolate the problem — create a reduced test case and a live example. You can use CodePen to fork any demo found on documentation to use it as a template. - -A good bug report shouldn't leave others needing to chase you up for more information. -Please try to be as detailed as possible in your report. - - -Feature requests are welcome. Please look for existing ones and use GitHub's "reactions" feature to vote. - -Please do not use the issue tracker for personal support requests - use Stack Overflow ([fancybox-3](http://stackoverflow.com/questions/tagged/fancybox-3) tag) instead. diff --git a/fancybox/asset/fancybox/fancybox.config.js b/fancybox/asset/fancybox/fancybox.config.js deleted file mode 100644 index 233b423f..00000000 --- a/fancybox/asset/fancybox/fancybox.config.js +++ /dev/null @@ -1,13 +0,0 @@ -$(document).ready(function() { - $.fancybox.defaults.loop = "true"; - // this disables the colorbox hook found in frio/js/modal.js:34 - $("body").off("click", ".wall-item-body a img"); - - // Adds ALT/TITLE text to fancybox - $('a[data-fancybox').fancybox({ - afterLoad : function(instance, current) { - current.$image.attr('alt', current.opts.$orig.find('img').attr('alt') ); - current.$image.attr('title', current.opts.$orig.find('img').attr('title') ); - } - }); -}); \ No newline at end of file diff --git a/fancybox/asset/fancybox/jquery.fancybox.css b/fancybox/asset/fancybox/jquery.fancybox.css deleted file mode 100644 index 16b01254..00000000 --- a/fancybox/asset/fancybox/jquery.fancybox.css +++ /dev/null @@ -1,895 +0,0 @@ -body.compensate-for-scrollbar { - overflow: hidden; -} - -.fancybox-active { - height: auto; -} - -.fancybox-is-hidden { - left: -9999px; - margin: 0; - position: absolute !important; - top: -9999px; - visibility: hidden; -} - -.fancybox-container { - -webkit-backface-visibility: hidden; - height: 100%; - left: 0; - outline: none; - position: fixed; - -webkit-tap-highlight-color: transparent; - top: 0; - -ms-touch-action: manipulation; - touch-action: manipulation; - transform: translateZ(0); - width: 100%; - z-index: 99992; -} - -.fancybox-container * { - box-sizing: border-box; -} - -.fancybox-outer, -.fancybox-inner, -.fancybox-bg, -.fancybox-stage { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; -} - -.fancybox-outer { - -webkit-overflow-scrolling: touch; - overflow-y: auto; -} - -.fancybox-bg { - background: rgb(30, 30, 30); - opacity: 0; - transition-duration: inherit; - transition-property: opacity; - transition-timing-function: cubic-bezier(.47, 0, .74, .71); -} - -.fancybox-is-open .fancybox-bg { - opacity: .9; - transition-timing-function: cubic-bezier(.22, .61, .36, 1); -} - -.fancybox-infobar, -.fancybox-toolbar, -.fancybox-caption, -.fancybox-navigation .fancybox-button { - direction: ltr; - opacity: 0; - position: absolute; - transition: opacity .25s ease, visibility 0s ease .25s; - visibility: hidden; - z-index: 99997; -} - -.fancybox-show-infobar .fancybox-infobar, -.fancybox-show-toolbar .fancybox-toolbar, -.fancybox-show-caption .fancybox-caption, -.fancybox-show-nav .fancybox-navigation .fancybox-button { - opacity: 1; - transition: opacity .25s ease 0s, visibility 0s ease 0s; - visibility: visible; -} - -.fancybox-infobar { - color: #ccc; - font-size: 13px; - -webkit-font-smoothing: subpixel-antialiased; - height: 44px; - left: 0; - line-height: 44px; - min-width: 44px; - mix-blend-mode: difference; - padding: 0 10px; - pointer-events: none; - top: 0; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.fancybox-toolbar { - right: 0; - top: 0; -} - -.fancybox-stage { - direction: ltr; - overflow: visible; - transform: translateZ(0); - z-index: 99994; -} - -.fancybox-is-open .fancybox-stage { - overflow: hidden; -} - -.fancybox-slide { - -webkit-backface-visibility: hidden; - /* Using without prefix would break IE11 */ - display: none; - height: 100%; - left: 0; - outline: none; - overflow: auto; - -webkit-overflow-scrolling: touch; - padding: 44px; - position: absolute; - text-align: center; - top: 0; - transition-property: transform, opacity; - white-space: normal; - width: 100%; - z-index: 99994; -} - -.fancybox-slide::before { - content: ''; - display: inline-block; - font-size: 0; - height: 100%; - vertical-align: middle; - width: 0; -} - -.fancybox-is-sliding .fancybox-slide, -.fancybox-slide--previous, -.fancybox-slide--current, -.fancybox-slide--next { - display: block; -} - -.fancybox-slide--image { - overflow: hidden; - padding: 44px 0; -} - -.fancybox-slide--image::before { - display: none; -} - -.fancybox-slide--html { - padding: 6px; -} - -.fancybox-content { - background: #fff; - display: inline-block; - margin: 0; - max-width: 100%; - overflow: auto; - -webkit-overflow-scrolling: touch; - padding: 44px; - position: relative; - text-align: left; - vertical-align: middle; -} - -.fancybox-slide--image .fancybox-content { - animation-timing-function: cubic-bezier(.5, 0, .14, 1); - -webkit-backface-visibility: hidden; - background: transparent; - background-repeat: no-repeat; - background-size: 100% 100%; - left: 0; - max-width: none; - overflow: visible; - padding: 0; - position: absolute; - top: 0; - -ms-transform-origin: top left; - transform-origin: top left; - transition-property: transform, opacity; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - z-index: 99995; -} - -.fancybox-can-zoomOut .fancybox-content { - cursor: zoom-out; -} - -.fancybox-can-zoomIn .fancybox-content { - cursor: zoom-in; -} - -.fancybox-can-swipe .fancybox-content, -.fancybox-can-pan .fancybox-content { - cursor: -webkit-grab; - cursor: grab; -} - -.fancybox-is-grabbing .fancybox-content { - cursor: -webkit-grabbing; - cursor: grabbing; -} - -.fancybox-container [data-selectable='true'] { - cursor: text; -} - -.fancybox-image, -.fancybox-spaceball { - background: transparent; - border: 0; - height: 100%; - left: 0; - margin: 0; - max-height: none; - max-width: none; - padding: 0; - position: absolute; - top: 0; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - width: 100%; -} - -.fancybox-spaceball { - z-index: 1; -} - -.fancybox-slide--video .fancybox-content, -.fancybox-slide--map .fancybox-content, -.fancybox-slide--pdf .fancybox-content, -.fancybox-slide--iframe .fancybox-content { - height: 100%; - overflow: visible; - padding: 0; - width: 100%; -} - -.fancybox-slide--video .fancybox-content { - background: #000; -} - -.fancybox-slide--map .fancybox-content { - background: #e5e3df; -} - -.fancybox-slide--iframe .fancybox-content { - background: #fff; -} - -.fancybox-video, -.fancybox-iframe { - background: transparent; - border: 0; - display: block; - height: 100%; - margin: 0; - overflow: hidden; - padding: 0; - width: 100%; -} - -/* Fix iOS */ -.fancybox-iframe { - left: 0; - position: absolute; - top: 0; -} - -.fancybox-error { - background: #fff; - cursor: default; - max-width: 400px; - padding: 40px; - width: 100%; -} - -.fancybox-error p { - color: #444; - font-size: 16px; - line-height: 20px; - margin: 0; - padding: 0; -} - -/* Buttons */ - -.fancybox-button { - background: rgba(30, 30, 30, .6); - border: 0; - border-radius: 0; - box-shadow: none; - cursor: pointer; - display: inline-block; - height: 44px; - margin: 0; - padding: 10px; - position: relative; - transition: color .2s; - vertical-align: top; - visibility: inherit; - width: 44px; -} - -.fancybox-button, -.fancybox-button:visited, -.fancybox-button:link { - color: #ccc; -} - -.fancybox-button:hover { - color: #fff; -} - -.fancybox-button:focus { - outline: none; -} - -.fancybox-button.fancybox-focus { - outline: 1px dotted; -} - -.fancybox-button[disabled], -.fancybox-button[disabled]:hover { - color: #888; - cursor: default; - outline: none; -} - -/* Fix IE11 */ -.fancybox-button div { - height: 100%; -} - -.fancybox-button svg { - display: block; - height: 100%; - overflow: visible; - position: relative; - width: 100%; -} - -.fancybox-button svg path { - fill: currentColor; - stroke-width: 0; -} - -.fancybox-button--play svg:nth-child(2), -.fancybox-button--fsenter svg:nth-child(2) { - display: none; -} - -.fancybox-button--pause svg:nth-child(1), -.fancybox-button--fsexit svg:nth-child(1) { - display: none; -} - -.fancybox-progress { - background: #ff5268; - height: 2px; - left: 0; - position: absolute; - right: 0; - top: 0; - -ms-transform: scaleX(0); - transform: scaleX(0); - -ms-transform-origin: 0; - transform-origin: 0; - transition-property: transform; - transition-timing-function: linear; - z-index: 99998; -} - -/* Close button on the top right corner of html content */ - -.fancybox-close-small { - background: transparent; - border: 0; - border-radius: 0; - color: #ccc; - cursor: pointer; - opacity: .8; - padding: 8px; - position: absolute; - right: -12px; - top: -44px; - z-index: 401; -} - -.fancybox-close-small:hover { - color: #fff; - opacity: 1; -} - -.fancybox-slide--html .fancybox-close-small { - color: currentColor; - padding: 10px; - right: 0; - top: 0; -} - -.fancybox-slide--image.fancybox-is-scaling .fancybox-content { - overflow: hidden; -} - -.fancybox-is-scaling .fancybox-close-small, -.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small { - display: none; -} - -/* Navigation arrows */ - -.fancybox-navigation .fancybox-button { - background-clip: content-box; - height: 100px; - opacity: 0; - position: absolute; - top: calc(50% - 50px); - width: 70px; -} - -.fancybox-navigation .fancybox-button div { - padding: 7px; -} - -.fancybox-navigation .fancybox-button--arrow_left { - left: 0; - left: env(safe-area-inset-left); - padding: 31px 26px 31px 6px; -} - -.fancybox-navigation .fancybox-button--arrow_right { - padding: 31px 6px 31px 26px; - right: 0; - right: env(safe-area-inset-right); -} - -/* Caption */ - -.fancybox-caption { - background: linear-gradient(to top, - rgba(0, 0, 0, .85) 0%, - rgba(0, 0, 0, .3) 50%, - rgba(0, 0, 0, .15) 65%, - rgba(0, 0, 0, .075) 75.5%, - rgba(0, 0, 0, .037) 82.85%, - rgba(0, 0, 0, .019) 88%, - rgba(0, 0, 0, 0) 100%); - bottom: 0; - color: #eee; - font-size: 14px; - font-weight: 400; - left: 0; - line-height: 1.5; - padding: 75px 44px 25px 44px; - pointer-events: none; - right: 0; - text-align: center; - z-index: 99996; -} - -@supports (padding: max(0px)) { - .fancybox-caption { - padding: 75px max(44px, env(safe-area-inset-right)) max(25px, env(safe-area-inset-bottom)) max(44px, env(safe-area-inset-left)); - } -} - -.fancybox-caption--separate { - margin-top: -50px; -} - -.fancybox-caption__body { - max-height: 50vh; - overflow: auto; - pointer-events: all; -} - -.fancybox-caption a, -.fancybox-caption a:link, -.fancybox-caption a:visited { - color: #ccc; - text-decoration: none; -} - -.fancybox-caption a:hover { - color: #fff; - text-decoration: underline; -} - -/* Loading indicator */ - -.fancybox-loading { - animation: fancybox-rotate 1s linear infinite; - background: transparent; - border: 4px solid #888; - border-bottom-color: #fff; - border-radius: 50%; - height: 50px; - left: 50%; - margin: -25px 0 0 -25px; - opacity: .7; - padding: 0; - position: absolute; - top: 50%; - width: 50px; - z-index: 99999; -} - -@keyframes fancybox-rotate { - 100% { - transform: rotate(360deg); - } -} - -/* Transition effects */ - -.fancybox-animated { - transition-timing-function: cubic-bezier(0, 0, .25, 1); -} - -/* transitionEffect: slide */ - -.fancybox-fx-slide.fancybox-slide--previous { - opacity: 0; - transform: translate3d(-100%, 0, 0); -} - -.fancybox-fx-slide.fancybox-slide--next { - opacity: 0; - transform: translate3d(100%, 0, 0); -} - -.fancybox-fx-slide.fancybox-slide--current { - opacity: 1; - transform: translate3d(0, 0, 0); -} - -/* transitionEffect: fade */ - -.fancybox-fx-fade.fancybox-slide--previous, -.fancybox-fx-fade.fancybox-slide--next { - opacity: 0; - transition-timing-function: cubic-bezier(.19, 1, .22, 1); -} - -.fancybox-fx-fade.fancybox-slide--current { - opacity: 1; -} - -/* transitionEffect: zoom-in-out */ - -.fancybox-fx-zoom-in-out.fancybox-slide--previous { - opacity: 0; - transform: scale3d(1.5, 1.5, 1.5); -} - -.fancybox-fx-zoom-in-out.fancybox-slide--next { - opacity: 0; - transform: scale3d(.5, .5, .5); -} - -.fancybox-fx-zoom-in-out.fancybox-slide--current { - opacity: 1; - transform: scale3d(1, 1, 1); -} - -/* transitionEffect: rotate */ - -.fancybox-fx-rotate.fancybox-slide--previous { - opacity: 0; - -ms-transform: rotate(-360deg); - transform: rotate(-360deg); -} - -.fancybox-fx-rotate.fancybox-slide--next { - opacity: 0; - -ms-transform: rotate(360deg); - transform: rotate(360deg); -} - -.fancybox-fx-rotate.fancybox-slide--current { - opacity: 1; - -ms-transform: rotate(0deg); - transform: rotate(0deg); -} - -/* transitionEffect: circular */ - -.fancybox-fx-circular.fancybox-slide--previous { - opacity: 0; - transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0); -} - -.fancybox-fx-circular.fancybox-slide--next { - opacity: 0; - transform: scale3d(0, 0, 0) translate3d(100%, 0, 0); -} - -.fancybox-fx-circular.fancybox-slide--current { - opacity: 1; - transform: scale3d(1, 1, 1) translate3d(0, 0, 0); -} - -/* transitionEffect: tube */ - -.fancybox-fx-tube.fancybox-slide--previous { - transform: translate3d(-100%, 0, 0) scale(.1) skew(-10deg); -} - -.fancybox-fx-tube.fancybox-slide--next { - transform: translate3d(100%, 0, 0) scale(.1) skew(10deg); -} - -.fancybox-fx-tube.fancybox-slide--current { - transform: translate3d(0, 0, 0) scale(1); -} - -/* Styling for Small-Screen Devices */ -@media all and (max-height: 576px) { - .fancybox-slide { - padding-left: 6px; - padding-right: 6px; - } - - .fancybox-slide--image { - padding: 6px 0; - } - - .fancybox-close-small { - right: -6px; - } - - .fancybox-slide--image .fancybox-close-small { - background: #4e4e4e; - color: #f2f4f6; - height: 36px; - opacity: 1; - padding: 6px; - right: 0; - top: 0; - width: 36px; - } - - .fancybox-caption { - padding-left: 12px; - padding-right: 12px; - } - - @supports (padding: max(0px)) { - .fancybox-caption { - padding-left: max(12px, env(safe-area-inset-left)); - padding-right: max(12px, env(safe-area-inset-right)); - } - } -} -/* Share */ - -.fancybox-share { - background: #f4f4f4; - border-radius: 3px; - max-width: 90%; - padding: 30px; - text-align: center; -} - -.fancybox-share h1 { - color: #222; - font-size: 35px; - font-weight: 700; - margin: 0 0 20px 0; -} - -.fancybox-share p { - margin: 0; - padding: 0; -} - -.fancybox-share__button { - border: 0; - border-radius: 3px; - display: inline-block; - font-size: 14px; - font-weight: 700; - line-height: 40px; - margin: 0 5px 10px 5px; - min-width: 130px; - padding: 0 15px; - text-decoration: none; - transition: all .2s; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - white-space: nowrap; -} - -.fancybox-share__button:visited, -.fancybox-share__button:link { - color: #fff; -} - -.fancybox-share__button:hover { - text-decoration: none; -} - -.fancybox-share__button--fb { - background: #3b5998; -} - -.fancybox-share__button--fb:hover { - background: #344e86; -} - -.fancybox-share__button--pt { - background: #bd081d; -} - -.fancybox-share__button--pt:hover { - background: #aa0719; -} - -.fancybox-share__button--tw { - background: #1da1f2; -} - -.fancybox-share__button--tw:hover { - background: #0d95e8; -} - -.fancybox-share__button svg { - height: 25px; - margin-right: 7px; - position: relative; - top: -1px; - vertical-align: middle; - width: 25px; -} - -.fancybox-share__button svg path { - fill: #fff; -} - -.fancybox-share__input { - background: transparent; - border: 0; - border-bottom: 1px solid #d7d7d7; - border-radius: 0; - color: #5d5b5b; - font-size: 14px; - margin: 10px 0 0 0; - outline: none; - padding: 10px 15px; - width: 100%; -} -/* Thumbs */ - -.fancybox-thumbs { - background: #ddd; - bottom: 0; - display: none; - margin: 0; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - padding: 2px 2px 4px 2px; - position: absolute; - right: 0; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); - top: 0; - width: 212px; - z-index: 99995; -} - -.fancybox-thumbs-x { - overflow-x: auto; - overflow-y: hidden; -} - -.fancybox-show-thumbs .fancybox-thumbs { - display: block; -} - -.fancybox-show-thumbs .fancybox-inner { - right: 212px; -} - -.fancybox-thumbs__list { - font-size: 0; - height: 100%; - list-style: none; - margin: 0; - overflow-x: hidden; - overflow-y: auto; - padding: 0; - position: absolute; - position: relative; - white-space: nowrap; - width: 100%; -} - -.fancybox-thumbs-x .fancybox-thumbs__list { - overflow: hidden; -} - -.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar { - width: 7px; -} - -.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track { - background: #fff; - border-radius: 10px; - box-shadow: inset 0 0 6px rgba(0, 0, 0, .3); -} - -.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb { - background: #2a2a2a; - border-radius: 10px; -} - -.fancybox-thumbs__list a { - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - background-color: rgba(0, 0, 0, .1); - background-position: center center; - background-repeat: no-repeat; - background-size: cover; - cursor: pointer; - float: left; - height: 75px; - margin: 2px; - max-height: calc(100% - 8px); - max-width: calc(50% - 4px); - outline: none; - overflow: hidden; - padding: 0; - position: relative; - -webkit-tap-highlight-color: transparent; - width: 100px; -} - -.fancybox-thumbs__list a::before { - border: 6px solid #ff5268; - bottom: 0; - content: ''; - left: 0; - opacity: 0; - position: absolute; - right: 0; - top: 0; - transition: all .2s cubic-bezier(.25, .46, .45, .94); - z-index: 99991; -} - -.fancybox-thumbs__list a:focus::before { - opacity: .5; -} - -.fancybox-thumbs__list a.fancybox-thumbs-active::before { - opacity: 1; -} - -/* Styling for Small-Screen Devices */ -@media all and (max-width: 576px) { - .fancybox-thumbs { - width: 110px; - } - - .fancybox-show-thumbs .fancybox-inner { - right: 110px; - } - - .fancybox-thumbs__list a { - max-width: calc(100% - 10px); - } -} \ No newline at end of file diff --git a/fancybox/asset/fancybox/jquery.fancybox.js b/fancybox/asset/fancybox/jquery.fancybox.js deleted file mode 100644 index 806b2703..00000000 --- a/fancybox/asset/fancybox/jquery.fancybox.js +++ /dev/null @@ -1,5632 +0,0 @@ -// ================================================== -// fancyBox v3.5.7 -// -// Licensed GPLv3 for open source use -// or fancyBox Commercial License for commercial use -// -// http://fancyapps.com/fancybox/ -// Copyright 2019 fancyApps -// -// ================================================== -(function (window, document, $, undefined) { - "use strict"; - - window.console = window.console || { - info: function (stuff) {} - }; - - // If there's no jQuery, fancyBox can't work - // ========================================= - - if (!$) { - return; - } - - // Check if fancyBox is already initialized - // ======================================== - - if ($.fn.fancybox) { - console.info("fancyBox already initialized"); - - return; - } - - // Private default settings - // ======================== - - var defaults = { - // Close existing modals - // Set this to false if you do not need to stack multiple instances - closeExisting: false, - - // Enable infinite gallery navigation - loop: false, - - // Horizontal space between slides - gutter: 50, - - // Enable keyboard navigation - keyboard: true, - - // Should allow caption to overlap the content - preventCaptionOverlap: true, - - // Should display navigation arrows at the screen edges - arrows: true, - - // Should display counter at the top left corner - infobar: true, - - // Should display close button (using `btnTpl.smallBtn` template) over the content - // Can be true, false, "auto" - // If "auto" - will be automatically enabled for "html", "inline" or "ajax" items - smallBtn: "auto", - - // Should display toolbar (buttons at the top) - // Can be true, false, "auto" - // If "auto" - will be automatically hidden if "smallBtn" is enabled - toolbar: "auto", - - // What buttons should appear in the top right corner. - // Buttons will be created using templates from `btnTpl` option - // and they will be placed into toolbar (class="fancybox-toolbar"` element) - buttons: [ - "zoom", - //"share", - "slideShow", - //"fullScreen", - //"download", - "thumbs", - "close" - ], - - // Detect "idle" time in seconds - idleTime: 3, - - // Disable right-click and use simple image protection for images - protect: false, - - // Shortcut to make content "modal" - disable keyboard navigtion, hide buttons, etc - modal: false, - - image: { - // Wait for images to load before displaying - // true - wait for image to load and then display; - // false - display thumbnail and load the full-sized image over top, - // requires predefined image dimensions (`data-width` and `data-height` attributes) - preload: false - }, - - ajax: { - // Object containing settings for ajax request - settings: { - // This helps to indicate that request comes from the modal - // Feel free to change naming - data: { - fancybox: true - } - } - }, - - iframe: { - // Iframe template - tpl: '', - - // Preload iframe before displaying it - // This allows to calculate iframe content width and height - // (note: Due to "Same Origin Policy", you can't get cross domain data). - preload: true, - - // Custom CSS styling for iframe wrapping element - // You can use this to set custom iframe dimensions - css: {}, - - // Iframe tag attributes - attr: { - scrolling: "auto" - } - }, - - // For HTML5 video only - video: { - tpl: '", - format: "", // custom video format - autoStart: true - }, - - // Default content type if cannot be detected automatically - defaultType: "image", - - // Open/close animation type - // Possible values: - // false - disable - // "zoom" - zoom images from/to thumbnail - // "fade" - // "zoom-in-out" - // - animationEffect: "zoom", - - // Duration in ms for open/close animation - animationDuration: 366, - - // Should image change opacity while zooming - // If opacity is "auto", then opacity will be changed if image and thumbnail have different aspect ratios - zoomOpacity: "auto", - - // Transition effect between slides - // - // Possible values: - // false - disable - // "fade' - // "slide' - // "circular' - // "tube' - // "zoom-in-out' - // "rotate' - // - transitionEffect: "fade", - - // Duration in ms for transition animation - transitionDuration: 366, - - // Custom CSS class for slide element - slideClass: "", - - // Custom CSS class for layout - baseClass: "", - - // Base template for layout - baseTpl: '", - - // Loading indicator template - spinnerTpl: '
', - - // Error message template - errorTpl: '

{{ERROR}}

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

Hi!

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

{{SHARE}}

" + - "

" + - '' + - '' + - "Facebook" + - "" + - '' + - '' + - "Twitter" + - "" + - '' + - '' + - "Pinterest" + - "" + - "

" + - '

' + - "
" - } - }); - - function escapeHtml(string) { - var entityMap = { - "&": "&", - "<": "<", - ">": ">", - '"': """, - "'": "'", - "/": "/", - "`": "`", - "=": "=" - }; - - return String(string).replace(/[&<>"'`=\/]/g, function (s) { - return entityMap[s]; - }); - } - - $(document).on("click", "[data-fancybox-share]", function () { - var instance = $.fancybox.getInstance(), - current = instance.current || null, - url, - tpl; - - if (!current) { - return; - } - - if ($.type(current.opts.share.url) === "function") { - url = current.opts.share.url.apply(current, [instance, current]); - } - - tpl = current.opts.share.tpl - .replace(/\{\{media\}\}/g, current.type === "image" ? encodeURIComponent(current.src) : "") - .replace(/\{\{url\}\}/g, encodeURIComponent(url)) - .replace(/\{\{url_raw\}\}/g, escapeHtml(url)) - .replace(/\{\{descr\}\}/g, instance.$caption ? encodeURIComponent(instance.$caption.text()) : ""); - - $.fancybox.open({ - src: instance.translate(instance, tpl), - type: "html", - opts: { - touch: false, - animationEffect: false, - afterLoad: function (shareInstance, shareCurrent) { - // Close self if parent instance is closing - instance.$refs.container.one("beforeClose.fb", function () { - shareInstance.close(null, 0); - }); - - // Opening links in a popup window - shareCurrent.$content.find(".fancybox-share__button").click(function () { - window.open(this.href, "Share", "width=550, height=450"); - return false; - }); - }, - mobile: { - autoFocus: false - } - } - }); - }); -})(document, jQuery); -// ========================================================================== -// -// Hash -// Enables linking to each modal -// -// ========================================================================== -(function (window, document, $) { - "use strict"; - - // Simple $.escapeSelector polyfill (for jQuery prior v3) - if (!$.escapeSelector) { - $.escapeSelector = function (sel) { - var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; - var fcssescape = function (ch, asCodePoint) { - if (asCodePoint) { - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if (ch === "\0") { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }; - - return (sel + "").replace(rcssescape, fcssescape); - }; - } - - // Get info about gallery name and current index from url - function parseUrl() { - var hash = window.location.hash.substr(1), - rez = hash.split("-"), - index = rez.length > 1 && /^\+?\d+$/.test(rez[rez.length - 1]) ? parseInt(rez.pop(-1), 10) || 1 : 1, - gallery = rez.join("-"); - - return { - hash: hash, - /* Index is starting from 1 */ - index: index < 1 ? 1 : index, - gallery: gallery - }; - } - - // Trigger click evnt on links to open new fancyBox instance - function triggerFromUrl(url) { - if (url.gallery !== "") { - // If we can find element matching 'data-fancybox' atribute, - // then triggering click event should start fancyBox - $("[data-fancybox='" + $.escapeSelector(url.gallery) + "']") - .eq(url.index - 1) - .focus() - .trigger("click.fb-start"); - } - } - - // Get gallery name from current instance - function getGalleryID(instance) { - var opts, ret; - - if (!instance) { - return false; - } - - opts = instance.current ? instance.current.opts : instance.opts; - ret = opts.hash || (opts.$orig ? opts.$orig.data("fancybox") || opts.$orig.data("fancybox-trigger") : ""); - - return ret === "" ? false : ret; - } - - // Start when DOM becomes ready - $(function () { - // Check if user has disabled this module - if ($.fancybox.defaults.hash === false) { - return; - } - - // Update hash when opening/closing fancyBox - $(document).on({ - "onInit.fb": function (e, instance) { - var url, gallery; - - if (instance.group[instance.currIndex].opts.hash === false) { - return; - } - - url = parseUrl(); - gallery = getGalleryID(instance); - - // Make sure gallery start index matches index from hash - if (gallery && url.gallery && gallery == url.gallery) { - instance.currIndex = url.index - 1; - } - }, - - "beforeShow.fb": function (e, instance, current, firstRun) { - var gallery; - - if (!current || current.opts.hash === false) { - return; - } - - // Check if need to update window hash - gallery = getGalleryID(instance); - - if (!gallery) { - return; - } - - // Variable containing last hash value set by fancyBox - // It will be used to determine if fancyBox needs to close after hash change is detected - instance.currentHash = gallery + (instance.group.length > 1 ? "-" + (current.index + 1) : ""); - - // If current hash is the same (this instance most likely is opened by hashchange), then do nothing - if (window.location.hash === "#" + instance.currentHash) { - return; - } - - if (firstRun && !instance.origHash) { - instance.origHash = window.location.hash; - } - - if (instance.hashTimer) { - clearTimeout(instance.hashTimer); - } - - // Update hash - instance.hashTimer = setTimeout(function () { - if ("replaceState" in window.history) { - window.history[firstRun ? "pushState" : "replaceState"]({}, - document.title, - window.location.pathname + window.location.search + "#" + instance.currentHash - ); - - if (firstRun) { - instance.hasCreatedHistory = true; - } - } else { - window.location.hash = instance.currentHash; - } - - instance.hashTimer = null; - }, 300); - }, - - "beforeClose.fb": function (e, instance, current) { - if (!current || current.opts.hash === false) { - return; - } - - clearTimeout(instance.hashTimer); - - // Goto previous history entry - if (instance.currentHash && instance.hasCreatedHistory) { - window.history.back(); - } else if (instance.currentHash) { - if ("replaceState" in window.history) { - window.history.replaceState({}, document.title, window.location.pathname + window.location.search + (instance.origHash || "")); - } else { - window.location.hash = instance.origHash; - } - } - - instance.currentHash = null; - } - }); - - // Check if need to start/close after url has changed - $(window).on("hashchange.fb", function () { - var url = parseUrl(), - fb = null; - - // Find last fancyBox instance that has "hash" - $.each( - $(".fancybox-container") - .get() - .reverse(), - function (index, value) { - var tmp = $(value).data("FancyBox"); - - if (tmp && tmp.currentHash) { - fb = tmp; - return false; - } - } - ); - - if (fb) { - // Now, compare hash values - if (fb.currentHash !== url.gallery + "-" + url.index && !(url.index === 1 && fb.currentHash == url.gallery)) { - fb.currentHash = null; - - fb.close(); - } - } else if (url.gallery !== "") { - triggerFromUrl(url); - } - }); - - // Check current hash and trigger click event on matching element to start fancyBox, if needed - setTimeout(function () { - if (!$.fancybox.getInstance()) { - triggerFromUrl(parseUrl()); - } - }, 50); - }); -})(window, document, jQuery); -// ========================================================================== -// -// Wheel -// Basic mouse weheel support for gallery navigation -// -// ========================================================================== -(function (document, $) { - "use strict"; - - var prevTime = new Date().getTime(); - - $(document).on({ - "onInit.fb": function (e, instance, current) { - instance.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll", function (e) { - var current = instance.current, - currTime = new Date().getTime(); - - if (instance.group.length < 2 || current.opts.wheel === false || (current.opts.wheel === "auto" && current.type !== "image")) { - return; - } - - e.preventDefault(); - e.stopPropagation(); - - if (current.$slide.hasClass("fancybox-animated")) { - return; - } - - e = e.originalEvent || e; - - if (currTime - prevTime < 250) { - return; - } - - prevTime = currTime; - - instance[(-e.deltaY || -e.deltaX || e.wheelDelta || -e.detail) < 0 ? "next" : "previous"](); - }); - } - }); -})(document, jQuery); \ No newline at end of file diff --git a/fancybox/asset/fancybox/jquery.fancybox.min.css b/fancybox/asset/fancybox/jquery.fancybox.min.css deleted file mode 100644 index 7cc60b29..00000000 --- a/fancybox/asset/fancybox/jquery.fancybox.min.css +++ /dev/null @@ -1 +0,0 @@ -body.compensate-for-scrollbar{overflow:hidden}.fancybox-active{height:auto}.fancybox-is-hidden{left:-9999px;margin:0;position:absolute!important;top:-9999px;visibility:hidden}.fancybox-container{-webkit-backface-visibility:hidden;height:100%;left:0;outline:none;position:fixed;-webkit-tap-highlight-color:transparent;top:0;-ms-touch-action:manipulation;touch-action:manipulation;transform:translateZ(0);width:100%;z-index:99992}.fancybox-container *{box-sizing:border-box}.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-stage{bottom:0;left:0;position:absolute;right:0;top:0}.fancybox-outer{-webkit-overflow-scrolling:touch;overflow-y:auto}.fancybox-bg{background:#1e1e1e;opacity:0;transition-duration:inherit;transition-property:opacity;transition-timing-function:cubic-bezier(.47,0,.74,.71)}.fancybox-is-open .fancybox-bg{opacity:.9;transition-timing-function:cubic-bezier(.22,.61,.36,1)}.fancybox-caption,.fancybox-infobar,.fancybox-navigation .fancybox-button,.fancybox-toolbar{direction:ltr;opacity:0;position:absolute;transition:opacity .25s ease,visibility 0s ease .25s;visibility:hidden;z-index:99997}.fancybox-show-caption .fancybox-caption,.fancybox-show-infobar .fancybox-infobar,.fancybox-show-nav .fancybox-navigation .fancybox-button,.fancybox-show-toolbar .fancybox-toolbar{opacity:1;transition:opacity .25s ease 0s,visibility 0s ease 0s;visibility:visible}.fancybox-infobar{color:#ccc;font-size:13px;-webkit-font-smoothing:subpixel-antialiased;height:44px;left:0;line-height:44px;min-width:44px;mix-blend-mode:difference;padding:0 10px;pointer-events:none;top:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fancybox-toolbar{right:0;top:0}.fancybox-stage{direction:ltr;overflow:visible;transform:translateZ(0);z-index:99994}.fancybox-is-open .fancybox-stage{overflow:hidden}.fancybox-slide{-webkit-backface-visibility:hidden;display:none;height:100%;left:0;outline:none;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:absolute;text-align:center;top:0;transition-property:transform,opacity;white-space:normal;width:100%;z-index:99994}.fancybox-slide:before{content:"";display:inline-block;font-size:0;height:100%;vertical-align:middle;width:0}.fancybox-is-sliding .fancybox-slide,.fancybox-slide--current,.fancybox-slide--next,.fancybox-slide--previous{display:block}.fancybox-slide--image{overflow:hidden;padding:44px 0}.fancybox-slide--image:before{display:none}.fancybox-slide--html{padding:6px}.fancybox-content{background:#fff;display:inline-block;margin:0;max-width:100%;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:relative;text-align:left;vertical-align:middle}.fancybox-slide--image .fancybox-content{animation-timing-function:cubic-bezier(.5,0,.14,1);-webkit-backface-visibility:hidden;background:transparent;background-repeat:no-repeat;background-size:100% 100%;left:0;max-width:none;overflow:visible;padding:0;position:absolute;top:0;transform-origin:top left;transition-property:transform,opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:99995}.fancybox-can-zoomOut .fancybox-content{cursor:zoom-out}.fancybox-can-zoomIn .fancybox-content{cursor:zoom-in}.fancybox-can-pan .fancybox-content,.fancybox-can-swipe .fancybox-content{cursor:grab}.fancybox-is-grabbing .fancybox-content{cursor:grabbing}.fancybox-container [data-selectable=true]{cursor:text}.fancybox-image,.fancybox-spaceball{background:transparent;border:0;height:100%;left:0;margin:0;max-height:none;max-width:none;padding:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.fancybox-spaceball{z-index:1}.fancybox-slide--iframe .fancybox-content,.fancybox-slide--map .fancybox-content,.fancybox-slide--pdf .fancybox-content,.fancybox-slide--video .fancybox-content{height:100%;overflow:visible;padding:0;width:100%}.fancybox-slide--video .fancybox-content{background:#000}.fancybox-slide--map .fancybox-content{background:#e5e3df}.fancybox-slide--iframe .fancybox-content{background:#fff}.fancybox-iframe,.fancybox-video{background:transparent;border:0;display:block;height:100%;margin:0;overflow:hidden;padding:0;width:100%}.fancybox-iframe{left:0;position:absolute;top:0}.fancybox-error{background:#fff;cursor:default;max-width:400px;padding:40px;width:100%}.fancybox-error p{color:#444;font-size:16px;line-height:20px;margin:0;padding:0}.fancybox-button{background:rgba(30,30,30,.6);border:0;border-radius:0;box-shadow:none;cursor:pointer;display:inline-block;height:44px;margin:0;padding:10px;position:relative;transition:color .2s;vertical-align:top;visibility:inherit;width:44px}.fancybox-button,.fancybox-button:link,.fancybox-button:visited{color:#ccc}.fancybox-button:hover{color:#fff}.fancybox-button:focus{outline:none}.fancybox-button.fancybox-focus{outline:1px dotted}.fancybox-button[disabled],.fancybox-button[disabled]:hover{color:#888;cursor:default;outline:none}.fancybox-button div{height:100%}.fancybox-button svg{display:block;height:100%;overflow:visible;position:relative;width:100%}.fancybox-button svg path{fill:currentColor;stroke-width:0}.fancybox-button--fsenter svg:nth-child(2),.fancybox-button--fsexit svg:first-child,.fancybox-button--pause svg:first-child,.fancybox-button--play svg:nth-child(2){display:none}.fancybox-progress{background:#ff5268;height:2px;left:0;position:absolute;right:0;top:0;transform:scaleX(0);transform-origin:0;transition-property:transform;transition-timing-function:linear;z-index:99998}.fancybox-close-small{background:transparent;border:0;border-radius:0;color:#ccc;cursor:pointer;opacity:.8;padding:8px;position:absolute;right:-12px;top:-44px;z-index:401}.fancybox-close-small:hover{color:#fff;opacity:1}.fancybox-slide--html .fancybox-close-small{color:currentColor;padding:10px;right:0;top:0}.fancybox-slide--image.fancybox-is-scaling .fancybox-content{overflow:hidden}.fancybox-is-scaling .fancybox-close-small,.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small{display:none}.fancybox-navigation .fancybox-button{background-clip:content-box;height:100px;opacity:0;position:absolute;top:calc(50% - 50px);width:70px}.fancybox-navigation .fancybox-button div{padding:7px}.fancybox-navigation .fancybox-button--arrow_left{left:0;left:env(safe-area-inset-left);padding:31px 26px 31px 6px}.fancybox-navigation .fancybox-button--arrow_right{padding:31px 6px 31px 26px;right:0;right:env(safe-area-inset-right)}.fancybox-caption{background:linear-gradient(0deg,rgba(0,0,0,.85) 0,rgba(0,0,0,.3) 50%,rgba(0,0,0,.15) 65%,rgba(0,0,0,.075) 75.5%,rgba(0,0,0,.037) 82.85%,rgba(0,0,0,.019) 88%,transparent);bottom:0;color:#eee;font-size:14px;font-weight:400;left:0;line-height:1.5;padding:75px 44px 25px;pointer-events:none;right:0;text-align:center;z-index:99996}@supports (padding:max(0px)){.fancybox-caption{padding:75px max(44px,env(safe-area-inset-right)) max(25px,env(safe-area-inset-bottom)) max(44px,env(safe-area-inset-left))}}.fancybox-caption--separate{margin-top:-50px}.fancybox-caption__body{max-height:50vh;overflow:auto;pointer-events:all}.fancybox-caption a,.fancybox-caption a:link,.fancybox-caption a:visited{color:#ccc;text-decoration:none}.fancybox-caption a:hover{color:#fff;text-decoration:underline}.fancybox-loading{animation:a 1s linear infinite;background:transparent;border:4px solid #888;border-bottom-color:#fff;border-radius:50%;height:50px;left:50%;margin:-25px 0 0 -25px;opacity:.7;padding:0;position:absolute;top:50%;width:50px;z-index:99999}@keyframes a{to{transform:rotate(1turn)}}.fancybox-animated{transition-timing-function:cubic-bezier(0,0,.25,1)}.fancybox-fx-slide.fancybox-slide--previous{opacity:0;transform:translate3d(-100%,0,0)}.fancybox-fx-slide.fancybox-slide--next{opacity:0;transform:translate3d(100%,0,0)}.fancybox-fx-slide.fancybox-slide--current{opacity:1;transform:translateZ(0)}.fancybox-fx-fade.fancybox-slide--next,.fancybox-fx-fade.fancybox-slide--previous{opacity:0;transition-timing-function:cubic-bezier(.19,1,.22,1)}.fancybox-fx-fade.fancybox-slide--current{opacity:1}.fancybox-fx-zoom-in-out.fancybox-slide--previous{opacity:0;transform:scale3d(1.5,1.5,1.5)}.fancybox-fx-zoom-in-out.fancybox-slide--next{opacity:0;transform:scale3d(.5,.5,.5)}.fancybox-fx-zoom-in-out.fancybox-slide--current{opacity:1;transform:scaleX(1)}.fancybox-fx-rotate.fancybox-slide--previous{opacity:0;transform:rotate(-1turn)}.fancybox-fx-rotate.fancybox-slide--next{opacity:0;transform:rotate(1turn)}.fancybox-fx-rotate.fancybox-slide--current{opacity:1;transform:rotate(0deg)}.fancybox-fx-circular.fancybox-slide--previous{opacity:0;transform:scale3d(0,0,0) translate3d(-100%,0,0)}.fancybox-fx-circular.fancybox-slide--next{opacity:0;transform:scale3d(0,0,0) translate3d(100%,0,0)}.fancybox-fx-circular.fancybox-slide--current{opacity:1;transform:scaleX(1) translateZ(0)}.fancybox-fx-tube.fancybox-slide--previous{transform:translate3d(-100%,0,0) scale(.1) skew(-10deg)}.fancybox-fx-tube.fancybox-slide--next{transform:translate3d(100%,0,0) scale(.1) skew(10deg)}.fancybox-fx-tube.fancybox-slide--current{transform:translateZ(0) scale(1)}@media (max-height:576px){.fancybox-slide{padding-left:6px;padding-right:6px}.fancybox-slide--image{padding:6px 0}.fancybox-close-small{right:-6px}.fancybox-slide--image .fancybox-close-small{background:#4e4e4e;color:#f2f4f6;height:36px;opacity:1;padding:6px;right:0;top:0;width:36px}.fancybox-caption{padding-left:12px;padding-right:12px}@supports (padding:max(0px)){.fancybox-caption{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right))}}}.fancybox-share{background:#f4f4f4;border-radius:3px;max-width:90%;padding:30px;text-align:center}.fancybox-share h1{color:#222;font-size:35px;font-weight:700;margin:0 0 20px}.fancybox-share p{margin:0;padding:0}.fancybox-share__button{border:0;border-radius:3px;display:inline-block;font-size:14px;font-weight:700;line-height:40px;margin:0 5px 10px;min-width:130px;padding:0 15px;text-decoration:none;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.fancybox-share__button:link,.fancybox-share__button:visited{color:#fff}.fancybox-share__button:hover{text-decoration:none}.fancybox-share__button--fb{background:#3b5998}.fancybox-share__button--fb:hover{background:#344e86}.fancybox-share__button--pt{background:#bd081d}.fancybox-share__button--pt:hover{background:#aa0719}.fancybox-share__button--tw{background:#1da1f2}.fancybox-share__button--tw:hover{background:#0d95e8}.fancybox-share__button svg{height:25px;margin-right:7px;position:relative;top:-1px;vertical-align:middle;width:25px}.fancybox-share__button svg path{fill:#fff}.fancybox-share__input{background:transparent;border:0;border-bottom:1px solid #d7d7d7;border-radius:0;color:#5d5b5b;font-size:14px;margin:10px 0 0;outline:none;padding:10px 15px;width:100%}.fancybox-thumbs{background:#ddd;bottom:0;display:none;margin:0;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;padding:2px 2px 4px;position:absolute;right:0;-webkit-tap-highlight-color:rgba(0,0,0,0);top:0;width:212px;z-index:99995}.fancybox-thumbs-x{overflow-x:auto;overflow-y:hidden}.fancybox-show-thumbs .fancybox-thumbs{display:block}.fancybox-show-thumbs .fancybox-inner{right:212px}.fancybox-thumbs__list{font-size:0;height:100%;list-style:none;margin:0;overflow-x:hidden;overflow-y:auto;padding:0;position:absolute;position:relative;white-space:nowrap;width:100%}.fancybox-thumbs-x .fancybox-thumbs__list{overflow:hidden}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar{width:7px}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track{background:#fff;border-radius:10px;box-shadow:inset 0 0 6px rgba(0,0,0,.3)}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb{background:#2a2a2a;border-radius:10px}.fancybox-thumbs__list a{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:rgba(0,0,0,.1);background-position:50%;background-repeat:no-repeat;background-size:cover;cursor:pointer;float:left;height:75px;margin:2px;max-height:calc(100% - 8px);max-width:calc(50% - 4px);outline:none;overflow:hidden;padding:0;position:relative;-webkit-tap-highlight-color:transparent;width:100px}.fancybox-thumbs__list a:before{border:6px solid #ff5268;bottom:0;content:"";left:0;opacity:0;position:absolute;right:0;top:0;transition:all .2s cubic-bezier(.25,.46,.45,.94);z-index:99991}.fancybox-thumbs__list a:focus:before{opacity:.5}.fancybox-thumbs__list a.fancybox-thumbs-active:before{opacity:1}@media (max-width:576px){.fancybox-thumbs{width:110px}.fancybox-show-thumbs .fancybox-inner{right:110px}.fancybox-thumbs__list a{max-width:calc(100% - 10px)}} \ No newline at end of file diff --git a/fancybox/asset/fancybox/jquery.fancybox.min.js b/fancybox/asset/fancybox/jquery.fancybox.min.js deleted file mode 100644 index d5d10f6b..00000000 --- a/fancybox/asset/fancybox/jquery.fancybox.min.js +++ /dev/null @@ -1,13 +0,0 @@ -// ================================================== -// fancyBox v3.5.7 -// -// Licensed GPLv3 for open source use -// or fancyBox Commercial License for commercial use -// -// http://fancyapps.com/fancybox/ -// Copyright 2019 fancyApps -// -// ================================================== -!function(t,e,n,o){"use strict";function i(t,e){var o,i,a,s=[],r=0;t&&t.isDefaultPrevented()||(t.preventDefault(),e=e||{},t&&t.data&&(e=h(t.data.options,e)),o=e.$target||n(t.currentTarget).trigger("blur"),(a=n.fancybox.getInstance())&&a.$trigger&&a.$trigger.is(o)||(e.selector?s=n(e.selector):(i=o.attr("data-fancybox")||"",i?(s=t.data?t.data.items:[],s=s.length?s.filter('[data-fancybox="'+i+'"]'):n('[data-fancybox="'+i+'"]')):s=[o]),r=n(s).index(o),r<0&&(r=0),a=n.fancybox.open(s,e,r),a.$trigger=o))}if(t.console=t.console||{info:function(t){}},n){if(n.fn.fancybox)return void console.info("fancyBox already initialized");var a={closeExisting:!1,loop:!1,gutter:50,keyboard:!0,preventCaptionOverlap:!0,arrows:!0,infobar:!0,smallBtn:"auto",toolbar:"auto",buttons:["zoom","slideShow","thumbs","close"],idleTime:3,protect:!1,modal:!1,image:{preload:!1},ajax:{settings:{data:{fancybox:!0}}},iframe:{tpl:'',preload:!0,css:{},attr:{scrolling:"auto"}},video:{tpl:'',format:"",autoStart:!0},defaultType:"image",animationEffect:"zoom",animationDuration:366,zoomOpacity:"auto",transitionEffect:"fade",transitionDuration:366,slideClass:"",baseClass:"",baseTpl:'',spinnerTpl:'
',errorTpl:'

{{ERROR}}

',btnTpl:{download:'',zoom:'',close:'',arrowLeft:'',arrowRight:'',smallBtn:''},parentEl:"body",hideScrollbar:!0,autoFocus:!0,backFocus:!0,trapFocus:!0,fullScreen:{autoStart:!1},touch:{vertical:!0,momentum:!0},hash:null,media:{},slideShow:{autoStart:!1,speed:3e3},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"},wheel:"auto",onInit:n.noop,beforeLoad:n.noop,afterLoad:n.noop,beforeShow:n.noop,afterShow:n.noop,beforeClose:n.noop,afterClose:n.noop,onActivate:n.noop,onDeactivate:n.noop,clickContent:function(t,e){return"image"===t.type&&"zoom"},clickSlide:"close",clickOutside:"close",dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1,mobile:{preventCaptionOverlap:!1,idleTime:!1,clickContent:function(t,e){return"image"===t.type&&"toggleControls"},clickSlide:function(t,e){return"image"===t.type?"toggleControls":"close"},dblclickContent:function(t,e){return"image"===t.type&&"zoom"},dblclickSlide:function(t,e){return"image"===t.type&&"zoom"}},lang:"en",i18n:{en:{CLOSE:"Close",NEXT:"Next",PREV:"Previous",ERROR:"The requested content cannot be loaded.
Please try again later.",PLAY_START:"Start slideshow",PLAY_STOP:"Pause slideshow",FULL_SCREEN:"Full screen",THUMBS:"Thumbnails",DOWNLOAD:"Download",SHARE:"Share",ZOOM:"Zoom"},de:{CLOSE:"Schließen",NEXT:"Weiter",PREV:"Zurück",ERROR:"Die angeforderten Daten konnten nicht geladen werden.
Bitte versuchen Sie es später nochmal.",PLAY_START:"Diaschau starten",PLAY_STOP:"Diaschau beenden",FULL_SCREEN:"Vollbild",THUMBS:"Vorschaubilder",DOWNLOAD:"Herunterladen",SHARE:"Teilen",ZOOM:"Vergrößern"}}},s=n(t),r=n(e),c=0,l=function(t){return t&&t.hasOwnProperty&&t instanceof n},d=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),u=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),f=function(){var t,n=e.createElement("fakeelement"),o={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(t in o)if(void 0!==n.style[t])return o[t];return"transitionend"}(),p=function(t){return t&&t.length&&t[0].offsetHeight},h=function(t,e){var o=n.extend(!0,{},t,e);return n.each(e,function(t,e){n.isArray(e)&&(o[t]=e)}),o},g=function(t){var o,i;return!(!t||t.ownerDocument!==e)&&(n(".fancybox-container").css("pointer-events","none"),o={x:t.getBoundingClientRect().left+t.offsetWidth/2,y:t.getBoundingClientRect().top+t.offsetHeight/2},i=e.elementFromPoint(o.x,o.y)===t,n(".fancybox-container").css("pointer-events",""),i)},b=function(t,e,o){var i=this;i.opts=h({index:o},n.fancybox.defaults),n.isPlainObject(e)&&(i.opts=h(i.opts,e)),n.fancybox.isMobile&&(i.opts=h(i.opts,i.opts.mobile)),i.id=i.opts.id||++c,i.currIndex=parseInt(i.opts.index,10)||0,i.prevIndex=null,i.prevPos=null,i.currPos=0,i.firstRun=!0,i.group=[],i.slides={},i.addContent(t),i.group.length&&i.init()};n.extend(b.prototype,{init:function(){var o,i,a=this,s=a.group[a.currIndex],r=s.opts;r.closeExisting&&n.fancybox.close(!0),n("body").addClass("fancybox-active"),!n.fancybox.getInstance()&&!1!==r.hideScrollbar&&!n.fancybox.isMobile&&e.body.scrollHeight>t.innerHeight&&(n("head").append('"),n("body").addClass("compensate-for-scrollbar")),i="",n.each(r.buttons,function(t,e){i+=r.btnTpl[e]||""}),o=n(a.translate(a,r.baseTpl.replace("{{buttons}}",i).replace("{{arrows}}",r.btnTpl.arrowLeft+r.btnTpl.arrowRight))).attr("id","fancybox-container-"+a.id).addClass(r.baseClass).data("FancyBox",a).appendTo(r.parentEl),a.$refs={container:o},["bg","inner","infobar","toolbar","stage","caption","navigation"].forEach(function(t){a.$refs[t]=o.find(".fancybox-"+t)}),a.trigger("onInit"),a.activate(),a.jumpTo(a.currIndex)},translate:function(t,e){var n=t.opts.i18n[t.opts.lang]||t.opts.i18n.en;return e.replace(/\{\{(\w+)\}\}/g,function(t,e){return void 0===n[e]?t:n[e]})},addContent:function(t){var e,o=this,i=n.makeArray(t);n.each(i,function(t,e){var i,a,s,r,c,l={},d={};n.isPlainObject(e)?(l=e,d=e.opts||e):"object"===n.type(e)&&n(e).length?(i=n(e),d=i.data()||{},d=n.extend(!0,{},d,d.options),d.$orig=i,l.src=o.opts.src||d.src||i.attr("href"),l.type||l.src||(l.type="inline",l.src=e)):l={type:"html",src:e+""},l.opts=n.extend(!0,{},o.opts,d),n.isArray(d.buttons)&&(l.opts.buttons=d.buttons),n.fancybox.isMobile&&l.opts.mobile&&(l.opts=h(l.opts,l.opts.mobile)),a=l.type||l.opts.type,r=l.src||"",!a&&r&&((s=r.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))?(a="video",l.opts.video.format||(l.opts.video.format="video/"+("ogv"===s[1]?"ogg":s[1]))):r.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)?a="image":r.match(/\.(pdf)((\?|#).*)?$/i)?(a="iframe",l=n.extend(!0,l,{contentType:"pdf",opts:{iframe:{preload:!1}}})):"#"===r.charAt(0)&&(a="inline")),a?l.type=a:o.trigger("objectNeedsType",l),l.contentType||(l.contentType=n.inArray(l.type,["html","inline","ajax"])>-1?"html":l.type),l.index=o.group.length,"auto"==l.opts.smallBtn&&(l.opts.smallBtn=n.inArray(l.type,["html","inline","ajax"])>-1),"auto"===l.opts.toolbar&&(l.opts.toolbar=!l.opts.smallBtn),l.$thumb=l.opts.$thumb||null,l.opts.$trigger&&l.index===o.opts.index&&(l.$thumb=l.opts.$trigger.find("img:first"),l.$thumb.length&&(l.opts.$orig=l.opts.$trigger)),l.$thumb&&l.$thumb.length||!l.opts.$orig||(l.$thumb=l.opts.$orig.find("img:first")),l.$thumb&&!l.$thumb.length&&(l.$thumb=null),l.thumb=l.opts.thumb||(l.$thumb?l.$thumb[0].src:null),"function"===n.type(l.opts.caption)&&(l.opts.caption=l.opts.caption.apply(e,[o,l])),"function"===n.type(o.opts.caption)&&(l.opts.caption=o.opts.caption.apply(e,[o,l])),l.opts.caption instanceof n||(l.opts.caption=void 0===l.opts.caption?"":l.opts.caption+""),"ajax"===l.type&&(c=r.split(/\s+/,2),c.length>1&&(l.src=c.shift(),l.opts.filter=c.shift())),l.opts.modal&&(l.opts=n.extend(!0,l.opts,{trapFocus:!0,infobar:0,toolbar:0,smallBtn:0,keyboard:0,slideShow:0,fullScreen:0,thumbs:0,touch:0,clickContent:!1,clickSlide:!1,clickOutside:!1,dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1})),o.group.push(l)}),Object.keys(o.slides).length&&(o.updateControls(),(e=o.Thumbs)&&e.isActive&&(e.create(),e.focus()))},addEvents:function(){var e=this;e.removeEvents(),e.$refs.container.on("click.fb-close","[data-fancybox-close]",function(t){t.stopPropagation(),t.preventDefault(),e.close(t)}).on("touchstart.fb-prev click.fb-prev","[data-fancybox-prev]",function(t){t.stopPropagation(),t.preventDefault(),e.previous()}).on("touchstart.fb-next click.fb-next","[data-fancybox-next]",function(t){t.stopPropagation(),t.preventDefault(),e.next()}).on("click.fb","[data-fancybox-zoom]",function(t){e[e.isScaledDown()?"scaleToActual":"scaleToFit"]()}),s.on("orientationchange.fb resize.fb",function(t){t&&t.originalEvent&&"resize"===t.originalEvent.type?(e.requestId&&u(e.requestId),e.requestId=d(function(){e.update(t)})):(e.current&&"iframe"===e.current.type&&e.$refs.stage.hide(),setTimeout(function(){e.$refs.stage.show(),e.update(t)},n.fancybox.isMobile?600:250))}),r.on("keydown.fb",function(t){var o=n.fancybox?n.fancybox.getInstance():null,i=o.current,a=t.keyCode||t.which;if(9==a)return void(i.opts.trapFocus&&e.focus(t));if(!(!i.opts.keyboard||t.ctrlKey||t.altKey||t.shiftKey||n(t.target).is("input,textarea,video,audio,select")))return 8===a||27===a?(t.preventDefault(),void e.close(t)):37===a||38===a?(t.preventDefault(),void e.previous()):39===a||40===a?(t.preventDefault(),void e.next()):void e.trigger("afterKeydown",t,a)}),e.group[e.currIndex].opts.idleTime&&(e.idleSecondsCounter=0,r.on("mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle",function(t){e.idleSecondsCounter=0,e.isIdle&&e.showControls(),e.isIdle=!1}),e.idleInterval=t.setInterval(function(){++e.idleSecondsCounter>=e.group[e.currIndex].opts.idleTime&&!e.isDragging&&(e.isIdle=!0,e.idleSecondsCounter=0,e.hideControls())},1e3))},removeEvents:function(){var e=this;s.off("orientationchange.fb resize.fb"),r.off("keydown.fb .fb-idle"),this.$refs.container.off(".fb-close .fb-prev .fb-next"),e.idleInterval&&(t.clearInterval(e.idleInterval),e.idleInterval=null)},previous:function(t){return this.jumpTo(this.currPos-1,t)},next:function(t){return this.jumpTo(this.currPos+1,t)},jumpTo:function(t,e){var o,i,a,s,r,c,l,d,u,f=this,h=f.group.length;if(!(f.isDragging||f.isClosing||f.isAnimating&&f.firstRun)){if(t=parseInt(t,10),!(a=f.current?f.current.opts.loop:f.opts.loop)&&(t<0||t>=h))return!1;if(o=f.firstRun=!Object.keys(f.slides).length,r=f.current,f.prevIndex=f.currIndex,f.prevPos=f.currPos,s=f.createSlide(t),h>1&&((a||s.index0)&&f.createSlide(t-1)),f.current=s,f.currIndex=s.index,f.currPos=s.pos,f.trigger("beforeShow",o),f.updateControls(),s.forcedDuration=void 0,n.isNumeric(e)?s.forcedDuration=e:e=s.opts[o?"animationDuration":"transitionDuration"],e=parseInt(e,10),i=f.isMoved(s),s.$slide.addClass("fancybox-slide--current"),o)return s.opts.animationEffect&&e&&f.$refs.container.css("transition-duration",e+"ms"),f.$refs.container.addClass("fancybox-is-open").trigger("focus"),f.loadSlide(s),void f.preload("image");c=n.fancybox.getTranslate(r.$slide),l=n.fancybox.getTranslate(f.$refs.stage),n.each(f.slides,function(t,e){n.fancybox.stop(e.$slide,!0)}),r.pos!==s.pos&&(r.isComplete=!1),r.$slide.removeClass("fancybox-slide--complete fancybox-slide--current"),i?(u=c.left-(r.pos*c.width+r.pos*r.opts.gutter),n.each(f.slides,function(t,o){o.$slide.removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")});var i=o.pos*c.width+o.pos*o.opts.gutter;n.fancybox.setTranslate(o.$slide,{top:0,left:i-l.left+u}),o.pos!==s.pos&&o.$slide.addClass("fancybox-slide--"+(o.pos>s.pos?"next":"previous")),p(o.$slide),n.fancybox.animate(o.$slide,{top:0,left:(o.pos-s.pos)*c.width+(o.pos-s.pos)*o.opts.gutter},e,function(){o.$slide.css({transform:"",opacity:""}).removeClass("fancybox-slide--next fancybox-slide--previous"),o.pos===f.currPos&&f.complete()})})):e&&s.opts.transitionEffect&&(d="fancybox-animated fancybox-fx-"+s.opts.transitionEffect,r.$slide.addClass("fancybox-slide--"+(r.pos>s.pos?"next":"previous")),n.fancybox.animate(r.$slide,d,e,function(){r.$slide.removeClass(d).removeClass("fancybox-slide--next fancybox-slide--previous")},!1)),s.isLoaded?f.revealContent(s):f.loadSlide(s),f.preload("image")}},createSlide:function(t){var e,o,i=this;return o=t%i.group.length,o=o<0?i.group.length+o:o,!i.slides[t]&&i.group[o]&&(e=n('
').appendTo(i.$refs.stage),i.slides[t]=n.extend(!0,{},i.group[o],{pos:t,$slide:e,isLoaded:!1}),i.updateSlide(i.slides[t])),i.slides[t]},scaleToActual:function(t,e,o){var i,a,s,r,c,l=this,d=l.current,u=d.$content,f=n.fancybox.getTranslate(d.$slide).width,p=n.fancybox.getTranslate(d.$slide).height,h=d.width,g=d.height;l.isAnimating||l.isMoved()||!u||"image"!=d.type||!d.isLoaded||d.hasError||(l.isAnimating=!0,n.fancybox.stop(u),t=void 0===t?.5*f:t,e=void 0===e?.5*p:e,i=n.fancybox.getTranslate(u),i.top-=n.fancybox.getTranslate(d.$slide).top,i.left-=n.fancybox.getTranslate(d.$slide).left,r=h/i.width,c=g/i.height,a=.5*f-.5*h,s=.5*p-.5*g,h>f&&(a=i.left*r-(t*r-t),a>0&&(a=0),ap&&(s=i.top*c-(e*c-e),s>0&&(s=0),se-.5&&(l=e),d>o-.5&&(d=o),"image"===t.type?(u.top=Math.floor(.5*(o-d))+parseFloat(c.css("paddingTop")),u.left=Math.floor(.5*(e-l))+parseFloat(c.css("paddingLeft"))):"video"===t.contentType&&(a=t.opts.width&&t.opts.height?l/d:t.opts.ratio||16/9,d>l/a?d=l/a:l>d*a&&(l=d*a)),u.width=l,u.height=d,u)},update:function(t){var e=this;n.each(e.slides,function(n,o){e.updateSlide(o,t)})},updateSlide:function(t,e){var o=this,i=t&&t.$content,a=t.width||t.opts.width,s=t.height||t.opts.height,r=t.$slide;o.adjustCaption(t),i&&(a||s||"video"===t.contentType)&&!t.hasError&&(n.fancybox.stop(i),n.fancybox.setTranslate(i,o.getFitPos(t)),t.pos===o.currPos&&(o.isAnimating=!1,o.updateCursor())),o.adjustLayout(t),r.length&&(r.trigger("refresh"),t.pos===o.currPos&&o.$refs.toolbar.add(o.$refs.navigation.find(".fancybox-button--arrow_right")).toggleClass("compensate-for-scrollbar",r.get(0).scrollHeight>r.get(0).clientHeight)),o.trigger("onUpdate",t,e)},centerSlide:function(t){var e=this,o=e.current,i=o.$slide;!e.isClosing&&o&&(i.siblings().css({transform:"",opacity:""}),i.parent().children().removeClass("fancybox-slide--previous fancybox-slide--next"),n.fancybox.animate(i,{top:0,left:0,opacity:1},void 0===t?0:t,function(){i.css({transform:"",opacity:""}),o.isComplete||e.complete()},!1))},isMoved:function(t){var e,o,i=t||this.current;return!!i&&(o=n.fancybox.getTranslate(this.$refs.stage),e=n.fancybox.getTranslate(i.$slide),!i.$slide.hasClass("fancybox-animated")&&(Math.abs(e.top-o.top)>.5||Math.abs(e.left-o.left)>.5))},updateCursor:function(t,e){var o,i,a=this,s=a.current,r=a.$refs.container;s&&!a.isClosing&&a.Guestures&&(r.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan"),o=a.canPan(t,e),i=!!o||a.isZoomable(),r.toggleClass("fancybox-is-zoomable",i),n("[data-fancybox-zoom]").prop("disabled",!i),o?r.addClass("fancybox-can-pan"):i&&("zoom"===s.opts.clickContent||n.isFunction(s.opts.clickContent)&&"zoom"==s.opts.clickContent(s))?r.addClass("fancybox-can-zoomIn"):s.opts.touch&&(s.opts.touch.vertical||a.group.length>1)&&"video"!==s.contentType&&r.addClass("fancybox-can-swipe"))},isZoomable:function(){var t,e=this,n=e.current;if(n&&!e.isClosing&&"image"===n.type&&!n.hasError){if(!n.isLoaded)return!0;if((t=e.getFitPos(n))&&(n.width>t.width||n.height>t.height))return!0}return!1},isScaledDown:function(t,e){var o=this,i=!1,a=o.current,s=a.$content;return void 0!==t&&void 0!==e?i=t1.5||Math.abs(a.height-s.height)>1.5)),s},loadSlide:function(t){var e,o,i,a=this;if(!t.isLoading&&!t.isLoaded){if(t.isLoading=!0,!1===a.trigger("beforeLoad",t))return t.isLoading=!1,!1;switch(e=t.type,o=t.$slide,o.off("refresh").trigger("onReset").addClass(t.opts.slideClass),e){case"image":a.setImage(t);break;case"iframe":a.setIframe(t);break;case"html":a.setContent(t,t.src||t.content);break;case"video":a.setContent(t,t.opts.video.tpl.replace(/\{\{src\}\}/gi,t.src).replace("{{format}}",t.opts.videoFormat||t.opts.video.format||"").replace("{{poster}}",t.thumb||""));break;case"inline":n(t.src).length?a.setContent(t,n(t.src)):a.setError(t);break;case"ajax":a.showLoading(t),i=n.ajax(n.extend({},t.opts.ajax.settings,{url:t.src,success:function(e,n){"success"===n&&a.setContent(t,e)},error:function(e,n){e&&"abort"!==n&&a.setError(t)}})),o.one("onReset",function(){i.abort()});break;default:a.setError(t)}return!0}},setImage:function(t){var o,i=this;setTimeout(function(){var e=t.$image;i.isClosing||!t.isLoading||e&&e.length&&e[0].complete||t.hasError||i.showLoading(t)},50),i.checkSrcset(t),t.$content=n('
').addClass("fancybox-is-hidden").appendTo(t.$slide.addClass("fancybox-slide--image")),!1!==t.opts.preload&&t.opts.width&&t.opts.height&&t.thumb&&(t.width=t.opts.width,t.height=t.opts.height,o=e.createElement("img"),o.onerror=function(){n(this).remove(),t.$ghost=null},o.onload=function(){i.afterLoad(t)},t.$ghost=n(o).addClass("fancybox-image").appendTo(t.$content).attr("src",t.thumb)),i.setBigImage(t)},checkSrcset:function(e){var n,o,i,a,s=e.opts.srcset||e.opts.image.srcset;if(s){i=t.devicePixelRatio||1,a=t.innerWidth*i,o=s.split(",").map(function(t){var e={};return t.trim().split(/\s+/).forEach(function(t,n){var o=parseInt(t.substring(0,t.length-1),10);if(0===n)return e.url=t;o&&(e.value=o,e.postfix=t[t.length-1])}),e}),o.sort(function(t,e){return t.value-e.value});for(var r=0;r=a||"x"===c.postfix&&c.value>=i){n=c;break}}!n&&o.length&&(n=o[o.length-1]),n&&(e.src=n.url,e.width&&e.height&&"w"==n.postfix&&(e.height=e.width/e.height*n.value,e.width=n.value),e.opts.srcset=s)}},setBigImage:function(t){var o=this,i=e.createElement("img"),a=n(i);t.$image=a.one("error",function(){o.setError(t)}).one("load",function(){var e;t.$ghost||(o.resolveImageSlideSize(t,this.naturalWidth,this.naturalHeight),o.afterLoad(t)),o.isClosing||(t.opts.srcset&&(e=t.opts.sizes,e&&"auto"!==e||(e=(t.width/t.height>1&&s.width()/s.height()>1?"100":Math.round(t.width/t.height*100))+"vw"),a.attr("sizes",e).attr("srcset",t.opts.srcset)),t.$ghost&&setTimeout(function(){t.$ghost&&!o.isClosing&&t.$ghost.hide()},Math.min(300,Math.max(1e3,t.height/1600))),o.hideLoading(t))}).addClass("fancybox-image").attr("src",t.src).appendTo(t.$content),(i.complete||"complete"==i.readyState)&&a.naturalWidth&&a.naturalHeight?a.trigger("load"):i.error&&a.trigger("error")},resolveImageSlideSize:function(t,e,n){var o=parseInt(t.opts.width,10),i=parseInt(t.opts.height,10);t.width=e,t.height=n,o>0&&(t.width=o,t.height=Math.floor(o*n/e)),i>0&&(t.width=Math.floor(i*e/n),t.height=i)},setIframe:function(t){var e,o=this,i=t.opts.iframe,a=t.$slide;t.$content=n('
').css(i.css).appendTo(a),a.addClass("fancybox-slide--"+t.contentType),t.$iframe=e=n(i.tpl.replace(/\{rnd\}/g,(new Date).getTime())).attr(i.attr).appendTo(t.$content),i.preload?(o.showLoading(t),e.on("load.fb error.fb",function(e){this.isReady=1,t.$slide.trigger("refresh"),o.afterLoad(t)}),a.on("refresh.fb",function(){var n,o,s=t.$content,r=i.css.width,c=i.css.height;if(1===e[0].isReady){try{n=e.contents(),o=n.find("body")}catch(t){}o&&o.length&&o.children().length&&(a.css("overflow","visible"),s.css({width:"100%","max-width":"100%",height:"9999px"}),void 0===r&&(r=Math.ceil(Math.max(o[0].clientWidth,o.outerWidth(!0)))),s.css("width",r||"").css("max-width",""),void 0===c&&(c=Math.ceil(Math.max(o[0].clientHeight,o.outerHeight(!0)))),s.css("height",c||""),a.css("overflow","auto")),s.removeClass("fancybox-is-hidden")}})):o.afterLoad(t),e.attr("src",t.src),a.one("onReset",function(){try{n(this).find("iframe").hide().unbind().attr("src","//about:blank")}catch(t){}n(this).off("refresh.fb").empty(),t.isLoaded=!1,t.isRevealed=!1})},setContent:function(t,e){var o=this;o.isClosing||(o.hideLoading(t),t.$content&&n.fancybox.stop(t.$content),t.$slide.empty(),l(e)&&e.parent().length?((e.hasClass("fancybox-content")||e.parent().hasClass("fancybox-content"))&&e.parents(".fancybox-slide").trigger("onReset"),t.$placeholder=n("
").hide().insertAfter(e),e.css("display","inline-block")):t.hasError||("string"===n.type(e)&&(e=n("
").append(n.trim(e)).contents()),t.opts.filter&&(e=n("
").html(e).find(t.opts.filter))),t.$slide.one("onReset",function(){n(this).find("video,audio").trigger("pause"),t.$placeholder&&(t.$placeholder.after(e.removeClass("fancybox-content").hide()).remove(),t.$placeholder=null),t.$smallBtn&&(t.$smallBtn.remove(),t.$smallBtn=null),t.hasError||(n(this).empty(),t.isLoaded=!1,t.isRevealed=!1)}),n(e).appendTo(t.$slide),n(e).is("video,audio")&&(n(e).addClass("fancybox-video"),n(e).wrap("
"),t.contentType="video",t.opts.width=t.opts.width||n(e).attr("width"),t.opts.height=t.opts.height||n(e).attr("height")),t.$content=t.$slide.children().filter("div,form,main,video,audio,article,.fancybox-content").first(),t.$content.siblings().hide(),t.$content.length||(t.$content=t.$slide.wrapInner("
").children().first()),t.$content.addClass("fancybox-content"),t.$slide.addClass("fancybox-slide--"+t.contentType),o.afterLoad(t))},setError:function(t){t.hasError=!0,t.$slide.trigger("onReset").removeClass("fancybox-slide--"+t.contentType).addClass("fancybox-slide--error"),t.contentType="html",this.setContent(t,this.translate(t,t.opts.errorTpl)),t.pos===this.currPos&&(this.isAnimating=!1)},showLoading:function(t){var e=this;(t=t||e.current)&&!t.$spinner&&(t.$spinner=n(e.translate(e,e.opts.spinnerTpl)).appendTo(t.$slide).hide().fadeIn("fast"))},hideLoading:function(t){var e=this;(t=t||e.current)&&t.$spinner&&(t.$spinner.stop().remove(),delete t.$spinner)},afterLoad:function(t){var e=this;e.isClosing||(t.isLoading=!1,t.isLoaded=!0,e.trigger("afterLoad",t),e.hideLoading(t),!t.opts.smallBtn||t.$smallBtn&&t.$smallBtn.length||(t.$smallBtn=n(e.translate(t,t.opts.btnTpl.smallBtn)).appendTo(t.$content)),t.opts.protect&&t.$content&&!t.hasError&&(t.$content.on("contextmenu.fb",function(t){return 2==t.button&&t.preventDefault(),!0}),"image"===t.type&&n('
').appendTo(t.$content)),e.adjustCaption(t),e.adjustLayout(t),t.pos===e.currPos&&e.updateCursor(),e.revealContent(t))},adjustCaption:function(t){var e,n=this,o=t||n.current,i=o.opts.caption,a=o.opts.preventCaptionOverlap,s=n.$refs.caption,r=!1;s.toggleClass("fancybox-caption--separate",a),a&&i&&i.length&&(o.pos!==n.currPos?(e=s.clone().appendTo(s.parent()),e.children().eq(0).empty().html(i),r=e.outerHeight(!0),e.empty().remove()):n.$caption&&(r=n.$caption.outerHeight(!0)),o.$slide.css("padding-bottom",r||""))},adjustLayout:function(t){var e,n,o,i,a=this,s=t||a.current;s.isLoaded&&!0!==s.opts.disableLayoutFix&&(s.$content.css("margin-bottom",""),s.$content.outerHeight()>s.$slide.height()+.5&&(o=s.$slide[0].style["padding-bottom"],i=s.$slide.css("padding-bottom"),parseFloat(i)>0&&(e=s.$slide[0].scrollHeight,s.$slide.css("padding-bottom",0),Math.abs(e-s.$slide[0].scrollHeight)<1&&(n=i),s.$slide.css("padding-bottom",o))),s.$content.css("margin-bottom",n))},revealContent:function(t){var e,o,i,a,s=this,r=t.$slide,c=!1,l=!1,d=s.isMoved(t),u=t.isRevealed;return t.isRevealed=!0,e=t.opts[s.firstRun?"animationEffect":"transitionEffect"],i=t.opts[s.firstRun?"animationDuration":"transitionDuration"],i=parseInt(void 0===t.forcedDuration?i:t.forcedDuration,10),!d&&t.pos===s.currPos&&i||(e=!1),"zoom"===e&&(t.pos===s.currPos&&i&&"image"===t.type&&!t.hasError&&(l=s.getThumbPos(t))?c=s.getFitPos(t):e="fade"),"zoom"===e?(s.isAnimating=!0,c.scaleX=c.width/l.width,c.scaleY=c.height/l.height,a=t.opts.zoomOpacity,"auto"==a&&(a=Math.abs(t.width/t.height-l.width/l.height)>.1),a&&(l.opacity=.1,c.opacity=1),n.fancybox.setTranslate(t.$content.removeClass("fancybox-is-hidden"),l),p(t.$content),void n.fancybox.animate(t.$content,c,i,function(){s.isAnimating=!1,s.complete()})):(s.updateSlide(t),e?(n.fancybox.stop(r),o="fancybox-slide--"+(t.pos>=s.prevPos?"next":"previous")+" fancybox-animated fancybox-fx-"+e,r.addClass(o).removeClass("fancybox-slide--current"),t.$content.removeClass("fancybox-is-hidden"),p(r),"image"!==t.type&&t.$content.hide().show(0),void n.fancybox.animate(r,"fancybox-slide--current",i,function(){r.removeClass(o).css({transform:"",opacity:""}),t.pos===s.currPos&&s.complete()},!0)):(t.$content.removeClass("fancybox-is-hidden"),u||!d||"image"!==t.type||t.hasError||t.$content.hide().fadeIn("fast"),void(t.pos===s.currPos&&s.complete())))},getThumbPos:function(t){var e,o,i,a,s,r=!1,c=t.$thumb;return!(!c||!g(c[0]))&&(e=n.fancybox.getTranslate(c),o=parseFloat(c.css("border-top-width")||0),i=parseFloat(c.css("border-right-width")||0),a=parseFloat(c.css("border-bottom-width")||0),s=parseFloat(c.css("border-left-width")||0),r={top:e.top+o,left:e.left+s,width:e.width-i-s,height:e.height-o-a,scaleX:1,scaleY:1},e.width>0&&e.height>0&&r)},complete:function(){var t,e=this,o=e.current,i={};!e.isMoved()&&o.isLoaded&&(o.isComplete||(o.isComplete=!0,o.$slide.siblings().trigger("onReset"),e.preload("inline"),p(o.$slide),o.$slide.addClass("fancybox-slide--complete"),n.each(e.slides,function(t,o){o.pos>=e.currPos-1&&o.pos<=e.currPos+1?i[o.pos]=o:o&&(n.fancybox.stop(o.$slide),o.$slide.off().remove())}),e.slides=i),e.isAnimating=!1,e.updateCursor(),e.trigger("afterShow"),o.opts.video.autoStart&&o.$slide.find("video,audio").filter(":visible:first").trigger("play").one("ended",function(){Document.exitFullscreen?Document.exitFullscreen():this.webkitExitFullscreen&&this.webkitExitFullscreen(),e.next()}),o.opts.autoFocus&&"html"===o.contentType&&(t=o.$content.find("input[autofocus]:enabled:visible:first"),t.length?t.trigger("focus"):e.focus(null,!0)),o.$slide.scrollTop(0).scrollLeft(0))},preload:function(t){var e,n,o=this;o.group.length<2||(n=o.slides[o.currPos+1],e=o.slides[o.currPos-1],e&&e.type===t&&o.loadSlide(e),n&&n.type===t&&o.loadSlide(n))},focus:function(t,o){var i,a,s=this,r=["a[href]","area[href]",'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',"select:not([disabled]):not([aria-hidden])","textarea:not([disabled]):not([aria-hidden])","button:not([disabled]):not([aria-hidden])","iframe","object","embed","video","audio","[contenteditable]",'[tabindex]:not([tabindex^="-"])'].join(",");s.isClosing||(i=!t&&s.current&&s.current.isComplete?s.current.$slide.find("*:visible"+(o?":not(.fancybox-close-small)":"")):s.$refs.container.find("*:visible"),i=i.filter(r).filter(function(){return"hidden"!==n(this).css("visibility")&&!n(this).hasClass("disabled")}),i.length?(a=i.index(e.activeElement),t&&t.shiftKey?(a<0||0==a)&&(t.preventDefault(),i.eq(i.length-1).trigger("focus")):(a<0||a==i.length-1)&&(t&&t.preventDefault(),i.eq(0).trigger("focus"))):s.$refs.container.trigger("focus"))},activate:function(){var t=this;n(".fancybox-container").each(function(){var e=n(this).data("FancyBox");e&&e.id!==t.id&&!e.isClosing&&(e.trigger("onDeactivate"),e.removeEvents(),e.isVisible=!1)}),t.isVisible=!0,(t.current||t.isIdle)&&(t.update(),t.updateControls()),t.trigger("onActivate"),t.addEvents()},close:function(t,e){var o,i,a,s,r,c,l,u=this,f=u.current,h=function(){u.cleanUp(t)};return!u.isClosing&&(u.isClosing=!0,!1===u.trigger("beforeClose",t)?(u.isClosing=!1,d(function(){u.update()}),!1):(u.removeEvents(),a=f.$content,o=f.opts.animationEffect,i=n.isNumeric(e)?e:o?f.opts.animationDuration:0,f.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"),!0!==t?n.fancybox.stop(f.$slide):o=!1,f.$slide.siblings().trigger("onReset").remove(),i&&u.$refs.container.removeClass("fancybox-is-open").addClass("fancybox-is-closing").css("transition-duration",i+"ms"),u.hideLoading(f),u.hideControls(!0),u.updateCursor(),"zoom"!==o||a&&i&&"image"===f.type&&!u.isMoved()&&!f.hasError&&(l=u.getThumbPos(f))||(o="fade"),"zoom"===o?(n.fancybox.stop(a),s=n.fancybox.getTranslate(a),c={top:s.top,left:s.left,scaleX:s.width/l.width,scaleY:s.height/l.height,width:l.width,height:l.height},r=f.opts.zoomOpacity, -"auto"==r&&(r=Math.abs(f.width/f.height-l.width/l.height)>.1),r&&(l.opacity=0),n.fancybox.setTranslate(a,c),p(a),n.fancybox.animate(a,l,i,h),!0):(o&&i?n.fancybox.animate(f.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"),"fancybox-animated fancybox-fx-"+o,i,h):!0===t?setTimeout(h,i):h(),!0)))},cleanUp:function(e){var o,i,a,s=this,r=s.current.opts.$orig;s.current.$slide.trigger("onReset"),s.$refs.container.empty().remove(),s.trigger("afterClose",e),s.current.opts.backFocus&&(r&&r.length&&r.is(":visible")||(r=s.$trigger),r&&r.length&&(i=t.scrollX,a=t.scrollY,r.trigger("focus"),n("html, body").scrollTop(a).scrollLeft(i))),s.current=null,o=n.fancybox.getInstance(),o?o.activate():(n("body").removeClass("fancybox-active compensate-for-scrollbar"),n("#fancybox-style-noscroll").remove())},trigger:function(t,e){var o,i=Array.prototype.slice.call(arguments,1),a=this,s=e&&e.opts?e:a.current;if(s?i.unshift(s):s=a,i.unshift(a),n.isFunction(s.opts[t])&&(o=s.opts[t].apply(s,i)),!1===o)return o;"afterClose"!==t&&a.$refs?a.$refs.container.trigger(t+".fb",i):r.trigger(t+".fb",i)},updateControls:function(){var t=this,o=t.current,i=o.index,a=t.$refs.container,s=t.$refs.caption,r=o.opts.caption;o.$slide.trigger("refresh"),r&&r.length?(t.$caption=s,s.children().eq(0).html(r)):t.$caption=null,t.hasHiddenControls||t.isIdle||t.showControls(),a.find("[data-fancybox-count]").html(t.group.length),a.find("[data-fancybox-index]").html(i+1),a.find("[data-fancybox-prev]").prop("disabled",!o.opts.loop&&i<=0),a.find("[data-fancybox-next]").prop("disabled",!o.opts.loop&&i>=t.group.length-1),"image"===o.type?a.find("[data-fancybox-zoom]").show().end().find("[data-fancybox-download]").attr("href",o.opts.image.src||o.src).show():o.opts.toolbar&&a.find("[data-fancybox-download],[data-fancybox-zoom]").hide(),n(e.activeElement).is(":hidden,[disabled]")&&t.$refs.container.trigger("focus")},hideControls:function(t){var e=this,n=["infobar","toolbar","nav"];!t&&e.current.opts.preventCaptionOverlap||n.push("caption"),this.$refs.container.removeClass(n.map(function(t){return"fancybox-show-"+t}).join(" ")),this.hasHiddenControls=!0},showControls:function(){var t=this,e=t.current?t.current.opts:t.opts,n=t.$refs.container;t.hasHiddenControls=!1,t.idleSecondsCounter=0,n.toggleClass("fancybox-show-toolbar",!(!e.toolbar||!e.buttons)).toggleClass("fancybox-show-infobar",!!(e.infobar&&t.group.length>1)).toggleClass("fancybox-show-caption",!!t.$caption).toggleClass("fancybox-show-nav",!!(e.arrows&&t.group.length>1)).toggleClass("fancybox-is-modal",!!e.modal)},toggleControls:function(){this.hasHiddenControls?this.showControls():this.hideControls()}}),n.fancybox={version:"3.5.7",defaults:a,getInstance:function(t){var e=n('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"),o=Array.prototype.slice.call(arguments,1);return e instanceof b&&("string"===n.type(t)?e[t].apply(e,o):"function"===n.type(t)&&t.apply(e,o),e)},open:function(t,e,n){return new b(t,e,n)},close:function(t){var e=this.getInstance();e&&(e.close(),!0===t&&this.close(t))},destroy:function(){this.close(!0),r.add("body").off("click.fb-start","**")},isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),use3d:function(){var n=e.createElement("div");return t.getComputedStyle&&t.getComputedStyle(n)&&t.getComputedStyle(n).getPropertyValue("transform")&&!(e.documentMode&&e.documentMode<11)}(),getTranslate:function(t){var e;return!(!t||!t.length)&&(e=t[0].getBoundingClientRect(),{top:e.top||0,left:e.left||0,width:e.width,height:e.height,opacity:parseFloat(t.css("opacity"))})},setTranslate:function(t,e){var n="",o={};if(t&&e)return void 0===e.left&&void 0===e.top||(n=(void 0===e.left?t.position().left:e.left)+"px, "+(void 0===e.top?t.position().top:e.top)+"px",n=this.use3d?"translate3d("+n+", 0px)":"translate("+n+")"),void 0!==e.scaleX&&void 0!==e.scaleY?n+=" scale("+e.scaleX+", "+e.scaleY+")":void 0!==e.scaleX&&(n+=" scaleX("+e.scaleX+")"),n.length&&(o.transform=n),void 0!==e.opacity&&(o.opacity=e.opacity),void 0!==e.width&&(o.width=e.width),void 0!==e.height&&(o.height=e.height),t.css(o)},animate:function(t,e,o,i,a){var s,r=this;n.isFunction(o)&&(i=o,o=null),r.stop(t),s=r.getTranslate(t),t.on(f,function(c){(!c||!c.originalEvent||t.is(c.originalEvent.target)&&"z-index"!=c.originalEvent.propertyName)&&(r.stop(t),n.isNumeric(o)&&t.css("transition-duration",""),n.isPlainObject(e)?void 0!==e.scaleX&&void 0!==e.scaleY&&r.setTranslate(t,{top:e.top,left:e.left,width:s.width*e.scaleX,height:s.height*e.scaleY,scaleX:1,scaleY:1}):!0!==a&&t.removeClass(e),n.isFunction(i)&&i(c))}),n.isNumeric(o)&&t.css("transition-duration",o+"ms"),n.isPlainObject(e)?(void 0!==e.scaleX&&void 0!==e.scaleY&&(delete e.width,delete e.height,t.parent().hasClass("fancybox-slide--image")&&t.parent().addClass("fancybox-is-scaling")),n.fancybox.setTranslate(t,e)):t.addClass(e),t.data("timer",setTimeout(function(){t.trigger(f)},o+33))},stop:function(t,e){t&&t.length&&(clearTimeout(t.data("timer")),e&&t.trigger(f),t.off(f).css("transition-duration",""),t.parent().removeClass("fancybox-is-scaling"))}},n.fn.fancybox=function(t){var e;return t=t||{},e=t.selector||!1,e?n("body").off("click.fb-start",e).on("click.fb-start",e,{options:t},i):this.off("click.fb-start").on("click.fb-start",{items:this,options:t},i),this},r.on("click.fb-start","[data-fancybox]",i),r.on("click.fb-start","[data-fancybox-trigger]",function(t){n('[data-fancybox="'+n(this).attr("data-fancybox-trigger")+'"]').eq(n(this).attr("data-fancybox-index")||0).trigger("click.fb-start",{$trigger:n(this)})}),function(){var t=null;r.on("mousedown mouseup focus blur",".fancybox-button",function(e){switch(e.type){case"mousedown":t=n(this);break;case"mouseup":t=null;break;case"focusin":n(".fancybox-button").removeClass("fancybox-focus"),n(this).is(t)||n(this).is("[disabled]")||n(this).addClass("fancybox-focus");break;case"focusout":n(".fancybox-button").removeClass("fancybox-focus")}})}()}}(window,document,jQuery),function(t){"use strict";var e={youtube:{matcher:/(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i,params:{autoplay:1,autohide:1,fs:1,rel:0,hd:1,wmode:"transparent",enablejsapi:1,html5:1},paramPlace:8,type:"iframe",url:"https://www.youtube-nocookie.com/embed/$4",thumb:"https://img.youtube.com/vi/$4/hqdefault.jpg"},vimeo:{matcher:/^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/,params:{autoplay:1,hd:1,show_title:1,show_byline:1,show_portrait:0,fullscreen:1},paramPlace:3,type:"iframe",url:"//player.vimeo.com/video/$2"},instagram:{matcher:/(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,type:"image",url:"//$1/p/$2/media/?size=l"},gmap_place:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/?ll="+(t[9]?t[9]+"&z="+Math.floor(t[10])+(t[12]?t[12].replace(/^\//,"&"):""):t[12]+"").replace(/\?/,"&")+"&output="+(t[12]&&t[12].indexOf("layer=c")>0?"svembed":"embed")}},gmap_search:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/maps?q="+t[5].replace("query=","q=").replace("api=1","")+"&output=embed"}}},n=function(e,n,o){if(e)return o=o||"","object"===t.type(o)&&(o=t.param(o,!0)),t.each(n,function(t,n){e=e.replace("$"+t,n||"")}),o.length&&(e+=(e.indexOf("?")>0?"&":"?")+o),e};t(document).on("objectNeedsType.fb",function(o,i,a){var s,r,c,l,d,u,f,p=a.src||"",h=!1;s=t.extend(!0,{},e,a.opts.media),t.each(s,function(e,o){if(c=p.match(o.matcher)){if(h=o.type,f=e,u={},o.paramPlace&&c[o.paramPlace]){d=c[o.paramPlace],"?"==d[0]&&(d=d.substring(1)),d=d.split("&");for(var i=0;i1&&("youtube"===n.contentSource||"vimeo"===n.contentSource)&&o.load(n.contentSource)}})}(jQuery),function(t,e,n){"use strict";var o=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),i=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),a=function(e){var n=[];e=e.originalEvent||e||t.e,e=e.touches&&e.touches.length?e.touches:e.changedTouches&&e.changedTouches.length?e.changedTouches:[e];for(var o in e)e[o].pageX?n.push({x:e[o].pageX,y:e[o].pageY}):e[o].clientX&&n.push({x:e[o].clientX,y:e[o].clientY});return n},s=function(t,e,n){return e&&t?"x"===n?t.x-e.x:"y"===n?t.y-e.y:Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)):0},r=function(t){if(t.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe')||n.isFunction(t.get(0).onclick)||t.data("selectable"))return!0;for(var e=0,o=t[0].attributes,i=o.length;ee.clientHeight,a=("scroll"===o||"auto"===o)&&e.scrollWidth>e.clientWidth;return i||a},l=function(t){for(var e=!1;;){if(e=c(t.get(0)))break;if(t=t.parent(),!t.length||t.hasClass("fancybox-stage")||t.is("body"))break}return e},d=function(t){var e=this;e.instance=t,e.$bg=t.$refs.bg,e.$stage=t.$refs.stage,e.$container=t.$refs.container,e.destroy(),e.$container.on("touchstart.fb.touch mousedown.fb.touch",n.proxy(e,"ontouchstart"))};d.prototype.destroy=function(){var t=this;t.$container.off(".fb.touch"),n(e).off(".fb.touch"),t.requestId&&(i(t.requestId),t.requestId=null),t.tapped&&(clearTimeout(t.tapped),t.tapped=null)},d.prototype.ontouchstart=function(o){var i=this,c=n(o.target),d=i.instance,u=d.current,f=u.$slide,p=u.$content,h="touchstart"==o.type;if(h&&i.$container.off("mousedown.fb.touch"),(!o.originalEvent||2!=o.originalEvent.button)&&f.length&&c.length&&!r(c)&&!r(c.parent())&&(c.is("img")||!(o.originalEvent.clientX>c[0].clientWidth+c.offset().left))){if(!u||d.isAnimating||u.$slide.hasClass("fancybox-animated"))return o.stopPropagation(),void o.preventDefault();i.realPoints=i.startPoints=a(o),i.startPoints.length&&(u.touch&&o.stopPropagation(),i.startEvent=o,i.canTap=!0,i.$target=c,i.$content=p,i.opts=u.opts.touch,i.isPanning=!1,i.isSwiping=!1,i.isZooming=!1,i.isScrolling=!1,i.canPan=d.canPan(),i.startTime=(new Date).getTime(),i.distanceX=i.distanceY=i.distance=0,i.canvasWidth=Math.round(f[0].clientWidth),i.canvasHeight=Math.round(f[0].clientHeight),i.contentLastPos=null,i.contentStartPos=n.fancybox.getTranslate(i.$content)||{top:0,left:0},i.sliderStartPos=n.fancybox.getTranslate(f),i.stagePos=n.fancybox.getTranslate(d.$refs.stage),i.sliderStartPos.top-=i.stagePos.top,i.sliderStartPos.left-=i.stagePos.left,i.contentStartPos.top-=i.stagePos.top,i.contentStartPos.left-=i.stagePos.left,n(e).off(".fb.touch").on(h?"touchend.fb.touch touchcancel.fb.touch":"mouseup.fb.touch mouseleave.fb.touch",n.proxy(i,"ontouchend")).on(h?"touchmove.fb.touch":"mousemove.fb.touch",n.proxy(i,"ontouchmove")),n.fancybox.isMobile&&e.addEventListener("scroll",i.onscroll,!0),((i.opts||i.canPan)&&(c.is(i.$stage)||i.$stage.find(c).length)||(c.is(".fancybox-image")&&o.preventDefault(),n.fancybox.isMobile&&c.parents(".fancybox-caption").length))&&(i.isScrollable=l(c)||l(c.parent()),n.fancybox.isMobile&&i.isScrollable||o.preventDefault(),(1===i.startPoints.length||u.hasError)&&(i.canPan?(n.fancybox.stop(i.$content),i.isPanning=!0):i.isSwiping=!0,i.$container.addClass("fancybox-is-grabbing")),2===i.startPoints.length&&"image"===u.type&&(u.isLoaded||u.$ghost)&&(i.canTap=!1,i.isSwiping=!1,i.isPanning=!1,i.isZooming=!0,n.fancybox.stop(i.$content),i.centerPointStartX=.5*(i.startPoints[0].x+i.startPoints[1].x)-n(t).scrollLeft(),i.centerPointStartY=.5*(i.startPoints[0].y+i.startPoints[1].y)-n(t).scrollTop(),i.percentageOfImageAtPinchPointX=(i.centerPointStartX-i.contentStartPos.left)/i.contentStartPos.width,i.percentageOfImageAtPinchPointY=(i.centerPointStartY-i.contentStartPos.top)/i.contentStartPos.height,i.startDistanceBetweenFingers=s(i.startPoints[0],i.startPoints[1]))))}},d.prototype.onscroll=function(t){var n=this;n.isScrolling=!0,e.removeEventListener("scroll",n.onscroll,!0)},d.prototype.ontouchmove=function(t){var e=this;return void 0!==t.originalEvent.buttons&&0===t.originalEvent.buttons?void e.ontouchend(t):e.isScrolling?void(e.canTap=!1):(e.newPoints=a(t),void((e.opts||e.canPan)&&e.newPoints.length&&e.newPoints.length&&(e.isSwiping&&!0===e.isSwiping||t.preventDefault(),e.distanceX=s(e.newPoints[0],e.startPoints[0],"x"),e.distanceY=s(e.newPoints[0],e.startPoints[0],"y"),e.distance=s(e.newPoints[0],e.startPoints[0]),e.distance>0&&(e.isSwiping?e.onSwipe(t):e.isPanning?e.onPan():e.isZooming&&e.onZoom()))))},d.prototype.onSwipe=function(e){var a,s=this,r=s.instance,c=s.isSwiping,l=s.sliderStartPos.left||0;if(!0!==c)"x"==c&&(s.distanceX>0&&(s.instance.group.length<2||0===s.instance.current.index&&!s.instance.current.opts.loop)?l+=Math.pow(s.distanceX,.8):s.distanceX<0&&(s.instance.group.length<2||s.instance.current.index===s.instance.group.length-1&&!s.instance.current.opts.loop)?l-=Math.pow(-s.distanceX,.8):l+=s.distanceX),s.sliderLastPos={top:"x"==c?0:s.sliderStartPos.top+s.distanceY,left:l},s.requestId&&(i(s.requestId),s.requestId=null),s.requestId=o(function(){s.sliderLastPos&&(n.each(s.instance.slides,function(t,e){var o=e.pos-s.instance.currPos;n.fancybox.setTranslate(e.$slide,{top:s.sliderLastPos.top,left:s.sliderLastPos.left+o*s.canvasWidth+o*e.opts.gutter})}),s.$container.addClass("fancybox-is-sliding"))});else if(Math.abs(s.distance)>10){if(s.canTap=!1,r.group.length<2&&s.opts.vertical?s.isSwiping="y":r.isDragging||!1===s.opts.vertical||"auto"===s.opts.vertical&&n(t).width()>800?s.isSwiping="x":(a=Math.abs(180*Math.atan2(s.distanceY,s.distanceX)/Math.PI),s.isSwiping=a>45&&a<135?"y":"x"),"y"===s.isSwiping&&n.fancybox.isMobile&&s.isScrollable)return void(s.isScrolling=!0);r.isDragging=s.isSwiping,s.startPoints=s.newPoints,n.each(r.slides,function(t,e){var o,i;n.fancybox.stop(e.$slide),o=n.fancybox.getTranslate(e.$slide),i=n.fancybox.getTranslate(r.$refs.stage),e.$slide.css({transform:"",opacity:"","transition-duration":""}).removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")}),e.pos===r.current.pos&&(s.sliderStartPos.top=o.top-i.top,s.sliderStartPos.left=o.left-i.left),n.fancybox.setTranslate(e.$slide,{top:o.top-i.top,left:o.left-i.left})}),r.SlideShow&&r.SlideShow.isActive&&r.SlideShow.stop()}},d.prototype.onPan=function(){var t=this;if(s(t.newPoints[0],t.realPoints[0])<(n.fancybox.isMobile?10:5))return void(t.startPoints=t.newPoints);t.canTap=!1,t.contentLastPos=t.limitMovement(),t.requestId&&i(t.requestId),t.requestId=o(function(){n.fancybox.setTranslate(t.$content,t.contentLastPos)})},d.prototype.limitMovement=function(){var t,e,n,o,i,a,s=this,r=s.canvasWidth,c=s.canvasHeight,l=s.distanceX,d=s.distanceY,u=s.contentStartPos,f=u.left,p=u.top,h=u.width,g=u.height;return i=h>r?f+l:f,a=p+d,t=Math.max(0,.5*r-.5*h),e=Math.max(0,.5*c-.5*g),n=Math.min(r-h,.5*r-.5*h),o=Math.min(c-g,.5*c-.5*g),l>0&&i>t&&(i=t-1+Math.pow(-t+f+l,.8)||0),l<0&&i0&&a>e&&(a=e-1+Math.pow(-e+p+d,.8)||0),d<0&&aa?(t=t>0?0:t,t=ts?(e=e>0?0:e,e=e1&&(o.dMs>130&&s>10||s>50);o.sliderLastPos=null,"y"==t&&!e&&Math.abs(o.distanceY)>50?(n.fancybox.animate(o.instance.current.$slide,{top:o.sliderStartPos.top+o.distanceY+150*o.velocityY,opacity:0},200),i=o.instance.close(!0,250)):r&&o.distanceX>0?i=o.instance.previous(300):r&&o.distanceX<0&&(i=o.instance.next(300)),!1!==i||"x"!=t&&"y"!=t||o.instance.centerSlide(200),o.$container.removeClass("fancybox-is-sliding")},d.prototype.endPanning=function(){var t,e,o,i=this;i.contentLastPos&&(!1===i.opts.momentum||i.dMs>350?(t=i.contentLastPos.left,e=i.contentLastPos.top):(t=i.contentLastPos.left+500*i.velocityX,e=i.contentLastPos.top+500*i.velocityY),o=i.limitPosition(t,e,i.contentStartPos.width,i.contentStartPos.height),o.width=i.contentStartPos.width,o.height=i.contentStartPos.height,n.fancybox.animate(i.$content,o,366))},d.prototype.endZooming=function(){var t,e,o,i,a=this,s=a.instance.current,r=a.newWidth,c=a.newHeight;a.contentLastPos&&(t=a.contentLastPos.left,e=a.contentLastPos.top,i={top:e,left:t,width:r,height:c,scaleX:1,scaleY:1},n.fancybox.setTranslate(a.$content,i),rs.width||c>s.height?a.instance.scaleToActual(a.centerPointStartX,a.centerPointStartY,150):(o=a.limitPosition(t,e,r,c),n.fancybox.animate(a.$content,o,150)))},d.prototype.onTap=function(e){var o,i=this,s=n(e.target),r=i.instance,c=r.current,l=e&&a(e)||i.startPoints,d=l[0]?l[0].x-n(t).scrollLeft()-i.stagePos.left:0,u=l[0]?l[0].y-n(t).scrollTop()-i.stagePos.top:0,f=function(t){var o=c.opts[t];if(n.isFunction(o)&&(o=o.apply(r,[c,e])),o)switch(o){case"close":r.close(i.startEvent);break;case"toggleControls":r.toggleControls();break;case"next":r.next();break;case"nextOrClose":r.group.length>1?r.next():r.close(i.startEvent);break;case"zoom":"image"==c.type&&(c.isLoaded||c.$ghost)&&(r.canPan()?r.scaleToFit():r.isScaledDown()?r.scaleToActual(d,u):r.group.length<2&&r.close(i.startEvent))}};if((!e.originalEvent||2!=e.originalEvent.button)&&(s.is("img")||!(d>s[0].clientWidth+s.offset().left))){if(s.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container"))o="Outside";else if(s.is(".fancybox-slide"))o="Slide";else{if(!r.current.$content||!r.current.$content.find(s).addBack().filter(s).length)return;o="Content"}if(i.tapped){if(clearTimeout(i.tapped),i.tapped=null,Math.abs(d-i.tapX)>50||Math.abs(u-i.tapY)>50)return this;f("dblclick"+o)}else i.tapX=d,i.tapY=u,c.opts["dblclick"+o]&&c.opts["dblclick"+o]!==c.opts["click"+o]?i.tapped=setTimeout(function(){i.tapped=null,r.isAnimating||f("click"+o)},500):f("click"+o);return this}},n(e).on("onActivate.fb",function(t,e){e&&!e.Guestures&&(e.Guestures=new d(e))}).on("beforeClose.fb",function(t,e){e&&e.Guestures&&e.Guestures.destroy()})}(window,document,jQuery),function(t,e){"use strict";e.extend(!0,e.fancybox.defaults,{btnTpl:{slideShow:''},slideShow:{autoStart:!1,speed:3e3,progress:!0}});var n=function(t){this.instance=t,this.init()};e.extend(n.prototype,{timer:null,isActive:!1,$button:null,init:function(){var t=this,n=t.instance,o=n.group[n.currIndex].opts.slideShow;t.$button=n.$refs.toolbar.find("[data-fancybox-play]").on("click",function(){t.toggle()}),n.group.length<2||!o?t.$button.hide():o.progress&&(t.$progress=e('
').appendTo(n.$refs.inner))},set:function(t){var n=this,o=n.instance,i=o.current;i&&(!0===t||i.opts.loop||o.currIndex'},fullScreen:{autoStart:!1}}),e(t).on(n.fullscreenchange,function(){var t=o.isFullscreen(),n=e.fancybox.getInstance();n&&(n.current&&"image"===n.current.type&&n.isAnimating&&(n.isAnimating=!1,n.update(!0,!0,0),n.isComplete||n.complete()),n.trigger("onFullscreenChange",t),n.$refs.container.toggleClass("fancybox-is-fullscreen",t),n.$refs.toolbar.find("[data-fancybox-fullscreen]").toggleClass("fancybox-button--fsenter",!t).toggleClass("fancybox-button--fsexit",t))})}e(t).on({"onInit.fb":function(t,e){var i;if(!n)return void e.$refs.toolbar.find("[data-fancybox-fullscreen]").remove();e&&e.group[e.currIndex].opts.fullScreen?(i=e.$refs.container,i.on("click.fb-fullscreen","[data-fancybox-fullscreen]",function(t){t.stopPropagation(),t.preventDefault(),o.toggle()}),e.opts.fullScreen&&!0===e.opts.fullScreen.autoStart&&o.request(),e.FullScreen=o):e&&e.$refs.toolbar.find("[data-fancybox-fullscreen]").hide()},"afterKeydown.fb":function(t,e,n,o,i){e&&e.FullScreen&&70===i&&(o.preventDefault(),e.FullScreen.toggle())},"beforeClose.fb":function(t,e){e&&e.FullScreen&&e.$refs.container.hasClass("fancybox-is-fullscreen")&&o.exit()}})}(document,jQuery),function(t,e){"use strict";var n="fancybox-thumbs";e.fancybox.defaults=e.extend(!0,{btnTpl:{thumbs:''},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"}},e.fancybox.defaults);var o=function(t){this.init(t)};e.extend(o.prototype,{$button:null,$grid:null,$list:null,isVisible:!1,isActive:!1,init:function(t){var e=this,n=t.group,o=0;e.instance=t,e.opts=n[t.currIndex].opts.thumbs,t.Thumbs=e,e.$button=t.$refs.toolbar.find("[data-fancybox-thumbs]");for(var i=0,a=n.length;i1));i++);o>1&&e.opts?(e.$button.removeAttr("style").on("click",function(){e.toggle()}),e.isActive=!0):e.$button.hide()},create:function(){var t,o=this,i=o.instance,a=o.opts.parentEl,s=[];o.$grid||(o.$grid=e('
').appendTo(i.$refs.container.find(a).addBack().filter(a)),o.$grid.on("click","a",function(){i.jumpTo(e(this).attr("data-index"))})),o.$list||(o.$list=e('
').appendTo(o.$grid)),e.each(i.group,function(e,n){t=n.thumb,t||"image"!==n.type||(t=n.src),s.push('")}),o.$list[0].innerHTML=s.join(""),"x"===o.opts.axis&&o.$list.width(parseInt(o.$grid.css("padding-right"),10)+i.group.length*o.$list.children().eq(0).outerWidth(!0))},focus:function(t){var e,n,o=this,i=o.$list,a=o.$grid;o.instance.current&&(e=i.children().removeClass("fancybox-thumbs-active").filter('[data-index="'+o.instance.current.index+'"]').addClass("fancybox-thumbs-active"),n=e.position(),"y"===o.opts.axis&&(n.top<0||n.top>i.height()-e.outerHeight())?i.stop().animate({scrollTop:i.scrollTop()+n.top},t):"x"===o.opts.axis&&(n.lefta.scrollLeft()+(a.width()-e.outerWidth()))&&i.parent().stop().animate({scrollLeft:n.left},t))},update:function(){var t=this;t.instance.$refs.container.toggleClass("fancybox-show-thumbs",this.isVisible),t.isVisible?(t.$grid||t.create(),t.instance.trigger("onThumbsShow"),t.focus(0)):t.$grid&&t.instance.trigger("onThumbsHide"),t.instance.update()},hide:function(){this.isVisible=!1,this.update()},show:function(){this.isVisible=!0,this.update()},toggle:function(){this.isVisible=!this.isVisible,this.update()}}),e(t).on({"onInit.fb":function(t,e){var n;e&&!e.Thumbs&&(n=new o(e),n.isActive&&!0===n.opts.autoStart&&n.show())},"beforeShow.fb":function(t,e,n,o){var i=e&&e.Thumbs;i&&i.isVisible&&i.focus(o?0:250)},"afterKeydown.fb":function(t,e,n,o,i){var a=e&&e.Thumbs;a&&a.isActive&&71===i&&(o.preventDefault(),a.toggle())},"beforeClose.fb":function(t,e){var n=e&&e.Thumbs;n&&n.isVisible&&!1!==n.opts.hideOnClose&&n.$grid.hide()}})}(document,jQuery),function(t,e){"use strict";function n(t){var e={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(t).replace(/[&<>"'`=\/]/g,function(t){return e[t]})}e.extend(!0,e.fancybox.defaults,{btnTpl:{share:''},share:{url:function(t,e){return!t.currentHash&&"inline"!==e.type&&"html"!==e.type&&(e.origSrc||e.src)||window.location}, -tpl:''}}),e(t).on("click","[data-fancybox-share]",function(){var t,o,i=e.fancybox.getInstance(),a=i.current||null;a&&("function"===e.type(a.opts.share.url)&&(t=a.opts.share.url.apply(a,[i,a])),o=a.opts.share.tpl.replace(/\{\{media\}\}/g,"image"===a.type?encodeURIComponent(a.src):"").replace(/\{\{url\}\}/g,encodeURIComponent(t)).replace(/\{\{url_raw\}\}/g,n(t)).replace(/\{\{descr\}\}/g,i.$caption?encodeURIComponent(i.$caption.text()):""),e.fancybox.open({src:i.translate(i,o),type:"html",opts:{touch:!1,animationEffect:!1,afterLoad:function(t,e){i.$refs.container.one("beforeClose.fb",function(){t.close(null,0)}),e.$content.find(".fancybox-share__button").click(function(){return window.open(this.href,"Share","width=550, height=450"),!1})},mobile:{autoFocus:!1}}}))})}(document,jQuery),function(t,e,n){"use strict";function o(){var e=t.location.hash.substr(1),n=e.split("-"),o=n.length>1&&/^\+?\d+$/.test(n[n.length-1])?parseInt(n.pop(-1),10)||1:1,i=n.join("-");return{hash:e,index:o<1?1:o,gallery:i}}function i(t){""!==t.gallery&&n("[data-fancybox='"+n.escapeSelector(t.gallery)+"']").eq(t.index-1).focus().trigger("click.fb-start")}function a(t){var e,n;return!!t&&(e=t.current?t.current.opts:t.opts,""!==(n=e.hash||(e.$orig?e.$orig.data("fancybox")||e.$orig.data("fancybox-trigger"):""))&&n)}n.escapeSelector||(n.escapeSelector=function(t){return(t+"").replace(/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t})}),n(function(){!1!==n.fancybox.defaults.hash&&(n(e).on({"onInit.fb":function(t,e){var n,i;!1!==e.group[e.currIndex].opts.hash&&(n=o(),(i=a(e))&&n.gallery&&i==n.gallery&&(e.currIndex=n.index-1))},"beforeShow.fb":function(n,o,i,s){var r;i&&!1!==i.opts.hash&&(r=a(o))&&(o.currentHash=r+(o.group.length>1?"-"+(i.index+1):""),t.location.hash!=="#"+o.currentHash&&(s&&!o.origHash&&(o.origHash=t.location.hash),o.hashTimer&&clearTimeout(o.hashTimer),o.hashTimer=setTimeout(function(){"replaceState"in t.history?(t.history[s?"pushState":"replaceState"]({},e.title,t.location.pathname+t.location.search+"#"+o.currentHash),s&&(o.hasCreatedHistory=!0)):t.location.hash=o.currentHash,o.hashTimer=null},300)))},"beforeClose.fb":function(n,o,i){i&&!1!==i.opts.hash&&(clearTimeout(o.hashTimer),o.currentHash&&o.hasCreatedHistory?t.history.back():o.currentHash&&("replaceState"in t.history?t.history.replaceState({},e.title,t.location.pathname+t.location.search+(o.origHash||"")):t.location.hash=o.origHash),o.currentHash=null)}}),n(t).on("hashchange.fb",function(){var t=o(),e=null;n.each(n(".fancybox-container").get().reverse(),function(t,o){var i=n(o).data("FancyBox");if(i&&i.currentHash)return e=i,!1}),e?e.currentHash===t.gallery+"-"+t.index||1===t.index&&e.currentHash==t.gallery||(e.currentHash=null,e.close()):""!==t.gallery&&i(t)}),setTimeout(function(){n.fancybox.getInstance()||i(o())},50))})}(window,document,jQuery),function(t,e){"use strict";var n=(new Date).getTime();e(t).on({"onInit.fb":function(t,e,o){e.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll",function(t){var o=e.current,i=(new Date).getTime();e.group.length<2||!1===o.opts.wheel||"auto"===o.opts.wheel&&"image"!==o.type||(t.preventDefault(),t.stopPropagation(),o.$slide.hasClass("fancybox-animated")||(t=t.originalEvent||t,i-n<250||(n=i,e[(-t.deltaY||-t.deltaX||t.wheelDelta||-t.detail)<0?"next":"previous"]())))})}})}(document,jQuery); \ No newline at end of file diff --git a/fancybox/createrelease b/fancybox/createrelease deleted file mode 100755 index d31f3a63..00000000 --- a/fancybox/createrelease +++ /dev/null @@ -1,15 +0,0 @@ -MODULE=fancybox - -cd .. - -# old releases not needed anymore -mkdir -p $MODULE/dist -rm $MODULE/dist/* - -# create release for actual version -zip -r9 $MODULE/dist/release.zip $MODULE/* -x $MODULE/dist/\* -x $MODULE/test/\* $MODULE/createrelease - -echo dist/release.zip created. - -cd $MODULE - diff --git a/fancybox/fancybox.php b/fancybox/fancybox.php deleted file mode 100644 index 73bbdab9..00000000 --- a/fancybox/fancybox.php +++ /dev/null @@ -1,61 +0,0 @@ - - * Status: Unsupported - */ - -use Friendica\App; -use Friendica\Core\Hook; -use Friendica\DI; - -function fancybox_install() -{ - Hook::register('head', __FILE__, 'fancybox_head'); - Hook::register('footer', __FILE__, 'fancybox_footer'); - Hook::register('prepare_body_final', __FILE__, 'fancybox_render'); -} - -function fancybox_head(string &$b) -{ - DI::page()->registerStylesheet(__DIR__ . '/asset/fancybox/jquery.fancybox.min.css'); -} - -function fancybox_footer(string &$str) -{ - DI::page()->registerFooterScript(__DIR__ . '/asset/fancybox/jquery.fancybox.min.js'); - DI::page()->registerFooterScript(__DIR__ . '/asset/fancybox/fancybox.config.js'); -} - -function fancybox_render(array &$b){ - $gallery = 'gallery-' . $b['item']['uri-id'] ?? random_int(1000000, 10000000); - - // performWithEscapedBlocks escapes block defined with 2nd par pattern that won't be processed. - // We don't want to touch images in class="type-link": - $b['html'] = \Friendica\Util\Strings::performWithEscapedBlocks( - $b['html'], - '##s', - function ($text) use ($gallery) { - // This processes images inlined in posts - // Frio / Vier hooks für lightbox are un-hooked in fancybox-config.js. So this works for them, too! - //if (!in_array(DI::app()->getCurrentTheme(),['vier','frio'])) - $text = preg_replace( - '#]*href="([^"]*)"[^>]*>(]*src="[^"]*"[^>]*>)#', - '$2', - $text); - - // Local content images attached: - $text = preg_replace_callback( - '#
.*?
#s', - function ($matches) use ($gallery) { - return str_replace('