<?php
/**
 * Stuporglue's Single-File PHP Gallery
 *
 * 
 * Copyright (C) 2014, Michael Moore <stuporglue@gmail.com>
 *
 * Licensed under the MIT license. 
 *
 * Quick Start: 
 * Place this file in the top-level directory where you want photo galleries to appear. 
 *
 * For more details see https://github.com/stuporglue/InstaGallery
 */


$path = __DIR__;      // The base directory for the photos, defaults to the current directory
$thumbnailSize = 300; // size in pixels
$bgcolor = '#d0d5ee'; // background color


///////////////////////////////////////////////////////////////////////////////////////////
/////   Be careful below here...
///////////////////////////////////////////////////////////////////////////////////////////

/**
 * Verify that the requested path is within the $path
 *
 * @param $path The path to check our request within
 * @return String -- The full path to the target directory
 */
function getTargetPath($path){
    // Find and validate the target path
    $targetdir = $path  . (isset($_REQUEST['d']) ? '/' . $_REQUEST['d'] : '');
    while(strpos($targetdir,'..') !== FALSE){
        die("No double dot paths");
        // Get rid of double dots and make sure that our path is a subdirectory of the $path directory
        // Can't use realpath because symlinks might make something a valid path 
        preg_replace('|/.*?/../|','');
    }

    $valid = strpos(realpath($targetdir),realpath($path)) !== FALSE && is_dir($targetdir);

    if(!$valid){
        header("HTTP/1.0 404 Not Found");
        print "Directory not found";
        exit();
    }

    return $targetdir;
}

/**
 * Make a string pretty for printing
 * @param $name The name to pretty print
 * @return A pretty name string
 */
function prettyName($name){
    $origName = $name;
    $name = basename($name);
    $name = preg_split('/([^\w-]|[_])/u',$name);
    $name = array_map('ucfirst',$name);
    $name = implode(' ',array_filter($name));
    if($name === ''){
        return $origName;
    }
    return $name;
}

/**
 * Get the Table of Contents for the navigation
 * @param $path The base path
 * @return An html string for the nav
 */
function getNav($path,$relpath){
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
    $dots = Array('.','..');
    $wrapup = Array();
    foreach($objects as $name => $object){
    if($object->isDir() && !in_array($object->getBaseName(),$dots)){
            $name = explode('/',str_replace($path . '/','',$name));
            $wraplink = &$wrapup;
            $part = array_shift($name);
            while(@is_array($wraplink[$part])){
                $wraplink = &$wraplink[$part];
                $part = array_shift($name);
            }
            if($part[0] != '.'){ // skip hidden files/directories
                $wraplink[$part] = Array();
            }
        }
    }

    $rel = array_filter(explode('/',$relpath));
    $pathparts = Array();
    $navparts[] = "<span><a href='?d=' class='home'>Home</a></span>";

    $builtPath = Array();
    foreach($rel as $curpart){
        uksort($wrapup,function($a,$b){ return strnatcmp(prettyName($a),prettyName($b)); });
        $html = "\n<select class='navchange'>\n";
        foreach($wrapup as $pathpart => $childparts){
            $html .= "<option value='" . implode('/',$builtPath) . (count($builtPath) > 0 ? '/' : '') . $pathpart . "'". ($pathpart == $curpart ? ' selected' : '')  .">" . prettyName($pathpart) . "</option>";
        }
        $wrapup = &$wrapup[$curpart];
        $builtPath[] = $curpart;
        $html .= "</select>\n";
        $navparts[] = $html;
    }

    if(count($wrapup) > 0){
        $html = "\n<select class='navchange'>\n";
        $html .= "<option value='" . implode('/',$builtPath) ."'>--</option>\n";
        uksort($wrapup,function($a,$b){ return strnatcmp(prettyName($a),prettyName($b)); });
        foreach($wrapup as $pathpart => $childparts){
            $html .= "<option value='" . implode('/',$builtPath) . (count($builtPath) > 0 ? '/' : '') . $pathpart . "'>" . prettyName($pathpart) . "</option>";
        }
        $html .= "</select>\n";
        $navparts[] = $html;
    }

    return "<form>" . implode(' :: ',$navparts) . "</form>";
}

/**
 * Get an array of all media in the target directory, with titles if available
 * @param $targetdir The directory to get media from
 *
 * Get titles for each photo. Titles are in a file named "titles.csv" in each directory. 
 * The first column is the file name, the second column is the title/caption to use
 *
 * Return an array where the key is the filename and the value is the title. If no
 * title is found the filename is used.
 */
function getMedia($targetdir){
    $media = Array();
    $html = "";
    $globby = "$targetdir/*.*";
    $files = glob($globby);
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    foreach($files as $filename){
        if(preg_match('/(.*)_thumb\.([A-Za-z0-9]{3})/',$filename)){
            continue;
        }

        $mime = finfo_file($finfo,$filename);

        if(strpos($mime,'image') === 0 || strpos($mime,'video') === 0){
			if ( strpos( $mime, 'x-canon-cr2' ) !== false ) {
				continue;
			}
            $media[] = $filename;
        }
    }

    $titles = Array();

    if(is_file($targetdir . '/titles.csv')){
        $fh = fopen($targetdir . '/titles.csv','r');
        while(!feof($fh)){
            $line = fgetcsv($fh);
            if(count($line) >= 2 && file_exists($line[0])){
                $titles[$line[0]] = $line[1];
            }
        }
        fclose($fh);
    }

    foreach($media as $filename){
        $filename = basename($filename);
        if(!isset($titles[$filename])){
            $titles[$filename] = $filename;
        }
    }

    return $titles;
}

/**
 * Get the list of files from the target directory and generate the appropriate html
 *
 * @param $targetdir The target directory to get media from
 * @param $relpath The relative link for images
 */
function getSlides($targetdir,$relpath,$thumbnailSize){
    $media = getMedia($targetdir);
    $html = '';

    $finfo = finfo_open(FILEINFO_MIME_TYPE);

    foreach($media as $filename => $title){
            $thumbname = $relpath . '/' . preg_replace('/(.*)\.([A-Za-z0-9]{3})/',"$1" . "_thumb." . "$2",$filename);
            if(!is_file($thumbname)){
                $thumbname = "?d=$relpath&amp;t=$filename";
            }
            $html .= "<div id='$filename' class='gallery thumbnailwrapouter'>";
            $html .= "<span class='thumbnailinner'>";
            $filepath = preg_replace('#/+#','/', ($relpath == '' ? '' : $relpath . '/') . $filename);

			$mime = finfo_file($finfo, $filepath);

			if(strpos($mime,'video') === 0){

				if ( filesize( $filepath ) > 5000000 ) {
					$preload_and_poster = 'poster="' . $thumbname . '" preload="none"';
				} else {
					$preload_and_poster = '';
				}
					
				
				$html .= '<video data-mime="' . $mime . '" width="' . ( $thumbnailSize * 0.9 ) . '" height="' . ( $thumbnailSize * 0.7 ). '" controls loop ' . $preload_and_poster . '>';
				$html .= '<source src="' . $filepath . '" type="' . $mime . '">';
				$html .= ' Your browser does not support the video tag.</video>';
			} else {
				$html .= "<a href='$filepath' title='".htmlentities($title)."' class='thumbnaillink' rel='album' >";
				$html .= "<img data-mime='$mime' src='$thumbname' class='thumbnail'/>";
				$html .= "</a>";
			}

            $html .= "</span>";
            $html .= "<div class='filename'>". $title ."</div></div>\n";
    }
    if(count($media) === 0){
        return "<div class='error'>No photos found. Try another directory.</div>";
    }
    return $html;

}

/**
 * Print and possibly save a thumbnail image
 */
function printThumbnail($targetdir,$thumbnailSize){
    $orig = $targetdir . '/' . $_GET['t'];
    $thumb = preg_replace('/(.*)\.([A-Za-z0-9]{3}.?)$/',"$1" . "_thumb." . "$2",$orig);

    if(is_file($thumb)){
		$finfo = finfo_open(FILEINFO_MIME_TYPE);
		$thumb_mime = finfo_file($finfo,$thumb);
		header('Content-Type: ' . $thumb_mime);
        readfile($thumb);
        exit();
    }

    if(!is_file($orig)){
        header("HTTP/1.0 404 Not Found");
        exit();
    }

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
	$mime = finfo_file($finfo,$orig);
	if(strpos($mime,'video') === 0){
		$playButton = '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';
		header('Content-Type: image/png');
		print base64_decode($playButton);
		exit();
	}

    // This is going to slow down the user experience...
    if (!extension_loaded('gd') || !function_exists('gd_info')) {
        readfile($orig);
        exit();
    }

    try {
        $image_info = getimagesize($orig);
        switch($image_info[2]){
        case IMAGETYPE_JPEG:
            header('Content-Type: image/jpeg');
            $img = imagecreatefromjpeg($orig);
            $outfunc = 'imagejpeg';
            break;
        case IMAGETYPE_GIF:
            header('Content-Type: image/gif');
            $img = imagecreatefromgif($orig);
            $outfunc = 'imagegif';
            break;
        case IMAGETYPE_PNG:
            header('Content-Type: image/png');
            $img = imagecreatefrompng($orig);
            $outfunc = 'imagepng';
            break;
        default:
			header('Content-Type: ' . $mime);
            readfile($orig);
            exit();
        }   

        $width = $image_info[0];
        $height = $image_info[1];

        if ($width > $height) {
            // The actual minimum dimension to match the CSS
            $resizeFactor = $thumbnailSize / 0.9;
            $newwidth = $resizeFactor;
            $newheight = floor($height / ($width / $resizeFactor));
        } else {
            // The actual minimum dimension to match the CSS
            $resizeFactor = $thumbnailSize / 0.70;
            $newheight = $resizeFactor;
            $newwidth = floor($width / ($height / $resizeFactor) );
        }   

        $tmpimg = imagecreatetruecolor( $newwidth, $newheight );
        imagecopyresampled($tmpimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height );
        if(function_exists('imagecrop')){
            $tmpimg = imagecrop($tmpimg,Array(
                'x' => $newwidth / 2 - ($thumbnailSize * 0.9) / 2,
                'y' => $newheight / 2 - ($thumbnailSize * 0.75) / 2,
                'width' => $thumbnailSize * 0.9,
                'height' => $thumbnailSize * 0.75 
            ));
        }
        $outfunc($tmpimg, $thumb);
        
        if(file_exists($thumb)){
			$finfo = finfo_open(FILEINFO_MIME_TYPE);
			$thumb_mime = finfo_file($finfo,$thumb);
			header('Content-Type: ' . $thumb_mime);
            readfile($thumb);
        }else{
            $outfunc($tmpimg);
        }   
    } catch (Exception $e){
        error_log($e);
		header('Content-Type: ' . $mime);
        readfile($orig);
    }
}

$targetdir = getTargetPath($path);
$relpath = trim(str_replace($path,'',$targetdir),'/');

/**
 * Include any addons
 */
$moreHtml = Array();
foreach(glob("instaGallery_*.inc") as $plugin){
    include($plugin);
}

/**
 * Print the thumbnail and exit
 */
if(isset($_GET['t'])){
    printThumbnail($targetdir,$thumbnailSize);    
    exit();
}

$nav = getNav($path,$relpath);
$slides = getSlides($targetdir,$relpath,$thumbnailSize);

//////////////////////
// HTML Page
$title = "Choose a Photo Collection";

if($relpath !== './'){
    $title = explode('/',trim($relpath,'/'));
    $title = array_map('prettyName',$title);
    $title = implode(' | ',$title);
}
?>
<!DOCTYPE HTML>
<html><head>
<meta charset='utf-8'>
<title><?=$title?></title>
<style type='text/css'>
html,body{margin:0;padding:0;background:<?=$bgcolor?> fixed;height:100%;color:#444;text-align:center}
#nav{position:absolute;background:rgba(255,255,255,0.8);padding:3px 10px;width:calc(100% - 20px);text-align:left}
#nav form{display:inline-block}
#slides{padding-top:25px;max-width:100%;border:2px beveled #000}
.error{margin:50px calc(25% - 25px/2);padding:25px;border:5px groove #ccc;background-color:rgba(255,255,255,0.6)}
.thumbnailwrapouter{display:inline-block;height:<?=$thumbnailSize?>px;width:<?=$thumbnailSize?>px;margin:10px;background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:6px 10px 13px -1px rgba(94,94,94,0.7);-moz-box-shadow:6px 10px 13px -1px rgba(94,94,94,0.7);box-shadow:6px 10px 13px -1px rgba(94,94,94,0.7)}
.thumbnailinner{display:inline-block;height:calc(<?=$thumbnailSize?>px * 0.75);width:calc(<?=$thumbnailSize?>px * 0.9);margin-top:15px;overflow:hidden}
img.thumbnail{width:100%}
.filename{margin:0 10px;font-family:'Open Sans',cursive;font-size:calc(<?=$thumbnailSize?>px * 0.06);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;display:inline-block;max-width:calc(100% - 30px)}
#ctrlbox{z-index:1000;position:absolute;top:0;right:50px;height:50px;width:120px;text-align:right;color:#fff;font:larger bold;cursor:pointer}
#ctrlbox i{padding:15px}
#footer{margin:30px}
#footer a{text-decoration:none;color:#555;font-weight:700}
select{padding:3px;margin:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:solid 1px #999;background:#fff;color:#000;outline:none;display:inline-block;cursor:pointer}
.home{text-decoration:none;color:#000}
.home:hover{text-decoration:underline}
/* Simplelightbox V2.10.2 - andrerinas.de - Nucom-Mod */
body.hidden-scroll{overflow:hidden}
.sl-overlay{position:fixed;left:0;right:0;top:0;bottom:0;background:rgba(0,0,0,1);display:none;z-index:1035}
.sl-wrapper{background:rgba(30,30,30,.9);z-index:1040;width:100%;height:100%;left:0;top:0;position:fixed}
.sl-wrapper *{box-sizing:border-box}
.sl-wrapper button{border:0 none;background:transparent;font-size:28px;padding:0;cursor:pointer}
.sl-wrapper button:hover{opacity:.7}
.sl-wrapper .sl-close{display:none;position:fixed;right:30px;top:30px;z-index:10060;margin-top:-14px;margin-right:-14px;height:44px;width:44px;line-height:44px;font-family:Arial,Baskerville,monospace;color:#000;font-size:3rem}
.sl-wrapper .sl-counter{display:none;position:fixed;top:30px;left:30px;z-index:1060;color:#000;font-size:1rem}
.sl-wrapper .sl-navigation{width:100%;display:none}
.sl-wrapper .sl-navigation button{position:fixed;top:50%;margin-top:-22px;height:44px;width:22px;line-height:44px;text-align:center;display:block;z-index:10060;font-family:Arial,Baskerville,monospace;}
.sl-wrapper .sl-navigation button,.sl-wrapper .sl-close,.sl-wrapper .sl-counter {color:rgba(255,255,255,.9)}
.sl-wrapper .sl-navigation button.sl-next{right:5px;font-size:2rem}
.sl-wrapper .sl-navigation button.sl-prev{left:5px;font-size:2rem}
@media (min-width: 35.5em) {
.sl-wrapper .sl-navigation button{width:44px}
.sl-wrapper .sl-navigation button.sl-next{right:10px;font-size:3rem}
.sl-wrapper .sl-navigation button.sl-prev{left:10px;font-size:3rem}
}
@media (min-width: 50em) {
.sl-wrapper .sl-navigation button{width:44px}
.sl-wrapper .sl-navigation button.sl-next{right:20px;font-size:3rem}
.sl-wrapper .sl-navigation button.sl-prev{left:20px;font-size:3rem}
}
.sl-wrapper.sl-dir-rtl .sl-navigation{direction:ltr}
.sl-wrapper .sl-image{position:fixed;-ms-touch-action:none;touch-action:none;z-index:10000}
.sl-wrapper .sl-image img{margin:0;padding:0;display:block;border:0 none;width:100%;height:auto}
@media (min-width: 35.5em) {
.sl-wrapper .sl-image img{border:0 none}
}
@media (min-width: 50em) {
.sl-wrapper .sl-image img{border:0 none}
}
.sl-wrapper .sl-image iframe{background:#000;border:0 none}
@media (min-width: 35.5em) {
.sl-wrapper .sl-image iframe{border:0 none}
}
@media (min-width: 50em) {
.sl-wrapper .sl-image iframe{border:0 none}
}
.sl-wrapper .sl-image .sl-caption{display:none;padding:10px;color:#fff;background:rgba(0,0,0.8);font-size:1rem;position:absolute;bottom:0;left:0;right:0}
.sl-wrapper .sl-image .sl-caption.pos-top{bottom:auto;top:0}
.sl-wrapper .sl-image .sl-caption.pos-outside{bottom:auto}
.sl-wrapper .sl-image .sl-download{display:none;position:absolute;bottom:5px;right:5px;color:#000;z-index:1060}
.sl-spinner{display:none;border:5px solid #333;border-radius:40px;height:40px;left:50%;margin:-20px 0 0 -20px;opacity:0;position:fixed;top:50%;width:40px;z-index:1007;-webkit-animation:pulsate 1s ease-out infinite;-moz-animation:pulsate 1s ease-out infinite;-ms-animation:pulsate 1s ease-out infinite;-o-animation:pulsate 1s ease-out infinite;animation:pulsate 1s ease-out infinite}
.sl-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}
.sl-transition{transition:-moz-transform ease 200ms;transition:-ms-transform ease 200ms;transition:-o-transform ease 200ms;transition:-webkit-transform ease 200ms;transition:transform ease 200ms}
@-webkit-keyframes pulsate {
0%{transform:scale(0.1);opacity:0}
50%{opacity:1}
100%{transform:scale(1.2);opacity:0}
}
@keyframes pulsate {
0%{transform:scale(0.1);opacity:0}
50%{opacity:1}
100%{transform:scale(1.2);opacity:0}
}
@-moz-keyframes pulsate {
0%{transform:scale(0.1);opacity:0}
50%{opacity:1}
100%{transform:scale(1.2);opacity:0}
}
@-o-keyframes pulsate {
0%{transform:scale(0.1);opacity:0}
50%{opacity:1}
100%{transform:scale(1.2);opacity:0}
}
@-ms-keyframes pulsate {
0%{transform:scale(0.1);opacity:0}
50%{opacity:1}
100%{transform:scale(1.2);opacity:0}
}
</style>
</head>
<body>
    <div id='nav'>
        <?=$nav?> 
    </div>
    <div id='slides'>
        <?=$slides?>
    </div>
    <div id='footer'>
        <a href='https://github.com/stuporglue/InstaGallery'>Gallery by InstaGallery</a>
    </div>
    <?php print implode("\n",$moreHtml); ?>
    <script>
        /* Simplelightbox V2.10.2 - andrerinas.de - Nucom-Mod */
		!function i(n,s,a){function r(e,t){if(!s[e]){if(!n[e]){var o="function"==typeof require&&require;if(!t&&o)return o(e,!0);if(l)return l(e,!0);throw(o=new Error("Cannot find module '"+e+"'")).code="MODULE_NOT_FOUND",o}o=s[e]={exports:{}},n[e][0].call(o.exports,function(t){return r(n[e][1][t]||t)},o,o.exports,i,n,s,a)}return s[e].exports}for(var l="function"==typeof require&&require,t=0;t<a.length;t++)r(a[t]);return r}({1:[function(t,e,o){!function(e){!function(){"use strict";function h(t){return(h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function m(t,e){var o="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!o){if(Array.isArray(t)||(o=function(t,e){if(t){if("string"==typeof t)return r(t,e);var o=Object.prototype.toString.call(t).slice(8,-1);return"Map"===(o="Object"===o&&t.constructor?t.constructor.name:o)||"Set"===o?Array.from(t):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?r(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){o&&(t=o);var i=0,e=function(){};return{s:e,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:e}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var n,s=!0,a=!1;return{s:function(){o=o.call(t)},n:function(){var t=o.next();return s=t.done,t},e:function(t){a=!0,n=t},f:function(){try{s||null==o.return||o.return()}finally{if(a)throw n}}}}function r(t,e){(null==e||e>t.length)&&(e=t.length);for(var o=0,i=new Array(e);o<e;o++)i[o]=t[o];return i}function i(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,o){return e in t?Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[e]=o,t}Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0;var t=function(){function n(t,e){var o,i=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),s(this,"defaultOptions",{sourceAttr:"href",overlay:!0,overlayOpacity:.7,spinner:!0,nav:!0,navText:["&lsaquo;","&rsaquo;"],captions:!0,captionDelay:0,captionSelector:"img",captionType:"attr",captionsData:"title",captionPosition:"bottom",captionClass:"",close:!0,closeText:"&times;",swipeClose:!0,showCounter:!0,fileExt:"png|jpg|jpeg|gif|webp",animationSlide:!0,animationSpeed:250,preloading:!0,enableKeyboard:!0,loop:!0,rel:!1,docClose:!0,swipeTolerance:50,className:"simple-lightbox",widthRatio:.8,heightRatio:.9,scaleImageToRatio:!1,disableRightClick:!1,disableScroll:!0,alertError:!0,alertErrorMessage:"Image not found, next image will be loaded",additionalHtml:!1,history:!0,throttleInterval:0,doubleTapZoom:2,maxZoom:10,htmlClass:"has-lightbox",rtl:!1,fixedClass:"sl-fixed",fadeSpeed:300,uniqueImages:!0,focus:!0,scrollZoom:!0,scrollZoomFactor:.5}),s(this,"transitionPrefix",void 0),s(this,"isPassiveEventsSupported",void 0),s(this,"transitionCapable",!1),s(this,"isTouchDevice","ontouchstart"in window),s(this,"isAppleDevice",/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)),s(this,"initialLocationHash",void 0),s(this,"pushStateSupport","pushState"in history),s(this,"isOpen",!1),s(this,"isAnimating",!1),s(this,"isClosing",!1),s(this,"isFadeIn",!1),s(this,"urlChangedOnce",!1),s(this,"hashReseted",!1),s(this,"historyHasChanges",!1),s(this,"historyUpdateTimeout",null),s(this,"currentImage",void 0),s(this,"eventNamespace","simplelightbox"),s(this,"domNodes",{}),s(this,"loadedImages",[]),s(this,"initialImageIndex",0),s(this,"currentImageIndex",0),s(this,"initialSelector",null),s(this,"globalScrollbarWidth",0),s(this,"controlCoordinates",{swipeDiff:0,swipeYDiff:0,swipeStart:0,swipeEnd:0,swipeYStart:0,swipeYEnd:0,mousedown:!1,imageLeft:0,zoomed:!1,containerHeight:0,containerWidth:0,containerOffsetX:0,containerOffsetY:0,imgHeight:0,imgWidth:0,capture:!1,initialOffsetX:0,initialOffsetY:0,initialPointerOffsetX:0,initialPointerOffsetY:0,initialPointerOffsetX2:0,initialPointerOffsetY2:0,initialScale:1,initialPinchDistance:0,pointerOffsetX:0,pointerOffsetY:0,pointerOffsetX2:0,pointerOffsetY2:0,targetOffsetX:0,targetOffsetY:0,targetScale:0,pinchOffsetX:0,pinchOffsetY:0,limitOffsetX:0,limitOffsetY:0,scaleDifference:0,targetPinchDistance:0,touchCount:0,doubleTapped:!1,touchmoveCount:0}),this.options=Object.assign(this.defaultOptions,e),this.isPassiveEventsSupported=this.checkPassiveEventsSupport(),"string"==typeof t?(this.initialSelector=t,this.elements=Array.from(document.querySelectorAll(t))):this.elements=void 0!==t.length&&0<t.length?Array.from(t):[t],this.relatedElements=[],this.transitionPrefix=this.calculateTransitionPrefix(),this.transitionCapable=!1!==this.transitionPrefix,this.initialLocationHash=this.hash,this.options.rel&&(this.elements=this.getRelated(this.options.rel)),this.options.uniqueImages&&(o=[],this.elements=Array.from(this.elements).filter(function(t){t=t.getAttribute(i.options.sourceAttr);return-1===o.indexOf(t)&&(o.push(t),!0)})),this.createDomNodes(),this.options.close&&this.domNodes.wrapper.appendChild(this.domNodes.closeButton),this.options.nav&&this.domNodes.wrapper.appendChild(this.domNodes.navigation),this.options.spinner&&this.domNodes.wrapper.appendChild(this.domNodes.spinner),this.addEventListener(this.elements,"click."+this.eventNamespace,function(t){if(i.isValidLink(t.currentTarget)){if(t.preventDefault(),i.isAnimating)return!1;i.initialImageIndex=i.elements.indexOf(t.currentTarget),i.openImage(t.currentTarget)}}),this.options.docClose&&this.addEventListener(this.domNodes.wrapper,["click."+this.eventNamespace,"touchstart."+this.eventNamespace],function(t){i.isOpen&&t.target===t.currentTarget&&i.close()}),this.options.disableRightClick&&this.addEventListener(document.body,"contextmenu."+this.eventNamespace,function(t){t.target.parentElement.classList.contains("sl-image")&&t.preventDefault()}),this.options.enableKeyboard&&this.addEventListener(document.body,"keyup."+this.eventNamespace,this.throttle(function(t){return i.controlCoordinates.swipeDiff=0,i.isAnimating&&"Escape"===t.key?(i.currentImage.setAttribute("src",""),i.isAnimating=!1,i.close()):void(i.isOpen&&(t.preventDefault(),"Escape"===t.key&&i.close(),!i.isAnimating&&-1<["ArrowLeft","ArrowRight"].indexOf(t.key)&&i.loadImage("ArrowRight"===t.key?1:-1)))},this.options.throttleInterval)),this.addEvents()}var t,e,o;return t=n,(e=[{key:"checkPassiveEventsSupport",value:function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("testPassive",null,e),window.removeEventListener("testPassive",null,e)}catch(t){}return t}},{key:"createDomNodes",value:function(){this.domNodes.overlay=document.createElement("div"),this.domNodes.overlay.classList.add("sl-overlay"),this.domNodes.overlay.dataset.opacityTarget=this.options.overlayOpacity,this.domNodes.closeButton=document.createElement("button"),this.domNodes.closeButton.classList.add("sl-close"),this.domNodes.closeButton.innerHTML=this.options.closeText,this.domNodes.spinner=document.createElement("div"),this.domNodes.spinner.classList.add("sl-spinner"),this.domNodes.spinner.innerHTML="<div></div>",this.domNodes.navigation=document.createElement("div"),this.domNodes.navigation.classList.add("sl-navigation"),this.domNodes.navigation.innerHTML='<button class="sl-prev">'.concat(this.options.navText[0],'</button><button class="sl-next">').concat(this.options.navText[1],"</button>"),this.domNodes.counter=document.createElement("div"),this.domNodes.counter.classList.add("sl-counter"),this.domNodes.counter.innerHTML='<span class="sl-current"></span>/<span class="sl-total"></span>',this.domNodes.caption=document.createElement("div"),this.domNodes.caption.classList.add("sl-caption","pos-"+this.options.captionPosition),this.options.captionClass&&this.domNodes.caption.classList.add(this.options.captionClass),this.domNodes.image=document.createElement("div"),this.domNodes.image.classList.add("sl-image"),this.domNodes.wrapper=document.createElement("div"),this.domNodes.wrapper.classList.add("sl-wrapper"),this.domNodes.wrapper.setAttribute("tabindex",-1),this.domNodes.wrapper.setAttribute("role","dialog"),this.domNodes.wrapper.setAttribute("aria-hidden",!1),this.options.className&&this.domNodes.wrapper.classList.add(this.options.className),this.options.rtl&&this.domNodes.wrapper.classList.add("sl-dir-rtl")}},{key:"throttle",value:function(t,e){var o;return function(){o||(t.apply(this,arguments),o=!0,setTimeout(function(){return o=!1},e))}}},{key:"isValidLink",value:function(t){return!this.options.fileExt||t.getAttribute(this.options.sourceAttr)&&new RegExp("("+this.options.fileExt+")$","i").test(t.getAttribute(this.options.sourceAttr))}},{key:"calculateTransitionPrefix",value:function(){var t=(document.body||document.documentElement).style;return"transition"in t?"":"WebkitTransition"in t?"-webkit-":"MozTransition"in t?"-moz-":"OTransition"in t&&"-o"}},{key:"toggleScrollbar",value:function(t){var e,i=0,o=[].slice.call(document.querySelectorAll("."+this.options.fixedClass));return"hide"===t?((t=window.innerWidth)||(t=(e=document.documentElement.getBoundingClientRect()).right-Math.abs(e.left)),(document.body.clientWidth<t||this.isAppleDevice)&&(e=document.createElement("div"),t=parseInt(document.body.style.paddingRight||0,10),e.classList.add("sl-scrollbar-measure"),document.body.appendChild(e),i=e.offsetWidth-e.clientWidth,document.body.removeChild(e),document.body.dataset.originalPaddingRight=t,(0<i||0==i&&this.isAppleDevice)&&(document.body.classList.add("hidden-scroll"),document.body.style.paddingRight=t+i+"px",o.forEach(function(t){var e=t.style.paddingRight,o=window.getComputedStyle(t)["padding-right"];t.dataset.originalPaddingRight=e,t.style.paddingRight="".concat(parseFloat(o)+i,"px")})))):(document.body.classList.remove("hidden-scroll"),document.body.style.paddingRight=document.body.dataset.originalPaddingRight,o.forEach(function(t){var e=t.dataset.originalPaddingRight;void 0!==e&&(t.style.paddingRight=e)})),i}},{key:"close",value:function(){var t=this;if(!this.isOpen||this.isAnimating||this.isClosing)return!1;this.isClosing=!0;var e,o=this.relatedElements[this.currentImageIndex];for(e in o.dispatchEvent(new Event("close.simplelightbox")),this.options.history&&(this.historyHasChanges=!1,this.hashReseted||this.resetHash()),this.removeEventListener(document,"focusin."+this.eventNamespace),this.fadeOut(this.domNodes.overlay,this.options.fadeSpeed),this.fadeOut(document.querySelectorAll(".sl-image img,  .sl-close, .sl-navigation, .sl-image .sl-caption, .sl-counter"),this.options.fadeSpeed,function(){t.options.disableScroll&&t.toggleScrollbar("show"),t.options.htmlClass&&""!==t.options.htmlClass&&document.querySelector("html").classList.remove(t.options.htmlClass),document.body.removeChild(t.domNodes.wrapper),document.body.removeChild(t.domNodes.overlay),t.domNodes.additionalHtml=null,o.dispatchEvent(new Event("closed.simplelightbox")),t.isClosing=!1}),this.currentImage=null,this.isOpen=!1,this.isAnimating=!1,this.controlCoordinates)this.controlCoordinates[e]=0;this.controlCoordinates.mousedown=!1,this.controlCoordinates.zoomed=!1,this.controlCoordinates.capture=!1,this.controlCoordinates.initialScale=this.minMax(1,1,this.options.maxZoom),this.controlCoordinates.doubleTapped=!1}},{key:"hash",get:function(){return window.location.hash.substring(1)}},{key:"preload",value:function(){var e=this,o=this.currentImageIndex,t=this.relatedElements.length,i=o+1<0?t-1:t-1<=o+1?0:o+1,n=o-1<0?t-1:t-1<=o-1?0:o-1,s=new Image,t=new Image;s.addEventListener("load",function(t){t=t.target.getAttribute("src");-1===e.loadedImages.indexOf(t)&&e.loadedImages.push(t),e.relatedElements[o].dispatchEvent(new Event("nextImageLoaded."+e.eventNamespace))}),s.setAttribute("src",this.relatedElements[i].getAttribute(this.options.sourceAttr)),t.addEventListener("load",function(t){t=t.target.getAttribute("src");-1===e.loadedImages.indexOf(t)&&e.loadedImages.push(t),e.relatedElements[o].dispatchEvent(new Event("prevImageLoaded."+e.eventNamespace))}),t.setAttribute("src",this.relatedElements[n].getAttribute(this.options.sourceAttr))}},{key:"loadImage",value:function(t){var e=this,o=t;this.options.rtl&&(t=-t),this.relatedElements[this.currentImageIndex].dispatchEvent(new Event("change."+this.eventNamespace)),this.relatedElements[this.currentImageIndex].dispatchEvent(new Event((1===t?"next":"prev")+"."+this.eventNamespace));t=this.currentImageIndex+t;if(this.isAnimating||(t<0||t>=this.relatedElements.length)&&!1===this.options.loop)return!1;this.currentImageIndex=t<0?this.relatedElements.length-1:t>this.relatedElements.length-1?0:t,this.domNodes.counter.querySelector(".sl-current").innerHTML=this.currentImageIndex+1,this.options.animationSlide&&this.slide(this.options.animationSpeed/1e3,-100*o-this.controlCoordinates.swipeDiff+"px"),this.fadeOut(this.domNodes.image,this.options.fadeSpeed,function(){e.isAnimating=!0,e.isClosing?e.isAnimating=!1:setTimeout(function(){var t=e.relatedElements[e.currentImageIndex];e.currentImage.setAttribute("src",t.getAttribute(e.options.sourceAttr)),-1===e.loadedImages.indexOf(t.getAttribute(e.options.sourceAttr))&&e.show(e.domNodes.spinner),e.domNodes.image.contains(e.domNodes.caption)&&e.domNodes.image.removeChild(e.domNodes.caption),e.adjustImage(o),e.options.preloading&&e.preload()},100)})}},{key:"adjustImage",value:function(s){var a=this;if(!this.currentImage)return!1;var t=new Image,r=window.innerWidth*this.options.widthRatio,l=window.innerHeight*this.options.heightRatio;t.setAttribute("src",this.currentImage.getAttribute("src")),this.currentImage.dataset.scale=1,this.currentImage.dataset.translateX=0,this.currentImage.dataset.translateY=0,this.zoomPanElement(0,0,1),t.addEventListener("error",function(t){a.relatedElements[a.currentImageIndex].dispatchEvent(new Event("error."+a.eventNamespace)),a.isAnimating=!1,a.isOpen=!0,a.domNodes.spinner.style.display="none";var e=1===s||-1===s;if(a.initialImageIndex===a.currentImageIndex&&e)return a.close();a.options.alertError&&alert(a.options.alertErrorMessage),a.loadImage(e?s:1)}),t.addEventListener("load",function(t){void 0!==s&&(a.relatedElements[a.currentImageIndex].dispatchEvent(new Event("changed."+a.eventNamespace)),a.relatedElements[a.currentImageIndex].dispatchEvent(new Event((1===s?"nextDone":"prevDone")+"."+a.eventNamespace))),a.options.history&&a.updateURL(),-1===a.loadedImages.indexOf(a.currentImage.getAttribute("src"))&&a.loadedImages.push(a.currentImage.getAttribute("src"));var e,o,i=t.target.width,n=t.target.height;(a.options.scaleImageToRatio||r<i||l<n)&&(i/=t=r/l<i/n?i/r:n/l,n/=t),a.domNodes.image.style.top=(window.innerHeight-n)/2+"px",a.domNodes.image.style.left=(window.innerWidth-i-a.globalScrollbarWidth)/2+"px",a.domNodes.image.style.width=i+"px",a.domNodes.image.style.height=n+"px",a.domNodes.spinner.style.display="none",a.options.focus&&a.forceFocus(),a.fadeIn(a.currentImage,a.options.fadeSpeed,function(){a.options.focus&&a.domNodes.wrapper.focus()}),a.isOpen=!0,"string"==typeof a.options.captionSelector?e="self"===a.options.captionSelector?a.relatedElements[a.currentImageIndex]:a.relatedElements[a.currentImageIndex].querySelector(a.options.captionSelector):"function"==typeof a.options.captionSelector&&(e=a.options.captionSelector(a.relatedElements[a.currentImageIndex])),a.options.captions&&e&&(o="data"===a.options.captionType?e.dataset[a.options.captionsData]:"text"===a.options.captionType?e.innerHTML:e.getAttribute(a.options.captionsData)),a.options.loop?1===a.relatedElements.length?a.hide(a.domNodes.navigation.querySelectorAll(".sl-prev, .sl-next")):a.show(a.domNodes.navigation.querySelectorAll(".sl-prev, .sl-next")):(0===a.currentImageIndex&&a.hide(a.domNodes.navigation.querySelector(".sl-prev")),a.currentImageIndex>=a.relatedElements.length-1&&a.hide(a.domNodes.navigation.querySelector(".sl-next")),0<a.currentImageIndex&&a.show(a.domNodes.navigation.querySelector(".sl-prev")),a.currentImageIndex<a.relatedElements.length-1&&a.show(a.domNodes.navigation.querySelector(".sl-next"))),1===s||-1===s?(a.options.animationSlide&&(a.slide(0,100*s+"px"),setTimeout(function(){a.slide(a.options.animationSpeed/1e3,"0px")},50)),a.fadeIn(a.domNodes.image,a.options.fadeSpeed,function(){a.isAnimating=!1,a.setCaption(o,i)})):(a.isAnimating=!1,a.setCaption(o,i)),a.options.additionalHtml&&!a.domNodes.additionalHtml&&(a.domNodes.additionalHtml=document.createElement("div"),a.domNodes.additionalHtml.classList.add("sl-additional-html"),a.domNodes.additionalHtml.innerHTML=a.options.additionalHtml,a.domNodes.image.appendChild(a.domNodes.additionalHtml))})}},{key:"zoomPanElement",value:function(t,e,o){this.currentImage.style[this.transitionPrefix+"transform"]="translate("+t+","+e+") scale("+o+")"}},{key:"minMax",value:function(t,e,o){return t<e?e:o<t?o:t}},{key:"setZoomData",value:function(t,e,o){this.currentImage.dataset.scale=t,this.currentImage.dataset.translateX=e,this.currentImage.dataset.translateY=o}},{key:"hashchangeHandler",value:function(){this.isOpen&&this.hash===this.initialLocationHash&&(this.hashReseted=!0,this.close())}},{key:"addEvents",value:function(){var o,i=this;this.addEventListener(window,"resize."+this.eventNamespace,function(t){i.isOpen&&i.adjustImage()}),this.addEventListener(this.domNodes.closeButton,["click."+this.eventNamespace,"touchstart."+this.eventNamespace],this.close.bind(this)),this.options.history&&setTimeout(function(){i.addEventListener(window,"hashchange."+i.eventNamespace,function(t){i.isOpen&&i.hashchangeHandler()})},40),this.addEventListener(this.domNodes.navigation.getElementsByTagName("button"),"click."+this.eventNamespace,function(t){return!t.currentTarget.tagName.match(/button/i)||(t.preventDefault(),i.controlCoordinates.swipeDiff=0,void i.loadImage(t.currentTarget.classList.contains("sl-next")?1:-1))}),this.options.scrollZoom&&(o=1,this.addEventListener(this.domNodes.image,["mousewheel","DOMMouseScroll"],function(t){if(i.controlCoordinates.mousedown||i.isAnimating||i.isClosing||!i.isOpen)return!0;0==i.controlCoordinates.containerHeight&&(i.controlCoordinates.containerHeight=i.getDimensions(i.domNodes.image).height,i.controlCoordinates.containerWidth=i.getDimensions(i.domNodes.image).width,i.controlCoordinates.imgHeight=i.getDimensions(i.currentImage).height,i.controlCoordinates.imgWidth=i.getDimensions(i.currentImage).width,i.controlCoordinates.containerOffsetX=i.domNodes.image.offsetLeft,i.controlCoordinates.containerOffsetY=i.domNodes.image.offsetTop,i.controlCoordinates.initialOffsetX=parseFloat(i.currentImage.dataset.translateX),i.controlCoordinates.initialOffsetY=parseFloat(i.currentImage.dataset.translateY)),t.preventDefault();var e=t.delta||t.wheelDelta;void 0===e&&(e=t.detail),e=Math.max(-1,Math.min(1,e)),o+=e*i.options.scrollZoomFactor*o,o=Math.max(1,Math.min(i.options.maxZoom,o)),i.controlCoordinates.targetScale=o,i.controlCoordinates.pinchOffsetX=t.pageX,i.controlCoordinates.pinchOffsetY=t.pageY,i.controlCoordinates.limitOffsetX=(i.controlCoordinates.imgWidth*i.controlCoordinates.targetScale-i.controlCoordinates.containerWidth)/2,i.controlCoordinates.limitOffsetY=(i.controlCoordinates.imgHeight*i.controlCoordinates.targetScale-i.controlCoordinates.containerHeight)/2,i.controlCoordinates.scaleDifference=i.controlCoordinates.targetScale-i.controlCoordinates.initialScale,i.controlCoordinates.targetOffsetX=i.controlCoordinates.imgWidth*i.controlCoordinates.targetScale<=i.controlCoordinates.containerWidth?0:i.minMax(i.controlCoordinates.initialOffsetX-(i.controlCoordinates.pinchOffsetX-i.controlCoordinates.containerOffsetX-i.controlCoordinates.containerWidth/2-i.controlCoordinates.initialOffsetX)/(i.controlCoordinates.targetScale-i.controlCoordinates.scaleDifference)*i.controlCoordinates.scaleDifference,-1*i.controlCoordinates.limitOffsetX,i.controlCoordinates.limitOffsetX),i.controlCoordinates.targetOffsetY=i.controlCoordinates.imgHeight*i.controlCoordinates.targetScale<=i.controlCoordinates.containerHeight?0:i.minMax(i.controlCoordinates.initialOffsetY-(i.controlCoordinates.pinchOffsetY-i.controlCoordinates.containerOffsetY-i.controlCoordinates.containerHeight/2-i.controlCoordinates.initialOffsetY)/(i.controlCoordinates.targetScale-i.controlCoordinates.scaleDifference)*i.controlCoordinates.scaleDifference,-1*i.controlCoordinates.limitOffsetY,i.controlCoordinates.limitOffsetY),i.zoomPanElement(i.controlCoordinates.targetOffsetX+"px",i.controlCoordinates.targetOffsetY+"px",i.controlCoordinates.targetScale),1<i.controlCoordinates.targetScale?(i.controlCoordinates.zoomed=!0,(!i.domNodes.caption.style.opacity||0<i.domNodes.caption.style.opacity)&&"none"!==i.domNodes.caption.style.display&&i.fadeOut(i.domNodes.caption,i.options.fadeSpeed)):(1===i.controlCoordinates.initialScale&&(i.controlCoordinates.zoomed=!1,"none"===i.domNodes.caption.style.display&&i.fadeIn(i.domNodes.caption,i.options.fadeSpeed)),i.controlCoordinates.initialPinchDistance=null,i.controlCoordinates.capture=!1),i.controlCoordinates.initialPinchDistance=i.controlCoordinates.targetPinchDistance,i.controlCoordinates.initialScale=i.controlCoordinates.targetScale,i.controlCoordinates.initialOffsetX=i.controlCoordinates.targetOffsetX,i.controlCoordinates.initialOffsetY=i.controlCoordinates.targetOffsetY,i.setZoomData(i.controlCoordinates.targetScale,i.controlCoordinates.targetOffsetX,i.controlCoordinates.targetOffsetY),i.zoomPanElement(i.controlCoordinates.targetOffsetX+"px",i.controlCoordinates.targetOffsetY+"px",i.controlCoordinates.targetScale)})),this.addEventListener(this.domNodes.image,["touchstart."+this.eventNamespace,"mousedown."+this.eventNamespace],function(t){if("A"===t.target.tagName&&"touchstart"===t.type)return!0;if("mousedown"===t.type)t.preventDefault(),i.controlCoordinates.initialPointerOffsetX=t.clientX,i.controlCoordinates.initialPointerOffsetY=t.clientY,i.controlCoordinates.containerHeight=i.getDimensions(i.domNodes.image).height,i.controlCoordinates.containerWidth=i.getDimensions(i.domNodes.image).width,i.controlCoordinates.imgHeight=i.getDimensions(i.currentImage).height,i.controlCoordinates.imgWidth=i.getDimensions(i.currentImage).width,i.controlCoordinates.containerOffsetX=i.domNodes.image.offsetLeft,i.controlCoordinates.containerOffsetY=i.domNodes.image.offsetTop,i.controlCoordinates.initialOffsetX=parseFloat(i.currentImage.dataset.translateX),i.controlCoordinates.initialOffsetY=parseFloat(i.currentImage.dataset.translateY),i.controlCoordinates.capture=!0;else{if(i.controlCoordinates.touchCount=t.touches.length,i.controlCoordinates.initialPointerOffsetX=t.touches[0].clientX,i.controlCoordinates.initialPointerOffsetY=t.touches[0].clientY,i.controlCoordinates.containerHeight=i.getDimensions(i.domNodes.image).height,i.controlCoordinates.containerWidth=i.getDimensions(i.domNodes.image).width,i.controlCoordinates.imgHeight=i.getDimensions(i.currentImage).height,i.controlCoordinates.imgWidth=i.getDimensions(i.currentImage).width,i.controlCoordinates.containerOffsetX=i.domNodes.image.offsetLeft,i.controlCoordinates.containerOffsetY=i.domNodes.image.offsetTop,1===i.controlCoordinates.touchCount){if(i.controlCoordinates.doubleTapped)return i.currentImage.classList.add("sl-transition"),i.controlCoordinates.zoomed?(i.controlCoordinates.initialScale=1,i.setZoomData(i.controlCoordinates.initialScale,0,0),i.zoomPanElement("0px","0px",i.controlCoordinates.initialScale),i.controlCoordinates.zoomed=!1):(i.controlCoordinates.initialScale=i.options.doubleTapZoom,i.setZoomData(i.controlCoordinates.initialScale,0,0),i.zoomPanElement("0px","0px",i.controlCoordinates.initialScale),(!i.domNodes.caption.style.opacity||0<i.domNodes.caption.style.opacity)&&"none"!==i.domNodes.caption.style.display&&i.fadeOut(i.domNodes.caption,i.options.fadeSpeed),i.controlCoordinates.zoomed=!0),setTimeout(function(){i.currentImage&&i.currentImage.classList.remove("sl-transition")},200),!1;i.controlCoordinates.doubleTapped=!0,setTimeout(function(){i.controlCoordinates.doubleTapped=!1},300),i.controlCoordinates.initialOffsetX=parseFloat(i.currentImage.dataset.translateX),i.controlCoordinates.initialOffsetY=parseFloat(i.currentImage.dataset.translateY)}else 2===i.controlCoordinates.touchCount&&(i.controlCoordinates.initialPointerOffsetX2=t.touches[1].clientX,i.controlCoordinates.initialPointerOffsetY2=t.touches[1].clientY,i.controlCoordinates.initialOffsetX=parseFloat(i.currentImage.dataset.translateX),i.controlCoordinates.initialOffsetY=parseFloat(i.currentImage.dataset.translateY),i.controlCoordinates.pinchOffsetX=(i.controlCoordinates.initialPointerOffsetX+i.controlCoordinates.initialPointerOffsetX2)/2,i.controlCoordinates.pinchOffsetY=(i.controlCoordinates.initialPointerOffsetY+i.controlCoordinates.initialPointerOffsetY2)/2,i.controlCoordinates.initialPinchDistance=Math.sqrt((i.controlCoordinates.initialPointerOffsetX-i.controlCoordinates.initialPointerOffsetX2)*(i.controlCoordinates.initialPointerOffsetX-i.controlCoordinates.initialPointerOffsetX2)+(i.controlCoordinates.initialPointerOffsetY-i.controlCoordinates.initialPointerOffsetY2)*(i.controlCoordinates.initialPointerOffsetY-i.controlCoordinates.initialPointerOffsetY2)));i.controlCoordinates.capture=!0}return!!i.controlCoordinates.mousedown||(i.transitionCapable&&(i.controlCoordinates.imageLeft=parseInt(i.domNodes.image.style.left,10)),i.controlCoordinates.mousedown=!0,i.controlCoordinates.swipeDiff=0,i.controlCoordinates.swipeYDiff=0,i.controlCoordinates.swipeStart=t.pageX||t.touches[0].pageX,i.controlCoordinates.swipeYStart=t.pageY||t.touches[0].pageY,!1)}),this.addEventListener(this.domNodes.image,["touchmove."+this.eventNamespace,"mousemove."+this.eventNamespace,"MSPointerMove"],function(t){if(!i.controlCoordinates.mousedown)return!0;if("touchmove"===t.type){if(!1===i.controlCoordinates.capture)return!1;i.controlCoordinates.pointerOffsetX=t.touches[0].clientX,i.controlCoordinates.pointerOffsetY=t.touches[0].clientY,i.controlCoordinates.touchCount=t.touches.length,i.controlCoordinates.touchmoveCount++,1<i.controlCoordinates.touchCount?(i.controlCoordinates.pointerOffsetX2=t.touches[1].clientX,i.controlCoordinates.pointerOffsetY2=t.touches[1].clientY,i.controlCoordinates.targetPinchDistance=Math.sqrt((i.controlCoordinates.pointerOffsetX-i.controlCoordinates.pointerOffsetX2)*(i.controlCoordinates.pointerOffsetX-i.controlCoordinates.pointerOffsetX2)+(i.controlCoordinates.pointerOffsetY-i.controlCoordinates.pointerOffsetY2)*(i.controlCoordinates.pointerOffsetY-i.controlCoordinates.pointerOffsetY2)),null===i.controlCoordinates.initialPinchDistance&&(i.controlCoordinates.initialPinchDistance=i.controlCoordinates.targetPinchDistance),1<=Math.abs(i.controlCoordinates.initialPinchDistance-i.controlCoordinates.targetPinchDistance)&&(i.controlCoordinates.targetScale=i.minMax(i.controlCoordinates.targetPinchDistance/i.controlCoordinates.initialPinchDistance*i.controlCoordinates.initialScale,1,i.options.maxZoom),i.controlCoordinates.limitOffsetX=(i.controlCoordinates.imgWidth*i.controlCoordinates.targetScale-i.controlCoordinates.containerWidth)/2,i.controlCoordinates.limitOffsetY=(i.controlCoordinates.imgHeight*i.controlCoordinates.targetScale-i.controlCoordinates.containerHeight)/2,i.controlCoordinates.scaleDifference=i.controlCoordinates.targetScale-i.controlCoordinates.initialScale,i.controlCoordinates.targetOffsetX=i.controlCoordinates.imgWidth*i.controlCoordinates.targetScale<=i.controlCoordinates.containerWidth?0:i.minMax(i.controlCoordinates.initialOffsetX-(i.controlCoordinates.pinchOffsetX-i.controlCoordinates.containerOffsetX-i.controlCoordinates.containerWidth/2-i.controlCoordinates.initialOffsetX)/(i.controlCoordinates.targetScale-i.controlCoordinates.scaleDifference)*i.controlCoordinates.scaleDifference,-1*i.controlCoordinates.limitOffsetX,i.controlCoordinates.limitOffsetX),i.controlCoordinates.targetOffsetY=i.controlCoordinates.imgHeight*i.controlCoordinates.targetScale<=i.controlCoordinates.containerHeight?0:i.minMax(i.controlCoordinates.initialOffsetY-(i.controlCoordinates.pinchOffsetY-i.controlCoordinates.containerOffsetY-i.controlCoordinates.containerHeight/2-i.controlCoordinates.initialOffsetY)/(i.controlCoordinates.targetScale-i.controlCoordinates.scaleDifference)*i.controlCoordinates.scaleDifference,-1*i.controlCoordinates.limitOffsetY,i.controlCoordinates.limitOffsetY),i.zoomPanElement(i.controlCoordinates.targetOffsetX+"px",i.controlCoordinates.targetOffsetY+"px",i.controlCoordinates.targetScale),1<i.controlCoordinates.targetScale&&(i.controlCoordinates.zoomed=!0,(!i.domNodes.caption.style.opacity||0<i.domNodes.caption.style.opacity)&&"none"!==i.domNodes.caption.style.display&&i.fadeOut(i.domNodes.caption,i.options.fadeSpeed)),i.controlCoordinates.initialPinchDistance=i.controlCoordinates.targetPinchDistance,i.controlCoordinates.initialScale=i.controlCoordinates.targetScale,i.controlCoordinates.initialOffsetX=i.controlCoordinates.targetOffsetX,i.controlCoordinates.initialOffsetY=i.controlCoordinates.targetOffsetY)):(i.controlCoordinates.targetScale=i.controlCoordinates.initialScale,i.controlCoordinates.limitOffsetX=(i.controlCoordinates.imgWidth*i.controlCoordinates.targetScale-i.controlCoordinates.containerWidth)/2,i.controlCoordinates.limitOffsetY=(i.controlCoordinates.imgHeight*i.controlCoordinates.targetScale-i.controlCoordinates.containerHeight)/2,i.controlCoordinates.targetOffsetX=i.controlCoordinates.imgWidth*i.controlCoordinates.targetScale<=i.controlCoordinates.containerWidth?0:i.minMax(i.controlCoordinates.pointerOffsetX-(i.controlCoordinates.initialPointerOffsetX-i.controlCoordinates.initialOffsetX),-1*i.controlCoordinates.limitOffsetX,i.controlCoordinates.limitOffsetX),i.controlCoordinates.targetOffsetY=i.controlCoordinates.imgHeight*i.controlCoordinates.targetScale<=i.controlCoordinates.containerHeight?0:i.minMax(i.controlCoordinates.pointerOffsetY-(i.controlCoordinates.initialPointerOffsetY-i.controlCoordinates.initialOffsetY),-1*i.controlCoordinates.limitOffsetY,i.controlCoordinates.limitOffsetY),Math.abs(i.controlCoordinates.targetOffsetX)===Math.abs(i.controlCoordinates.limitOffsetX)&&(i.controlCoordinates.initialOffsetX=i.controlCoordinates.targetOffsetX,i.controlCoordinates.initialPointerOffsetX=i.controlCoordinates.pointerOffsetX),Math.abs(i.controlCoordinates.targetOffsetY)===Math.abs(i.controlCoordinates.limitOffsetY)&&(i.controlCoordinates.initialOffsetY=i.controlCoordinates.targetOffsetY,i.controlCoordinates.initialPointerOffsetY=i.controlCoordinates.pointerOffsetY),i.setZoomData(i.controlCoordinates.initialScale,i.controlCoordinates.targetOffsetX,i.controlCoordinates.targetOffsetY),i.zoomPanElement(i.controlCoordinates.targetOffsetX+"px",i.controlCoordinates.targetOffsetY+"px",i.controlCoordinates.targetScale))}if("mousemove"===t.type&&i.controlCoordinates.mousedown){if("touchmove"==t.type)return!0;if(t.preventDefault(),!1===i.controlCoordinates.capture)return!1;i.controlCoordinates.pointerOffsetX=t.clientX,i.controlCoordinates.pointerOffsetY=t.clientY,i.controlCoordinates.targetScale=i.controlCoordinates.initialScale,i.controlCoordinates.limitOffsetX=(i.controlCoordinates.imgWidth*i.controlCoordinates.targetScale-i.controlCoordinates.containerWidth)/2,i.controlCoordinates.limitOffsetY=(i.controlCoordinates.imgHeight*i.controlCoordinates.targetScale-i.controlCoordinates.containerHeight)/2,i.controlCoordinates.targetOffsetX=i.controlCoordinates.imgWidth*i.controlCoordinates.targetScale<=i.controlCoordinates.containerWidth?0:i.minMax(i.controlCoordinates.pointerOffsetX-(i.controlCoordinates.initialPointerOffsetX-i.controlCoordinates.initialOffsetX),-1*i.controlCoordinates.limitOffsetX,i.controlCoordinates.limitOffsetX),i.controlCoordinates.targetOffsetY=i.controlCoordinates.imgHeight*i.controlCoordinates.targetScale<=i.controlCoordinates.containerHeight?0:i.minMax(i.controlCoordinates.pointerOffsetY-(i.controlCoordinates.initialPointerOffsetY-i.controlCoordinates.initialOffsetY),-1*i.controlCoordinates.limitOffsetY,i.controlCoordinates.limitOffsetY),Math.abs(i.controlCoordinates.targetOffsetX)===Math.abs(i.controlCoordinates.limitOffsetX)&&(i.controlCoordinates.initialOffsetX=i.controlCoordinates.targetOffsetX,i.controlCoordinates.initialPointerOffsetX=i.controlCoordinates.pointerOffsetX),Math.abs(i.controlCoordinates.targetOffsetY)===Math.abs(i.controlCoordinates.limitOffsetY)&&(i.controlCoordinates.initialOffsetY=i.controlCoordinates.targetOffsetY,i.controlCoordinates.initialPointerOffsetY=i.controlCoordinates.pointerOffsetY),i.setZoomData(i.controlCoordinates.initialScale,i.controlCoordinates.targetOffsetX,i.controlCoordinates.targetOffsetY),i.zoomPanElement(i.controlCoordinates.targetOffsetX+"px",i.controlCoordinates.targetOffsetY+"px",i.controlCoordinates.targetScale)}i.controlCoordinates.zoomed||(i.controlCoordinates.swipeEnd=t.pageX||t.touches[0].pageX,i.controlCoordinates.swipeYEnd=t.pageY||t.touches[0].pageY,i.controlCoordinates.swipeDiff=i.controlCoordinates.swipeStart-i.controlCoordinates.swipeEnd,i.controlCoordinates.swipeYDiff=i.controlCoordinates.swipeYStart-i.controlCoordinates.swipeYEnd,i.options.animationSlide&&i.slide(0,-i.controlCoordinates.swipeDiff+"px"))}),this.addEventListener(this.domNodes.image,["touchend."+this.eventNamespace,"mouseup."+this.eventNamespace,"touchcancel."+this.eventNamespace,"mouseleave."+this.eventNamespace,"pointerup","pointercancel","MSPointerUp","MSPointerCancel"],function(t){i.isTouchDevice&&"touchend"===t.type&&(i.controlCoordinates.touchCount=t.touches.length,0===i.controlCoordinates.touchCount?(i.currentImage&&i.setZoomData(i.controlCoordinates.initialScale,i.controlCoordinates.targetOffsetX,i.controlCoordinates.targetOffsetY),1===i.controlCoordinates.initialScale&&(i.controlCoordinates.zoomed=!1,"none"===i.domNodes.caption.style.display&&i.fadeIn(i.domNodes.caption,i.options.fadeSpeed)),i.controlCoordinates.initialPinchDistance=null,i.controlCoordinates.capture=!1):1===i.controlCoordinates.touchCount?(i.controlCoordinates.initialPointerOffsetX=t.touches[0].clientX,i.controlCoordinates.initialPointerOffsetY=t.touches[0].clientY):1<i.controlCoordinates.touchCount&&(i.controlCoordinates.initialPinchDistance=null)),i.controlCoordinates.mousedown&&(t=!(i.controlCoordinates.mousedown=!1),i.options.loop||(0===i.currentImageIndex&&i.controlCoordinates.swipeDiff<0&&(t=!1),i.currentImageIndex>=i.relatedElements.length-1&&0<i.controlCoordinates.swipeDiff&&(t=!1)),Math.abs(i.controlCoordinates.swipeDiff)>i.options.swipeTolerance&&t?i.loadImage(0<i.controlCoordinates.swipeDiff?1:-1):i.options.animationSlide&&i.slide(i.options.animationSpeed/1e3,"0px"),i.options.swipeClose&&50<Math.abs(i.controlCoordinates.swipeYDiff)&&Math.abs(i.controlCoordinates.swipeDiff)<i.options.swipeTolerance&&i.close())}),this.addEventListener(this.domNodes.image,["dblclick"],function(t){if(!i.isTouchDevice)return i.controlCoordinates.initialPointerOffsetX=t.clientX,i.controlCoordinates.initialPointerOffsetY=t.clientY,i.controlCoordinates.containerHeight=i.getDimensions(i.domNodes.image).height,i.controlCoordinates.containerWidth=i.getDimensions(i.domNodes.image).width,i.controlCoordinates.imgHeight=i.getDimensions(i.currentImage).height,i.controlCoordinates.imgWidth=i.getDimensions(i.currentImage).width,i.controlCoordinates.containerOffsetX=i.domNodes.image.offsetLeft,i.controlCoordinates.containerOffsetY=i.domNodes.image.offsetTop,i.currentImage.classList.add("sl-transition"),i.controlCoordinates.zoomed?(i.controlCoordinates.initialScale=1,i.setZoomData(i.controlCoordinates.initialScale,0,0),i.zoomPanElement("0px","0px",i.controlCoordinates.initialScale),i.controlCoordinates.zoomed=!1,"none"===i.domNodes.caption.style.display&&i.fadeIn(i.domNodes.caption,i.options.fadeSpeed)):(i.controlCoordinates.initialScale=i.options.doubleTapZoom,i.setZoomData(i.controlCoordinates.initialScale,0,0),i.zoomPanElement("0px","0px",i.controlCoordinates.initialScale),(!i.domNodes.caption.style.opacity||0<i.domNodes.caption.style.opacity)&&"none"!==i.domNodes.caption.style.display&&i.fadeOut(i.domNodes.caption,i.options.fadeSpeed),i.controlCoordinates.zoomed=!0),setTimeout(function(){i.currentImage&&(i.currentImage.classList.remove("sl-transition"),i.currentImage.style[i.transitionPrefix+"transform-origin"]=null)},200),!(i.controlCoordinates.capture=!0)})}},{key:"getDimensions",value:function(t){var e=window.getComputedStyle(t),o=t.offsetHeight,i=t.offsetWidth,t=parseFloat(e.borderTopWidth);return{height:o-parseFloat(e.borderBottomWidth)-t-parseFloat(e.paddingTop)-parseFloat(e.paddingBottom),width:i-parseFloat(e.borderLeftWidth)-parseFloat(e.borderRightWidth)-parseFloat(e.paddingLeft)-parseFloat(e.paddingRight)}}},{key:"updateHash",value:function(){var t="pid="+(this.currentImageIndex+1),e=window.location.href.split("#")[0]+"#"+t;this.hashReseted=!1,this.pushStateSupport?window.history[this.historyHasChanges?"replaceState":"pushState"]("",document.title,e):this.historyHasChanges?window.location.replace(e):window.location.hash=t,this.historyHasChanges||(this.urlChangedOnce=!0),this.historyHasChanges=!0}},{key:"resetHash",value:function(){this.hashReseted=!0,this.urlChangedOnce?history.back():this.pushStateSupport?history.pushState("",document.title,window.location.pathname+window.location.search):window.location.hash="",clearTimeout(this.historyUpdateTimeout)}},{key:"updateURL",value:function(){clearTimeout(this.historyUpdateTimeout),this.historyHasChanges?this.historyUpdateTimeout=setTimeout(this.updateHash.bind(this),800):this.updateHash()}},{key:"setCaption",value:function(t,e){var o=this;this.options.captions&&t&&""!==t&&void 0!==t&&(this.hide(this.domNodes.caption),this.domNodes.caption.style.width=e+"px",this.domNodes.caption.innerHTML=t,this.domNodes.image.appendChild(this.domNodes.caption),setTimeout(function(){o.fadeIn(o.domNodes.caption,o.options.fadeSpeed)},this.options.captionDelay))}},{key:"slide",value:function(t,e){if(!this.transitionCapable)return this.domNodes.image.style.left=e;this.domNodes.image.style[this.transitionPrefix+"transform"]="translateX("+e+")",this.domNodes.image.style[this.transitionPrefix+"transition"]=this.transitionPrefix+"transform "+t+"s linear"}},{key:"getRelated",value:function(e){var t=e&&!1!==e&&"nofollow"!==e?Array.from(this.elements).filter(function(t){return t.getAttribute("rel")===e}):this.elements;return t}},{key:"openImage",value:function(t){var e=this;t.dispatchEvent(new Event("show."+this.eventNamespace)),this.options.disableScroll&&(this.globalScrollbarWidth=this.toggleScrollbar("hide")),this.options.htmlClass&&""!==this.options.htmlClass&&document.querySelector("html").classList.add(this.options.htmlClass),document.body.appendChild(this.domNodes.wrapper),this.domNodes.wrapper.appendChild(this.domNodes.image),this.options.overlay&&document.body.appendChild(this.domNodes.overlay),this.relatedElements=this.getRelated(t.rel),this.options.showCounter&&(1==this.relatedElements.length&&this.domNodes.wrapper.contains(this.domNodes.counter)?this.domNodes.wrapper.removeChild(this.domNodes.counter):1<this.relatedElements.length&&!this.domNodes.wrapper.contains(this.domNodes.counter)&&this.domNodes.wrapper.appendChild(this.domNodes.counter)),this.isAnimating=!0,this.currentImageIndex=this.relatedElements.indexOf(t);var o=t.getAttribute(this.options.sourceAttr);this.currentImage=document.createElement("img"),this.currentImage.style.display="none",this.currentImage.setAttribute("src",o),this.currentImage.dataset.scale=1,this.currentImage.dataset.translateX=0,this.currentImage.dataset.translateY=0,-1===this.loadedImages.indexOf(o)&&this.loadedImages.push(o),this.domNodes.image.innerHTML="",this.domNodes.image.setAttribute("style",""),this.domNodes.image.appendChild(this.currentImage),this.fadeIn(this.domNodes.overlay,this.options.fadeSpeed),this.fadeIn([this.domNodes.counter,this.domNodes.navigation,this.domNodes.closeButton],this.options.fadeSpeed),this.show(this.domNodes.spinner),this.domNodes.counter.querySelector(".sl-current").innerHTML=this.currentImageIndex+1,this.domNodes.counter.querySelector(".sl-total").innerHTML=this.relatedElements.length,this.adjustImage(),this.options.preloading&&this.preload(),setTimeout(function(){t.dispatchEvent(new Event("shown."+e.eventNamespace))},this.options.animationSpeed)}},{key:"forceFocus",value:function(){var e=this;this.removeEventListener(document,"focusin."+this.eventNamespace),this.addEventListener(document,"focusin."+this.eventNamespace,function(t){document===t.target||e.domNodes.wrapper===t.target||e.domNodes.wrapper.contains(t.target)||e.domNodes.wrapper.focus()})}},{key:"addEventListener",value:function(t,e,o,i){t=this.wrap(t),e=this.wrap(e);var n,s=m(t);try{for(s.s();!(n=s.n()).done;){var a=n.value;a.namespaces||(a.namespaces={});var r,l=m(e);try{for(l.s();!(r=l.n()).done;){var d=r.value,c=i||!1;0<=["touchstart","touchmove"].indexOf(d.split(".")[0])&&this.isPassiveEventsSupported&&("object"===h(c)?c.passive=!0:c={passive:!0}),a.namespaces[d]=o,a.addEventListener(d.split(".")[0],o,c)}}catch(t){l.e(t)}finally{l.f()}}}catch(t){s.e(t)}finally{s.f()}}},{key:"removeEventListener",value:function(t,e){t=this.wrap(t),e=this.wrap(e);var o,i=m(t);try{for(i.s();!(o=i.n()).done;){var n,s=o.value,a=m(e);try{for(a.s();!(n=a.n()).done;){var r=n.value;s.namespaces&&s.namespaces[r]&&(s.removeEventListener(r.split(".")[0],s.namespaces[r]),delete s.namespaces[r])}}catch(t){a.e(t)}finally{a.f()}}}catch(t){i.e(t)}finally{i.f()}}},{key:"fadeOut",value:function(r,t,l){var e,d=this,o=m(r=this.wrap(r));try{for(o.s();!(e=o.n()).done;){var i=e.value;i.style.opacity=parseFloat(i)||window.getComputedStyle(i).getPropertyValue("opacity")}}catch(t){o.e(t)}finally{o.f()}this.isFadeIn=!1;var c=16.66666/(t||this.options.fadeSpeed);(function t(){var e=parseFloat(r[0].style.opacity);if((e-=c)<0){var o,i=m(r);try{for(i.s();!(o=i.n()).done;){var n=o.value;n.style.display="none",n.style.opacity=1}}catch(t){i.e(t)}finally{i.f()}l&&l.call(d,r)}else{var s,a=m(r);try{for(a.s();!(s=a.n()).done;)s.value.style.opacity=e}catch(t){a.e(t)}finally{a.f()}requestAnimationFrame(t)}})()}},{key:"fadeIn",value:function(a,t,r,e){var o,l=this,i=m(a=this.wrap(a));try{for(i.s();!(o=i.n()).done;){var n=o.value;n.style.opacity=0,n.style.display=e||"block"}}catch(t){i.e(t)}finally{i.f()}this.isFadeIn=!0;var d=parseFloat(a[0].dataset.opacityTarget||1),c=16.66666*d/(t||this.options.fadeSpeed);(function t(){var e=parseFloat(a[0].style.opacity);if((e+=c)>d){var o,i=m(a);try{for(i.s();!(o=i.n()).done;)o.value.style.opacity=d}catch(t){i.e(t)}finally{i.f()}r&&r.call(l,a)}else{var n,s=m(a);try{for(s.s();!(n=s.n()).done;)n.value.style.opacity=e}catch(t){s.e(t)}finally{s.f()}l.isFadeIn&&requestAnimationFrame(t)}})()}},{key:"hide",value:function(t){var e,o=m(t=this.wrap(t));try{for(o.s();!(e=o.n()).done;){var i=e.value;"none"!=i.style.display&&(i.dataset.initialDisplay=i.style.display),i.style.display="none"}}catch(t){o.e(t)}finally{o.f()}}},{key:"show",value:function(t,e){var o,i=m(t=this.wrap(t));try{for(i.s();!(o=i.n()).done;){var n=o.value;n.style.display=n.dataset.initialDisplay||e||"block"}}catch(t){i.e(t)}finally{i.f()}}},{key:"wrap",value:function(t){return"function"==typeof t[Symbol.iterator]&&"string"!=typeof t?t:[t]}},{key:"on",value:function(t,e){t=this.wrap(t);var o,i=m(this.elements);try{for(i.s();!(o=i.n()).done;){var n=o.value;n.fullyNamespacedEvents||(n.fullyNamespacedEvents={});var s,a=m(t);try{for(a.s();!(s=a.n()).done;){var r=s.value;n.fullyNamespacedEvents[r]=e,n.addEventListener(r,e)}}catch(t){a.e(t)}finally{a.f()}}}catch(t){i.e(t)}finally{i.f()}return this}},{key:"off",value:function(t){t=this.wrap(t);var e,o=m(this.elements);try{for(o.s();!(e=o.n()).done;){var i,n=e.value,s=m(t);try{for(s.s();!(i=s.n()).done;){var a=i.value;void 0!==n.fullyNamespacedEvents&&a in n.fullyNamespacedEvents&&n.removeEventListener(a,n.fullyNamespacedEvents[a])}}catch(t){s.e(t)}finally{s.f()}}}catch(t){o.e(t)}finally{o.f()}return this}},{key:"open",value:function(t){t=t||this.elements[0],"undefined"!=typeof jQuery&&t instanceof jQuery&&(t=t.get(0)),this.initialImageIndex=this.elements.indexOf(t),-1<this.initialImageIndex&&this.openImage(t)}},{key:"next",value:function(){this.loadImage(1)}},{key:"prev",value:function(){this.loadImage(-1)}},{key:"getLighboxData",value:function(){return{currentImageIndex:this.currentImageIndex,currentImage:this.currentImage,globalScrollbarWidth:this.globalScrollbarWidth}}},{key:"destroy",value:function(){this.off(["close."+this.eventNamespace,"closed."+this.eventNamespace,"nextImageLoaded."+this.eventNamespace,"prevImageLoaded."+this.eventNamespace,"change."+this.eventNamespace,"nextDone."+this.eventNamespace,"prevDone."+this.eventNamespace,"error."+this.eventNamespace,"changed."+this.eventNamespace,"next."+this.eventNamespace,"prev."+this.eventNamespace,"show."+this.eventNamespace,"shown."+this.eventNamespace]),this.removeEventListener(this.elements,"click."+this.eventNamespace),this.removeEventListener(document,"focusin."+this.eventNamespace),this.removeEventListener(document.body,"contextmenu."+this.eventNamespace),this.removeEventListener(document.body,"keyup."+this.eventNamespace),this.removeEventListener(this.domNodes.navigation.getElementsByTagName("button"),"click."+this.eventNamespace),this.removeEventListener(this.domNodes.closeButton,"click."+this.eventNamespace),this.removeEventListener(window,"resize."+this.eventNamespace),this.removeEventListener(window,"hashchange."+this.eventNamespace),this.close(),this.isOpen&&(document.body.removeChild(this.domNodes.wrapper),document.body.removeChild(this.domNodes.overlay)),this.elements=null}},{key:"refresh",value:function(){if(!this.initialSelector)throw"refreshing only works when you initialize using a selector!";var t=this.options,e=this.initialSelector;return this.destroy(),this.constructor(e,t),this}}])&&i(t.prototype,e),o&&i(t,o),n}();o.default=t,e.SimpleLightbox=t}.call(this)}.call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1]);
		// INIT
		(function() {
			var $gallery = new SimpleLightbox('.gallery a', {
			/* options */
			nav: true,
			captionSelector: 'img',
			captionType: 'attr',
			captionsData: 'title'
			});
		})();
    </script>
    </body>
</html>
