3889 lines
		
	
	
		
			128 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			3889 lines
		
	
	
		
			128 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
| /*!
 | ||
|  * Fotorama 4.6.4 | http://fotorama.io/license/
 | ||
|  */
 | ||
| fotoramaVersion = '4.6.4';
 | ||
| (function (window, document, location, $, undefined) {
 | ||
|     "use strict";
 | ||
|     var _fotoramaClass = 'fotorama',
 | ||
|         _fullscreenClass = 'fotorama__fullscreen',
 | ||
| 
 | ||
|         wrapClass = _fotoramaClass + '__wrap',
 | ||
|         wrapCss2Class = wrapClass + '--css2',
 | ||
|         wrapCss3Class = wrapClass + '--css3',
 | ||
|         wrapVideoClass = wrapClass + '--video',
 | ||
|         wrapFadeClass = wrapClass + '--fade',
 | ||
|         wrapSlideClass = wrapClass + '--slide',
 | ||
|         wrapNoControlsClass = wrapClass + '--no-controls',
 | ||
|         wrapNoShadowsClass = wrapClass + '--no-shadows',
 | ||
|         wrapPanYClass = wrapClass + '--pan-y',
 | ||
|         wrapRtlClass = wrapClass + '--rtl',
 | ||
|         wrapOnlyActiveClass = wrapClass + '--only-active',
 | ||
|         wrapNoCaptionsClass = wrapClass + '--no-captions',
 | ||
|         wrapToggleArrowsClass = wrapClass + '--toggle-arrows',
 | ||
| 
 | ||
|         stageClass = _fotoramaClass + '__stage',
 | ||
|         stageFrameClass = stageClass + '__frame',
 | ||
|         stageFrameVideoClass = stageFrameClass + '--video',
 | ||
|         stageShaftClass = stageClass + '__shaft',
 | ||
| 
 | ||
|         grabClass = _fotoramaClass + '__grab',
 | ||
|         pointerClass = _fotoramaClass + '__pointer',
 | ||
| 
 | ||
|         arrClass = _fotoramaClass + '__arr',
 | ||
|         arrDisabledClass = arrClass + '--disabled',
 | ||
|         arrPrevClass = arrClass + '--prev',
 | ||
|         arrNextClass = arrClass + '--next',
 | ||
| 
 | ||
|         navClass = _fotoramaClass + '__nav',
 | ||
|         navWrapClass = navClass + '-wrap',
 | ||
|         navShaftClass = navClass + '__shaft',
 | ||
|         navShaftVerticalClass = navWrapClass + '--vertical',
 | ||
|         navShaftListClass = navWrapClass + '--list',
 | ||
|         navShafthorizontalClass = navWrapClass + '--horizontal',
 | ||
|         navDotsClass = navClass + '--dots',
 | ||
|         navThumbsClass = navClass + '--thumbs',
 | ||
|         navFrameClass = navClass + '__frame',
 | ||
| 
 | ||
|         fadeClass = _fotoramaClass + '__fade',
 | ||
|         fadeFrontClass = fadeClass + '-front',
 | ||
|         fadeRearClass = fadeClass + '-rear',
 | ||
| 
 | ||
|         shadowClass = _fotoramaClass + '__shadow',
 | ||
|         shadowsClass = shadowClass + 's',
 | ||
|         shadowsLeftClass = shadowsClass + '--left',
 | ||
|         shadowsRightClass = shadowsClass + '--right',
 | ||
|         shadowsTopClass = shadowsClass + '--top',
 | ||
|         shadowsBottomClass = shadowsClass + '--bottom',
 | ||
| 
 | ||
|         activeClass = _fotoramaClass + '__active',
 | ||
|         selectClass = _fotoramaClass + '__select',
 | ||
| 
 | ||
|         hiddenClass = _fotoramaClass + '--hidden',
 | ||
| 
 | ||
|         fullscreenClass = _fotoramaClass + '--fullscreen',
 | ||
|         fullscreenIconClass = _fotoramaClass + '__fullscreen-icon',
 | ||
| 
 | ||
|         errorClass = _fotoramaClass + '__error',
 | ||
|         loadingClass = _fotoramaClass + '__loading',
 | ||
|         loadedClass = _fotoramaClass + '__loaded',
 | ||
|         loadedFullClass = loadedClass + '--full',
 | ||
|         loadedImgClass = loadedClass + '--img',
 | ||
| 
 | ||
|         grabbingClass = _fotoramaClass + '__grabbing',
 | ||
| 
 | ||
|         imgClass = _fotoramaClass + '__img',
 | ||
|         imgFullClass = imgClass + '--full',
 | ||
| 
 | ||
|         thumbClass = _fotoramaClass + '__thumb',
 | ||
|         thumbArrLeft = thumbClass + '__arr--left',
 | ||
|         thumbArrRight = thumbClass + '__arr--right',
 | ||
|         thumbBorderClass = thumbClass + '-border',
 | ||
| 
 | ||
|         htmlClass = _fotoramaClass + '__html',
 | ||
| 
 | ||
|         videoContainerClass = _fotoramaClass + '-video-container',
 | ||
|         videoClass = _fotoramaClass + '__video',
 | ||
|         videoPlayClass = videoClass + '-play',
 | ||
|         videoCloseClass = videoClass + '-close',
 | ||
| 
 | ||
| 
 | ||
|         horizontalImageClass = _fotoramaClass + '_horizontal_ratio',
 | ||
|         verticalImageClass = _fotoramaClass + '_vertical_ratio',
 | ||
|         fotoramaSpinnerClass = _fotoramaClass + '__spinner',
 | ||
|         spinnerShowClass = fotoramaSpinnerClass + '--show';
 | ||
|     var JQUERY_VERSION = $ && $.fn.jquery.split('.');
 | ||
| 
 | ||
|     if (!JQUERY_VERSION
 | ||
|         || JQUERY_VERSION[0] < 1
 | ||
|         || (JQUERY_VERSION[0] == 1 && JQUERY_VERSION[1] < 8)) {
 | ||
|         throw 'Fotorama requires jQuery 1.8 or later and will not run without it.';
 | ||
|     }
 | ||
| 
 | ||
|     var _ = {};
 | ||
|     /* Modernizr 2.8.3 (Custom Build) | MIT & BSD
 | ||
|      * Build: http://modernizr.com/download/#-csstransforms3d-csstransitions-touch-prefixed
 | ||
|      */
 | ||
| 
 | ||
|     var Modernizr = (function (window, document, undefined) {
 | ||
|         var version = '2.8.3',
 | ||
|             Modernizr = {},
 | ||
| 
 | ||
| 
 | ||
|             docElement = document.documentElement,
 | ||
| 
 | ||
|             mod = 'modernizr',
 | ||
|             modElem = document.createElement(mod),
 | ||
|             mStyle = modElem.style,
 | ||
|             inputElem,
 | ||
| 
 | ||
| 
 | ||
|             toString = {}.toString,
 | ||
| 
 | ||
|             prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
 | ||
| 
 | ||
| 
 | ||
|             omPrefixes = 'Webkit Moz O ms',
 | ||
| 
 | ||
|             cssomPrefixes = omPrefixes.split(' '),
 | ||
| 
 | ||
|             domPrefixes = omPrefixes.toLowerCase().split(' '),
 | ||
| 
 | ||
| 
 | ||
|             tests = {},
 | ||
|             inputs = {},
 | ||
|             attrs = {},
 | ||
| 
 | ||
|             classes = [],
 | ||
| 
 | ||
|             slice = classes.slice,
 | ||
| 
 | ||
|             featureName,
 | ||
| 
 | ||
| 
 | ||
|             injectElementWithStyles = function (rule, callback, nodes, testnames) {
 | ||
| 
 | ||
|                 var style, ret, node, docOverflow,
 | ||
|                     div = document.createElement('div'),
 | ||
|                     body = document.body,
 | ||
|                     fakeBody = body || document.createElement('body');
 | ||
| 
 | ||
|                 if (parseInt(nodes, 10)) {
 | ||
|                     while (nodes--) {
 | ||
|                         node = document.createElement('div');
 | ||
|                         node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
 | ||
|                         div.appendChild(node);
 | ||
|                     }
 | ||
|                 }
 | ||
| 
 | ||
|                 style = ['­', '<style id="s', mod, '">', rule, '</style>'].join('');
 | ||
|                 div.id = mod;
 | ||
|                 (body ? div : fakeBody).innerHTML += style;
 | ||
|                 fakeBody.appendChild(div);
 | ||
|                 if (!body) {
 | ||
|                     fakeBody.style.background = '';
 | ||
|                     fakeBody.style.overflow = 'hidden';
 | ||
|                     docOverflow = docElement.style.overflow;
 | ||
|                     docElement.style.overflow = 'hidden';
 | ||
|                     docElement.appendChild(fakeBody);
 | ||
|                 }
 | ||
| 
 | ||
|                 ret = callback(div, rule);
 | ||
|                 if (!body) {
 | ||
|                     fakeBody.parentNode.removeChild(fakeBody);
 | ||
|                     docElement.style.overflow = docOverflow;
 | ||
|                 } else {
 | ||
|                     div.parentNode.removeChild(div);
 | ||
|                 }
 | ||
| 
 | ||
|                 return !!ret;
 | ||
| 
 | ||
|             },
 | ||
|             _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
 | ||
| 
 | ||
|         if (!is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined')) {
 | ||
|             hasOwnProp = function (object, property) {
 | ||
|                 return _hasOwnProperty.call(object, property);
 | ||
|             };
 | ||
|         }
 | ||
|         else {
 | ||
|             hasOwnProp = function (object, property) {
 | ||
|                 return ((property in object) && is(object.constructor.prototype[property], 'undefined'));
 | ||
|             };
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
|         if (!Function.prototype.bind) {
 | ||
|             Function.prototype.bind = function bind(that) {
 | ||
| 
 | ||
|                 var target = this;
 | ||
| 
 | ||
|                 if (typeof target != "function") {
 | ||
|                     throw new TypeError();
 | ||
|                 }
 | ||
| 
 | ||
|                 var args = slice.call(arguments, 1),
 | ||
|                     bound = function () {
 | ||
| 
 | ||
|                         if (this instanceof bound) {
 | ||
| 
 | ||
|                             var F = function () {
 | ||
|                             };
 | ||
|                             F.prototype = target.prototype;
 | ||
|                             var self = new F();
 | ||
| 
 | ||
|                             var result = target.apply(
 | ||
|                                 self,
 | ||
|                                 args.concat(slice.call(arguments))
 | ||
|                             );
 | ||
|                             if (Object(result) === result) {
 | ||
|                                 return result;
 | ||
|                             }
 | ||
|                             return self;
 | ||
| 
 | ||
|                         } else {
 | ||
| 
 | ||
|                             return target.apply(
 | ||
|                                 that,
 | ||
|                                 args.concat(slice.call(arguments))
 | ||
|                             );
 | ||
| 
 | ||
|                         }
 | ||
| 
 | ||
|                     };
 | ||
| 
 | ||
|                 return bound;
 | ||
|             };
 | ||
|         }
 | ||
| 
 | ||
|         function setCss(str) {
 | ||
|             mStyle.cssText = str;
 | ||
|         }
 | ||
| 
 | ||
|         function setCssAll(str1, str2) {
 | ||
|             return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
 | ||
|         }
 | ||
| 
 | ||
|         function is(obj, type) {
 | ||
|             return typeof obj === type;
 | ||
|         }
 | ||
| 
 | ||
|         function contains(str, substr) {
 | ||
|             return !!~('' + str).indexOf(substr);
 | ||
|         }
 | ||
| 
 | ||
|         function testProps(props, prefixed) {
 | ||
|             for (var i in props) {
 | ||
|                 var prop = props[i];
 | ||
|                 if (!contains(prop, "-") && mStyle[prop] !== undefined) {
 | ||
|                     return prefixed == 'pfx' ? prop : true;
 | ||
|                 }
 | ||
|             }
 | ||
|             return false;
 | ||
|         }
 | ||
| 
 | ||
|         function testDOMProps(props, obj, elem) {
 | ||
|             for (var i in props) {
 | ||
|                 var item = obj[props[i]];
 | ||
|                 if (item !== undefined) {
 | ||
| 
 | ||
|                     if (elem === false) return props[i];
 | ||
| 
 | ||
|                     if (is(item, 'function')) {
 | ||
|                         return item.bind(elem || obj);
 | ||
|                     }
 | ||
| 
 | ||
|                     return item;
 | ||
|                 }
 | ||
|             }
 | ||
|             return false;
 | ||
|         }
 | ||
| 
 | ||
|         function testPropsAll(prop, prefixed, elem) {
 | ||
| 
 | ||
|             var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
 | ||
|                 props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
 | ||
| 
 | ||
|             if (is(prefixed, "string") || is(prefixed, "undefined")) {
 | ||
|                 return testProps(props, prefixed);
 | ||
| 
 | ||
|             } else {
 | ||
|                 props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
 | ||
|                 return testDOMProps(props, prefixed, elem);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         tests['touch'] = function () {
 | ||
|             var bool;
 | ||
| 
 | ||
|             if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
 | ||
|                 bool = true;
 | ||
|             } else {
 | ||
|                 injectElementWithStyles(['@media (', prefixes.join('touch-enabled),('), mod, ')', '{#modernizr{top:9px;position:absolute}}'].join(''), function (node) {
 | ||
|                     bool = node.offsetTop === 9;
 | ||
|                 });
 | ||
|             }
 | ||
| 
 | ||
|             return bool;
 | ||
|         };
 | ||
|         tests['csstransforms3d'] = function () {
 | ||
| 
 | ||
|             var ret = !!testPropsAll('perspective');
 | ||
| 
 | ||
|             if (ret && 'webkitPerspective' in docElement.style) {
 | ||
| 
 | ||
|                 injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function (node, rule) {
 | ||
|                     ret = node.offsetLeft === 9 && node.offsetHeight === 3;
 | ||
|                 });
 | ||
|             }
 | ||
|             return ret;
 | ||
|         };
 | ||
| 
 | ||
| 
 | ||
|         tests['csstransitions'] = function () {
 | ||
|             return testPropsAll('transition');
 | ||
|         };
 | ||
| 
 | ||
| 
 | ||
|         for (var feature in tests) {
 | ||
|             if (hasOwnProp(tests, feature)) {
 | ||
|                 featureName = feature.toLowerCase();
 | ||
|                 Modernizr[featureName] = tests[feature]();
 | ||
| 
 | ||
|                 classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
|         Modernizr.addTest = function (feature, test) {
 | ||
|             if (typeof feature == 'object') {
 | ||
|                 for (var key in feature) {
 | ||
|                     if (hasOwnProp(feature, key)) {
 | ||
|                         Modernizr.addTest(key, feature[key]);
 | ||
|                     }
 | ||
|                 }
 | ||
|             } else {
 | ||
| 
 | ||
|                 feature = feature.toLowerCase();
 | ||
| 
 | ||
|                 if (Modernizr[feature] !== undefined) {
 | ||
|                     return Modernizr;
 | ||
|                 }
 | ||
| 
 | ||
|                 test = typeof test == 'function' ? test() : test;
 | ||
| 
 | ||
|                 if (typeof enableClasses !== "undefined" && enableClasses) {
 | ||
|                     docElement.className += ' ' + (test ? '' : 'no-') + feature;
 | ||
|                 }
 | ||
|                 Modernizr[feature] = test;
 | ||
| 
 | ||
|             }
 | ||
| 
 | ||
|             return Modernizr;
 | ||
|         };
 | ||
| 
 | ||
| 
 | ||
|         setCss('');
 | ||
|         modElem = inputElem = null;
 | ||
| 
 | ||
| 
 | ||
|         Modernizr._version = version;
 | ||
| 
 | ||
|         Modernizr._prefixes = prefixes;
 | ||
|         Modernizr._domPrefixes = domPrefixes;
 | ||
|         Modernizr._cssomPrefixes = cssomPrefixes;
 | ||
| 
 | ||
| 
 | ||
|         Modernizr.testProp = function (prop) {
 | ||
|             return testProps([prop]);
 | ||
|         };
 | ||
| 
 | ||
|         Modernizr.testAllProps = testPropsAll;
 | ||
|         Modernizr.testStyles = injectElementWithStyles;
 | ||
|         Modernizr.prefixed = function (prop, obj, elem) {
 | ||
|             if (!obj) {
 | ||
|                 return testPropsAll(prop, 'pfx');
 | ||
|             } else {
 | ||
|                 return testPropsAll(prop, obj, elem);
 | ||
|             }
 | ||
|         };
 | ||
|         return Modernizr;
 | ||
|     })(window, document);
 | ||
| 
 | ||
|     var fullScreenApi = {
 | ||
|             ok: false,
 | ||
|             is: function () {
 | ||
|                 return false;
 | ||
|             },
 | ||
|             request: function () {
 | ||
|             },
 | ||
|             cancel: function () {
 | ||
|             },
 | ||
|             event: '',
 | ||
|             prefix: ''
 | ||
|         },
 | ||
|         browserPrefixes = 'webkit moz o ms khtml'.split(' ');
 | ||
| 
 | ||
| // check for native support
 | ||
|     if (typeof document.cancelFullScreen != 'undefined') {
 | ||
|         fullScreenApi.ok = true;
 | ||
|     } else {
 | ||
|         // check for fullscreen support by vendor prefix
 | ||
|         for (var i = 0, il = browserPrefixes.length; i < il; i++) {
 | ||
|             fullScreenApi.prefix = browserPrefixes[i];
 | ||
|             if (typeof document[fullScreenApi.prefix + 'CancelFullScreen'] != 'undefined') {
 | ||
|                 fullScreenApi.ok = true;
 | ||
|                 break;
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
| // update methods to do something useful
 | ||
|     if (fullScreenApi.ok) {
 | ||
|         fullScreenApi.event = fullScreenApi.prefix + 'fullscreenchange';
 | ||
|         fullScreenApi.is = function () {
 | ||
|             switch (this.prefix) {
 | ||
|                 case '':
 | ||
|                     return document.fullScreen;
 | ||
|                 case 'webkit':
 | ||
|                     return document.webkitIsFullScreen;
 | ||
|                 default:
 | ||
|                     return document[this.prefix + 'FullScreen'];
 | ||
|             }
 | ||
|         };
 | ||
|         fullScreenApi.request = function (el) {
 | ||
|             return (this.prefix === '') ? el.requestFullScreen() : el[this.prefix + 'RequestFullScreen']();
 | ||
|         };
 | ||
|         fullScreenApi.cancel = function (el) {
 | ||
|             if (!this.is()) {
 | ||
|                 return false;
 | ||
|             }
 | ||
|             return (this.prefix === '') ? document.cancelFullScreen() : document[this.prefix + 'CancelFullScreen']();
 | ||
|         };
 | ||
|     }
 | ||
|     /* Bez v1.0.10-g5ae0136
 | ||
|      * http://github.com/rdallasgray/bez
 | ||
|      *
 | ||
|      * A plugin to convert CSS3 cubic-bezier co-ordinates to jQuery-compatible easing functions
 | ||
|      *
 | ||
|      * With thanks to Nikolay Nemshilov for clarification on the cubic-bezier maths
 | ||
|      * See http://st-on-it.blogspot.com/2011/05/calculating-cubic-bezier-function.html
 | ||
|      *
 | ||
|      * Copyright 2011 Robert Dallas Gray. All rights reserved.
 | ||
|      * Provided under the FreeBSD license: https://github.com/rdallasgray/bez/blob/master/LICENSE.txt
 | ||
|      */
 | ||
|     function bez(coOrdArray) {
 | ||
|         var encodedFuncName = "bez_" + $.makeArray(arguments).join("_").replace(".", "p");
 | ||
|         if (typeof $['easing'][encodedFuncName] !== "function") {
 | ||
|             var polyBez = function (p1, p2) {
 | ||
|                 var A = [null, null],
 | ||
|                     B = [null, null],
 | ||
|                     C = [null, null],
 | ||
|                     bezCoOrd = function (t, ax) {
 | ||
|                         C[ax] = 3 * p1[ax];
 | ||
|                         B[ax] = 3 * (p2[ax] - p1[ax]) - C[ax];
 | ||
|                         A[ax] = 1 - C[ax] - B[ax];
 | ||
|                         return t * (C[ax] + t * (B[ax] + t * A[ax]));
 | ||
|                     },
 | ||
|                     xDeriv = function (t) {
 | ||
|                         return C[0] + t * (2 * B[0] + 3 * A[0] * t);
 | ||
|                     },
 | ||
|                     xForT = function (t) {
 | ||
|                         var x = t, i = 0, z;
 | ||
|                         while (++i < 14) {
 | ||
|                             z = bezCoOrd(x, 0) - t;
 | ||
|                             if (Math.abs(z) < 1e-3) break;
 | ||
|                             x -= z / xDeriv(x);
 | ||
|                         }
 | ||
|                         return x;
 | ||
|                     };
 | ||
|                 return function (t) {
 | ||
|                     return bezCoOrd(xForT(t), 1);
 | ||
|                 }
 | ||
|             };
 | ||
|             $['easing'][encodedFuncName] = function (x, t, b, c, d) {
 | ||
|                 return c * polyBez([coOrdArray[0], coOrdArray[1]], [coOrdArray[2], coOrdArray[3]])(t / d) + b;
 | ||
|             }
 | ||
|         }
 | ||
|         return encodedFuncName;
 | ||
|     }
 | ||
| 
 | ||
|     var $WINDOW = $(window),
 | ||
|         $DOCUMENT = $(document),
 | ||
|         $HTML,
 | ||
|         $BODY,
 | ||
| 
 | ||
|         QUIRKS_FORCE = location.hash.replace('#', '') === 'quirks',
 | ||
|         TRANSFORMS3D = Modernizr.csstransforms3d,
 | ||
|         CSS3 = TRANSFORMS3D && !QUIRKS_FORCE,
 | ||
|         COMPAT = TRANSFORMS3D || document.compatMode === 'CSS1Compat',
 | ||
|         FULLSCREEN = fullScreenApi.ok,
 | ||
| 
 | ||
|         MOBILE = navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i),
 | ||
|         SLOW = !CSS3 || MOBILE,
 | ||
| 
 | ||
|         MS_POINTER = navigator.msPointerEnabled,
 | ||
| 
 | ||
|         WHEEL = "onwheel" in document.createElement("div") ? "wheel" : document.onmousewheel !== undefined ? "mousewheel" : "DOMMouseScroll",
 | ||
| 
 | ||
|         TOUCH_TIMEOUT = 250,
 | ||
|         TRANSITION_DURATION = 300,
 | ||
| 
 | ||
|         SCROLL_LOCK_TIMEOUT = 1400,
 | ||
| 
 | ||
|         AUTOPLAY_INTERVAL = 5000,
 | ||
|         MARGIN = 2,
 | ||
|         THUMB_SIZE = 64,
 | ||
| 
 | ||
|         WIDTH = 500,
 | ||
|         HEIGHT = 333,
 | ||
| 
 | ||
|         STAGE_FRAME_KEY = '$stageFrame',
 | ||
|         NAV_DOT_FRAME_KEY = '$navDotFrame',
 | ||
|         NAV_THUMB_FRAME_KEY = '$navThumbFrame',
 | ||
| 
 | ||
|         AUTO = 'auto',
 | ||
| 
 | ||
|         BEZIER = bez([.1, 0, .25, 1]),
 | ||
| 
 | ||
|         MAX_WIDTH = 1200,
 | ||
| 
 | ||
|         /**
 | ||
|          * Number of thumbnails in slide. Calculated only on setOptions and resize.
 | ||
|          * @type {number}
 | ||
|          */
 | ||
|         thumbsPerSlide = 1,
 | ||
| 
 | ||
|         OPTIONS = {
 | ||
| 
 | ||
|             /**
 | ||
|              * Set width for gallery.
 | ||
|              * Default value - width of first image
 | ||
|              * Number - set value in px
 | ||
|              * String - set value in quotes
 | ||
|              *
 | ||
|              */
 | ||
|             width: null,
 | ||
| 
 | ||
|             /**
 | ||
|              * Set min-width for gallery
 | ||
|              *
 | ||
|              */
 | ||
|             minwidth: null,
 | ||
| 
 | ||
|             /**
 | ||
|              * Set max-width for gallery
 | ||
|              *
 | ||
|              */
 | ||
|             maxwidth: '100%',
 | ||
| 
 | ||
|             /**
 | ||
|              * Set height for gallery
 | ||
|              * Default value - height of first image
 | ||
|              * Number - set value in px
 | ||
|              * String - set value in quotes
 | ||
|              *
 | ||
|              */
 | ||
|             height: null,
 | ||
| 
 | ||
|             /**
 | ||
|              * Set min-height for gallery
 | ||
|              *
 | ||
|              */
 | ||
|             minheight: null,
 | ||
| 
 | ||
|             /**
 | ||
|              * Set max-height for gallery
 | ||
|              *
 | ||
|              */
 | ||
|             maxheight: null,
 | ||
| 
 | ||
|             /**
 | ||
|              * Set proportion ratio for gallery depends of image
 | ||
|              *
 | ||
|              */
 | ||
|             ratio: null, // '16/9' || 500/333 || 1.5
 | ||
| 
 | ||
|             margin: MARGIN,
 | ||
| 
 | ||
|             nav: 'dots', // 'thumbs' || false
 | ||
|             navposition: 'bottom', // 'top'
 | ||
|             navwidth: null,
 | ||
|             thumbwidth: THUMB_SIZE,
 | ||
|             thumbheight: THUMB_SIZE,
 | ||
|             thumbmargin: MARGIN,
 | ||
|             thumbborderwidth: MARGIN,
 | ||
| 
 | ||
|             allowfullscreen: false, // true || 'native'
 | ||
| 
 | ||
|             transition: 'slide', // 'crossfade' || 'dissolve'
 | ||
|             clicktransition: null,
 | ||
|             transitionduration: TRANSITION_DURATION,
 | ||
| 
 | ||
|             captions: true,
 | ||
| 
 | ||
|             startindex: 0,
 | ||
| 
 | ||
|             loop: false,
 | ||
| 
 | ||
|             autoplay: false,
 | ||
|             stopautoplayontouch: true,
 | ||
| 
 | ||
|             keyboard: false,
 | ||
| 
 | ||
|             arrows: true,
 | ||
|             click: true,
 | ||
|             swipe: false,
 | ||
|             trackpad: false,
 | ||
| 
 | ||
|             shuffle: false,
 | ||
| 
 | ||
|             direction: 'ltr', // 'rtl'
 | ||
| 
 | ||
|             shadows: true,
 | ||
| 
 | ||
|             showcaption: true,
 | ||
| 
 | ||
|             /**
 | ||
|              * Set type of thumbnail navigation
 | ||
|              */
 | ||
|             navdir: 'horizontal',
 | ||
| 
 | ||
|             /**
 | ||
|              * Set configuration to show or hide arrows in thumb navigation
 | ||
|              */
 | ||
|             navarrows: true,
 | ||
| 
 | ||
|             /**
 | ||
|              * Set type of navigation. Can be thumbs or slides
 | ||
|              */
 | ||
|             navtype: 'thumbs'
 | ||
| 
 | ||
|         },
 | ||
| 
 | ||
|         KEYBOARD_OPTIONS = {
 | ||
|             left: true,
 | ||
|             right: true,
 | ||
|             down: true,
 | ||
|             up: true,
 | ||
|             space: false,
 | ||
|             home: false,
 | ||
|             end: false
 | ||
|         };
 | ||
| 
 | ||
|     function noop() {
 | ||
|     }
 | ||
| 
 | ||
|     function minMaxLimit(value, min, max) {
 | ||
|         return Math.max(isNaN(min) ? -Infinity : min, Math.min(isNaN(max) ? Infinity : max, value));
 | ||
|     }
 | ||
| 
 | ||
|     function readTransform(css, dir) {
 | ||
|         return css.match(/ma/) && css.match(/-?\d+(?!d)/g)[css.match(/3d/) ?
 | ||
|                 (dir === 'vertical' ? 13 : 12) : (dir === 'vertical' ? 5 : 4)
 | ||
|                 ]
 | ||
|     }
 | ||
| 
 | ||
|     function readPosition($el, dir) {
 | ||
|         if (CSS3) {
 | ||
|             return +readTransform($el.css('transform'), dir);
 | ||
|         } else {
 | ||
|             return +$el.css(dir === 'vertical' ? 'top' : 'left').replace('px', '');
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     function getTranslate(pos, direction) {
 | ||
|         var obj = {};
 | ||
| 
 | ||
|         if (CSS3) {
 | ||
| 
 | ||
|             switch (direction) {
 | ||
|                 case 'vertical':
 | ||
|                     obj.transform = 'translate3d(0, ' + (pos) + 'px,0)';
 | ||
|                     break;
 | ||
|                 case 'list':
 | ||
|                     break;
 | ||
|                 default :
 | ||
|                     obj.transform = 'translate3d(' + (pos) + 'px,0,0)';
 | ||
|                     break;
 | ||
|             }
 | ||
|         } else {
 | ||
|             direction === 'vertical' ?
 | ||
|                 obj.top = pos :
 | ||
|                 obj.left = pos;
 | ||
|         }
 | ||
|         return obj;
 | ||
|     }
 | ||
| 
 | ||
|     function getDuration(time) {
 | ||
|         return {'transition-duration': time + 'ms'};
 | ||
|     }
 | ||
| 
 | ||
|     function unlessNaN(value, alternative) {
 | ||
|         return isNaN(value) ? alternative : value;
 | ||
|     }
 | ||
| 
 | ||
|     function numberFromMeasure(value, measure) {
 | ||
|         return unlessNaN(+String(value).replace(measure || 'px', ''));
 | ||
|     }
 | ||
| 
 | ||
|     function numberFromPercent(value) {
 | ||
|         return /%$/.test(value) ? numberFromMeasure(value, '%') : undefined;
 | ||
|     }
 | ||
| 
 | ||
|     function numberFromWhatever(value, whole) {
 | ||
|         return unlessNaN(numberFromPercent(value) / 100 * whole, numberFromMeasure(value));
 | ||
|     }
 | ||
| 
 | ||
|     function measureIsValid(value) {
 | ||
|         return (!isNaN(numberFromMeasure(value)) || !isNaN(numberFromMeasure(value, '%'))) && value;
 | ||
|     }
 | ||
| 
 | ||
|     function getPosByIndex(index, side, margin, baseIndex) {
 | ||
| 
 | ||
|         return (index - (baseIndex || 0)) * (side + (margin || 0));
 | ||
|     }
 | ||
| 
 | ||
|     function getIndexByPos(pos, side, margin, baseIndex) {
 | ||
|         return -Math.round(pos / (side + (margin || 0)) - (baseIndex || 0));
 | ||
|     }
 | ||
| 
 | ||
|     function bindTransitionEnd($el) {
 | ||
|         var elData = $el.data();
 | ||
| 
 | ||
|         if (elData.tEnd) return;
 | ||
| 
 | ||
|         var el = $el[0],
 | ||
|             transitionEndEvent = {
 | ||
|                 WebkitTransition: 'webkitTransitionEnd',
 | ||
|                 MozTransition: 'transitionend',
 | ||
|                 OTransition: 'oTransitionEnd otransitionend',
 | ||
|                 msTransition: 'MSTransitionEnd',
 | ||
|                 transition: 'transitionend'
 | ||
|             };
 | ||
|         addEvent(el, transitionEndEvent[Modernizr.prefixed('transition')], function (e) {
 | ||
|             elData.tProp && e.propertyName.match(elData.tProp) && elData.onEndFn();
 | ||
|         });
 | ||
|         elData.tEnd = true;
 | ||
|     }
 | ||
| 
 | ||
|     function afterTransition($el, property, fn, time) {
 | ||
|         var ok,
 | ||
|             elData = $el.data();
 | ||
| 
 | ||
|         if (elData) {
 | ||
|             elData.onEndFn = function () {
 | ||
|                 if (ok) return;
 | ||
|                 ok = true;
 | ||
|                 clearTimeout(elData.tT);
 | ||
|                 fn();
 | ||
|             };
 | ||
|             elData.tProp = property;
 | ||
| 
 | ||
|             // Passive call, just in case of fail of native transition-end event
 | ||
|             clearTimeout(elData.tT);
 | ||
|             elData.tT = setTimeout(function () {
 | ||
|                 elData.onEndFn();
 | ||
|             }, time * 1.5);
 | ||
| 
 | ||
|             bindTransitionEnd($el);
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     function stop($el, pos/*, _001*/) {
 | ||
|         var dir = $el.navdir || 'horizontal';
 | ||
|         if ($el.length) {
 | ||
|             var elData = $el.data();
 | ||
|             if (CSS3) {
 | ||
|                 $el.css(getDuration(0));
 | ||
|                 elData.onEndFn = noop;
 | ||
|                 clearTimeout(elData.tT);
 | ||
|             } else {
 | ||
|                 $el.stop();
 | ||
|             }
 | ||
|             var lockedPos = getNumber(pos, function () {
 | ||
|                 return readPosition($el, dir);
 | ||
|             });
 | ||
| 
 | ||
|             $el.css(getTranslate(lockedPos, dir/*, _001*/));//.width(); // `.width()` for reflow
 | ||
|             return lockedPos;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     function getNumber() {
 | ||
|         var number;
 | ||
|         for (var _i = 0, _l = arguments.length; _i < _l; _i++) {
 | ||
|             number = _i ? arguments[_i]() : arguments[_i];
 | ||
|             if (typeof number === 'number') {
 | ||
|                 break;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         return number;
 | ||
|     }
 | ||
| 
 | ||
|     function edgeResistance(pos, edge) {
 | ||
|         return Math.round(pos + ((edge - pos) / 1.5));
 | ||
|     }
 | ||
| 
 | ||
|     function getProtocol() {
 | ||
|         getProtocol.p = getProtocol.p || (location.protocol === 'https:' ? 'https://' : 'http://');
 | ||
|         return getProtocol.p;
 | ||
|     }
 | ||
| 
 | ||
|     function parseHref(href) {
 | ||
|         var a = document.createElement('a');
 | ||
|         a.href = href;
 | ||
|         return a;
 | ||
|     }
 | ||
| 
 | ||
|     function findVideoId(href, forceVideo) {
 | ||
|         if (typeof href !== 'string') return href;
 | ||
|         href = parseHref(href);
 | ||
| 
 | ||
|         var id,
 | ||
|             type;
 | ||
| 
 | ||
|         if (href.host.match(/youtube\.com/) && href.search) {
 | ||
|             //.log();
 | ||
|             id = href.search.split('v=')[1];
 | ||
|             if (id) {
 | ||
|                 var ampersandPosition = id.indexOf('&');
 | ||
|                 if (ampersandPosition !== -1) {
 | ||
|                     id = id.substring(0, ampersandPosition);
 | ||
|                 }
 | ||
|                 type = 'youtube';
 | ||
|             }
 | ||
|         } else if (href.host.match(/youtube\.com|youtu\.be|youtube-nocookie.com/)) {
 | ||
|             id = href.pathname.replace(/^\/(embed\/|v\/)?/, '').replace(/\/.*/, '');
 | ||
|             type = 'youtube';
 | ||
|         } else if (href.host.match(/vimeo\.com/)) {
 | ||
|             type = 'vimeo';
 | ||
|             id = href.pathname.replace(/^\/(video\/)?/, '').replace(/\/.*/, '');
 | ||
|         }
 | ||
| 
 | ||
|         if ((!id || !type) && forceVideo) {
 | ||
|             id = href.href;
 | ||
|             type = 'custom';
 | ||
|         }
 | ||
| 
 | ||
|         return id ? {id: id, type: type, s: href.search.replace(/^\?/, ''), p: getProtocol()} : false;
 | ||
|     }
 | ||
| 
 | ||
|     function getVideoThumbs(dataFrame, data, fotorama) {
 | ||
|         var img, thumb, video = dataFrame.video;
 | ||
|         if (video.type === 'youtube') {
 | ||
|             thumb = getProtocol() + 'img.youtube.com/vi/' + video.id + '/default.jpg';
 | ||
|             img = thumb.replace(/\/default.jpg$/, '/hqdefault.jpg');
 | ||
|             dataFrame.thumbsReady = true;
 | ||
|         } else if (video.type === 'vimeo') {
 | ||
|             $.ajax({
 | ||
|                 url: getProtocol() + 'vimeo.com/api/oembed.json',
 | ||
|                 data: {
 | ||
|                     url: 'https://vimeo.com/' + video.id
 | ||
|                 },
 | ||
|                 dataType: 'jsonp',
 | ||
|                 success: function (json) {
 | ||
|                     dataFrame.thumbsReady = true;
 | ||
|                     updateData(data, {
 | ||
|                         img: json[0].thumbnail_url,
 | ||
|                         thumb: json[0].thumbnail_url
 | ||
|                     }, dataFrame.i, fotorama);
 | ||
|                 }
 | ||
|             });
 | ||
|         } else {
 | ||
|             dataFrame.thumbsReady = true;
 | ||
|         }
 | ||
| 
 | ||
|         return {
 | ||
|             img: img,
 | ||
|             thumb: thumb
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     function updateData(data, _dataFrame, i, fotorama) {
 | ||
|         for (var _i = 0, _l = data.length; _i < _l; _i++) {
 | ||
|             var dataFrame = data[_i];
 | ||
| 
 | ||
|             if (dataFrame.i === i && dataFrame.thumbsReady) {
 | ||
|                 var clear = {videoReady: true};
 | ||
|                 clear[STAGE_FRAME_KEY] = clear[NAV_THUMB_FRAME_KEY] = clear[NAV_DOT_FRAME_KEY] = false;
 | ||
| 
 | ||
|                 fotorama.splice(_i, 1, $.extend(
 | ||
|                     {},
 | ||
|                     dataFrame,
 | ||
|                     clear,
 | ||
|                     _dataFrame
 | ||
|                 ));
 | ||
| 
 | ||
|                 break;
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     function getDataFromHtml($el) {
 | ||
|         var data = [];
 | ||
| 
 | ||
|         function getDataFromImg($img, imgData, checkVideo) {
 | ||
|             var $child = $img.children('img').eq(0),
 | ||
|                 _imgHref = $img.attr('href'),
 | ||
|                 _imgSrc = $img.attr('src'),
 | ||
|                 _thumbSrc = $child.attr('src'),
 | ||
|                 _video = imgData.video,
 | ||
|                 video = checkVideo ? findVideoId(_imgHref, _video === true) : false;
 | ||
| 
 | ||
|             if (video) {
 | ||
|                 _imgHref = false;
 | ||
|             } else {
 | ||
|                 video = _video;
 | ||
|             }
 | ||
| 
 | ||
|             getDimensions($img, $child, $.extend(imgData, {
 | ||
|                 video: video,
 | ||
|                 img: imgData.img || _imgHref || _imgSrc || _thumbSrc,
 | ||
|                 thumb: imgData.thumb || _thumbSrc || _imgSrc || _imgHref
 | ||
|             }));
 | ||
|         }
 | ||
| 
 | ||
|         function getDimensions($img, $child, imgData) {
 | ||
|             var separateThumbFLAG = imgData.thumb && imgData.img !== imgData.thumb,
 | ||
|                 width = numberFromMeasure(imgData.width || $img.attr('width')),
 | ||
|                 height = numberFromMeasure(imgData.height || $img.attr('height'));
 | ||
| 
 | ||
|             $.extend(imgData, {
 | ||
|                 width: width,
 | ||
|                 height: height,
 | ||
|                 thumbratio: getRatio(imgData.thumbratio || (numberFromMeasure(imgData.thumbwidth || ($child && $child.attr('width')) || separateThumbFLAG || width) / numberFromMeasure(imgData.thumbheight || ($child && $child.attr('height')) || separateThumbFLAG || height)))
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         $el.children().each(function () {
 | ||
|             var $this = $(this),
 | ||
|                 dataFrame = optionsToLowerCase($.extend($this.data(), {id: $this.attr('id')}));
 | ||
|             if ($this.is('a, img')) {
 | ||
|                 getDataFromImg($this, dataFrame, true);
 | ||
|             } else if (!$this.is(':empty')) {
 | ||
|                 getDimensions($this, null, $.extend(dataFrame, {
 | ||
|                     html: this,
 | ||
|                     _html: $this.html() // Because of IE
 | ||
|                 }));
 | ||
|             } else return;
 | ||
| 
 | ||
|             data.push(dataFrame);
 | ||
|         });
 | ||
| 
 | ||
|         return data;
 | ||
|     }
 | ||
| 
 | ||
|     function isHidden(el) {
 | ||
|         return el.offsetWidth === 0 && el.offsetHeight === 0;
 | ||
|     }
 | ||
| 
 | ||
|     function isDetached(el) {
 | ||
|         return !$.contains(document.documentElement, el);
 | ||
|     }
 | ||
| 
 | ||
|     function waitFor(test, fn, timeout, i) {
 | ||
|         if (!waitFor.i) {
 | ||
|             waitFor.i = 1;
 | ||
|             waitFor.ii = [true];
 | ||
|         }
 | ||
| 
 | ||
|         i = i || waitFor.i;
 | ||
| 
 | ||
|         if (typeof waitFor.ii[i] === 'undefined') {
 | ||
|             waitFor.ii[i] = true;
 | ||
|         }
 | ||
| 
 | ||
|         if (test()) {
 | ||
|             fn();
 | ||
|         } else {
 | ||
|             waitFor.ii[i] && setTimeout(function () {
 | ||
|                 waitFor.ii[i] && waitFor(test, fn, timeout, i);
 | ||
|             }, timeout || 100);
 | ||
|         }
 | ||
| 
 | ||
|         return waitFor.i++;
 | ||
|     }
 | ||
| 
 | ||
|     waitFor.stop = function (i) {
 | ||
|         waitFor.ii[i] = false;
 | ||
|     };
 | ||
| 
 | ||
|     function fit($el, measuresToFit) {
 | ||
|         var elData = $el.data(),
 | ||
|             measures = elData.measures;
 | ||
| 
 | ||
|         if (measures && (!elData.l ||
 | ||
|             elData.l.W !== measures.width ||
 | ||
|             elData.l.H !== measures.height ||
 | ||
|             elData.l.r !== measures.ratio ||
 | ||
|             elData.l.w !== measuresToFit.w ||
 | ||
|             elData.l.h !== measuresToFit.h)) {
 | ||
| 
 | ||
|             var height = minMaxLimit(measuresToFit.h, 0, measures.height),
 | ||
|                 width = height * measures.ratio;
 | ||
| 
 | ||
|             UTIL.setRatio($el, width, height);
 | ||
| 
 | ||
|             elData.l = {
 | ||
|                 W: measures.width,
 | ||
|                 H: measures.height,
 | ||
|                 r: measures.ratio,
 | ||
|                 w: measuresToFit.w,
 | ||
|                 h: measuresToFit.h
 | ||
|             };
 | ||
|         }
 | ||
| 
 | ||
|         return true;
 | ||
|     }
 | ||
| 
 | ||
|     function setStyle($el, style) {
 | ||
|         var el = $el[0];
 | ||
|         if (el.styleSheet) {
 | ||
|             el.styleSheet.cssText = style;
 | ||
|         } else {
 | ||
|             $el.html(style);
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     function findShadowEdge(pos, min, max, dir) {
 | ||
|         return min === max ? false :
 | ||
|             dir === 'vertical' ?
 | ||
|                 (pos <= min ? 'top' : pos >= max ? 'bottom' : 'top bottom') :
 | ||
|                 (pos <= min ? 'left' : pos >= max ? 'right' : 'left right');
 | ||
|     }
 | ||
| 
 | ||
|     function smartClick($el, fn, _options) {
 | ||
|         _options = _options || {};
 | ||
| 
 | ||
|         $el.each(function () {
 | ||
|             var $this = $(this),
 | ||
|                 thisData = $this.data(),
 | ||
|                 startEvent;
 | ||
| 
 | ||
|             if (thisData.clickOn) return;
 | ||
| 
 | ||
|             thisData.clickOn = true;
 | ||
| 
 | ||
|             $.extend(touch($this, {
 | ||
|                 onStart: function (e) {
 | ||
|                     startEvent = e;
 | ||
|                     (_options.onStart || noop).call(this, e);
 | ||
|                 },
 | ||
|                 onMove: _options.onMove || noop,
 | ||
|                 onTouchEnd: _options.onTouchEnd || noop,
 | ||
|                 onEnd: function (result) {
 | ||
|                     if (result.moved) return;
 | ||
|                     fn.call(this, startEvent);
 | ||
|                 }
 | ||
|             }), {noMove: true});
 | ||
|         });
 | ||
|     }
 | ||
| 
 | ||
|     function div(classes, child) {
 | ||
|         return '<div class="' + classes + '">' + (child || '') + '</div>';
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * Function transforming into valid classname
 | ||
|      * @param className - name of the class
 | ||
|      * @returns {string} - dom format of class name
 | ||
|      */
 | ||
|     function cls(className) {
 | ||
|         return "." + className;
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      *
 | ||
|      * @param {json-object} videoItem Parsed object from data.video item or href from link a in input dates
 | ||
|      * @returns {string} DOM view of video iframe
 | ||
|      */
 | ||
|     function createVideoFrame(videoItem) {
 | ||
|         var frame = '<iframe src="' + videoItem.p + videoItem.type + '.com/embed/' + videoItem.id + '" frameborder="0" allowfullscreen></iframe>';
 | ||
|         return frame;
 | ||
|     }
 | ||
| 
 | ||
| // Fisher–Yates Shuffle
 | ||
| // http://bost.ocks.org/mike/shuffle/
 | ||
|     function shuffle(array) {
 | ||
|         // While there remain elements to shuffle
 | ||
|         var l = array.length;
 | ||
|         while (l) {
 | ||
|             // Pick a remaining element
 | ||
|             var i = Math.floor(Math.random() * l--);
 | ||
| 
 | ||
|             // And swap it with the current element
 | ||
|             var t = array[l];
 | ||
|             array[l] = array[i];
 | ||
|             array[i] = t;
 | ||
|         }
 | ||
| 
 | ||
|         return array;
 | ||
|     }
 | ||
| 
 | ||
|     function clone(array) {
 | ||
|         return Object.prototype.toString.call(array) == '[object Array]'
 | ||
|             && $.map(array, function (frame) {
 | ||
|                 return $.extend({}, frame);
 | ||
|             });
 | ||
|     }
 | ||
| 
 | ||
|     function lockScroll($el, left, top) {
 | ||
|         $el
 | ||
|             .scrollLeft(left || 0)
 | ||
|             .scrollTop(top || 0);
 | ||
|     }
 | ||
| 
 | ||
|     function optionsToLowerCase(options) {
 | ||
|         if (options) {
 | ||
|             var opts = {};
 | ||
|             $.each(options, function (key, value) {
 | ||
|                 opts[key.toLowerCase()] = value;
 | ||
|             });
 | ||
| 
 | ||
|             return opts;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     function getRatio(_ratio) {
 | ||
|         if (!_ratio) return;
 | ||
|         var ratio = +_ratio;
 | ||
|         if (!isNaN(ratio)) {
 | ||
|             return ratio;
 | ||
|         } else {
 | ||
|             ratio = _ratio.split('/');
 | ||
|             return +ratio[0] / +ratio[1] || undefined;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     function addEvent(el, e, fn, bool) {
 | ||
|         if (!e) return;
 | ||
|         el.addEventListener ? el.addEventListener(e, fn, !!bool) : el.attachEvent('on' + e, fn);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      *
 | ||
|      * @param position guess position for navShaft
 | ||
|      * @param restriction object contains min and max values for position
 | ||
|      * @returns {*} filtered value of position
 | ||
|      */
 | ||
|     function validateRestrictions(position, restriction) {
 | ||
|         if (position > restriction.max) {
 | ||
|             position = restriction.max;
 | ||
|         } else {
 | ||
|             if (position < restriction.min) {
 | ||
|                 position = restriction.min;
 | ||
|             }
 | ||
|         }
 | ||
|         return position;
 | ||
|     }
 | ||
| 
 | ||
|     function validateSlidePos(opt, navShaftTouchTail, guessIndex, offsetNav, $guessNavFrame, $navWrap, dir) {
 | ||
|         var position,
 | ||
|             size,
 | ||
|             wrapSize;
 | ||
|         if (dir === 'horizontal') {
 | ||
|             size = opt.thumbwidth;
 | ||
|             wrapSize = $navWrap.width();
 | ||
|         } else {
 | ||
|             size = opt.thumbheight;
 | ||
|             wrapSize = $navWrap.height();
 | ||
|         }
 | ||
|         if ( (size + opt.margin) * (guessIndex + 1) >= (wrapSize - offsetNav) ) {
 | ||
|             if (dir === 'horizontal') {
 | ||
|                 position = -$guessNavFrame.position().left;
 | ||
|             } else {
 | ||
|                 position = -$guessNavFrame.position().top;
 | ||
|             }
 | ||
|         } else {
 | ||
|             if ((size + opt.margin) * (guessIndex) <= Math.abs(offsetNav)) {
 | ||
|                 if (dir === 'horizontal') {
 | ||
|                     position = -$guessNavFrame.position().left + wrapSize - (size + opt.margin);
 | ||
|                 } else {
 | ||
|                     position = -$guessNavFrame.position().top + wrapSize - (size + opt.margin);
 | ||
|                 }
 | ||
|             } else {
 | ||
|                 position = offsetNav;
 | ||
|             }
 | ||
|         }
 | ||
|         position = validateRestrictions(position, navShaftTouchTail);
 | ||
| 
 | ||
|         return position || 0;
 | ||
|     }
 | ||
| 
 | ||
|     function elIsDisabled(el) {
 | ||
|         return !!el.getAttribute('disabled');
 | ||
|     }
 | ||
| 
 | ||
|     function disableAttr(FLAG, disable) {
 | ||
|         if (disable) {
 | ||
|             return {disabled: FLAG};
 | ||
|         } else {
 | ||
|             return {tabindex: FLAG * -1 + '', disabled: FLAG};
 | ||
| 
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     function addEnterUp(el, fn) {
 | ||
|         addEvent(el, 'keyup', function (e) {
 | ||
|             elIsDisabled(el) || e.keyCode == 13 && fn.call(el, e);
 | ||
|         });
 | ||
|     }
 | ||
| 
 | ||
|     function addFocus(el, fn) {
 | ||
|         addEvent(el, 'focus', el.onfocusin = function (e) {
 | ||
|             fn.call(el, e);
 | ||
|         }, true);
 | ||
|     }
 | ||
| 
 | ||
|     function stopEvent(e, stopPropagation) {
 | ||
|         e.preventDefault ? e.preventDefault() : (e.returnValue = false);
 | ||
|         stopPropagation && e.stopPropagation && e.stopPropagation();
 | ||
|     }
 | ||
| 
 | ||
|     function getDirectionSign(forward) {
 | ||
|         return forward ? '>' : '<';
 | ||
|     }
 | ||
| 
 | ||
|     var UTIL = (function () {
 | ||
| 
 | ||
|         function setRatioClass($el, wh, ht) {
 | ||
|             var rateImg = wh / ht;
 | ||
| 
 | ||
|             if (rateImg <= 1) {
 | ||
|                 $el.parent().removeClass(horizontalImageClass);
 | ||
|                 $el.parent().addClass(verticalImageClass);
 | ||
|             } else {
 | ||
|                 $el.parent().removeClass(verticalImageClass);
 | ||
|                 $el.parent().addClass(horizontalImageClass);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         /**
 | ||
|          * Set specific attribute in thumbnail template
 | ||
|          * @param $frame DOM item of specific thumbnail
 | ||
|          * @param value Value which must be setted into specific attribute
 | ||
|          * @param searchAttr Name of attribute where value must be included
 | ||
|          */
 | ||
|         function setThumbAttr($frame, value, searchAttr) {
 | ||
|             var attr = searchAttr;
 | ||
| 
 | ||
|             if (!$frame.attr(attr) && $frame.attr(attr) !== undefined) {
 | ||
|                 $frame.attr(attr, value);
 | ||
|             }
 | ||
| 
 | ||
|             if ($frame.find("[" + attr + "]").length) {
 | ||
|                 $frame.find("[" + attr + "]")
 | ||
|                     .each(function () {
 | ||
|                         $(this).attr(attr, value);
 | ||
|                     });
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         /**
 | ||
|          * Method describe behavior need to render caption on preview or not
 | ||
|          * @param frameItem specific item from data
 | ||
|          * @param isExpected {bool} if items with caption need render them or not
 | ||
|          * @returns {boolean} if true then caption should be rendered
 | ||
|          */
 | ||
|         function isExpectedCaption(frameItem, isExpected, undefined) {
 | ||
|             var expected = false,
 | ||
|                 frameExpected;
 | ||
| 
 | ||
|             frameItem.showCaption === undefined || frameItem.showCaption === true ? frameExpected = true : frameExpected = false;
 | ||
| 
 | ||
|             if (!isExpected) {
 | ||
|                 return false;
 | ||
|             }
 | ||
| 
 | ||
|             if (frameItem.caption && frameExpected) {
 | ||
|                 expected = true;
 | ||
|             }
 | ||
| 
 | ||
|             return expected;
 | ||
|         }
 | ||
| 
 | ||
|         return {
 | ||
|             setRatio: setRatioClass,
 | ||
|             setThumbAttr: setThumbAttr,
 | ||
|             isExpectedCaption: isExpectedCaption
 | ||
|         };
 | ||
| 
 | ||
|     }(UTIL || {}, jQuery));
 | ||
| 
 | ||
|     function slide($el, options) {
 | ||
|         var elData = $el.data(),
 | ||
|             elPos = Math.round(options.pos),
 | ||
|             onEndFn = function () {
 | ||
|                 if (elData && elData.sliding) {
 | ||
|                     elData.sliding = false;
 | ||
|                 }
 | ||
|                 (options.onEnd || noop)();
 | ||
|             };
 | ||
| 
 | ||
|         if (typeof options.overPos !== 'undefined' && options.overPos !== options.pos) {
 | ||
|             elPos = options.overPos;
 | ||
|         }
 | ||
| 
 | ||
|         var translate = $.extend(getTranslate(elPos, options.direction), options.width && {width: options.width}, options.height && {height: options.height});
 | ||
|         if (elData && elData.sliding) {
 | ||
|             elData.sliding = true;
 | ||
|         }
 | ||
| 
 | ||
|         if (CSS3) {
 | ||
|             $el.css($.extend(getDuration(options.time), translate));
 | ||
| 
 | ||
|             if (options.time > 10) {
 | ||
|                 afterTransition($el, 'transform', onEndFn, options.time);
 | ||
|             } else {
 | ||
|                 onEndFn();
 | ||
|             }
 | ||
|         } else {
 | ||
|             $el.stop().animate(translate, options.time, BEZIER, onEndFn);
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     function fade($el1, $el2, $frames, options, fadeStack, chain) {
 | ||
|         var chainedFLAG = typeof chain !== 'undefined';
 | ||
|         if (!chainedFLAG) {
 | ||
|             fadeStack.push(arguments);
 | ||
|             Array.prototype.push.call(arguments, fadeStack.length);
 | ||
|             if (fadeStack.length > 1) return;
 | ||
|         }
 | ||
| 
 | ||
|         $el1 = $el1 || $($el1);
 | ||
|         $el2 = $el2 || $($el2);
 | ||
| 
 | ||
|         var _$el1 = $el1[0],
 | ||
|             _$el2 = $el2[0],
 | ||
|             crossfadeFLAG = options.method === 'crossfade',
 | ||
|             onEndFn = function () {
 | ||
|                 if (!onEndFn.done) {
 | ||
|                     onEndFn.done = true;
 | ||
|                     var args = (chainedFLAG || fadeStack.shift()) && fadeStack.shift();
 | ||
|                     args && fade.apply(this, args);
 | ||
|                     (options.onEnd || noop)(!!args);
 | ||
|                 }
 | ||
|             },
 | ||
|             time = options.time / (chain || 1);
 | ||
| 
 | ||
|         $frames.removeClass(fadeRearClass + ' ' + fadeFrontClass);
 | ||
| 
 | ||
|         $el1
 | ||
|             .stop()
 | ||
|             .addClass(fadeRearClass);
 | ||
|         $el2
 | ||
|             .stop()
 | ||
|             .addClass(fadeFrontClass);
 | ||
| 
 | ||
|         crossfadeFLAG && _$el2 && $el1.fadeTo(0, 0);
 | ||
| 
 | ||
|         $el1.fadeTo(crossfadeFLAG ? time : 0, 1, crossfadeFLAG && onEndFn);
 | ||
|         $el2.fadeTo(time, 0, onEndFn);
 | ||
| 
 | ||
|         (_$el1 && crossfadeFLAG) || _$el2 || onEndFn();
 | ||
|     }
 | ||
| 
 | ||
|     var lastEvent,
 | ||
|         moveEventType,
 | ||
|         preventEvent,
 | ||
|         preventEventTimeout,
 | ||
|         dragDomEl;
 | ||
| 
 | ||
|     function extendEvent(e) {
 | ||
|         var touch = (e.touches || [])[0] || e;
 | ||
|         e._x = touch.pageX || touch.originalEvent.pageX;
 | ||
|         e._y = touch.clientY || touch.originalEvent.clientY;
 | ||
|         e._now = $.now();
 | ||
|     }
 | ||
| 
 | ||
|     function touch($el, options) {
 | ||
|         var el = $el[0],
 | ||
|             tail = {},
 | ||
|             touchEnabledFLAG,
 | ||
|             startEvent,
 | ||
|             $target,
 | ||
|             controlTouch,
 | ||
|             touchFLAG,
 | ||
|             targetIsSelectFLAG,
 | ||
|             targetIsLinkFlag,
 | ||
|             isDisabledSwipe,
 | ||
|             tolerance,
 | ||
|             moved;
 | ||
| 
 | ||
|         function onStart(e) {
 | ||
|             $target = $(e.target);
 | ||
|             tail.checked = targetIsSelectFLAG = targetIsLinkFlag = isDisabledSwipe = moved = false;
 | ||
| 
 | ||
|             if (touchEnabledFLAG
 | ||
|                 || tail.flow
 | ||
|                 || (e.touches && e.touches.length > 1)
 | ||
|                 || e.which > 1
 | ||
|                 || (lastEvent && lastEvent.type !== e.type && preventEvent)
 | ||
|                 || (targetIsSelectFLAG = options.select && $target.is(options.select, el))) return targetIsSelectFLAG;
 | ||
| 
 | ||
|             touchFLAG = e.type === 'touchstart';
 | ||
|             targetIsLinkFlag = $target.is('a, a *', el);
 | ||
|             isDisabledSwipe = $target.hasClass('disableSwipe');
 | ||
|             controlTouch = tail.control;
 | ||
| 
 | ||
|             tolerance = (tail.noMove || tail.noSwipe || controlTouch) ? 16 : !tail.snap ? 4 : 0;
 | ||
| 
 | ||
|             extendEvent(e);
 | ||
| 
 | ||
|             startEvent = lastEvent = e;
 | ||
|             moveEventType = e.type.replace(/down|start/, 'move').replace(/Down/, 'Move');
 | ||
| 
 | ||
|             (options.onStart || noop).call(el, e, {control: controlTouch, $target: $target});
 | ||
| 
 | ||
|             touchEnabledFLAG = tail.flow = true;
 | ||
| 
 | ||
|             if (!isDisabledSwipe && (!touchFLAG || tail.go)) stopEvent(e);
 | ||
|         }
 | ||
| 
 | ||
|         function onMove(e) {
 | ||
|             if ((e.touches && e.touches.length > 1)
 | ||
|                 || (MS_POINTER && !e.isPrimary)
 | ||
|                 || moveEventType !== e.type
 | ||
|                 || !touchEnabledFLAG) {
 | ||
|                 touchEnabledFLAG && onEnd();
 | ||
|                 (options.onTouchEnd || noop)();
 | ||
|                 return;
 | ||
|             }
 | ||
| 
 | ||
|             isDisabledSwipe = $(e.target).hasClass('disableSwipe');
 | ||
| 
 | ||
|             if (isDisabledSwipe) {
 | ||
|                 return;
 | ||
|             }
 | ||
| 
 | ||
|             extendEvent(e);
 | ||
| 
 | ||
|             var xDiff = Math.abs(e._x - startEvent._x), // opt _x → _pageX
 | ||
|                 yDiff = Math.abs(e._y - startEvent._y),
 | ||
|                 xyDiff = xDiff - yDiff,
 | ||
|                 xWin = (tail.go || tail.x || xyDiff >= 0) && !tail.noSwipe,
 | ||
|                 yWin = xyDiff < 0;
 | ||
| 
 | ||
|             if (touchFLAG && !tail.checked) {
 | ||
|                 if (touchEnabledFLAG = xWin) {
 | ||
|                     stopEvent(e);
 | ||
|                 }
 | ||
|             } else {
 | ||
|                 stopEvent(e);
 | ||
|                 if (movedEnough(xDiff,yDiff)) {
 | ||
|                     (options.onMove || noop).call(el, e, {touch: touchFLAG});
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             if (!moved && movedEnough(xDiff, yDiff) && Math.sqrt(Math.pow(xDiff, 2) + Math.pow(yDiff, 2)) > tolerance) {
 | ||
|                 moved = true;
 | ||
|             }
 | ||
| 
 | ||
|             tail.checked = tail.checked || xWin || yWin;
 | ||
|         }
 | ||
| 
 | ||
|         function movedEnough(xDiff, yDiff) {
 | ||
|             return xDiff > yDiff && xDiff > 1.5;
 | ||
|         }
 | ||
| 
 | ||
|         function onEnd(e) {
 | ||
|             (options.onTouchEnd || noop)();
 | ||
| 
 | ||
|             var _touchEnabledFLAG = touchEnabledFLAG;
 | ||
|             tail.control = touchEnabledFLAG = false;
 | ||
| 
 | ||
|             if (_touchEnabledFLAG) {
 | ||
|                 tail.flow = false;
 | ||
|             }
 | ||
| 
 | ||
|             if (!_touchEnabledFLAG || (targetIsLinkFlag && !tail.checked)) return;
 | ||
| 
 | ||
|             e && stopEvent(e);
 | ||
| 
 | ||
|             preventEvent = true;
 | ||
|             clearTimeout(preventEventTimeout);
 | ||
|             preventEventTimeout = setTimeout(function () {
 | ||
|                 preventEvent = false;
 | ||
|             }, 1000);
 | ||
| 
 | ||
|             (options.onEnd || noop).call(el, {
 | ||
|                 moved: moved,
 | ||
|                 $target: $target,
 | ||
|                 control: controlTouch,
 | ||
|                 touch: touchFLAG,
 | ||
|                 startEvent: startEvent,
 | ||
|                 aborted: !e || e.type === 'MSPointerCancel'
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         function onOtherStart() {
 | ||
|             if (tail.flow) return;
 | ||
|             tail.flow = true;
 | ||
|         }
 | ||
| 
 | ||
|         function onOtherEnd() {
 | ||
|             if (!tail.flow) return;
 | ||
|             tail.flow = false;
 | ||
|         }
 | ||
| 
 | ||
|         if (MS_POINTER) {
 | ||
|             addEvent(el, 'MSPointerDown', onStart);
 | ||
|             addEvent(document, 'MSPointerMove', onMove);
 | ||
|             addEvent(document, 'MSPointerCancel', onEnd);
 | ||
|             addEvent(document, 'MSPointerUp', onEnd);
 | ||
|         } else {
 | ||
|             addEvent(el, 'touchstart', onStart);
 | ||
|             addEvent(el, 'touchmove', onMove);
 | ||
|             addEvent(el, 'touchend', onEnd);
 | ||
| 
 | ||
|             addEvent(document, 'touchstart', onOtherStart, true);
 | ||
|             addEvent(document, 'touchend', onOtherEnd);
 | ||
|             addEvent(document, 'touchcancel', onOtherEnd);
 | ||
| 
 | ||
|             $WINDOW.on('scroll', onOtherEnd);
 | ||
| 
 | ||
|             $el.on('mousedown', onStart);
 | ||
|             $DOCUMENT
 | ||
|                 .on('mousemove', onMove)
 | ||
|                 .on('mouseup', onEnd);
 | ||
|         }
 | ||
|         if (Modernizr.touch) {
 | ||
|             dragDomEl = 'a';
 | ||
|         } else {
 | ||
|             dragDomEl = 'div';
 | ||
|         }
 | ||
|         $el.on('click', dragDomEl, function (e) {
 | ||
|             tail.checked && stopEvent(e);
 | ||
|         });
 | ||
| 
 | ||
|         return tail;
 | ||
|     }
 | ||
| 
 | ||
|     function moveOnTouch($el, options) {
 | ||
|         var el = $el[0],
 | ||
|             elData = $el.data(),
 | ||
|             tail = {},
 | ||
|             startCoo,
 | ||
|             coo,
 | ||
|             startElPos,
 | ||
|             moveElPos,
 | ||
|             edge,
 | ||
|             moveTrack,
 | ||
|             startTime,
 | ||
|             endTime,
 | ||
|             min,
 | ||
|             max,
 | ||
|             snap,
 | ||
|             dir,
 | ||
|             slowFLAG,
 | ||
|             controlFLAG,
 | ||
|             moved,
 | ||
|             tracked;
 | ||
| 
 | ||
|         function startTracking(e, noStop) {
 | ||
|             tracked = true;
 | ||
|             startCoo = coo = (dir === 'vertical') ? e._y : e._x;
 | ||
|             startTime = e._now;
 | ||
| 
 | ||
|             moveTrack = [
 | ||
|                 [startTime, startCoo]
 | ||
|             ];
 | ||
| 
 | ||
|             startElPos = moveElPos = tail.noMove || noStop ? 0 : stop($el, (options.getPos || noop)()/*, options._001*/);
 | ||
| 
 | ||
|             (options.onStart || noop).call(el, e);
 | ||
|         }
 | ||
| 
 | ||
|         function onStart(e, result) {
 | ||
|             min = tail.min;
 | ||
|             max = tail.max;
 | ||
|             snap = tail.snap,
 | ||
|                 dir = tail.direction || 'horizontal',
 | ||
|                 $el.navdir = dir;
 | ||
| 
 | ||
|             slowFLAG = e.altKey;
 | ||
|             tracked = moved = false;
 | ||
| 
 | ||
|             controlFLAG = result.control;
 | ||
| 
 | ||
|             if (!controlFLAG && !elData.sliding) {
 | ||
|                 startTracking(e);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function onMove(e, result) {
 | ||
|             if (!tail.noSwipe) {
 | ||
|                 if (!tracked) {
 | ||
|                     startTracking(e);
 | ||
|                 }
 | ||
|                 coo = (dir === 'vertical') ? e._y : e._x;
 | ||
| 
 | ||
|                 moveTrack.push([e._now, coo]);
 | ||
| 
 | ||
|                 moveElPos = startElPos - (startCoo - coo);
 | ||
| 
 | ||
|                 edge = findShadowEdge(moveElPos, min, max, dir);
 | ||
| 
 | ||
|                 if (moveElPos <= min) {
 | ||
|                     moveElPos = edgeResistance(moveElPos, min);
 | ||
|                 } else if (moveElPos >= max) {
 | ||
|                     moveElPos = edgeResistance(moveElPos, max);
 | ||
|                 }
 | ||
| 
 | ||
|                 if (!tail.noMove) {
 | ||
|                     $el.css(getTranslate(moveElPos, dir));
 | ||
|                     if (!moved) {
 | ||
|                         moved = true;
 | ||
|                         // only for mouse
 | ||
|                         result.touch || MS_POINTER || $el.addClass(grabbingClass);
 | ||
|                     }
 | ||
| 
 | ||
|                     (options.onMove || noop).call(el, e, {pos: moveElPos, edge: edge});
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function onEnd(result) {
 | ||
|             if (tail.noSwipe && result.moved) return;
 | ||
| 
 | ||
|             if (!tracked) {
 | ||
|                 startTracking(result.startEvent, true);
 | ||
|             }
 | ||
| 
 | ||
|             result.touch || MS_POINTER || $el.removeClass(grabbingClass);
 | ||
| 
 | ||
|             endTime = $.now();
 | ||
| 
 | ||
|             var _backTimeIdeal = endTime - TOUCH_TIMEOUT,
 | ||
|                 _backTime,
 | ||
|                 _timeDiff,
 | ||
|                 _timeDiffLast,
 | ||
|                 backTime = null,
 | ||
|                 backCoo,
 | ||
|                 virtualPos,
 | ||
|                 limitPos,
 | ||
|                 newPos,
 | ||
|                 overPos,
 | ||
|                 time = TRANSITION_DURATION,
 | ||
|                 speed,
 | ||
|                 friction = options.friction;
 | ||
| 
 | ||
|             for (var _i = moveTrack.length - 1; _i >= 0; _i--) {
 | ||
|                 _backTime = moveTrack[_i][0];
 | ||
|                 _timeDiff = Math.abs(_backTime - _backTimeIdeal);
 | ||
|                 if (backTime === null || _timeDiff < _timeDiffLast) {
 | ||
|                     backTime = _backTime;
 | ||
|                     backCoo = moveTrack[_i][1];
 | ||
|                 } else if (backTime === _backTimeIdeal || _timeDiff > _timeDiffLast) {
 | ||
|                     break;
 | ||
|                 }
 | ||
|                 _timeDiffLast = _timeDiff;
 | ||
|             }
 | ||
| 
 | ||
|             newPos = minMaxLimit(moveElPos, min, max);
 | ||
| 
 | ||
|             var cooDiff = backCoo - coo,
 | ||
|                 forwardFLAG = cooDiff >= 0,
 | ||
|                 timeDiff = endTime - backTime,
 | ||
|                 longTouchFLAG = timeDiff > TOUCH_TIMEOUT,
 | ||
|                 swipeFLAG = !longTouchFLAG && moveElPos !== startElPos && newPos === moveElPos;
 | ||
| 
 | ||
|             if (snap) {
 | ||
|                 newPos = minMaxLimit(Math[swipeFLAG ? (forwardFLAG ? 'floor' : 'ceil') : 'round'](moveElPos / snap) * snap, min, max);
 | ||
|                 min = max = newPos;
 | ||
|             }
 | ||
| 
 | ||
|             if (swipeFLAG && (snap || newPos === moveElPos)) {
 | ||
|                 speed = -(cooDiff / timeDiff);
 | ||
|                 time *= minMaxLimit(Math.abs(speed), options.timeLow, options.timeHigh);
 | ||
|                 virtualPos = Math.round(moveElPos + speed * time / friction);
 | ||
| 
 | ||
|                 if (!snap) {
 | ||
|                     newPos = virtualPos;
 | ||
|                 }
 | ||
| 
 | ||
|                 if (!forwardFLAG && virtualPos > max || forwardFLAG && virtualPos < min) {
 | ||
|                     limitPos = forwardFLAG ? min : max;
 | ||
|                     overPos = virtualPos - limitPos;
 | ||
|                     if (!snap) {
 | ||
|                         newPos = limitPos;
 | ||
|                     }
 | ||
|                     overPos = minMaxLimit(newPos + overPos * .03, limitPos - 50, limitPos + 50);
 | ||
|                     time = Math.abs((moveElPos - overPos) / (speed / friction));
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             time *= slowFLAG ? 10 : 1;
 | ||
| 
 | ||
|             (options.onEnd || noop).call(el, $.extend(result, {
 | ||
|                 moved: result.moved || longTouchFLAG && snap,
 | ||
|                 pos: moveElPos,
 | ||
|                 newPos: newPos,
 | ||
|                 overPos: overPos,
 | ||
|                 time: time,
 | ||
|                 dir: dir
 | ||
|             }));
 | ||
|         }
 | ||
| 
 | ||
|         tail = $.extend(touch(options.$wrap, $.extend({}, options, {
 | ||
|             onStart: onStart,
 | ||
|             onMove: onMove,
 | ||
|             onEnd: onEnd
 | ||
|         })), tail);
 | ||
| 
 | ||
|         return tail;
 | ||
|     }
 | ||
| 
 | ||
|     function wheel($el, options) {
 | ||
|         var el = $el[0],
 | ||
|             lockFLAG,
 | ||
|             lastDirection,
 | ||
|             lastNow,
 | ||
|             tail = {
 | ||
|                 prevent: {}
 | ||
|             };
 | ||
| 
 | ||
|         addEvent(el, WHEEL, function (e) {
 | ||
|             var yDelta = e.wheelDeltaY || -1 * e.deltaY || 0,
 | ||
|                 xDelta = e.wheelDeltaX || -1 * e.deltaX || 0,
 | ||
|                 xWin = Math.abs(xDelta) && !Math.abs(yDelta),
 | ||
|                 direction = getDirectionSign(xDelta < 0),
 | ||
|                 sameDirection = lastDirection === direction,
 | ||
|                 now = $.now(),
 | ||
|                 tooFast = now - lastNow < TOUCH_TIMEOUT;
 | ||
| 
 | ||
|             lastDirection = direction;
 | ||
|             lastNow = now;
 | ||
| 
 | ||
|             if (!xWin || !tail.ok || tail.prevent[direction] && !lockFLAG) {
 | ||
|                 return;
 | ||
|             } else {
 | ||
|                 stopEvent(e, true);
 | ||
|                 if (lockFLAG && sameDirection && tooFast) {
 | ||
|                     return;
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             if (options.shift) {
 | ||
|                 lockFLAG = true;
 | ||
|                 clearTimeout(tail.t);
 | ||
|                 tail.t = setTimeout(function () {
 | ||
|                     lockFLAG = false;
 | ||
|                 }, SCROLL_LOCK_TIMEOUT);
 | ||
|             }
 | ||
| 
 | ||
|             (options.onEnd || noop)(e, options.shift ? direction : xDelta);
 | ||
| 
 | ||
|         });
 | ||
| 
 | ||
|         return tail;
 | ||
|     }
 | ||
| 
 | ||
|     jQuery.Fotorama = function ($fotorama, opts) {
 | ||
|         $HTML = $('html');
 | ||
|         $BODY = $('body');
 | ||
| 
 | ||
|         var that = this,
 | ||
|             stamp = $.now(),
 | ||
|             stampClass = _fotoramaClass + stamp,
 | ||
|             fotorama = $fotorama[0],
 | ||
|             data,
 | ||
|             dataFrameCount = 1,
 | ||
|             fotoramaData = $fotorama.data(),
 | ||
|             size,
 | ||
| 
 | ||
|             $style = $('<style></style>'),
 | ||
| 
 | ||
|             $anchor = $(div(hiddenClass)),
 | ||
|             $wrap = $fotorama.find(cls(wrapClass)),
 | ||
|             $stage = $wrap.find(cls(stageClass)),
 | ||
|             stage = $stage[0],
 | ||
| 
 | ||
|             $stageShaft = $fotorama.find(cls(stageShaftClass)),
 | ||
|             $stageFrame = $(),
 | ||
|             $arrPrev = $fotorama.find(cls(arrPrevClass)),
 | ||
|             $arrNext = $fotorama.find(cls(arrNextClass)),
 | ||
|             $arrs = $fotorama.find(cls(arrClass)),
 | ||
|             $navWrap = $fotorama.find(cls(navWrapClass)),
 | ||
|             $nav = $navWrap.find(cls(navClass)),
 | ||
|             $navShaft = $nav.find(cls(navShaftClass)),
 | ||
|             $navFrame,
 | ||
|             $navDotFrame = $(),
 | ||
|             $navThumbFrame = $(),
 | ||
| 
 | ||
|             stageShaftData = $stageShaft.data(),
 | ||
|             navShaftData = $navShaft.data(),
 | ||
| 
 | ||
|             $thumbBorder = $fotorama.find(cls(thumbBorderClass)),
 | ||
|             $thumbArrLeft = $fotorama.find(cls(thumbArrLeft)),
 | ||
|             $thumbArrRight = $fotorama.find(cls(thumbArrRight)),
 | ||
| 
 | ||
|             $fullscreenIcon = $fotorama.find(cls(fullscreenIconClass)),
 | ||
|             fullscreenIcon = $fullscreenIcon[0],
 | ||
|             $videoPlay = $(div(videoPlayClass)),
 | ||
|             $videoClose = $fotorama.find(cls(videoCloseClass)),
 | ||
|             videoClose = $videoClose[0],
 | ||
| 
 | ||
|             $spinner = $fotorama.find(cls(fotoramaSpinnerClass)),
 | ||
| 
 | ||
|             $videoPlaying,
 | ||
| 
 | ||
|             activeIndex = false,
 | ||
|             activeFrame,
 | ||
|             activeIndexes,
 | ||
|             repositionIndex,
 | ||
|             dirtyIndex,
 | ||
|             lastActiveIndex,
 | ||
|             prevIndex,
 | ||
|             nextIndex,
 | ||
|             nextAutoplayIndex,
 | ||
|             startIndex,
 | ||
| 
 | ||
|             o_loop,
 | ||
|             o_nav,
 | ||
|             o_navThumbs,
 | ||
|             o_navTop,
 | ||
|             o_allowFullScreen,
 | ||
|             o_nativeFullScreen,
 | ||
|             o_fade,
 | ||
|             o_thumbSide,
 | ||
|             o_thumbSide2,
 | ||
|             o_transitionDuration,
 | ||
|             o_transition,
 | ||
|             o_shadows,
 | ||
|             o_rtl,
 | ||
|             o_keyboard,
 | ||
|             lastOptions = {},
 | ||
| 
 | ||
|             measures = {},
 | ||
|             measuresSetFLAG,
 | ||
| 
 | ||
|             stageShaftTouchTail = {},
 | ||
|             stageWheelTail = {},
 | ||
|             navShaftTouchTail = {},
 | ||
|             navWheelTail = {},
 | ||
| 
 | ||
|             scrollTop,
 | ||
|             scrollLeft,
 | ||
| 
 | ||
|             showedFLAG,
 | ||
|             pausedAutoplayFLAG,
 | ||
|             stoppedAutoplayFLAG,
 | ||
| 
 | ||
|             toDeactivate = {},
 | ||
|             toDetach = {},
 | ||
| 
 | ||
|             measuresStash,
 | ||
| 
 | ||
|             touchedFLAG,
 | ||
| 
 | ||
|             hoverFLAG,
 | ||
| 
 | ||
|             navFrameKey,
 | ||
|             stageLeft = 0,
 | ||
| 
 | ||
|             fadeStack = [];
 | ||
| 
 | ||
|         $wrap[STAGE_FRAME_KEY] = $('<div class="' + stageFrameClass + '"></div>');
 | ||
|         $wrap[NAV_THUMB_FRAME_KEY] = $($.Fotorama.jst.thumb());
 | ||
|         $wrap[NAV_DOT_FRAME_KEY] = $($.Fotorama.jst.dots());
 | ||
| 
 | ||
|         toDeactivate[STAGE_FRAME_KEY] = [];
 | ||
|         toDeactivate[NAV_THUMB_FRAME_KEY] = [];
 | ||
|         toDeactivate[NAV_DOT_FRAME_KEY] = [];
 | ||
|         toDetach[STAGE_FRAME_KEY] = {};
 | ||
| 
 | ||
|         $wrap.addClass(CSS3 ? wrapCss3Class : wrapCss2Class);
 | ||
| 
 | ||
|         fotoramaData.fotorama = this;
 | ||
| 
 | ||
|         /**
 | ||
|          * Search video items in incoming data and transform object for video layout.
 | ||
|          *
 | ||
|          */
 | ||
|         function checkForVideo() {
 | ||
|             $.each(data, function (i, dataFrame) {
 | ||
|                 if (!dataFrame.i) {
 | ||
|                     dataFrame.i = dataFrameCount++;
 | ||
|                     var video = findVideoId(dataFrame.video, true);
 | ||
|                     if (video) {
 | ||
|                         var thumbs = {};
 | ||
|                         dataFrame.video = video;
 | ||
|                         if (!dataFrame.img && !dataFrame.thumb) {
 | ||
|                             thumbs = getVideoThumbs(dataFrame, data, that);
 | ||
|                         } else {
 | ||
|                             dataFrame.thumbsReady = true;
 | ||
|                         }
 | ||
|                         updateData(data, {img: thumbs.img, thumb: thumbs.thumb}, dataFrame.i, that);
 | ||
|                     }
 | ||
|                 }
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         /**
 | ||
|          * Checks if current media object is YouTube or Vimeo video stream
 | ||
|          * @returns {boolean}
 | ||
|          */
 | ||
|         function isVideo() {
 | ||
|             return $((that.activeFrame || {}).$stageFrame || {}).hasClass('fotorama-video-container');
 | ||
|         }
 | ||
| 
 | ||
|         function allowKey(key) {
 | ||
|             return o_keyboard[key];
 | ||
|         }
 | ||
| 
 | ||
|         function setStagePosition() {
 | ||
|             if ($stage !== undefined) {
 | ||
| 
 | ||
|                 if (opts.navdir == 'vertical') {
 | ||
|                     var padding = opts.thumbwidth + opts.thumbmargin;
 | ||
| 
 | ||
|                     $stage.css('left', padding);
 | ||
|                     $arrNext.css('right', padding);
 | ||
|                     $fullscreenIcon.css('right', padding);
 | ||
|                     $wrap.css('width', $wrap.css('width') + padding);
 | ||
|                     $stageShaft.css('max-width', $wrap.width() - padding);
 | ||
|                 } else {
 | ||
|                     $stage.css('left', '');
 | ||
|                     $arrNext.css('right', '');
 | ||
|                     $fullscreenIcon.css('right', '');
 | ||
|                     $wrap.css('width', $wrap.css('width') + padding);
 | ||
|                     $stageShaft.css('max-width', '');
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function bindGlobalEvents(FLAG) {
 | ||
|             var keydownCommon = 'keydown.' + _fotoramaClass,
 | ||
|                 localStamp = _fotoramaClass + stamp,
 | ||
|                 keydownLocal = 'keydown.' + localStamp,
 | ||
|                 keyupLocal = 'keyup.' + localStamp,
 | ||
|                 resizeLocal = 'resize.' + localStamp + ' ' + 'orientationchange.' + localStamp,
 | ||
|                 showParams;
 | ||
| 
 | ||
|             if (FLAG) {
 | ||
|                 $DOCUMENT
 | ||
|                     .on(keydownLocal, function (e) {
 | ||
|                         var catched,
 | ||
|                             index;
 | ||
| 
 | ||
|                         if ($videoPlaying && e.keyCode === 27) {
 | ||
|                             catched = true;
 | ||
|                             unloadVideo($videoPlaying, true, true);
 | ||
|                         } else if (that.fullScreen || (opts.keyboard && !that.index)) {
 | ||
|                             if (e.keyCode === 27) {
 | ||
|                                 catched = true;
 | ||
|                                 that.cancelFullScreen();
 | ||
|                             } else if ((e.shiftKey && e.keyCode === 32 && allowKey('space')) || (!e.altKey && !e.metaKey && e.keyCode === 37 && allowKey('left')) || (e.keyCode === 38 && allowKey('up') && $(':focus').attr('data-gallery-role'))) {
 | ||
|                                 that.longPress.progress();
 | ||
|                                 index = '<';
 | ||
|                             } else if ((e.keyCode === 32 && allowKey('space')) || (!e.altKey && !e.metaKey && e.keyCode === 39 && allowKey('right')) || (e.keyCode === 40 && allowKey('down') && $(':focus').attr('data-gallery-role'))) {
 | ||
|                                 that.longPress.progress();
 | ||
|                                 index = '>';
 | ||
|                             } else if (e.keyCode === 36 && allowKey('home')) {
 | ||
|                                 that.longPress.progress();
 | ||
|                                 index = '<<';
 | ||
|                             } else if (e.keyCode === 35 && allowKey('end')) {
 | ||
|                                 that.longPress.progress();
 | ||
|                                 index = '>>';
 | ||
|                             }
 | ||
|                         }
 | ||
| 
 | ||
|                         (catched || index) && stopEvent(e);
 | ||
|                         showParams = {index: index, slow: e.altKey, user: true};
 | ||
|                         index && (that.longPress.inProgress ?
 | ||
|                             that.showWhileLongPress(showParams) :
 | ||
|                             that.show(showParams));
 | ||
|                     });
 | ||
| 
 | ||
|                 if (FLAG) {
 | ||
|                     $DOCUMENT
 | ||
|                         .on(keyupLocal, function (e) {
 | ||
|                             if (that.longPress.inProgress) {
 | ||
|                                 that.showEndLongPress({user: true});
 | ||
|                             }
 | ||
|                             that.longPress.reset();
 | ||
|                         });
 | ||
|                 }
 | ||
| 
 | ||
|                 if (!that.index) {
 | ||
|                     $DOCUMENT
 | ||
|                         .off(keydownCommon)
 | ||
|                         .on(keydownCommon, 'textarea, input, select', function (e) {
 | ||
|                             !$BODY.hasClass(_fullscreenClass) && e.stopPropagation();
 | ||
|                         });
 | ||
|                 }
 | ||
| 
 | ||
|                 $WINDOW.on(resizeLocal, that.resize);
 | ||
|             } else {
 | ||
|                 $DOCUMENT.off(keydownLocal);
 | ||
|                 $WINDOW.off(resizeLocal);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function appendElements(FLAG) {
 | ||
|             if (FLAG === appendElements.f) return;
 | ||
| 
 | ||
|             if (FLAG) {
 | ||
|                 $fotorama
 | ||
|                     .addClass(_fotoramaClass + ' ' + stampClass)
 | ||
|                     .before($anchor)
 | ||
|                     .before($style);
 | ||
|                 addInstance(that);
 | ||
|             } else {
 | ||
|                 $anchor.detach();
 | ||
|                 $style.detach();
 | ||
|                 $fotorama
 | ||
|                     .html(fotoramaData.urtext)
 | ||
|                     .removeClass(stampClass);
 | ||
| 
 | ||
|                 hideInstance(that);
 | ||
|             }
 | ||
| 
 | ||
|             bindGlobalEvents(FLAG);
 | ||
|             appendElements.f = FLAG;
 | ||
|         }
 | ||
| 
 | ||
|         /**
 | ||
|          * Set and install data from incoming @param {JSON} options or takes data attr from data-"name"=... values.
 | ||
|          */
 | ||
|         function setData() {
 | ||
|             data = that.data = data || clone(opts.data) || getDataFromHtml($fotorama);
 | ||
|             size = that.size = data.length;
 | ||
| 
 | ||
|             ready.ok && opts.shuffle && shuffle(data);
 | ||
| 
 | ||
|             checkForVideo();
 | ||
| 
 | ||
|             activeIndex = limitIndex(activeIndex);
 | ||
| 
 | ||
|             size && appendElements(true);
 | ||
|         }
 | ||
| 
 | ||
|         function stageNoMove() {
 | ||
|             var _noMove = size < 2 || $videoPlaying;
 | ||
|             stageShaftTouchTail.noMove = _noMove || o_fade;
 | ||
|             stageShaftTouchTail.noSwipe = _noMove || !opts.swipe;
 | ||
| 
 | ||
|             !o_transition && $stageShaft.toggleClass(grabClass, !opts.click && !stageShaftTouchTail.noMove && !stageShaftTouchTail.noSwipe);
 | ||
|             MS_POINTER && $wrap.toggleClass(wrapPanYClass, !stageShaftTouchTail.noSwipe);
 | ||
|         }
 | ||
| 
 | ||
|         function setAutoplayInterval(interval) {
 | ||
|             if (interval === true) interval = '';
 | ||
|             opts.autoplay = Math.max(+interval || AUTOPLAY_INTERVAL, o_transitionDuration * 1.5);
 | ||
|         }
 | ||
| 
 | ||
|         function updateThumbArrow(opt) {
 | ||
|             if (opt.navarrows && opt.nav === 'thumbs') {
 | ||
|                 $thumbArrLeft.show();
 | ||
|                 $thumbArrRight.show();
 | ||
|             } else {
 | ||
|                 $thumbArrLeft.hide();
 | ||
|                 $thumbArrRight.hide();
 | ||
|             }
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|         function getThumbsInSlide($el, opts) {
 | ||
|             return Math.floor($wrap.width() / (opts.thumbwidth + opts.thumbmargin));
 | ||
|         }
 | ||
| 
 | ||
|         /**
 | ||
|          * Options on the fly
 | ||
|          * */
 | ||
|         function setOptions() {
 | ||
|             if (!opts.nav || opts.nav === 'dots') {
 | ||
|                 opts.navdir = 'horizontal'
 | ||
|             }
 | ||
| 
 | ||
|             that.options = opts = optionsToLowerCase(opts);
 | ||
|             thumbsPerSlide = getThumbsInSlide($wrap, opts);
 | ||
| 
 | ||
|             o_fade = (opts.transition === 'crossfade' || opts.transition === 'dissolve');
 | ||
| 
 | ||
|             o_loop = opts.loop && (size > 2 || (o_fade && (!o_transition || o_transition !== 'slide')));
 | ||
| 
 | ||
|             o_transitionDuration = +opts.transitionduration || TRANSITION_DURATION;
 | ||
| 
 | ||
|             o_rtl = opts.direction === 'rtl';
 | ||
| 
 | ||
|             o_keyboard = $.extend({}, opts.keyboard && KEYBOARD_OPTIONS, opts.keyboard);
 | ||
|             updateThumbArrow(opts);
 | ||
|             var classes = {add: [], remove: []};
 | ||
| 
 | ||
|             function addOrRemoveClass(FLAG, value) {
 | ||
|                 classes[FLAG ? 'add' : 'remove'].push(value);
 | ||
|             }
 | ||
| 
 | ||
|             if (size > 1) {
 | ||
|                 o_nav = opts.nav;
 | ||
|                 o_navTop = opts.navposition === 'top';
 | ||
|                 classes.remove.push(selectClass);
 | ||
| 
 | ||
|                 $arrs.toggle(!!opts.arrows);
 | ||
|             } else {
 | ||
|                 o_nav = false;
 | ||
|                 $arrs.hide();
 | ||
|             }
 | ||
| 
 | ||
|             arrsUpdate();
 | ||
|             stageWheelUpdate();
 | ||
|             thumbArrUpdate();
 | ||
|             if (opts.autoplay) setAutoplayInterval(opts.autoplay);
 | ||
| 
 | ||
|             o_thumbSide = numberFromMeasure(opts.thumbwidth) || THUMB_SIZE;
 | ||
|             o_thumbSide2 = numberFromMeasure(opts.thumbheight) || THUMB_SIZE;
 | ||
| 
 | ||
|             stageWheelTail.ok = navWheelTail.ok = opts.trackpad && !SLOW;
 | ||
| 
 | ||
|             stageNoMove();
 | ||
| 
 | ||
|             extendMeasures(opts, [measures]);
 | ||
| 
 | ||
|             o_navThumbs = o_nav === 'thumbs';
 | ||
| 
 | ||
|             if ($navWrap.filter(':hidden') && !!o_nav) {
 | ||
|                 $navWrap.show();
 | ||
|             }
 | ||
|             if (o_navThumbs) {
 | ||
|                 frameDraw(size, 'navThumb');
 | ||
| 
 | ||
|                 $navFrame = $navThumbFrame;
 | ||
|                 navFrameKey = NAV_THUMB_FRAME_KEY;
 | ||
| 
 | ||
|                 setStyle($style, $.Fotorama.jst.style({
 | ||
|                     w: o_thumbSide,
 | ||
|                     h: o_thumbSide2,
 | ||
|                     b: opts.thumbborderwidth,
 | ||
|                     m: opts.thumbmargin,
 | ||
|                     s: stamp,
 | ||
|                     q: !COMPAT
 | ||
|                 }));
 | ||
| 
 | ||
|                 $nav
 | ||
|                     .addClass(navThumbsClass)
 | ||
|                     .removeClass(navDotsClass);
 | ||
|             } else if (o_nav === 'dots') {
 | ||
|                 frameDraw(size, 'navDot');
 | ||
| 
 | ||
|                 $navFrame = $navDotFrame;
 | ||
|                 navFrameKey = NAV_DOT_FRAME_KEY;
 | ||
| 
 | ||
|                 $nav
 | ||
|                     .addClass(navDotsClass)
 | ||
|                     .removeClass(navThumbsClass);
 | ||
|             } else {
 | ||
|                 $navWrap.hide();
 | ||
|                 o_nav = false;
 | ||
|                 $nav.removeClass(navThumbsClass + ' ' + navDotsClass);
 | ||
|             }
 | ||
| 
 | ||
|             if (o_nav) {
 | ||
|                 if (o_navTop) {
 | ||
|                     $navWrap.insertBefore($stage);
 | ||
|                 } else {
 | ||
|                     $navWrap.insertAfter($stage);
 | ||
|                 }
 | ||
|                 frameAppend.nav = false;
 | ||
| 
 | ||
|                 frameAppend($navFrame, $navShaft, 'nav');
 | ||
|             }
 | ||
| 
 | ||
|             o_allowFullScreen = opts.allowfullscreen;
 | ||
| 
 | ||
|             if (o_allowFullScreen) {
 | ||
|                 $fullscreenIcon.prependTo($stage);
 | ||
|                 o_nativeFullScreen = FULLSCREEN && o_allowFullScreen === 'native';
 | ||
|             } else {
 | ||
|                 $fullscreenIcon.detach();
 | ||
|                 o_nativeFullScreen = false;
 | ||
|             }
 | ||
| 
 | ||
|             addOrRemoveClass(o_fade, wrapFadeClass);
 | ||
|             addOrRemoveClass(!o_fade, wrapSlideClass);
 | ||
|             addOrRemoveClass(!opts.captions, wrapNoCaptionsClass);
 | ||
|             addOrRemoveClass(o_rtl, wrapRtlClass);
 | ||
|             addOrRemoveClass(opts.arrows, wrapToggleArrowsClass);
 | ||
| 
 | ||
|             o_shadows = opts.shadows && !SLOW;
 | ||
|             addOrRemoveClass(!o_shadows, wrapNoShadowsClass);
 | ||
| 
 | ||
|             $wrap
 | ||
|                 .addClass(classes.add.join(' '))
 | ||
|                 .removeClass(classes.remove.join(' '));
 | ||
| 
 | ||
|             lastOptions = $.extend({}, opts);
 | ||
|             setStagePosition();
 | ||
|         }
 | ||
| 
 | ||
|         function normalizeIndex(index) {
 | ||
|             return index < 0 ? (size + (index % size)) % size : index >= size ? index % size : index;
 | ||
|         }
 | ||
| 
 | ||
|         function limitIndex(index) {
 | ||
|             return minMaxLimit(index, 0, size - 1);
 | ||
|         }
 | ||
| 
 | ||
|         function edgeIndex(index) {
 | ||
|             return o_loop ? normalizeIndex(index) : limitIndex(index);
 | ||
|         }
 | ||
| 
 | ||
|         function getPrevIndex(index) {
 | ||
|             return index > 0 || o_loop ? index - 1 : false;
 | ||
|         }
 | ||
| 
 | ||
|         function getNextIndex(index) {
 | ||
|             return index < size - 1 || o_loop ? index + 1 : false;
 | ||
|         }
 | ||
| 
 | ||
|         function setStageShaftMinmaxAndSnap() {
 | ||
|             stageShaftTouchTail.min = o_loop ? -Infinity : -getPosByIndex(size - 1, measures.w, opts.margin, repositionIndex);
 | ||
|             stageShaftTouchTail.max = o_loop ? Infinity : -getPosByIndex(0, measures.w, opts.margin, repositionIndex);
 | ||
|             stageShaftTouchTail.snap = measures.w + opts.margin;
 | ||
|         }
 | ||
| 
 | ||
|         function setNavShaftMinMax() {
 | ||
| 
 | ||
|             var isVerticalDir = (opts.navdir === 'vertical');
 | ||
|             var param = isVerticalDir ? $navShaft.height() : $navShaft.width();
 | ||
|             var mainParam = isVerticalDir ? measures.h : measures.nw;
 | ||
|             navShaftTouchTail.min = Math.min(0, mainParam - param);
 | ||
|             navShaftTouchTail.max = 0;
 | ||
|             navShaftTouchTail.direction = opts.navdir;
 | ||
|             $navShaft.toggleClass(grabClass, !(navShaftTouchTail.noMove = navShaftTouchTail.min === navShaftTouchTail.max));
 | ||
|         }
 | ||
| 
 | ||
|         function eachIndex(indexes, type, fn) {
 | ||
|             if (typeof indexes === 'number') {
 | ||
|                 indexes = new Array(indexes);
 | ||
|                 var rangeFLAG = true;
 | ||
|             }
 | ||
|             return $.each(indexes, function (i, index) {
 | ||
|                 if (rangeFLAG) index = i;
 | ||
|                 if (typeof index === 'number') {
 | ||
|                     var dataFrame = data[normalizeIndex(index)];
 | ||
| 
 | ||
|                     if (dataFrame) {
 | ||
|                         var key = '$' + type + 'Frame',
 | ||
|                             $frame = dataFrame[key];
 | ||
| 
 | ||
|                         fn.call(this, i, index, dataFrame, $frame, key, $frame && $frame.data());
 | ||
|                     }
 | ||
|                 }
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         function setMeasures(width, height, ratio, index) {
 | ||
|             if (!measuresSetFLAG || (measuresSetFLAG === '*' && index === startIndex)) {
 | ||
| 
 | ||
|                 width = measureIsValid(opts.width) || measureIsValid(width) || WIDTH;
 | ||
|                 height = measureIsValid(opts.height) || measureIsValid(height) || HEIGHT;
 | ||
|                 that.resize({
 | ||
|                     width: width,
 | ||
|                     ratio: opts.ratio || ratio || width / height
 | ||
|                 }, 0, index !== startIndex && '*');
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function loadImg(indexes, type, specialMeasures, again) {
 | ||
| 
 | ||
|             eachIndex(indexes, type, function (i, index, dataFrame, $frame, key, frameData) {
 | ||
| 
 | ||
|                 if (!$frame) return;
 | ||
| 
 | ||
|                 var fullFLAG = that.fullScreen && !frameData.$full && type === 'stage';
 | ||
| 
 | ||
|                 if (frameData.$img && !again && !fullFLAG) return;
 | ||
| 
 | ||
|                 var img = new Image(),
 | ||
|                     $img = $(img),
 | ||
|                     imgData = $img.data();
 | ||
| 
 | ||
|                 frameData[fullFLAG ? '$full' : '$img'] = $img;
 | ||
| 
 | ||
|                 var srcKey = type === 'stage' ? (fullFLAG ? 'full' : 'img') : 'thumb',
 | ||
|                     src = dataFrame[srcKey],
 | ||
|                     dummy = fullFLAG ? dataFrame['img'] : dataFrame[type === 'stage' ? 'thumb' : 'img'];
 | ||
| 
 | ||
|                 if (type === 'navThumb') $frame = frameData.$wrap;
 | ||
| 
 | ||
|                 function triggerTriggerEvent(event) {
 | ||
|                     var _index = normalizeIndex(index);
 | ||
|                     triggerEvent(event, {
 | ||
|                         index: _index,
 | ||
|                         src: src,
 | ||
|                         frame: data[_index]
 | ||
|                     });
 | ||
|                 }
 | ||
| 
 | ||
|                 function error() {
 | ||
|                     $img.remove();
 | ||
| 
 | ||
|                     $.Fotorama.cache[src] = 'error';
 | ||
| 
 | ||
|                     if ((!dataFrame.html || type !== 'stage') && dummy && dummy !== src) {
 | ||
|                         dataFrame[srcKey] = src = dummy;
 | ||
|                         frameData.$full = null;
 | ||
|                         loadImg([index], type, specialMeasures, true);
 | ||
|                     } else {
 | ||
|                         if (src && !dataFrame.html && !fullFLAG) {
 | ||
|                             $frame
 | ||
|                                 .trigger('f:error')
 | ||
|                                 .removeClass(loadingClass)
 | ||
|                                 .addClass(errorClass);
 | ||
| 
 | ||
|                             triggerTriggerEvent('error');
 | ||
|                         } else if (type === 'stage') {
 | ||
|                             $frame
 | ||
|                                 .trigger('f:load')
 | ||
|                                 .removeClass(loadingClass + ' ' + errorClass)
 | ||
|                                 .addClass(loadedClass);
 | ||
| 
 | ||
|                             triggerTriggerEvent('load');
 | ||
|                             setMeasures();
 | ||
|                         }
 | ||
| 
 | ||
|                         frameData.state = 'error';
 | ||
| 
 | ||
|                         if (size > 1 && data[index] === dataFrame && !dataFrame.html && !dataFrame.deleted && !dataFrame.video && !fullFLAG) {
 | ||
|                             dataFrame.deleted = true;
 | ||
|                             that.splice(index, 1);
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
| 
 | ||
|                 function loaded() {
 | ||
|                     $.Fotorama.measures[src] = imgData.measures = $.Fotorama.measures[src] || {
 | ||
|                             width: img.width,
 | ||
|                             height: img.height,
 | ||
|                             ratio: img.width / img.height
 | ||
|                         };
 | ||
| 
 | ||
|                     setMeasures(imgData.measures.width, imgData.measures.height, imgData.measures.ratio, index);
 | ||
| 
 | ||
|                     $img
 | ||
|                         .off('load error')
 | ||
|                         .addClass('' + (fullFLAG ? imgFullClass: imgClass))
 | ||
|                         .attr('aria-hidden', 'false')
 | ||
|                         .prependTo($frame);
 | ||
| 
 | ||
|                     if ($frame.hasClass(stageFrameClass) && !$frame.hasClass(videoContainerClass)) {
 | ||
|                         $frame.attr("href", $img.attr("src"));
 | ||
|                     }
 | ||
| 
 | ||
|                     fit($img, (
 | ||
|                             $.isFunction(specialMeasures) ? specialMeasures() : specialMeasures) || measures);
 | ||
| 
 | ||
|                     $.Fotorama.cache[src] = frameData.state = 'loaded';
 | ||
| 
 | ||
|                     setTimeout(function () {
 | ||
|                         $frame
 | ||
|                             .trigger('f:load')
 | ||
|                             .removeClass(loadingClass + ' ' + errorClass)
 | ||
|                             .addClass(loadedClass + ' ' + (fullFLAG ? loadedFullClass : loadedImgClass));
 | ||
| 
 | ||
|                         if (type === 'stage') {
 | ||
|                             triggerTriggerEvent('load');
 | ||
|                         } else if (dataFrame.thumbratio === AUTO || !dataFrame.thumbratio && opts.thumbratio === AUTO) {
 | ||
|                             // danger! reflow for all thumbnails
 | ||
|                             dataFrame.thumbratio = imgData.measures.ratio;
 | ||
|                             reset();
 | ||
|                         }
 | ||
|                     }, 0);
 | ||
|                 }
 | ||
| 
 | ||
|                 if (!src) {
 | ||
|                     error();
 | ||
|                     return;
 | ||
|                 }
 | ||
| 
 | ||
|                 function waitAndLoad() {
 | ||
|                     var _i = 10;
 | ||
|                     waitFor(function () {
 | ||
|                         return !touchedFLAG || !_i-- && !SLOW;
 | ||
|                     }, function () {
 | ||
|                         loaded();
 | ||
|                     });
 | ||
|                 }
 | ||
| 
 | ||
|                 if (!$.Fotorama.cache[src]) {
 | ||
|                     $.Fotorama.cache[src] = '*';
 | ||
| 
 | ||
|                     $img
 | ||
|                         .on('load', waitAndLoad)
 | ||
|                         .on('error', error);
 | ||
|                 } else {
 | ||
|                     (function justWait() {
 | ||
|                         if ($.Fotorama.cache[src] === 'error') {
 | ||
|                             error();
 | ||
|                         } else if ($.Fotorama.cache[src] === 'loaded') {
 | ||
|                             setTimeout(waitAndLoad, 0);
 | ||
|                         } else {
 | ||
|                             setTimeout(justWait, 100);
 | ||
|                         }
 | ||
|                     })();
 | ||
|                 }
 | ||
| 
 | ||
|                 frameData.state = '';
 | ||
|                 img.src = src;
 | ||
| 
 | ||
|                 if (frameData.data.caption) {
 | ||
|                     img.alt = frameData.data.caption || "";
 | ||
|                 }
 | ||
| 
 | ||
|                 if (frameData.data.full) {
 | ||
|                     $(img).data('original', frameData.data.full);
 | ||
|                 }
 | ||
| 
 | ||
|                 if (UTIL.isExpectedCaption(dataFrame, opts.showcaption)) {
 | ||
|                     $(img).attr('aria-labelledby', dataFrame.labelledby);
 | ||
|                 }
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         function updateFotoramaState() {
 | ||
|             var $frame = activeFrame[STAGE_FRAME_KEY];
 | ||
| 
 | ||
|             if ($frame && !$frame.data().state) {
 | ||
|                 $spinner.addClass(spinnerShowClass);
 | ||
|                 $frame.on('f:load f:error', function () {
 | ||
|                     $frame.off('f:load f:error');
 | ||
|                     $spinner.removeClass(spinnerShowClass);
 | ||
|                 });
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function addNavFrameEvents(frame) {
 | ||
|             addEnterUp(frame, onNavFrameClick);
 | ||
|             addFocus(frame, function () {
 | ||
| 
 | ||
|                 setTimeout(function () {
 | ||
|                     lockScroll($nav);
 | ||
|                 }, 0);
 | ||
|                 slideNavShaft({time: o_transitionDuration, guessIndex: $(this).data().eq, minMax: navShaftTouchTail});
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         function frameDraw(indexes, type) {
 | ||
|             eachIndex(indexes, type, function (i, index, dataFrame, $frame, key, frameData) {
 | ||
|                 if ($frame) return;
 | ||
| 
 | ||
|                 $frame = dataFrame[key] = $wrap[key].clone();
 | ||
|                 frameData = $frame.data();
 | ||
|                 frameData.data = dataFrame;
 | ||
|                 var frame = $frame[0],
 | ||
|                     labelledbyValue = "labelledby" + $.now();
 | ||
| 
 | ||
|                 if (type === 'stage') {
 | ||
| 
 | ||
|                     if (dataFrame.html) {
 | ||
|                         $('<div class="' + htmlClass + '"></div>')
 | ||
|                             .append(
 | ||
|                             dataFrame._html ? $(dataFrame.html)
 | ||
|                                 .removeAttr('id')
 | ||
|                                 .html(dataFrame._html) // Because of IE
 | ||
|                                 : dataFrame.html
 | ||
|                         )
 | ||
|                             .appendTo($frame);
 | ||
|                     }
 | ||
| 
 | ||
|                     if (dataFrame.id) {
 | ||
|                         labelledbyValue = dataFrame.id || labelledbyValue;
 | ||
|                     }
 | ||
|                     dataFrame.labelledby = labelledbyValue;
 | ||
| 
 | ||
|                     if (UTIL.isExpectedCaption(dataFrame, opts.showcaption)) {
 | ||
|                         $($.Fotorama.jst.frameCaption({
 | ||
|                             caption: dataFrame.caption,
 | ||
|                             labelledby: labelledbyValue
 | ||
|                         })).appendTo($frame);
 | ||
|                     }
 | ||
| 
 | ||
|                     dataFrame.video && $frame
 | ||
|                         .addClass(stageFrameVideoClass)
 | ||
|                         .append($videoPlay.clone());
 | ||
| 
 | ||
|                     // This solves tabbing problems
 | ||
|                     addFocus(frame, function (e) {
 | ||
|                         setTimeout(function () {
 | ||
|                             lockScroll($stage);
 | ||
|                         }, 0);
 | ||
|                         clickToShow({index: frameData.eq, user: true}, e);
 | ||
|                     });
 | ||
| 
 | ||
|                     $stageFrame = $stageFrame.add($frame);
 | ||
|                 } else if (type === 'navDot') {
 | ||
|                     addNavFrameEvents(frame);
 | ||
|                     $navDotFrame = $navDotFrame.add($frame);
 | ||
|                 } else if (type === 'navThumb') {
 | ||
|                     addNavFrameEvents(frame);
 | ||
|                     frameData.$wrap = $frame.children(':first');
 | ||
| 
 | ||
|                     $navThumbFrame = $navThumbFrame.add($frame);
 | ||
|                     if (dataFrame.video) {
 | ||
|                         frameData.$wrap.append($videoPlay.clone());
 | ||
|                     }
 | ||
|                 }
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         function callFit($img, measuresToFit) {
 | ||
|             return $img && $img.length && fit($img, measuresToFit);
 | ||
|         }
 | ||
| 
 | ||
|         function stageFramePosition(indexes) {
 | ||
|             eachIndex(indexes, 'stage', function (i, index, dataFrame, $frame, key, frameData) {
 | ||
|                 if (!$frame) return;
 | ||
| 
 | ||
|                 var normalizedIndex = normalizeIndex(index);
 | ||
|                 frameData.eq = normalizedIndex;
 | ||
| 
 | ||
|                 toDetach[STAGE_FRAME_KEY][normalizedIndex] = $frame.css($.extend({left: o_fade ? 0 : getPosByIndex(index, measures.w, opts.margin, repositionIndex)}, o_fade && getDuration(0)));
 | ||
| 
 | ||
|                 if (isDetached($frame[0])) {
 | ||
|                     $frame.appendTo($stageShaft);
 | ||
|                     unloadVideo(dataFrame.$video);
 | ||
|                 }
 | ||
| 
 | ||
|                 callFit(frameData.$img, measures);
 | ||
|                 callFit(frameData.$full, measures);
 | ||
| 
 | ||
|                 if ($frame.hasClass(stageFrameClass) && !($frame.attr('aria-hidden') === "false" && $frame.hasClass(activeClass))) {
 | ||
|                     $frame.attr('aria-hidden', 'true');
 | ||
|                 }
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         function thumbsDraw(pos, loadFLAG) {
 | ||
|             var leftLimit,
 | ||
|                 rightLimit,
 | ||
|                 exceedLimit;
 | ||
| 
 | ||
| 
 | ||
|             if (o_nav !== 'thumbs' || isNaN(pos)) return;
 | ||
| 
 | ||
|             leftLimit = -pos;
 | ||
|             rightLimit = -pos + measures.nw;
 | ||
| 
 | ||
|             if (opts.navdir === 'vertical') {
 | ||
|                 pos = pos - opts.thumbheight;
 | ||
|                 rightLimit = -pos + measures.h;
 | ||
|             }
 | ||
| 
 | ||
|             $navThumbFrame.each(function () {
 | ||
|                 var $this = $(this),
 | ||
|                     thisData = $this.data(),
 | ||
|                     eq = thisData.eq,
 | ||
|                     getSpecialMeasures = function () {
 | ||
|                         return {
 | ||
|                             h: o_thumbSide2,
 | ||
|                             w: thisData.w
 | ||
|                         }
 | ||
|                     },
 | ||
|                     specialMeasures = getSpecialMeasures(),
 | ||
|                     exceedLimit = opts.navdir === 'vertical' ?
 | ||
|                     thisData.t > rightLimit : thisData.l > rightLimit;
 | ||
|                 specialMeasures.w = thisData.w;
 | ||
| 
 | ||
|                 if ((opts.navdir !== 'vertical' && thisData.l + thisData.w < leftLimit)
 | ||
|                     || exceedLimit
 | ||
|                     || callFit(thisData.$img, specialMeasures)) return;
 | ||
| 
 | ||
|                 loadFLAG && loadImg([eq], 'navThumb', getSpecialMeasures);
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         function frameAppend($frames, $shaft, type) {
 | ||
|             if (!frameAppend[type]) {
 | ||
| 
 | ||
|                 var thumbsFLAG = type === 'nav' && o_navThumbs,
 | ||
|                     left = 0,
 | ||
|                     top = 0;
 | ||
| 
 | ||
|                 $shaft.append(
 | ||
|                     $frames
 | ||
|                         .filter(function () {
 | ||
|                             var actual,
 | ||
|                                 $this = $(this),
 | ||
|                                 frameData = $this.data();
 | ||
|                             for (var _i = 0, _l = data.length; _i < _l; _i++) {
 | ||
|                                 if (frameData.data === data[_i]) {
 | ||
|                                     actual = true;
 | ||
|                                     frameData.eq = _i;
 | ||
|                                     break;
 | ||
|                                 }
 | ||
|                             }
 | ||
|                             return actual || $this.remove() && false;
 | ||
|                         })
 | ||
|                         .sort(function (a, b) {
 | ||
|                             return $(a).data().eq - $(b).data().eq;
 | ||
|                         })
 | ||
|                         .each(function () {
 | ||
|                             var $this = $(this),
 | ||
|                                 frameData = $this.data();
 | ||
|                             UTIL.setThumbAttr($this, frameData.data.caption, "aria-label");
 | ||
|                         })
 | ||
|                         .each(function () {
 | ||
| 
 | ||
|                             if (!thumbsFLAG) return;
 | ||
| 
 | ||
|                             var $this = $(this),
 | ||
|                                 frameData = $this.data(),
 | ||
|                                 thumbwidth = Math.round(o_thumbSide2 * frameData.data.thumbratio) || o_thumbSide,
 | ||
|                                 thumbheight = Math.round(o_thumbSide / frameData.data.thumbratio) || o_thumbSide2;
 | ||
|                             frameData.t = top;
 | ||
|                             frameData.h = thumbheight;
 | ||
|                             frameData.l = left;
 | ||
|                             frameData.w = thumbwidth;
 | ||
| 
 | ||
|                             $this.css({width: thumbwidth});
 | ||
| 
 | ||
|                             top += thumbheight + opts.thumbmargin;
 | ||
|                             left += thumbwidth + opts.thumbmargin;
 | ||
|                         })
 | ||
|                 );
 | ||
| 
 | ||
|                 frameAppend[type] = true;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function getDirection(x) {
 | ||
|             return x - stageLeft > measures.w / 3;
 | ||
|         }
 | ||
| 
 | ||
|         function disableDirrection(i) {
 | ||
|             return !o_loop && (!(activeIndex + i) || !(activeIndex - size + i)) && !$videoPlaying;
 | ||
|         }
 | ||
| 
 | ||
|         function arrsUpdate() {
 | ||
|             var disablePrev = disableDirrection(0),
 | ||
|                 disableNext = disableDirrection(1);
 | ||
|             $arrPrev
 | ||
|                 .toggleClass(arrDisabledClass, disablePrev)
 | ||
|                 .attr(disableAttr(disablePrev, false));
 | ||
|             $arrNext
 | ||
|                 .toggleClass(arrDisabledClass, disableNext)
 | ||
|                 .attr(disableAttr(disableNext, false));
 | ||
|         }
 | ||
| 
 | ||
|         function thumbArrUpdate() {
 | ||
|             var isLeftDisable = false,
 | ||
|                 isRightDisable = false;
 | ||
|             if (opts.navtype === 'thumbs' && !opts.loop) {
 | ||
|                 (activeIndex == 0) ? isLeftDisable = true : isLeftDisable = false;
 | ||
|                 (activeIndex == opts.data.length - 1) ? isRightDisable = true : isRightDisable = false;
 | ||
|             }
 | ||
|             if (opts.navtype === 'slides') {
 | ||
|                 var pos = readPosition($navShaft, opts.navdir);
 | ||
|                 pos >= navShaftTouchTail.max ? isLeftDisable = true : isLeftDisable = false;
 | ||
|                 pos <= Math.round(navShaftTouchTail.min) ? isRightDisable = true : isRightDisable = false;
 | ||
|             }
 | ||
|             $thumbArrLeft
 | ||
|                 .toggleClass(arrDisabledClass, isLeftDisable)
 | ||
|                 .attr(disableAttr(isLeftDisable, true));
 | ||
|             $thumbArrRight
 | ||
|                 .toggleClass(arrDisabledClass, isRightDisable)
 | ||
|                 .attr(disableAttr(isRightDisable, true));
 | ||
|         }
 | ||
| 
 | ||
|         function stageWheelUpdate() {
 | ||
|             if (stageWheelTail.ok) {
 | ||
|                 stageWheelTail.prevent = {'<': disableDirrection(0), '>': disableDirrection(1)};
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function getNavFrameBounds($navFrame) {
 | ||
|             var navFrameData = $navFrame.data(),
 | ||
|                 left,
 | ||
|                 top,
 | ||
|                 width,
 | ||
|                 height;
 | ||
| 
 | ||
|             if (o_navThumbs) {
 | ||
|                 left = navFrameData.l;
 | ||
|                 top = navFrameData.t;
 | ||
|                 width = navFrameData.w;
 | ||
|                 height = navFrameData.h;
 | ||
|             } else {
 | ||
|                 left = $navFrame.position().left;
 | ||
|                 width = $navFrame.width();
 | ||
|             }
 | ||
| 
 | ||
|             var horizontalBounds = {
 | ||
|                 c: left + width / 2,
 | ||
|                 min: -left + opts.thumbmargin * 10,
 | ||
|                 max: -left + measures.w - width - opts.thumbmargin * 10
 | ||
|             };
 | ||
| 
 | ||
|             var verticalBounds = {
 | ||
|                 c: top + height / 2,
 | ||
|                 min: -top + opts.thumbmargin * 10,
 | ||
|                 max: -top + measures.h - height - opts.thumbmargin * 10
 | ||
|             };
 | ||
| 
 | ||
|             return opts.navdir === 'vertical' ? verticalBounds : horizontalBounds;
 | ||
|         }
 | ||
| 
 | ||
|         function slideThumbBorder(time) {
 | ||
|             var navFrameData = activeFrame[navFrameKey].data();
 | ||
|             slide($thumbBorder, {
 | ||
|                 time: time * 1.2,
 | ||
|                 pos: (opts.navdir === 'vertical' ? navFrameData.t : navFrameData.l),
 | ||
|                 width: navFrameData.w,
 | ||
|                 height: navFrameData.h,
 | ||
|                 direction: opts.navdir
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         function slideNavShaft(options) {
 | ||
|             var $guessNavFrame = data[options.guessIndex][navFrameKey],
 | ||
|                 typeOfAnimation = opts.navtype;
 | ||
| 
 | ||
|             var overflowFLAG,
 | ||
|                 time,
 | ||
|                 minMax,
 | ||
|                 boundTop,
 | ||
|                 boundLeft,
 | ||
|                 l,
 | ||
|                 pos,
 | ||
|                 x;
 | ||
| 
 | ||
|             if ($guessNavFrame) {
 | ||
|                 if (typeOfAnimation === 'thumbs') {
 | ||
|                     overflowFLAG = navShaftTouchTail.min !== navShaftTouchTail.max;
 | ||
|                     minMax = options.minMax || overflowFLAG && getNavFrameBounds(activeFrame[navFrameKey]);
 | ||
|                     boundTop = overflowFLAG && (options.keep && slideNavShaft.t ? slideNavShaft.l : minMaxLimit((options.coo || measures.nw / 2) - getNavFrameBounds($guessNavFrame).c, minMax.min, minMax.max));
 | ||
|                     boundLeft = overflowFLAG && (options.keep && slideNavShaft.l ? slideNavShaft.l : minMaxLimit((options.coo || measures.nw / 2) - getNavFrameBounds($guessNavFrame).c, minMax.min, minMax.max));
 | ||
|                     l = (opts.navdir === 'vertical' ? boundTop : boundLeft);
 | ||
|                     pos = overflowFLAG && minMaxLimit(l, navShaftTouchTail.min, navShaftTouchTail.max) || 0;
 | ||
|                     time = options.time * 1.1;
 | ||
|                     slide($navShaft, {
 | ||
|                         time: time,
 | ||
|                         pos: pos,
 | ||
|                         direction: opts.navdir,
 | ||
|                         onEnd: function () {
 | ||
|                             thumbsDraw(pos, true);
 | ||
|                             thumbArrUpdate();
 | ||
|                         }
 | ||
|                     });
 | ||
| 
 | ||
|                     setShadow($nav, findShadowEdge(pos, navShaftTouchTail.min, navShaftTouchTail.max, opts.navdir));
 | ||
|                     slideNavShaft.l = l;
 | ||
|                 } else {
 | ||
|                     x = readPosition($navShaft, opts.navdir);
 | ||
|                     time = options.time * 1.11;
 | ||
| 
 | ||
|                     pos = validateSlidePos(opts, navShaftTouchTail, options.guessIndex, x, $guessNavFrame, $navWrap, opts.navdir);
 | ||
| 
 | ||
|                     slide($navShaft, {
 | ||
|                         time: time,
 | ||
|                         pos: pos,
 | ||
|                         direction: opts.navdir,
 | ||
|                         onEnd: function () {
 | ||
|                             thumbsDraw(pos, true);
 | ||
|                             thumbArrUpdate();
 | ||
|                         }
 | ||
|                     });
 | ||
|                     setShadow($nav, findShadowEdge(pos, navShaftTouchTail.min, navShaftTouchTail.max, opts.navdir));
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function navUpdate() {
 | ||
|             deactivateFrames(navFrameKey);
 | ||
|             toDeactivate[navFrameKey].push(activeFrame[navFrameKey].addClass(activeClass).attr('data-active', true));
 | ||
|         }
 | ||
| 
 | ||
|         function deactivateFrames(key) {
 | ||
|             var _toDeactivate = toDeactivate[key];
 | ||
| 
 | ||
|             while (_toDeactivate.length) {
 | ||
|                 _toDeactivate.shift().removeClass(activeClass).attr('data-active', false);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function detachFrames(key) {
 | ||
|             var _toDetach = toDetach[key];
 | ||
| 
 | ||
|             $.each(activeIndexes, function (i, index) {
 | ||
|                 delete _toDetach[normalizeIndex(index)];
 | ||
|             });
 | ||
| 
 | ||
|             $.each(_toDetach, function (index, $frame) {
 | ||
|                 delete _toDetach[index];
 | ||
|                 $frame.detach();
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         function stageShaftReposition(skipOnEnd) {
 | ||
| 
 | ||
|             repositionIndex = dirtyIndex = activeIndex;
 | ||
| 
 | ||
|             var $frame = activeFrame[STAGE_FRAME_KEY];
 | ||
| 
 | ||
|             if ($frame) {
 | ||
|                 deactivateFrames(STAGE_FRAME_KEY);
 | ||
|                 toDeactivate[STAGE_FRAME_KEY].push($frame.addClass(activeClass).attr('data-active', true));
 | ||
| 
 | ||
|                 if ($frame.hasClass(stageFrameClass)) {
 | ||
|                     $frame.attr('aria-hidden', 'false');
 | ||
|                 }
 | ||
| 
 | ||
|                 skipOnEnd || that.showStage.onEnd(true);
 | ||
|                 stop($stageShaft, 0, true);
 | ||
| 
 | ||
|                 detachFrames(STAGE_FRAME_KEY);
 | ||
|                 stageFramePosition(activeIndexes);
 | ||
|                 setStageShaftMinmaxAndSnap();
 | ||
|                 setNavShaftMinMax();
 | ||
|                 addEnterUp($stageShaft[0], function () {
 | ||
|                     if (!$fotorama.hasClass(fullscreenClass)) {
 | ||
|                         that.requestFullScreen();
 | ||
|                         $fullscreenIcon.focus();
 | ||
|                     }
 | ||
|                 });
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function extendMeasures(options, measuresArray) {
 | ||
|             if (!options) return;
 | ||
| 
 | ||
|             $.each(measuresArray, function (i, measures) {
 | ||
|                 if (!measures) return;
 | ||
| 
 | ||
|                 $.extend(measures, {
 | ||
|                     width: options.width || measures.width,
 | ||
|                     height: options.height,
 | ||
|                     minwidth: options.minwidth,
 | ||
|                     maxwidth: options.maxwidth,
 | ||
|                     minheight: options.minheight,
 | ||
|                     maxheight: options.maxheight,
 | ||
|                     ratio: getRatio(options.ratio)
 | ||
|                 })
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         function triggerEvent(event, extra) {
 | ||
|             $fotorama.trigger(_fotoramaClass + ':' + event, [that, extra]);
 | ||
|         }
 | ||
| 
 | ||
|         function onTouchStart() {
 | ||
|             clearTimeout(onTouchEnd.t);
 | ||
|             touchedFLAG = 1;
 | ||
| 
 | ||
|             if (opts.stopautoplayontouch) {
 | ||
|                 that.stopAutoplay();
 | ||
|             } else {
 | ||
|                 pausedAutoplayFLAG = true;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function onTouchEnd() {
 | ||
|             if (!touchedFLAG) return;
 | ||
|             if (!opts.stopautoplayontouch) {
 | ||
|                 releaseAutoplay();
 | ||
|                 changeAutoplay();
 | ||
|             }
 | ||
| 
 | ||
|             onTouchEnd.t = setTimeout(function () {
 | ||
|                 touchedFLAG = 0;
 | ||
|             }, TRANSITION_DURATION + TOUCH_TIMEOUT);
 | ||
|         }
 | ||
| 
 | ||
|         function releaseAutoplay() {
 | ||
|             pausedAutoplayFLAG = !!($videoPlaying || stoppedAutoplayFLAG);
 | ||
|         }
 | ||
| 
 | ||
|         function changeAutoplay() {
 | ||
| 
 | ||
|             clearTimeout(changeAutoplay.t);
 | ||
|             waitFor.stop(changeAutoplay.w);
 | ||
| 
 | ||
|             if (!opts.autoplay || pausedAutoplayFLAG) {
 | ||
|                 if (that.autoplay) {
 | ||
|                     that.autoplay = false;
 | ||
|                     triggerEvent('stopautoplay');
 | ||
|                 }
 | ||
| 
 | ||
|                 return;
 | ||
|             }
 | ||
| 
 | ||
|             if (!that.autoplay) {
 | ||
|                 that.autoplay = true;
 | ||
|                 triggerEvent('startautoplay');
 | ||
|             }
 | ||
| 
 | ||
|             var _activeIndex = activeIndex;
 | ||
| 
 | ||
| 
 | ||
|             var frameData = activeFrame[STAGE_FRAME_KEY].data();
 | ||
|             changeAutoplay.w = waitFor(function () {
 | ||
|                 return frameData.state || _activeIndex !== activeIndex;
 | ||
|             }, function () {
 | ||
|                 changeAutoplay.t = setTimeout(function () {
 | ||
| 
 | ||
|                     if (pausedAutoplayFLAG || _activeIndex !== activeIndex) return;
 | ||
| 
 | ||
|                     var _nextAutoplayIndex = nextAutoplayIndex,
 | ||
|                         nextFrameData = data[_nextAutoplayIndex][STAGE_FRAME_KEY].data();
 | ||
| 
 | ||
|                     changeAutoplay.w = waitFor(function () {
 | ||
| 
 | ||
|                         return nextFrameData.state || _nextAutoplayIndex !== nextAutoplayIndex;
 | ||
|                     }, function () {
 | ||
|                         if (pausedAutoplayFLAG || _nextAutoplayIndex !== nextAutoplayIndex) return;
 | ||
|                         that.show(o_loop ? getDirectionSign(!o_rtl) : nextAutoplayIndex);
 | ||
|                     });
 | ||
|                 }, opts.autoplay);
 | ||
|             });
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|         that.startAutoplay = function (interval) {
 | ||
|             if (that.autoplay) return this;
 | ||
|             pausedAutoplayFLAG = stoppedAutoplayFLAG = false;
 | ||
|             setAutoplayInterval(interval || opts.autoplay);
 | ||
|             changeAutoplay();
 | ||
| 
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         that.stopAutoplay = function () {
 | ||
|             if (that.autoplay) {
 | ||
|                 pausedAutoplayFLAG = stoppedAutoplayFLAG = true;
 | ||
|                 changeAutoplay();
 | ||
|             }
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         that.showSlide = function (slideDir) {
 | ||
|             var currentPosition = readPosition($navShaft, opts.navdir),
 | ||
|                 pos,
 | ||
|                 time = 500 * 1.1,
 | ||
|                 size = opts.navdir === 'horizontal' ? opts.thumbwidth : opts.thumbheight,
 | ||
|                 onEnd = function () {
 | ||
|                     thumbArrUpdate();
 | ||
|                 };
 | ||
|             if (slideDir === 'next') {
 | ||
|                 pos = currentPosition - (size + opts.margin) * thumbsPerSlide;
 | ||
|             }
 | ||
|             if (slideDir === 'prev') {
 | ||
|                 pos = currentPosition + (size + opts.margin) * thumbsPerSlide;
 | ||
|             }
 | ||
|             pos = validateRestrictions(pos, navShaftTouchTail);
 | ||
|             thumbsDraw(pos, true);
 | ||
|             slide($navShaft, {
 | ||
|                 time: time,
 | ||
|                 pos: pos,
 | ||
|                 direction: opts.navdir,
 | ||
|                 onEnd: onEnd
 | ||
|             });
 | ||
|         };
 | ||
| 
 | ||
|         that.showWhileLongPress = function (options) {
 | ||
|             if (that.longPress.singlePressInProgress) {
 | ||
|                 return;
 | ||
|             }
 | ||
| 
 | ||
|             var index = calcActiveIndex(options);
 | ||
|             calcGlobalIndexes(index);
 | ||
|             var time = calcTime(options) / 50;
 | ||
|             var _activeFrame = activeFrame;
 | ||
|             that.activeFrame = activeFrame = data[activeIndex];
 | ||
|             var silent = _activeFrame === activeFrame && !options.user;
 | ||
| 
 | ||
|             that.showNav(silent, options, time);
 | ||
| 
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         that.showEndLongPress = function (options) {
 | ||
|             if (that.longPress.singlePressInProgress) {
 | ||
|                 return;
 | ||
|             }
 | ||
| 
 | ||
|             var index = calcActiveIndex(options);
 | ||
|             calcGlobalIndexes(index);
 | ||
|             var time = calcTime(options) / 50;
 | ||
|             var _activeFrame = activeFrame;
 | ||
|             that.activeFrame = activeFrame = data[activeIndex];
 | ||
| 
 | ||
|             var silent = _activeFrame === activeFrame && !options.user;
 | ||
| 
 | ||
|             that.showStage(silent, options, time);
 | ||
| 
 | ||
|             showedFLAG = typeof lastActiveIndex !== 'undefined' && lastActiveIndex !== activeIndex;
 | ||
|             lastActiveIndex = activeIndex;
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         function calcActiveIndex (options) {
 | ||
|             var index;
 | ||
| 
 | ||
|             if (typeof options !== 'object') {
 | ||
|                 index = options;
 | ||
|                 options = {};
 | ||
|             } else {
 | ||
|                 index = options.index;
 | ||
|             }
 | ||
| 
 | ||
|             index = index === '>' ? dirtyIndex + 1 : index === '<' ? dirtyIndex - 1 : index === '<<' ? 0 : index === '>>' ? size - 1 : index;
 | ||
|             index = isNaN(index) ? undefined : index;
 | ||
|             index = typeof index === 'undefined' ? activeIndex || 0 : index;
 | ||
| 
 | ||
|             return index;
 | ||
|         }
 | ||
| 
 | ||
|         function calcGlobalIndexes (index) {
 | ||
|             that.activeIndex = activeIndex = edgeIndex(index);
 | ||
|             prevIndex = getPrevIndex(activeIndex);
 | ||
|             nextIndex = getNextIndex(activeIndex);
 | ||
|             nextAutoplayIndex = normalizeIndex(activeIndex + (o_rtl ? -1 : 1));
 | ||
|             activeIndexes = [activeIndex, prevIndex, nextIndex];
 | ||
| 
 | ||
|             dirtyIndex = o_loop ? index : activeIndex;
 | ||
|         }
 | ||
| 
 | ||
|         function calcTime (options) {
 | ||
|             var diffIndex = Math.abs(lastActiveIndex - dirtyIndex),
 | ||
|                 time = getNumber(options.time, function () {
 | ||
|                     return Math.min(o_transitionDuration * (1 + (diffIndex - 1) / 12), o_transitionDuration * 2);
 | ||
|                 });
 | ||
| 
 | ||
|             if (options.slow) {
 | ||
|                 time *= 10;
 | ||
|             }
 | ||
| 
 | ||
|             return time;
 | ||
|         }
 | ||
| 
 | ||
|         that.showStage = function (silent, options, time, e) {
 | ||
|             if (e !== undefined && e.target.tagName == 'IFRAME') {
 | ||
|                 return;
 | ||
|             }
 | ||
|             unloadVideo($videoPlaying, activeFrame.i !== data[normalizeIndex(repositionIndex)].i);
 | ||
|             frameDraw(activeIndexes, 'stage');
 | ||
|             stageFramePosition(SLOW ? [dirtyIndex] : [dirtyIndex, getPrevIndex(dirtyIndex), getNextIndex(dirtyIndex)]);
 | ||
|             updateTouchTails('go', true);
 | ||
| 
 | ||
|             silent || triggerEvent('show', {
 | ||
|                 user: options.user,
 | ||
|                 time: time
 | ||
|             });
 | ||
| 
 | ||
|             pausedAutoplayFLAG = true;
 | ||
| 
 | ||
|             var overPos = options.overPos;
 | ||
|             var onEnd = that.showStage.onEnd = function (skipReposition) {
 | ||
|                 if (onEnd.ok) return;
 | ||
|                 onEnd.ok = true;
 | ||
| 
 | ||
|                 skipReposition || stageShaftReposition(true);
 | ||
| 
 | ||
|                 if (!silent) {
 | ||
|                     triggerEvent('showend', {
 | ||
|                         user: options.user
 | ||
|                     });
 | ||
|                 }
 | ||
| 
 | ||
|                 if (!skipReposition && o_transition && o_transition !== opts.transition) {
 | ||
|                     that.setOptions({transition: o_transition});
 | ||
|                     o_transition = false;
 | ||
|                     return;
 | ||
|                 }
 | ||
| 
 | ||
|                 updateFotoramaState();
 | ||
|                 loadImg(activeIndexes, 'stage');
 | ||
| 
 | ||
|                 updateTouchTails('go', false);
 | ||
|                 stageWheelUpdate();
 | ||
| 
 | ||
|                 stageCursor();
 | ||
|                 releaseAutoplay();
 | ||
|                 changeAutoplay();
 | ||
| 
 | ||
|                 if (that.fullScreen) {
 | ||
|                     activeFrame[STAGE_FRAME_KEY].find('.' + imgFullClass).attr('aria-hidden', false);
 | ||
|                     activeFrame[STAGE_FRAME_KEY].find('.' + imgClass).attr('aria-hidden', true)
 | ||
|                 } else {
 | ||
|                     activeFrame[STAGE_FRAME_KEY].find('.' + imgFullClass).attr('aria-hidden', true);
 | ||
|                     activeFrame[STAGE_FRAME_KEY].find('.' + imgClass).attr('aria-hidden', false)
 | ||
|                 }
 | ||
|             };
 | ||
| 
 | ||
|             if (!o_fade) {
 | ||
|                 slide($stageShaft, {
 | ||
|                     pos: -getPosByIndex(dirtyIndex, measures.w, opts.margin, repositionIndex),
 | ||
|                     overPos: overPos,
 | ||
|                     time: time,
 | ||
|                     onEnd: onEnd
 | ||
|                 });
 | ||
|             } else {
 | ||
|                 var $activeFrame = activeFrame[STAGE_FRAME_KEY],
 | ||
|                     $prevActiveFrame = data[lastActiveIndex] && activeIndex !== lastActiveIndex ? data[lastActiveIndex][STAGE_FRAME_KEY] : null;
 | ||
| 
 | ||
|                 fade($activeFrame, $prevActiveFrame, $stageFrame, {
 | ||
|                     time: time,
 | ||
|                     method: opts.transition,
 | ||
|                     onEnd: onEnd
 | ||
|                 }, fadeStack);
 | ||
|             }
 | ||
| 
 | ||
|             arrsUpdate();
 | ||
|         };
 | ||
| 
 | ||
|         that.showNav = function(silent, options, time){
 | ||
|             thumbArrUpdate();
 | ||
|             if (o_nav) {
 | ||
|                 navUpdate();
 | ||
| 
 | ||
|                 var guessIndex = limitIndex(activeIndex + minMaxLimit(dirtyIndex - lastActiveIndex, -1, 1));
 | ||
|                 slideNavShaft({
 | ||
|                     time: time,
 | ||
|                     coo: guessIndex !== activeIndex && options.coo,
 | ||
|                     guessIndex: typeof options.coo !== 'undefined' ? guessIndex : activeIndex,
 | ||
|                     keep: silent
 | ||
|                 });
 | ||
|                 if (o_navThumbs) slideThumbBorder(time);
 | ||
|             }
 | ||
|         };
 | ||
| 
 | ||
|         that.show = function (options, e) {
 | ||
|             that.longPress.singlePressInProgress = true;
 | ||
| 
 | ||
|             var index = calcActiveIndex(options);
 | ||
|             calcGlobalIndexes(index);
 | ||
|             var time = calcTime(options);
 | ||
|             var _activeFrame = activeFrame;
 | ||
|             that.activeFrame = activeFrame = data[activeIndex];
 | ||
| 
 | ||
|             var silent = _activeFrame === activeFrame && !options.user;
 | ||
| 
 | ||
|             that.showStage(silent, options, time, e);
 | ||
|             that.showNav(silent, options, time);
 | ||
| 
 | ||
|             showedFLAG = typeof lastActiveIndex !== 'undefined' && lastActiveIndex !== activeIndex;
 | ||
|             lastActiveIndex = activeIndex;
 | ||
|             that.longPress.singlePressInProgress = false;
 | ||
| 
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         that.requestFullScreen = function () {
 | ||
|             if (o_allowFullScreen && !that.fullScreen) {
 | ||
| 
 | ||
|                 //check that this is not video
 | ||
|                 if(isVideo()) {
 | ||
|                     return;
 | ||
|                 }
 | ||
| 
 | ||
|                 scrollTop = $WINDOW.scrollTop();
 | ||
|                 scrollLeft = $WINDOW.scrollLeft();
 | ||
| 
 | ||
|                 lockScroll($WINDOW);
 | ||
| 
 | ||
|                 updateTouchTails('x', true);
 | ||
| 
 | ||
|                 measuresStash = $.extend({}, measures);
 | ||
| 
 | ||
|                 $fotorama
 | ||
|                     .addClass(fullscreenClass)
 | ||
|                     .appendTo($BODY.addClass(_fullscreenClass));
 | ||
| 
 | ||
|                 $HTML.addClass(_fullscreenClass);
 | ||
| 
 | ||
|                 unloadVideo($videoPlaying, true, true);
 | ||
| 
 | ||
|                 that.fullScreen = true;
 | ||
| 
 | ||
|                 if (o_nativeFullScreen) {
 | ||
|                     fullScreenApi.request(fotorama);
 | ||
|                 }
 | ||
| 
 | ||
|                 loadImg(activeIndexes, 'stage');
 | ||
|                 updateFotoramaState();
 | ||
|                 triggerEvent('fullscreenenter');
 | ||
|                 that.resize();
 | ||
| 
 | ||
|                 if (!('ontouchstart' in window)) {
 | ||
|                     $fullscreenIcon.focus();
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         function cancelFullScreen() {
 | ||
|             if (that.fullScreen) {
 | ||
|                 that.fullScreen = false;
 | ||
| 
 | ||
|                 if (FULLSCREEN) {
 | ||
|                     fullScreenApi.cancel(fotorama);
 | ||
|                 }
 | ||
| 
 | ||
|                 $BODY.removeClass(_fullscreenClass);
 | ||
|                 $HTML.removeClass(_fullscreenClass);
 | ||
| 
 | ||
|                 $fotorama
 | ||
|                     .removeClass(fullscreenClass)
 | ||
|                     .insertAfter($anchor);
 | ||
| 
 | ||
|                 measures = $.extend({}, measuresStash);
 | ||
| 
 | ||
|                 unloadVideo($videoPlaying, true, true);
 | ||
| 
 | ||
|                 updateTouchTails('x', false);
 | ||
| 
 | ||
|                 that.resize();
 | ||
|                 loadImg(activeIndexes, 'stage');
 | ||
| 
 | ||
|                 lockScroll($WINDOW, scrollLeft, scrollTop);
 | ||
| 
 | ||
|                 triggerEvent('fullscreenexit');
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         that.cancelFullScreen = function () {
 | ||
|             if (o_nativeFullScreen && fullScreenApi.is()) {
 | ||
|                 fullScreenApi.cancel(document);
 | ||
|             } else {
 | ||
|                 cancelFullScreen();
 | ||
|             }
 | ||
| 
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         that.toggleFullScreen = function () {
 | ||
|             return that[(that.fullScreen ? 'cancel' : 'request') + 'FullScreen']();
 | ||
|         };
 | ||
| 
 | ||
|         that.resize = function (options) {
 | ||
|             if (!data) return this;
 | ||
| 
 | ||
|             var time = arguments[1] || 0,
 | ||
|                 setFLAG = arguments[2];
 | ||
| 
 | ||
|             thumbsPerSlide = getThumbsInSlide($wrap, opts);
 | ||
|             extendMeasures(!that.fullScreen ? optionsToLowerCase(options) : {
 | ||
|                 width: $(window).width(),
 | ||
|                 maxwidth: null,
 | ||
|                 minwidth: null,
 | ||
|                 height: $(window).height(),
 | ||
|                 maxheight: null,
 | ||
|                 minheight: null
 | ||
|             }, [measures, setFLAG || that.fullScreen || opts]);
 | ||
| 
 | ||
|             var width = measures.width,
 | ||
|                 height = measures.height,
 | ||
|                 ratio = measures.ratio,
 | ||
|                 windowHeight = $WINDOW.height() - (o_nav ? $nav.height() : 0);
 | ||
| 
 | ||
|             if (measureIsValid(width)) {
 | ||
|                 $wrap.css({width: ''});
 | ||
|                 $stage.css({width: ''});
 | ||
|                 $stageShaft.css({width: ''});
 | ||
|                 $nav.css({width: ''});
 | ||
|                 $wrap.css({minWidth: measures.minwidth || 0, maxWidth: measures.maxwidth || MAX_WIDTH});
 | ||
| 
 | ||
|                 if (o_nav === 'dots') {
 | ||
|                     $navWrap.hide();
 | ||
|                 }
 | ||
|                 width = measures.W = measures.w = $wrap.width();
 | ||
|                 measures.nw = o_nav && numberFromWhatever(opts.navwidth, width) || width;
 | ||
| 
 | ||
|                 $stageShaft.css({width: measures.w, marginLeft: (measures.W - measures.w) / 2});
 | ||
| 
 | ||
|                 height = numberFromWhatever(height, windowHeight);
 | ||
| 
 | ||
|                 height = height || (ratio && width / ratio);
 | ||
| 
 | ||
|                 if (height) {
 | ||
|                     width = Math.round(width);
 | ||
|                     height = measures.h = Math.round(minMaxLimit(height, numberFromWhatever(measures.minheight, windowHeight), numberFromWhatever(measures.maxheight, windowHeight)));
 | ||
|                     $stage.css({'width': width, 'height': height});
 | ||
| 
 | ||
|                     if (opts.navdir === 'vertical' && !that.fullscreen) {
 | ||
|                         $nav.width(opts.thumbwidth + opts.thumbmargin * 2);
 | ||
|                     }
 | ||
| 
 | ||
|                     if (opts.navdir === 'horizontal' && !that.fullscreen) {
 | ||
|                         $nav.height(opts.thumbheight + opts.thumbmargin * 2);
 | ||
|                     }
 | ||
| 
 | ||
|                     if (o_nav === 'dots') {
 | ||
|                         $nav.width(width)
 | ||
|                             .height('auto');
 | ||
|                         $navWrap.show();
 | ||
|                     }
 | ||
| 
 | ||
|                     if (opts.navdir === 'vertical' && that.fullScreen) {
 | ||
|                         $stage.css('height', $WINDOW.height());
 | ||
|                     }
 | ||
| 
 | ||
|                     if (opts.navdir === 'horizontal' && that.fullScreen) {
 | ||
|                         $stage.css('height', $WINDOW.height() - $nav.height());
 | ||
|                     }
 | ||
| 
 | ||
|                     if (o_nav) {
 | ||
|                         switch (opts.navdir) {
 | ||
|                             case 'vertical':
 | ||
|                                 $navWrap.removeClass(navShafthorizontalClass);
 | ||
|                                 $navWrap.removeClass(navShaftListClass);
 | ||
|                                 $navWrap.addClass(navShaftVerticalClass);
 | ||
|                                 $nav
 | ||
|                                     .stop()
 | ||
|                                     .animate({height: measures.h, width: opts.thumbwidth}, time);
 | ||
|                                 break;
 | ||
|                             case 'list':
 | ||
|                                 $navWrap.removeClass(navShaftVerticalClass);
 | ||
|                                 $navWrap.removeClass(navShafthorizontalClass);
 | ||
|                                 $navWrap.addClass(navShaftListClass);
 | ||
|                                 break;
 | ||
|                             default:
 | ||
|                                 $navWrap.removeClass(navShaftVerticalClass);
 | ||
|                                 $navWrap.removeClass(navShaftListClass);
 | ||
|                                 $navWrap.addClass(navShafthorizontalClass);
 | ||
|                                 $nav
 | ||
|                                     .stop()
 | ||
|                                     .animate({width: measures.nw}, time);
 | ||
|                                 break;
 | ||
|                         }
 | ||
| 
 | ||
|                         stageShaftReposition();
 | ||
|                         slideNavShaft({guessIndex: activeIndex, time: time, keep: true});
 | ||
|                         if (o_navThumbs && frameAppend.nav) slideThumbBorder(time);
 | ||
|                     }
 | ||
| 
 | ||
|                     measuresSetFLAG = setFLAG || true;
 | ||
| 
 | ||
|                     ready.ok = true;
 | ||
|                     ready();
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             stageLeft = $stage.offset().left;
 | ||
|             setStagePosition();
 | ||
| 
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         that.setOptions = function (options) {
 | ||
|             $.extend(opts, options);
 | ||
|             reset();
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         that.shuffle = function () {
 | ||
|             data && shuffle(data) && reset();
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         function setShadow($el, edge) {
 | ||
|             if (o_shadows) {
 | ||
|                 $el.removeClass(shadowsLeftClass + ' ' + shadowsRightClass);
 | ||
|                 $el.removeClass(shadowsTopClass + ' ' + shadowsBottomClass);
 | ||
|                 edge && !$videoPlaying && $el.addClass(edge.replace(/^|\s/g, ' ' + shadowsClass + '--'));
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         that.longPress = {
 | ||
|             threshold: 1,
 | ||
|             count: 0,
 | ||
|             thumbSlideTime: 20,
 | ||
|             progress: function(){
 | ||
|                 if (!this.inProgress) {
 | ||
|                     this.count++;
 | ||
|                     this.inProgress = this.count > this.threshold;
 | ||
|                 }
 | ||
|             },
 | ||
|             end: function(){
 | ||
|                 if(this.inProgress) {
 | ||
|                     this.isEnded = true
 | ||
|                 }
 | ||
|             },
 | ||
|             reset: function(){
 | ||
|                 this.count = 0;
 | ||
|                 this.inProgress = false;
 | ||
|                 this.isEnded = false;
 | ||
|             }
 | ||
|         };
 | ||
| 
 | ||
|         that.destroy = function () {
 | ||
|             that.cancelFullScreen();
 | ||
|             that.stopAutoplay();
 | ||
| 
 | ||
|             data = that.data = null;
 | ||
| 
 | ||
|             appendElements();
 | ||
| 
 | ||
|             activeIndexes = [];
 | ||
|             detachFrames(STAGE_FRAME_KEY);
 | ||
| 
 | ||
|             reset.ok = false;
 | ||
| 
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         /**
 | ||
|          *
 | ||
|          * @returns {jQuery.Fotorama}
 | ||
|          */
 | ||
|         that.playVideo = function () {
 | ||
|             var dataFrame = activeFrame,
 | ||
|                 video = dataFrame.video,
 | ||
|                 _activeIndex = activeIndex;
 | ||
| 
 | ||
|             if (typeof video === 'object' && dataFrame.videoReady) {
 | ||
|                 o_nativeFullScreen && that.fullScreen && that.cancelFullScreen();
 | ||
| 
 | ||
|                 waitFor(function () {
 | ||
|                     return !fullScreenApi.is() || _activeIndex !== activeIndex;
 | ||
|                 }, function () {
 | ||
|                     if (_activeIndex === activeIndex) {
 | ||
|                         dataFrame.$video = dataFrame.$video || $(div(videoClass)).append(createVideoFrame(video));
 | ||
|                         dataFrame.$video.appendTo(dataFrame[STAGE_FRAME_KEY]);
 | ||
| 
 | ||
|                         $wrap.addClass(wrapVideoClass);
 | ||
|                         $videoPlaying = dataFrame.$video;
 | ||
| 
 | ||
|                         stageNoMove();
 | ||
| 
 | ||
|                         $arrs.blur();
 | ||
|                         $fullscreenIcon.blur();
 | ||
| 
 | ||
|                         triggerEvent('loadvideo');
 | ||
|                     }
 | ||
|                 });
 | ||
|             }
 | ||
| 
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         that.stopVideo = function () {
 | ||
|             unloadVideo($videoPlaying, true, true);
 | ||
|             return this;
 | ||
|         };
 | ||
| 
 | ||
|         that.spliceByIndex = function (index, newImgObj) {
 | ||
|             newImgObj.i = index + 1;
 | ||
|             newImgObj.img && $.ajax({
 | ||
|                 url: newImgObj.img,
 | ||
|                 type: 'HEAD',
 | ||
|                 success: function () {
 | ||
|                     data.splice(index, 1, newImgObj);
 | ||
|                     reset();
 | ||
|                 }
 | ||
|             });
 | ||
|         };
 | ||
| 
 | ||
|         function unloadVideo($video, unloadActiveFLAG, releaseAutoplayFLAG) {
 | ||
|             if (unloadActiveFLAG) {
 | ||
|                 $wrap.removeClass(wrapVideoClass);
 | ||
|                 $videoPlaying = false;
 | ||
| 
 | ||
|                 stageNoMove();
 | ||
|             }
 | ||
| 
 | ||
|             if ($video && $video !== $videoPlaying) {
 | ||
|                 $video.remove();
 | ||
|                 triggerEvent('unloadvideo');
 | ||
|             }
 | ||
| 
 | ||
|             if (releaseAutoplayFLAG) {
 | ||
|                 releaseAutoplay();
 | ||
|                 changeAutoplay();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function toggleControlsClass(FLAG) {
 | ||
|             $wrap.toggleClass(wrapNoControlsClass, FLAG);
 | ||
|         }
 | ||
| 
 | ||
|         function stageCursor(e) {
 | ||
|             if (stageShaftTouchTail.flow) return;
 | ||
| 
 | ||
|             var x = e ? e.pageX : stageCursor.x,
 | ||
|                 pointerFLAG = x && !disableDirrection(getDirection(x)) && opts.click;
 | ||
| 
 | ||
|             if (stageCursor.p !== pointerFLAG
 | ||
|                 && $stage.toggleClass(pointerClass, pointerFLAG)) {
 | ||
|                 stageCursor.p = pointerFLAG;
 | ||
|                 stageCursor.x = x;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         $stage.on('mousemove', stageCursor);
 | ||
| 
 | ||
|         function clickToShow(showOptions, e) {
 | ||
|             clearTimeout(clickToShow.t);
 | ||
| 
 | ||
|             if (opts.clicktransition && opts.clicktransition !== opts.transition) {
 | ||
|                 setTimeout(function () {
 | ||
|                     var _o_transition = opts.transition;
 | ||
| 
 | ||
|                     that.setOptions({transition: opts.clicktransition});
 | ||
| 
 | ||
|                     // now safe to pass base transition to o_transition, so that.show will restor it
 | ||
|                     o_transition = _o_transition;
 | ||
|                     // this timeout is here to prevent jerking in some browsers
 | ||
|                     clickToShow.t = setTimeout(function () {
 | ||
|                         that.show(showOptions);
 | ||
|                     }, 10);
 | ||
|                 }, 0);
 | ||
|             } else {
 | ||
|                 that.show(showOptions, e);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function onStageTap(e, toggleControlsFLAG) {
 | ||
|             var target = e.target,
 | ||
|                 $target = $(target);
 | ||
|             if ($target.hasClass(videoPlayClass)) {
 | ||
|                 that.playVideo();
 | ||
|             } else if (target === fullscreenIcon) {
 | ||
|                 that.toggleFullScreen();
 | ||
|             } else if ($videoPlaying) {
 | ||
|                 target === videoClose && unloadVideo($videoPlaying, true, true);
 | ||
|             } else if (!$fotorama.hasClass(fullscreenClass)) {
 | ||
|                 that.requestFullScreen();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function updateTouchTails(key, value) {
 | ||
|             stageShaftTouchTail[key] = navShaftTouchTail[key] = value;
 | ||
|         }
 | ||
| 
 | ||
|         stageShaftTouchTail = moveOnTouch($stageShaft, {
 | ||
|             onStart: onTouchStart,
 | ||
|             onMove: function (e, result) {
 | ||
|                 setShadow($stage, result.edge);
 | ||
|             },
 | ||
|             onTouchEnd: onTouchEnd,
 | ||
|             onEnd: function (result) {
 | ||
|                 var toggleControlsFLAG;
 | ||
| 
 | ||
|                 setShadow($stage);
 | ||
|                 toggleControlsFLAG = (MS_POINTER && !hoverFLAG || result.touch) &&
 | ||
|                     opts.arrows;
 | ||
| 
 | ||
|                 if ((result.moved || (toggleControlsFLAG && result.pos !== result.newPos && !result.control)) && result.$target[0] !== $fullscreenIcon[0]) {
 | ||
|                     var index = getIndexByPos(result.newPos, measures.w, opts.margin, repositionIndex);
 | ||
| 
 | ||
|                     that.show({
 | ||
|                         index: index,
 | ||
|                         time: o_fade ? o_transitionDuration : result.time,
 | ||
|                         overPos: result.overPos,
 | ||
|                         user: true
 | ||
|                     });
 | ||
|                 } else if (!result.aborted && !result.control) {
 | ||
|                     onStageTap(result.startEvent, toggleControlsFLAG);
 | ||
|                 }
 | ||
|             },
 | ||
|             timeLow: 1,
 | ||
|             timeHigh: 1,
 | ||
|             friction: 2,
 | ||
|             select: '.' + selectClass + ', .' + selectClass + ' *',
 | ||
|             $wrap: $stage,
 | ||
|             direction: 'horizontal'
 | ||
| 
 | ||
|         });
 | ||
| 
 | ||
|         navShaftTouchTail = moveOnTouch($navShaft, {
 | ||
|             onStart: onTouchStart,
 | ||
|             onMove: function (e, result) {
 | ||
|                 setShadow($nav, result.edge);
 | ||
|             },
 | ||
|             onTouchEnd: onTouchEnd,
 | ||
|             onEnd: function (result) {
 | ||
| 
 | ||
|                 function onEnd() {
 | ||
|                     slideNavShaft.l = result.newPos;
 | ||
|                     releaseAutoplay();
 | ||
|                     changeAutoplay();
 | ||
|                     thumbsDraw(result.newPos, true);
 | ||
|                     thumbArrUpdate();
 | ||
|                 }
 | ||
| 
 | ||
|                 if (!result.moved) {
 | ||
|                     var target = result.$target.closest('.' + navFrameClass, $navShaft)[0];
 | ||
|                     target && onNavFrameClick.call(target, result.startEvent);
 | ||
|                 } else if (result.pos !== result.newPos) {
 | ||
|                     pausedAutoplayFLAG = true;
 | ||
|                     slide($navShaft, {
 | ||
|                         time: result.time,
 | ||
|                         pos: result.newPos,
 | ||
|                         overPos: result.overPos,
 | ||
|                         direction: opts.navdir,
 | ||
|                         onEnd: onEnd
 | ||
|                     });
 | ||
|                     thumbsDraw(result.newPos);
 | ||
|                     o_shadows && setShadow($nav, findShadowEdge(result.newPos, navShaftTouchTail.min, navShaftTouchTail.max, result.dir));
 | ||
|                 } else {
 | ||
|                     onEnd();
 | ||
|                 }
 | ||
|             },
 | ||
|             timeLow: .5,
 | ||
|             timeHigh: 2,
 | ||
|             friction: 5,
 | ||
|             $wrap: $nav,
 | ||
|             direction: opts.navdir
 | ||
|         });
 | ||
| 
 | ||
|         stageWheelTail = wheel($stage, {
 | ||
|             shift: true,
 | ||
|             onEnd: function (e, direction) {
 | ||
|                 onTouchStart();
 | ||
|                 onTouchEnd();
 | ||
|                 that.show({index: direction, slow: e.altKey})
 | ||
|             }
 | ||
|         });
 | ||
| 
 | ||
|         navWheelTail = wheel($nav, {
 | ||
|             onEnd: function (e, direction) {
 | ||
|                 onTouchStart();
 | ||
|                 onTouchEnd();
 | ||
|                 var newPos = stop($navShaft) + direction * .25;
 | ||
|                 $navShaft.css(getTranslate(minMaxLimit(newPos, navShaftTouchTail.min, navShaftTouchTail.max), opts.navdir));
 | ||
|                 o_shadows && setShadow($nav, findShadowEdge(newPos, navShaftTouchTail.min, navShaftTouchTail.max, opts.navdir));
 | ||
|                 navWheelTail.prevent = {'<': newPos >= navShaftTouchTail.max, '>': newPos <= navShaftTouchTail.min};
 | ||
|                 clearTimeout(navWheelTail.t);
 | ||
|                 navWheelTail.t = setTimeout(function () {
 | ||
|                     slideNavShaft.l = newPos;
 | ||
|                     thumbsDraw(newPos, true)
 | ||
|                 }, TOUCH_TIMEOUT);
 | ||
|                 thumbsDraw(newPos);
 | ||
|             }
 | ||
|         });
 | ||
| 
 | ||
|         $wrap.hover(
 | ||
|             function () {
 | ||
|                 setTimeout(function () {
 | ||
|                     if (touchedFLAG) return;
 | ||
|                     toggleControlsClass(!(hoverFLAG = true));
 | ||
|                 }, 0);
 | ||
|             },
 | ||
|             function () {
 | ||
|                 if (!hoverFLAG) return;
 | ||
|                 toggleControlsClass(!(hoverFLAG = false));
 | ||
|             }
 | ||
|         );
 | ||
| 
 | ||
|         function onNavFrameClick(e) {
 | ||
|             var index = $(this).data().eq;
 | ||
| 
 | ||
|             if (opts.navtype === 'thumbs') {
 | ||
|                 clickToShow({index: index, slow: e.altKey, user: true, coo: e._x - $nav.offset().left});
 | ||
|             } else {
 | ||
|                 clickToShow({index: index, slow: e.altKey, user: true});
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function onArrClick(e) {
 | ||
|             clickToShow({index: $arrs.index(this) ? '>' : '<', slow: e.altKey, user: true});
 | ||
|         }
 | ||
| 
 | ||
|         smartClick($arrs, function (e) {
 | ||
|             stopEvent(e);
 | ||
|             onArrClick.call(this, e);
 | ||
|         }, {
 | ||
|             onStart: function () {
 | ||
|                 onTouchStart();
 | ||
|                 stageShaftTouchTail.control = true;
 | ||
|             },
 | ||
|             onTouchEnd: onTouchEnd
 | ||
|         });
 | ||
| 
 | ||
|         smartClick($thumbArrLeft, function (e) {
 | ||
|             stopEvent(e);
 | ||
|             if (opts.navtype === 'thumbs') {
 | ||
| 
 | ||
|                 that.show('<');
 | ||
|             } else {
 | ||
|                 that.showSlide('prev')
 | ||
|             }
 | ||
|         });
 | ||
| 
 | ||
|         smartClick($thumbArrRight, function (e) {
 | ||
|             stopEvent(e);
 | ||
|             if (opts.navtype === 'thumbs') {
 | ||
|                 that.show('>');
 | ||
|             } else {
 | ||
|                 that.showSlide('next')
 | ||
|             }
 | ||
| 
 | ||
|         });
 | ||
| 
 | ||
| 
 | ||
|         function addFocusOnControls(el) {
 | ||
|             addFocus(el, function () {
 | ||
|                 setTimeout(function () {
 | ||
|                     lockScroll($stage);
 | ||
|                 }, 0);
 | ||
|                 toggleControlsClass(false);
 | ||
|             });
 | ||
|         }
 | ||
| 
 | ||
|         $arrs.each(function () {
 | ||
|             addEnterUp(this, function (e) {
 | ||
|                 onArrClick.call(this, e);
 | ||
|             });
 | ||
|             addFocusOnControls(this);
 | ||
|         });
 | ||
| 
 | ||
|         addEnterUp(fullscreenIcon, function () {
 | ||
|             if ($fotorama.hasClass(fullscreenClass)) {
 | ||
|                 that.cancelFullScreen();
 | ||
|                 $stageShaft.focus();
 | ||
|             } else {
 | ||
|                 that.requestFullScreen();
 | ||
|                 $fullscreenIcon.focus();
 | ||
|             }
 | ||
| 
 | ||
|         });
 | ||
|         addFocusOnControls(fullscreenIcon);
 | ||
| 
 | ||
|         function reset() {
 | ||
|             setData();
 | ||
|             setOptions();
 | ||
| 
 | ||
|             if (!reset.i) {
 | ||
|                 reset.i = true;
 | ||
|                 // Only once
 | ||
|                 var _startindex = opts.startindex;
 | ||
|                 activeIndex = repositionIndex = dirtyIndex = lastActiveIndex = startIndex = edgeIndex(_startindex) || 0;
 | ||
|                 /*(o_rtl ? size - 1 : 0)*///;
 | ||
|             }
 | ||
| 
 | ||
|             if (size) {
 | ||
|                 if (changeToRtl()) return;
 | ||
| 
 | ||
|                 if ($videoPlaying) {
 | ||
|                     unloadVideo($videoPlaying, true);
 | ||
|                 }
 | ||
| 
 | ||
|                 activeIndexes = [];
 | ||
| 
 | ||
|                 if (!isVideo()) {
 | ||
|                     detachFrames(STAGE_FRAME_KEY);
 | ||
|                 }
 | ||
| 
 | ||
|                 reset.ok = true;
 | ||
| 
 | ||
|                 that.show({index: activeIndex, time: 0});
 | ||
|                 that.resize();
 | ||
|             } else {
 | ||
|                 that.destroy();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         function changeToRtl() {
 | ||
| 
 | ||
|             if (!changeToRtl.f === o_rtl) {
 | ||
|                 changeToRtl.f = o_rtl;
 | ||
|                 activeIndex = size - 1 - activeIndex;
 | ||
|                 that.reverse();
 | ||
| 
 | ||
|                 return true;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         $.each('load push pop shift unshift reverse sort splice'.split(' '), function (i, method) {
 | ||
|             that[method] = function () {
 | ||
|                 data = data || [];
 | ||
|                 if (method !== 'load') {
 | ||
|                     Array.prototype[method].apply(data, arguments);
 | ||
|                 } else if (arguments[0] && typeof arguments[0] === 'object' && arguments[0].length) {
 | ||
|                     data = clone(arguments[0]);
 | ||
|                 }
 | ||
|                 reset();
 | ||
|                 return that;
 | ||
|             }
 | ||
|         });
 | ||
| 
 | ||
|         function ready() {
 | ||
|             if (ready.ok) {
 | ||
|                 ready.ok = false;
 | ||
|                 triggerEvent('ready');
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         reset();
 | ||
|     };
 | ||
|     $.fn.fotorama = function (opts) {
 | ||
|         return this.each(function () {
 | ||
|             var that = this,
 | ||
|                 $fotorama = $(this),
 | ||
|                 fotoramaData = $fotorama.data(),
 | ||
|                 fotorama = fotoramaData.fotorama;
 | ||
| 
 | ||
|             if (!fotorama) {
 | ||
|                 waitFor(function () {
 | ||
|                     return !isHidden(that);
 | ||
|                 }, function () {
 | ||
|                     fotoramaData.urtext = $fotorama.html();
 | ||
|                     new $.Fotorama($fotorama,
 | ||
|                         $.extend(
 | ||
|                             {},
 | ||
|                             OPTIONS,
 | ||
|                             window.fotoramaDefaults,
 | ||
|                             opts,
 | ||
|                             fotoramaData
 | ||
|                         )
 | ||
|                     );
 | ||
|                 });
 | ||
|             } else {
 | ||
|                 fotorama.setOptions(opts, true);
 | ||
|             }
 | ||
|         });
 | ||
|     };
 | ||
|     $.Fotorama.instances = [];
 | ||
| 
 | ||
|     function calculateIndexes() {
 | ||
|         $.each($.Fotorama.instances, function (index, instance) {
 | ||
|             instance.index = index;
 | ||
|         });
 | ||
|     }
 | ||
| 
 | ||
|     function addInstance(instance) {
 | ||
|         $.Fotorama.instances.push(instance);
 | ||
|         calculateIndexes();
 | ||
|     }
 | ||
| 
 | ||
|     function hideInstance(instance) {
 | ||
|         $.Fotorama.instances.splice(instance.index, 1);
 | ||
|         calculateIndexes();
 | ||
|     }
 | ||
| 
 | ||
|     $.Fotorama.cache = {};
 | ||
|     $.Fotorama.measures = {};
 | ||
|     $ = $ || {};
 | ||
|     $.Fotorama = $.Fotorama || {};
 | ||
|     $.Fotorama.jst = $.Fotorama.jst || {};
 | ||
| 
 | ||
|     $.Fotorama.jst.dots = function (v) {
 | ||
|         var __t, __p = '', __e = _.escape;
 | ||
|         __p += '<div class="fotorama__nav__frame fotorama__nav__frame--dot" tabindex="0" role="button" data-gallery-role="nav-frame" data-nav-type="thumb" aria-label>\r\n    <div class="fotorama__dot"></div>\r\n</div>';
 | ||
|         return __p
 | ||
|     };
 | ||
| 
 | ||
|     $.Fotorama.jst.frameCaption = function (v) {
 | ||
|         var __t, __p = '', __e = _.escape;
 | ||
|         __p += '<div class="fotorama__caption" aria-hidden="true">\r\n    <div class="fotorama__caption__wrap" id="' +
 | ||
|             ((__t = ( v.labelledby )) == null ? '' : __t) +
 | ||
|             '">' +
 | ||
|             ((__t = ( v.caption )) == null ? '' : __t) +
 | ||
|             '</div>\r\n</div>\r\n';
 | ||
|         return __p
 | ||
|     };
 | ||
| 
 | ||
|     $.Fotorama.jst.style = function (v) {
 | ||
|         var __t, __p = '', __e = _.escape;
 | ||
|         __p += '.fotorama' +
 | ||
|             ((__t = ( v.s )) == null ? '' : __t) +
 | ||
|             ' .fotorama__nav--thumbs .fotorama__nav__frame{\r\npadding:' +
 | ||
|             ((__t = ( v.m )) == null ? '' : __t) +
 | ||
|             'px;\r\nheight:' +
 | ||
|             ((__t = ( v.h )) == null ? '' : __t) +
 | ||
|             'px}\r\n.fotorama' +
 | ||
|             ((__t = ( v.s )) == null ? '' : __t) +
 | ||
|             ' .fotorama__thumb-border{\r\nheight:' +
 | ||
|             ((__t = ( v.h )) == null ? '' : __t) +
 | ||
|             'px;\r\nborder-width:' +
 | ||
|             ((__t = ( v.b )) == null ? '' : __t) +
 | ||
|             'px;\r\nmargin-top:' +
 | ||
|             ((__t = ( v.m )) == null ? '' : __t) +
 | ||
|             'px}';
 | ||
|         return __p
 | ||
|     };
 | ||
| 
 | ||
|     $.Fotorama.jst.thumb = function (v) {
 | ||
|         var __t, __p = '', __e = _.escape;
 | ||
|         __p += '<div class="fotorama__nav__frame fotorama__nav__frame--thumb" tabindex="0" role="button" data-gallery-role="nav-frame" data-nav-type="thumb" aria-label>\r\n    <div class="fotorama__thumb">\r\n    </div>\r\n</div>';
 | ||
|         return __p
 | ||
|     };
 | ||
| })(window, document, location, typeof jQuery !== 'undefined' && jQuery);
 |