fotoramajs 4.5.0 → 4.5.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Fotorama 4.5.0 | http://fotorama.io/license/
2
+ * Fotorama 4.5.2 | http://fotorama.io/license/
3
3
  */
4
4
  (function (window, document, location, $, undefined) {
5
5
  "use strict";
@@ -17,6 +17,8 @@ var _fotoramaClass = 'fotorama',
17
17
  wrapPanYClass = wrapClass + '--pan-y',
18
18
  wrapRtlClass = wrapClass + '--rtl',
19
19
  wrapOnlyActiveClass = wrapClass + '--only-active',
20
+ wrapNoCaptionsClass = wrapClass + '--no-captions',
21
+ wrapToggleArrowsClass = wrapClass + '--toggle-arrows',
20
22
 
21
23
  stageClass = _fotoramaClass + '__stage',
22
24
  stageFrameClass = stageClass + '__frame',
@@ -82,7 +84,9 @@ var _fotoramaClass = 'fotorama',
82
84
  captionClass = _fotoramaClass + '__caption',
83
85
  captionWrapClass = _fotoramaClass + '__caption__wrap',
84
86
 
85
- spinnerClass = _fotoramaClass + '__spinner';
87
+ spinnerClass = _fotoramaClass + '__spinner',
88
+
89
+ buttonAttributes = '" tabindex="0" role="button';
86
90
  var JQUERY_VERSION = $ && $.fn.jquery.split('.');
87
91
 
88
92
  if (!JQUERY_VERSION
@@ -361,8 +365,7 @@ var Modernizr = (function (window, document, undefined) {
361
365
 
362
366
  return Modernizr;
363
367
  })(window, document);
364
- var
365
- fullScreenApi = {
368
+ var fullScreenApi = {
366
369
  ok: false,
367
370
  is: function () {
368
371
  return false;
@@ -846,8 +849,6 @@ var $WINDOW = $(window),
846
849
  MOBILE = navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i),
847
850
  SLOW = !CSS3 || MOBILE,
848
851
 
849
- ADD_EVENT_LISTENER = 'addEventListener',
850
-
851
852
  MS_POINTER = navigator.msPointerEnabled,
852
853
 
853
854
  WHEEL = "onwheel" in document.createElement("div") ? "wheel" : document.onmousewheel !== undefined ? "mousewheel" : "DOMMouseScroll",
@@ -868,7 +869,80 @@ var $WINDOW = $(window),
868
869
  NAV_DOT_FRAME_KEY = '$navDotFrame',
869
870
  NAV_THUMB_FRAME_KEY = '$navThumbFrame',
870
871
 
871
- BEZIER = bez([.1, 0, .25, 1]);
872
+ AUTO = 'auto',
873
+
874
+ BEZIER = bez([.1, 0, .25, 1]),
875
+
876
+ MAX_WIDTH = 99999,
877
+
878
+ OPTIONS = {
879
+ // dimensions
880
+ width: null, // 500 || '100%'
881
+ minwidth: null,
882
+ maxwidth: '100%', // '100%'
883
+ height: null,
884
+ minheight: null,
885
+ maxheight: null,
886
+
887
+ ratio: null, // '16/9' || 500/333 || 1.5
888
+
889
+ margin: MARGIN,
890
+ glimpse: 0,
891
+
892
+ fit: 'contain', // 'cover' || 'scaledown' || 'none'
893
+
894
+ // navigation, thumbs
895
+ nav: 'dots', // 'thumbs' || false
896
+ navposition: 'bottom', // 'top'
897
+ navwidth: null,
898
+ thumbwidth: THUMB_SIZE,
899
+ thumbheight: THUMB_SIZE,
900
+ thumbmargin: MARGIN,
901
+ thumbborderwidth: MARGIN,
902
+ thumbfit: 'cover', // 'contain' || 'scaledown' || 'none'
903
+
904
+ allowfullscreen: false, // true || 'native'
905
+
906
+ transition: 'slide', // 'crossfade' || 'dissolve'
907
+ clicktransition: null,
908
+ transitionduration: TRANSITION_DURATION,
909
+
910
+ captions: true,
911
+
912
+ hash: false,
913
+ startindex: 0,
914
+
915
+ loop: false,
916
+
917
+ autoplay: false,
918
+ stopautoplayontouch: true,
919
+
920
+ keyboard: false,
921
+
922
+ arrows: true,
923
+ click: true,
924
+ swipe: true,
925
+ trackpad: false,
926
+
927
+ controlsonstart: true,
928
+
929
+ shuffle: false,
930
+
931
+ direction: 'ltr', // 'rtl'
932
+
933
+ shadows: true,
934
+ spinner: null
935
+ },
936
+
937
+ KEYBOARD_OPTIONS = {
938
+ left: true,
939
+ right: true,
940
+ down: false,
941
+ up: false,
942
+ space: false,
943
+ home: false,
944
+ end: false
945
+ };
872
946
  function noop () {}
873
947
 
874
948
  function minMaxLimit (value, min, max) {
@@ -887,10 +961,10 @@ function readPosition ($el) {
887
961
  }
888
962
  }
889
963
 
890
- function getTranslate (pos, _001) {
964
+ function getTranslate (pos/*, _001*/) {
891
965
  var obj = {};
892
966
  if (CSS3) {
893
- obj.transform = 'translate3d(' + (pos + (_001 ? 0.001 : 0)) + 'px,0,0)'; // 0.001 to remove Retina artifacts
967
+ obj.transform = 'translate3d(' + (pos/* + (_001 ? 0.001 : 0)*/) + 'px,0,0)'; // 0.001 to remove Retina artifacts
894
968
  } else {
895
969
  obj.left = pos;
896
970
  }
@@ -918,6 +992,9 @@ function measureIsValid (value) {
918
992
  }
919
993
 
920
994
  function getPosByIndex (index, side, margin, baseIndex) {
995
+ //console.log('getPosByIndex', index, side, margin, baseIndex);
996
+ //console.log((index - (baseIndex || 0)) * (side + (margin || 0)));
997
+
921
998
  return (index - (baseIndex || 0)) * (side + (margin || 0));
922
999
  }
923
1000
 
@@ -938,9 +1015,9 @@ function bindTransitionEnd ($el) {
938
1015
  msTransition: 'MSTransitionEnd',
939
1016
  transition: 'transitionend'
940
1017
  };
941
- el.addEventListener(transitionEndEvent[Modernizr.prefixed('transition')], function (e) {
1018
+ addEvent(el, transitionEndEvent[Modernizr.prefixed('transition')], function (e) {
942
1019
  elData.tProp && e.propertyName.match(elData.tProp) && elData.onEndFn();
943
- }, false);
1020
+ });
944
1021
  elData.tEnd = true;
945
1022
  }
946
1023
 
@@ -968,7 +1045,7 @@ function afterTransition ($el, property, fn, time) {
968
1045
  }
969
1046
 
970
1047
 
971
- function stop ($el, left, _001) {
1048
+ function stop ($el, left/*, _001*/) {
972
1049
  if ($el.length) {
973
1050
  var elData = $el.data();
974
1051
  if (CSS3) {
@@ -982,7 +1059,7 @@ function stop ($el, left, _001) {
982
1059
  return readPosition($el);
983
1060
  });
984
1061
 
985
- $el.css(getTranslate(lockedLeft, _001));//.width(); // `.width()` for reflow
1062
+ $el.css(getTranslate(lockedLeft/*, _001*/));//.width(); // `.width()` for reflow
986
1063
  return lockedLeft;
987
1064
  }
988
1065
  }
@@ -1044,7 +1121,7 @@ function findVideoId (href, forceVideo) {
1044
1121
  type = 'custom';
1045
1122
  }
1046
1123
 
1047
- return id ? {id: id, type: type, s: href.search.replace(/^\?/, '')} : false;
1124
+ return id ? {id: id, type: type, s: href.search.replace(/^\?/, ''), p: getProtocol()} : false;
1048
1125
  }
1049
1126
 
1050
1127
  function getVideoThumbs (dataFrame, data, fotorama) {
@@ -1205,8 +1282,8 @@ function fit ($el, measuresToFit, method) {
1205
1282
  $el.css({
1206
1283
  width: Math.ceil(width),
1207
1284
  height: Math.ceil(height),
1208
- marginLeft: Math.floor(-width / 2),
1209
- marginTop: Math.floor(-height / 2)
1285
+ left: Math.floor(measuresToFit.w / 2 - width / 2),
1286
+ top: Math.floor(measuresToFit.h / 2 - height / 2)
1210
1287
  });
1211
1288
 
1212
1289
  elData.l = {
@@ -1310,10 +1387,10 @@ function clone (array) {
1310
1387
  });
1311
1388
  }
1312
1389
 
1313
- function lockScroll (left, top) {
1314
- $WINDOW
1315
- .scrollLeft(left)
1316
- .scrollTop(top);
1390
+ function lockScroll ($el, left, top) {
1391
+ $el
1392
+ .scrollLeft(left || 0)
1393
+ .scrollTop(top || 0);
1317
1394
  }
1318
1395
 
1319
1396
  function optionsToLowerCase (options) {
@@ -1338,8 +1415,33 @@ function getRatio (_ratio) {
1338
1415
  }
1339
1416
  }
1340
1417
 
1418
+ function addEvent (el, e, fn, bool) {
1419
+ if (!e) return;
1420
+ el.addEventListener ? el.addEventListener(e, fn, !!bool) : el.attachEvent('on'+e, fn);
1421
+ }
1422
+
1423
+ function elIsDisabled (el) {
1424
+ return !!el.getAttribute('disabled');
1425
+ }
1426
+
1427
+ function disableAttr (FLAG) {
1428
+ return {tabindex: FLAG * -1 + '', disabled: FLAG};
1429
+ }
1430
+
1431
+ function addEnterUp (el, fn) {
1432
+ addEvent(el, 'keyup', function (e) {
1433
+ elIsDisabled(el) || e.keyCode == 13 && fn.call(el, e);
1434
+ });
1435
+ }
1436
+
1437
+ function addFocus (el, fn) {
1438
+ addEvent(el, 'focus', el.onfocusin = function (e) {
1439
+ fn.call(el, e);
1440
+ }, true);
1441
+ }
1442
+
1341
1443
  function stopEvent (e, stopPropagation) {
1342
- e.preventDefault();
1444
+ e.preventDefault ? e.preventDefault() : (e.returnValue = false);
1343
1445
  stopPropagation && e.stopPropagation();
1344
1446
  }
1345
1447
 
@@ -1363,7 +1465,7 @@ function slide ($el, options) {
1363
1465
  }
1364
1466
 
1365
1467
  //console.time('var translate = $.extend');
1366
- var translate = $.extend(getTranslate(elPos, options._001), options.width && {width: options.width});
1468
+ var translate = $.extend(getTranslate(elPos/*, options._001*/), options.width && {width: options.width});
1367
1469
  //console.timeEnd('var translate = $.extend');
1368
1470
 
1369
1471
  elData.sliding = true;
@@ -1552,26 +1654,24 @@ function touch ($el, options) {
1552
1654
  }
1553
1655
 
1554
1656
  if (MS_POINTER) {
1555
- el[ADD_EVENT_LISTENER]('MSPointerDown', onStart, false);
1556
- document[ADD_EVENT_LISTENER]('MSPointerMove', onMove, false);
1557
- document[ADD_EVENT_LISTENER]('MSPointerCancel', onEnd, false);
1558
- document[ADD_EVENT_LISTENER]('MSPointerUp', onEnd, false);
1657
+ addEvent(el, 'MSPointerDown', onStart);
1658
+ addEvent(document, 'MSPointerMove', onMove);
1659
+ addEvent(document,'MSPointerCancel', onEnd);
1660
+ addEvent(document, 'MSPointerUp', onEnd);
1559
1661
  } else {
1560
- if (el[ADD_EVENT_LISTENER]) {
1561
- el[ADD_EVENT_LISTENER]('touchstart', onStart, false);
1562
- el[ADD_EVENT_LISTENER]('touchmove', onMove, false);
1563
- el[ADD_EVENT_LISTENER]('touchend', onEnd, false);
1662
+ addEvent(el, 'touchstart', onStart);
1663
+ addEvent(el, 'touchmove', onMove);
1664
+ addEvent(el, 'touchend', onEnd);
1564
1665
 
1565
- document[ADD_EVENT_LISTENER]('touchstart', onOtherStart, false);
1566
- document[ADD_EVENT_LISTENER]('touchend', onOtherEnd, false);
1567
- document[ADD_EVENT_LISTENER]('touchcancel', onOtherEnd, false);
1568
- window[ADD_EVENT_LISTENER]('scroll', onOtherEnd, false);
1569
- }
1666
+ addEvent(document, 'touchstart', onOtherStart);
1667
+ addEvent(document, 'touchend', onOtherEnd);
1668
+ addEvent(document, 'touchcancel', onOtherEnd);
1570
1669
 
1571
- $el.on('mousedown', onStart);
1572
- $DOCUMENT
1573
- .on('mousemove', onMove)
1574
- .on('mouseup', onEnd);
1670
+ addEvent(window, 'scroll', onOtherEnd);
1671
+
1672
+ addEvent(el, 'mousedown', onStart);
1673
+ addEvent(document, 'mousemove', onMove);
1674
+ addEvent(document, 'mouseup', onEnd);
1575
1675
  }
1576
1676
 
1577
1677
  $el.on('click', 'a', function (e) {
@@ -1610,7 +1710,7 @@ function moveOnTouch ($el, options) {
1610
1710
  [startTime, startCoo]
1611
1711
  ];
1612
1712
 
1613
- startElPos = moveElPos = tail.noMove || noStop ? 0 : stop($el, (options.getPos || noop)(), options._001);
1713
+ startElPos = moveElPos = tail.noMove || noStop ? 0 : stop($el, (options.getPos || noop)()/*, options._001*/);
1614
1714
 
1615
1715
  (options.onStart || noop).call(el, e);
1616
1716
  }
@@ -1651,7 +1751,7 @@ function moveOnTouch ($el, options) {
1651
1751
  }
1652
1752
 
1653
1753
  if (!tail.noMove) {
1654
- $el.css(getTranslate(moveElPos, options._001));
1754
+ $el.css(getTranslate(moveElPos/*, options._001*/));
1655
1755
  if (!moved) {
1656
1756
  moved = true;
1657
1757
  // only for mouse
@@ -1741,13 +1841,11 @@ function moveOnTouch ($el, options) {
1741
1841
  (options.onEnd || noop).call(el, $.extend(result, {moved: result.moved || longTouchFLAG && snap, pos: moveElPos, newPos: newPos, overPos: overPos, time: time}));
1742
1842
  }
1743
1843
 
1744
- tail = $.extend(touch(options.$wrap, {
1844
+ tail = $.extend(touch(options.$wrap, $.extend({}, options, {
1745
1845
  onStart: onStart,
1746
1846
  onMove: onMove,
1747
- onTouchEnd: options.onTouchEnd,
1748
- onEnd: onEnd,
1749
- select: options.select
1750
- }), tail);
1847
+ onEnd: onEnd
1848
+ })), tail);
1751
1849
 
1752
1850
  return tail;
1753
1851
  }
@@ -1760,10 +1858,10 @@ function wheel ($el, options) {
1760
1858
  prevent: {}
1761
1859
  };
1762
1860
 
1763
- el[ADD_EVENT_LISTENER] && el[ADD_EVENT_LISTENER](WHEEL, function (e) {
1861
+ addEvent(el, WHEEL, function (e) {
1764
1862
  var yDelta = e.wheelDeltaY || -1 * e.deltaY || 0,
1765
1863
  xDelta = e.wheelDeltaX || -1 * e.deltaX || 0,
1766
- xWin = Math.abs(xDelta) > Math.abs(yDelta),
1864
+ xWin = Math.abs(xDelta) && !Math.abs(yDelta),
1767
1865
  direction = getDirectionSign(xDelta < 0),
1768
1866
  sameDirection = lastDirection === direction,
1769
1867
  now = $.now(),
@@ -1791,13 +1889,13 @@ function wheel ($el, options) {
1791
1889
 
1792
1890
  (options.onEnd || noop)(e, options.shift ? direction : xDelta);
1793
1891
 
1794
- }, false);
1892
+ });
1795
1893
 
1796
1894
  return tail;
1797
1895
  }
1798
1896
  jQuery.Fotorama = function ($fotorama, opts) {
1799
- $HTML = $HTML || $('html');
1800
- $BODY = $BODY || $('body');
1897
+ $HTML = $('html');
1898
+ $BODY = $('body');
1801
1899
 
1802
1900
  var that = this,
1803
1901
  stamp = $.now(),
@@ -1817,8 +1915,8 @@ jQuery.Fotorama = function ($fotorama, opts) {
1817
1915
 
1818
1916
  $stageShaft = $(div(stageShaftClass)).appendTo($stage),
1819
1917
  $stageFrame = $(),
1820
- $arrPrev = $(div(arrClass + ' ' + arrPrevClass/*, div(arrArrClass)*/)),
1821
- $arrNext = $(div(arrClass + ' ' + arrNextClass/*, div(arrArrClass)*/)),
1918
+ $arrPrev = $(div(arrClass + ' ' + arrPrevClass + buttonAttributes)),
1919
+ $arrNext = $(div(arrClass + ' ' + arrNextClass + buttonAttributes)),
1822
1920
  $arrs = $arrPrev.add($arrNext).appendTo($stage),
1823
1921
  $navWrap = $(div(navWrapClass)),
1824
1922
  $nav = $(div(navClass)).appendTo($navWrap),
@@ -1832,7 +1930,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
1832
1930
 
1833
1931
  $thumbBorder = $(div(thumbBorderClass)).appendTo($navShaft),
1834
1932
 
1835
- $fullscreenIcon = $(div(fullscreenIconClass)),
1933
+ $fullscreenIcon = $(div(fullscreenIconClass + buttonAttributes)),
1836
1934
  fullscreenIcon = $fullscreenIcon[0],
1837
1935
  $videoPlay = $(div(videoPlayClass)),
1838
1936
  $videoClose = $(div(videoCloseClass)).appendTo($stage),
@@ -1866,6 +1964,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
1866
1964
  o_transition,
1867
1965
  o_shadows,
1868
1966
  o_rtl,
1967
+ o_keyboard,
1869
1968
  lastOptions = {},
1870
1969
 
1871
1970
  measures = {},
@@ -1898,15 +1997,17 @@ jQuery.Fotorama = function ($fotorama, opts) {
1898
1997
  fadeStack = [];
1899
1998
 
1900
1999
  $wrap[STAGE_FRAME_KEY] = $(div(stageFrameClass));
1901
- $wrap[NAV_THUMB_FRAME_KEY] = $(div(navFrameClass + ' ' + navFrameThumbClass, div(thumbClass)));
1902
- $wrap[NAV_DOT_FRAME_KEY] = $(div(navFrameClass + ' ' + navFrameDotClass, div(dotClass)));
2000
+ $wrap[NAV_THUMB_FRAME_KEY] = $(div(navFrameClass + ' ' + navFrameThumbClass + buttonAttributes, div(thumbClass)));
2001
+ $wrap[NAV_DOT_FRAME_KEY] = $(div(navFrameClass + ' ' + navFrameDotClass + buttonAttributes, div(dotClass)));
1903
2002
 
1904
2003
  toDeactivate[STAGE_FRAME_KEY] = [];
1905
2004
  toDeactivate[NAV_THUMB_FRAME_KEY] = [];
1906
2005
  toDeactivate[NAV_DOT_FRAME_KEY] = [];
1907
2006
  toDetach[STAGE_FRAME_KEY] = {};
1908
2007
 
1909
- $wrap.addClass(CSS3 ? wrapCss3Class : wrapCss2Class);
2008
+ $wrap
2009
+ .addClass(CSS3 ? wrapCss3Class : wrapCss2Class)
2010
+ .toggleClass(wrapNoControlsClass, !opts.controlsonstart);
1910
2011
 
1911
2012
  fotoramaData.fotorama = this;
1912
2013
 
@@ -1929,29 +2030,42 @@ jQuery.Fotorama = function ($fotorama, opts) {
1929
2030
  });
1930
2031
  }
1931
2032
 
2033
+ function allowKey (key) {
2034
+ return o_keyboard[key] || that.fullScreen;
2035
+ }
2036
+
1932
2037
  function bindGlobalEvents (FLAG) {
1933
2038
  var keydownCommon = 'keydown.' + _fotoramaClass,
1934
- keydownLocal = 'keydown.' + _fotoramaClass + stamp,
1935
- resizeLocal = 'resize.' + _fotoramaClass + stamp;
2039
+ localStamp = _fotoramaClass + stamp,
2040
+ keydownLocal = 'keydown.' + localStamp,
2041
+ resizeLocal = 'resize.' + localStamp + ' ' + 'orientationchange.' + localStamp;
1936
2042
 
1937
2043
  if (FLAG) {
1938
2044
  $DOCUMENT
1939
2045
  .on(keydownLocal, function (e) {
2046
+ var catched,
2047
+ index;
2048
+
1940
2049
  if ($videoPlaying && e.keyCode === 27) {
1941
- stopEvent(e);
2050
+ catched = true;
1942
2051
  unloadVideo($videoPlaying, true, true);
1943
2052
  } else if (that.fullScreen || (opts.keyboard && !that.index)) {
1944
2053
  if (e.keyCode === 27) {
1945
- stopEvent(e);
2054
+ catched = true;
1946
2055
  that.cancelFullScreen();
1947
- } else if (e.keyCode === 39 || (e.keyCode === 40 && that.fullScreen)) {
1948
- stopEvent(e);
1949
- that.show({index: '>', slow: e.altKey, user: true});
1950
- } else if (e.keyCode === 37 || (e.keyCode === 38 && that.fullScreen)) {
1951
- stopEvent(e);
1952
- that.show({index: '<', slow: e.altKey, user: true});
2056
+ } else if ((e.shiftKey && e.keyCode === 32 && allowKey('space')) || (e.keyCode === 37 && allowKey('left')) || (e.keyCode === 38 && allowKey('up'))) {
2057
+ index = '<';
2058
+ } else if ((e.keyCode === 32 && allowKey('space')) || (e.keyCode === 39 && allowKey('right')) || (e.keyCode === 40 && allowKey('down'))) {
2059
+ index = '>';
2060
+ } else if (e.keyCode === 36 && allowKey('home')) {
2061
+ index = '<<';
2062
+ } else if (e.keyCode === 35 && allowKey('end')) {
2063
+ index = '>>';
1953
2064
  }
1954
2065
  }
2066
+
2067
+ (catched || index) && stopEvent(e);
2068
+ index && that.show({index: index, slow: e.altKey, user: true});
1955
2069
  });
1956
2070
 
1957
2071
  if (!that.index) {
@@ -2014,7 +2128,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2014
2128
  stageShaftTouchTail.noMove = _noMove || o_fade;
2015
2129
  stageShaftTouchTail.noSwipe = _noMove || !opts.swipe;
2016
2130
 
2017
- !o_transition && $stageShaft.toggleClass(grabClass, !stageShaftTouchTail.noMove && !stageShaftTouchTail.noSwipe);
2131
+ !o_transition && $stageShaft.toggleClass(grabClass, !opts.click && !stageShaftTouchTail.noMove && !stageShaftTouchTail.noSwipe);
2018
2132
  MS_POINTER && $wrap.toggleClass(wrapPanYClass, !stageShaftTouchTail.noSwipe);
2019
2133
  }
2020
2134
 
@@ -2023,32 +2137,34 @@ jQuery.Fotorama = function ($fotorama, opts) {
2023
2137
  opts.autoplay = Math.max(+interval || AUTOPLAY_INTERVAL, o_transitionDuration * 1.5);
2024
2138
  }
2025
2139
 
2026
- function addOrRemove (FLAG) {
2027
- return FLAG ? 'add' : 'remove';
2028
- }
2029
-
2030
2140
  /**
2031
2141
  * Options on the fly
2032
2142
  * */
2033
2143
  function setOptions () {
2034
2144
  that.options = opts = optionsToLowerCase(opts);
2035
2145
 
2036
- o_fade = opts.transition === 'crossfade' || opts.transition === 'dissolve';
2146
+ o_fade = (opts.transition === 'crossfade' || opts.transition === 'dissolve');
2037
2147
 
2038
- o_loop = opts.loop && (size > 2 || o_fade);
2148
+ o_loop = opts.loop && (size > 2 || (o_fade && (!o_transition || o_transition !== 'slide')));
2039
2149
 
2040
2150
  o_transitionDuration = +opts.transitionduration || TRANSITION_DURATION;
2041
2151
 
2042
2152
  o_rtl = opts.direction === 'rtl';
2043
2153
 
2154
+ o_keyboard = $.extend({}, opts.keyboard && KEYBOARD_OPTIONS, opts.keyboard);
2155
+
2044
2156
  var classes = {add: [], remove: []};
2045
2157
 
2158
+ function addOrRemoveClass (FLAG, value) {
2159
+ classes[FLAG ? 'add' : 'remove'].push(value);
2160
+ }
2161
+
2046
2162
  if (size > 1) {
2047
2163
  o_nav = opts.nav;
2048
2164
  o_navTop = opts.navposition === 'top';
2049
2165
  classes.remove.push(selectClass);
2050
2166
 
2051
- $arrs.toggle(opts.arrows);
2167
+ $arrs.toggle(!!opts.arrows);
2052
2168
  } else {
2053
2169
  o_nav = false;
2054
2170
  $arrs.hide();
@@ -2069,7 +2185,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2069
2185
 
2070
2186
  stageNoMove();
2071
2187
 
2072
- extendMeasures(opts, true);
2188
+ extendMeasures(opts, [measures]);
2073
2189
 
2074
2190
  o_navThumbs = o_nav === 'thumbs';
2075
2191
 
@@ -2111,20 +2227,21 @@ jQuery.Fotorama = function ($fotorama, opts) {
2111
2227
  o_allowFullScreen = opts.allowfullscreen;
2112
2228
 
2113
2229
  if (o_allowFullScreen) {
2114
- $fullscreenIcon.appendTo($stage);
2230
+ $fullscreenIcon.prependTo($stage);
2115
2231
  o_nativeFullScreen = FULLSCREEN && o_allowFullScreen === 'native';
2116
2232
  } else {
2117
2233
  $fullscreenIcon.detach();
2118
2234
  o_nativeFullScreen = false;
2119
2235
  }
2120
2236
 
2121
- classes[addOrRemove(o_fade)].push(wrapFadeClass);
2122
- classes[addOrRemove(!o_fade)].push(wrapSlideClass);
2123
-
2124
- classes[addOrRemove(o_rtl)].push(wrapRtlClass);
2237
+ addOrRemoveClass(o_fade, wrapFadeClass);
2238
+ addOrRemoveClass(!o_fade, wrapSlideClass);
2239
+ addOrRemoveClass(!opts.captions, wrapNoCaptionsClass);
2240
+ addOrRemoveClass(o_rtl, wrapRtlClass);
2241
+ addOrRemoveClass(opts.arrows !== 'always', wrapToggleArrowsClass);
2125
2242
 
2126
2243
  o_shadows = opts.shadows && !SLOW;
2127
- classes[addOrRemove(!o_shadows)].push(wrapNoShadowsClass);
2244
+ addOrRemoveClass(!o_shadows, wrapNoShadowsClass);
2128
2245
 
2129
2246
  $wrap
2130
2247
  .addClass(classes.add.join(' '))
@@ -2188,12 +2305,15 @@ jQuery.Fotorama = function ($fotorama, opts) {
2188
2305
 
2189
2306
  function setMeasures (width, height, ratio, index) {
2190
2307
  if (!measuresSetFLAG || (measuresSetFLAG === '*' && index === startIndex)) {
2308
+
2309
+ //console.log('setMeasures', index, opts.width, opts.height);
2310
+
2191
2311
  width = measureIsValid(opts.width) || measureIsValid(width) || WIDTH;
2192
2312
  height = measureIsValid(opts.height) || measureIsValid(height) || HEIGHT;
2193
2313
  that.resize({
2194
2314
  width: width,
2195
2315
  ratio: opts.ratio || ratio || width / height
2196
- }, 0, index === startIndex ? true : '*');
2316
+ }, 0, index !== startIndex && '*');
2197
2317
  }
2198
2318
  }
2199
2319
 
@@ -2292,8 +2412,12 @@ jQuery.Fotorama = function ($fotorama, opts) {
2292
2412
 
2293
2413
  if (type === 'stage') {
2294
2414
  triggerTriggerEvent('load');
2415
+ } else if (dataFrame.thumbratio === AUTO || !dataFrame.thumbratio && opts.thumbratio === AUTO) {
2416
+ // danger! reflow for all thumbnails
2417
+ dataFrame.thumbratio = imgData.measures.ratio;
2418
+ reset();
2295
2419
  }
2296
- }, 5);
2420
+ }, 0);
2297
2421
  }
2298
2422
 
2299
2423
  if (!src) {
@@ -2344,7 +2468,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2344
2468
  }
2345
2469
 
2346
2470
  function updateFotoramaState () {
2347
- var $frame = that.activeFrame[STAGE_FRAME_KEY];
2471
+ var $frame = activeFrame[STAGE_FRAME_KEY];
2348
2472
 
2349
2473
  if ($frame && !$frame.data().state) {
2350
2474
  spinnerSpin($frame);
@@ -2355,6 +2479,17 @@ jQuery.Fotorama = function ($fotorama, opts) {
2355
2479
  }
2356
2480
  }
2357
2481
 
2482
+ function addNavFrameEvents (frame) {
2483
+ addEnterUp(frame, onNavFrameClick);
2484
+ addFocus(frame, function () {
2485
+
2486
+ setTimeout(function () {
2487
+ lockScroll($nav);
2488
+ }, 0);
2489
+ slideNavShaft({time: o_transitionDuration, guessIndex: $(this).data().eq, minMax: navShaftTouchTail});
2490
+ });
2491
+ }
2492
+
2358
2493
  function frameDraw (indexes, type) {
2359
2494
  eachIndex(indexes, type, function (i, index, dataFrame, $frame, key, frameData) {
2360
2495
  if ($frame) return;
@@ -2362,6 +2497,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2362
2497
  $frame = dataFrame[key] = $wrap[key].clone();
2363
2498
  frameData = $frame.data();
2364
2499
  frameData.data = dataFrame;
2500
+ var frame = $frame[0];
2365
2501
 
2366
2502
  if (type === 'stage') {
2367
2503
 
@@ -2376,18 +2512,26 @@ jQuery.Fotorama = function ($fotorama, opts) {
2376
2512
  .appendTo($frame);
2377
2513
  }
2378
2514
 
2379
- if (opts.captions && dataFrame.caption) {
2380
- $(div(captionClass, div(captionWrapClass, dataFrame.caption))).appendTo($frame);
2381
- }
2515
+ dataFrame.caption && $(div(captionClass, div(captionWrapClass, dataFrame.caption))).appendTo($frame);
2382
2516
 
2383
2517
  dataFrame.video && $frame
2384
2518
  .addClass(stageFrameVideoClass)
2385
2519
  .append($videoPlay.clone());
2386
2520
 
2521
+ // This solves tabbing problems
2522
+ addFocus(frame, function () {
2523
+ setTimeout(function () {
2524
+ lockScroll($stage);
2525
+ }, 0);
2526
+ clickToShow({index: frameData.eq, user: true});
2527
+ });
2528
+
2387
2529
  $stageFrame = $stageFrame.add($frame);
2388
2530
  } else if (type === 'navDot') {
2531
+ addNavFrameEvents(frame);
2389
2532
  $navDotFrame = $navDotFrame.add($frame);
2390
2533
  } else if (type === 'navThumb') {
2534
+ addNavFrameEvents(frame);
2391
2535
  frameData.$wrap = $frame.children(':first');
2392
2536
  $navThumbFrame = $navThumbFrame.add($frame);
2393
2537
  if (dataFrame.video) {
@@ -2405,7 +2549,10 @@ jQuery.Fotorama = function ($fotorama, opts) {
2405
2549
  eachIndex(indexes, 'stage', function (i, index, dataFrame, $frame, key, frameData) {
2406
2550
  if (!$frame) return;
2407
2551
 
2408
- toDetach[STAGE_FRAME_KEY][normalizeIndex(index)] = $frame.css($.extend({left: o_fade ? 0 : getPosByIndex(index, measures.w, opts.margin, repositionIndex)}, o_fade && getDuration(0)));
2552
+ var normalizedIndex = normalizeIndex(index);
2553
+ frameData.eq = normalizedIndex;
2554
+
2555
+ toDetach[STAGE_FRAME_KEY][normalizedIndex] = $frame.css($.extend({left: o_fade ? 0 : getPosByIndex(index, measures.w, opts.margin, repositionIndex)}, o_fade && getDuration(0)));
2409
2556
 
2410
2557
  if (isDetached($frame[0])) {
2411
2558
  $frame.appendTo($stageShaft);
@@ -2430,7 +2577,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2430
2577
  thisData = $this.data(),
2431
2578
  eq = thisData.eq,
2432
2579
  specialMeasures = {h: o_thumbSide2},
2433
- specialFit = 'cover';
2580
+ specialFit = (data[eq] || {}).thumbfit || opts.thumbfit;
2434
2581
 
2435
2582
  specialMeasures.w = thisData.w;
2436
2583
 
@@ -2496,14 +2643,14 @@ jQuery.Fotorama = function ($fotorama, opts) {
2496
2643
  }
2497
2644
 
2498
2645
  function arrsUpdate () {
2499
- $arrPrev.toggleClass(
2500
- arrDisabledClass,
2501
- disableDirrection(0)
2502
- );
2503
- $arrNext.toggleClass(
2504
- arrDisabledClass,
2505
- disableDirrection(1)
2506
- );
2646
+ var disablePrev = disableDirrection(0),
2647
+ disableNext = disableDirrection(1);
2648
+ $arrPrev
2649
+ .toggleClass(arrDisabledClass, disablePrev)
2650
+ .attr(disableAttr(disablePrev));
2651
+ $arrNext
2652
+ .toggleClass(arrDisabledClass, disableNext)
2653
+ .attr(disableAttr(disableNext));
2507
2654
  }
2508
2655
 
2509
2656
  function stageWheelUpdate () {
@@ -2533,23 +2680,23 @@ jQuery.Fotorama = function ($fotorama, opts) {
2533
2680
  }
2534
2681
 
2535
2682
  function slideThumbBorder (time) {
2536
- var navFrameData = that.activeFrame[navFrameKey].data();
2683
+ var navFrameData = activeFrame[navFrameKey].data();
2537
2684
  slide($thumbBorder, {
2538
- time: time * .9,
2685
+ time: time * 1.2,
2539
2686
  pos: navFrameData.l,
2540
2687
  width: navFrameData.w - opts.thumbborderwidth * 2
2541
2688
  });
2542
2689
  }
2543
2690
 
2544
2691
  function slideNavShaft (options) {
2545
- //console.log('slideNavShaft');
2692
+ //console.log('slideNavShaft', options.guessIndex, options.keep, slideNavShaft.l);
2546
2693
  var $guessNavFrame = data[options.guessIndex][navFrameKey];
2547
2694
  if ($guessNavFrame) {
2548
2695
  var overflowFLAG = navShaftTouchTail.min !== navShaftTouchTail.max,
2549
- activeNavFrameBounds = overflowFLAG && getNavFrameBounds(that.activeFrame[navFrameKey]),
2550
- l = overflowFLAG && (options.keep && slideNavShaft.l ? slideNavShaft.l : minMaxLimit((options.coo || measures.nw / 2) - getNavFrameBounds($guessNavFrame).c, activeNavFrameBounds.min, activeNavFrameBounds.max)),
2696
+ minMax = options.minMax || overflowFLAG && getNavFrameBounds(activeFrame[navFrameKey]),
2697
+ l = overflowFLAG && (options.keep && slideNavShaft.l ? slideNavShaft.l : minMaxLimit((options.coo || measures.nw / 2) - getNavFrameBounds($guessNavFrame).c, minMax.min, minMax.max)),
2551
2698
  pos = overflowFLAG && minMaxLimit(l, navShaftTouchTail.min, navShaftTouchTail.max),
2552
- time = options.time * .9;
2699
+ time = options.time * 1.1;
2553
2700
 
2554
2701
  slide($navShaft, {
2555
2702
  time: time,
@@ -2568,7 +2715,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2568
2715
 
2569
2716
  function navUpdate () {
2570
2717
  deactivateFrames(navFrameKey);
2571
- toDeactivate[navFrameKey].push(that.activeFrame[navFrameKey].addClass(activeClass));
2718
+ toDeactivate[navFrameKey].push(activeFrame[navFrameKey].addClass(activeClass));
2572
2719
  }
2573
2720
 
2574
2721
  function deactivateFrames (key) {
@@ -2600,8 +2747,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2600
2747
 
2601
2748
  repositionIndex = dirtyIndex = activeIndex;
2602
2749
 
2603
- var dataFrame = that.activeFrame,
2604
- $frame = dataFrame[STAGE_FRAME_KEY];
2750
+ var $frame = activeFrame[STAGE_FRAME_KEY];
2605
2751
 
2606
2752
  if ($frame) {
2607
2753
  deactivateFrames(STAGE_FRAME_KEY);
@@ -2617,24 +2763,21 @@ jQuery.Fotorama = function ($fotorama, opts) {
2617
2763
  }
2618
2764
  }
2619
2765
 
2620
- function extendMeasures (options, optsLeave) {
2621
- options && $.extend(measures, {
2622
- width: options.width || measures.width,
2623
- height: options.height,
2624
- minwidth: options.minwidth,
2625
- maxwidth: options.maxwidth,
2626
- minheight: options.minheight,
2627
- maxheight: options.maxheight,
2628
- ratio: getRatio(options.ratio)
2629
- })
2630
- && !optsLeave && $.extend(opts, {
2631
- width: measures.width,
2632
- height: measures.height,
2633
- minwidth: measures.minwidth,
2634
- maxwidth: measures.maxwidth,
2635
- minheight: measures.minheight,
2636
- maxheight: measures.maxheight,
2637
- ratio: measures.ratio
2766
+ function extendMeasures (options, measuresArray) {
2767
+ if (!options) return;
2768
+
2769
+ $.each(measuresArray, function (i, measures) {
2770
+ if (!measures) return;
2771
+
2772
+ $.extend(measures, {
2773
+ width: options.width || measures.width,
2774
+ height: options.height,
2775
+ minwidth: options.minwidth,
2776
+ maxwidth: options.maxwidth,
2777
+ minheight: options.minheight,
2778
+ maxheight: options.maxheight,
2779
+ ratio: getRatio(options.ratio)
2780
+ })
2638
2781
  });
2639
2782
  }
2640
2783
 
@@ -2689,7 +2832,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2689
2832
  var _activeIndex = activeIndex;
2690
2833
 
2691
2834
 
2692
- var frameData = that.activeFrame[STAGE_FRAME_KEY].data();
2835
+ var frameData = activeFrame[STAGE_FRAME_KEY].data();
2693
2836
  waitFor(function () {
2694
2837
  return frameData.state || _activeIndex !== activeIndex;
2695
2838
  }, function () {
@@ -2749,9 +2892,12 @@ jQuery.Fotorama = function ($fotorama, opts) {
2749
2892
 
2750
2893
  if (options.slow) time *= 10;
2751
2894
 
2895
+ var _activeFrame = activeFrame;
2752
2896
  that.activeFrame = activeFrame = data[activeIndex];
2753
2897
  ////console.timeEnd('that.show prepare');
2754
2898
 
2899
+ var silent = _activeFrame === activeFrame;
2900
+
2755
2901
  //setTimeout(function () {
2756
2902
  ////console.time('unloadVideo');
2757
2903
  unloadVideo($videoPlaying, activeFrame.i !== data[normalizeIndex(repositionIndex)].i);
@@ -2766,7 +2912,8 @@ jQuery.Fotorama = function ($fotorama, opts) {
2766
2912
  updateTouchTails('go', true);
2767
2913
  ////console.timeEnd('updateTouchTails');
2768
2914
  ////console.time('triggerEvent');
2769
- options.reset || triggerEvent('show', {
2915
+
2916
+ silent || triggerEvent('show', {
2770
2917
  user: options.user,
2771
2918
  time: time
2772
2919
  });
@@ -2783,9 +2930,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2783
2930
 
2784
2931
  skipReposition || stageShaftReposition(true);
2785
2932
 
2786
- //console.log('options.reset', options.reset);
2787
-
2788
- if (!options.reset) {
2933
+ if (!silent) {
2789
2934
  triggerEvent('showend', {
2790
2935
  user: options.user
2791
2936
  });
@@ -2818,8 +2963,8 @@ jQuery.Fotorama = function ($fotorama, opts) {
2818
2963
  pos: -getPosByIndex(dirtyIndex, measures.w, opts.margin, repositionIndex),
2819
2964
  overPos: overPos,
2820
2965
  time: time,
2821
- onEnd: onEnd,
2822
- _001: true
2966
+ onEnd: onEnd/*,
2967
+ _001: true*/
2823
2968
  });
2824
2969
  ////console.timeEnd('slide');
2825
2970
  } else {
@@ -2844,7 +2989,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2844
2989
 
2845
2990
  ////console.time('slideNavShaft');
2846
2991
  var guessIndex = limitIndex(activeIndex + minMaxLimit(dirtyIndex - lastActiveIndex, -1, 1));
2847
- slideNavShaft({time: time, coo: guessIndex !== activeIndex && options.coo, guessIndex: typeof options.coo !== 'undefined' ? guessIndex : activeIndex, keep: options.reset});
2992
+ slideNavShaft({time: time, coo: guessIndex !== activeIndex && options.coo, guessIndex: typeof options.coo !== 'undefined' ? guessIndex : activeIndex, keep: silent});
2848
2993
  ////console.timeEnd('slideNavShaft');
2849
2994
 
2850
2995
  ////console.time('slideThumbBorder');
@@ -2868,7 +3013,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2868
3013
  scrollTop = $WINDOW.scrollTop();
2869
3014
  scrollLeft = $WINDOW.scrollLeft();
2870
3015
 
2871
- lockScroll(0, 0);
3016
+ lockScroll($WINDOW);
2872
3017
 
2873
3018
  updateTouchTails('x', true);
2874
3019
 
@@ -2922,7 +3067,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2922
3067
  that.resize();
2923
3068
  loadImg(activeIndexes, 'stage');
2924
3069
 
2925
- lockScroll(scrollLeft, scrollTop);
3070
+ lockScroll($WINDOW, scrollLeft, scrollTop);
2926
3071
 
2927
3072
  triggerEvent('fullscreenexit');
2928
3073
  }
@@ -2938,22 +3083,25 @@ jQuery.Fotorama = function ($fotorama, opts) {
2938
3083
  return this;
2939
3084
  };
2940
3085
 
2941
- if (document.addEventListener) {
2942
- document.addEventListener(fullScreenApi.event, function () {
2943
- if (data && !fullScreenApi.is() && !$videoPlaying) {
2944
- cancelFullScreen();
2945
- }
2946
- }, false);
2947
- }
3086
+ that.toggleFullScreen = function () {
3087
+ return that[(that.fullScreen ? 'cancel' : 'request') + 'FullScreen']();
3088
+ };
3089
+
3090
+ addEvent(document, fullScreenApi.event, function () {
3091
+ if (data && !fullScreenApi.is() && !$videoPlaying) {
3092
+ cancelFullScreen();
3093
+ }
3094
+ });
2948
3095
 
2949
3096
  that.resize = function (options) {
2950
3097
  if (!data) return this;
2951
3098
 
2952
- extendMeasures(!that.fullScreen ? optionsToLowerCase(options) : {width: '100%', maxwidth: null, minwidth: null, height: '100%', maxheight: null, minheight: null}, that.fullScreen);
2953
-
2954
3099
  var time = arguments[1] || 0,
2955
- setFLAG = arguments[2],
2956
- width = measures.width,
3100
+ setFLAG = arguments[2];
3101
+
3102
+ extendMeasures(!that.fullScreen ? optionsToLowerCase(options) : {width: '100%', maxwidth: null, minwidth: null, height: '100%', maxheight: null, minheight: null}, [measures, setFLAG || that.fullScreen || opts]);
3103
+
3104
+ var width = measures.width,
2957
3105
  height = measures.height,
2958
3106
  ratio = measures.ratio,
2959
3107
  windowHeight = $WINDOW.height() - (o_nav ? $nav.height() : 0);
@@ -2961,7 +3109,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2961
3109
  if (measureIsValid(width)) {
2962
3110
  $wrap
2963
3111
  .addClass(wrapOnlyActiveClass)
2964
- .css({width: width, minWidth: measures.minwidth, maxWidth: measures.maxwidth});
3112
+ .css({width: width, minWidth: measures.minwidth || 0, maxWidth: measures.maxwidth || MAX_WIDTH});
2965
3113
 
2966
3114
  width = measures.W = measures.w = $wrap.width();
2967
3115
  measures.nw = o_nav && numberFromWhatever(opts.navwidth, width) || width;
@@ -3043,11 +3191,13 @@ jQuery.Fotorama = function ($fotorama, opts) {
3043
3191
  activeIndexes = [];
3044
3192
  detachFrames(STAGE_FRAME_KEY);
3045
3193
 
3194
+ reset.ok = false;
3195
+
3046
3196
  return this;
3047
3197
  };
3048
3198
 
3049
3199
  that.playVideo = function () {
3050
- var dataFrame = that.activeFrame,
3200
+ var dataFrame = activeFrame,
3051
3201
  video = dataFrame.video,
3052
3202
  _activeIndex = activeIndex;
3053
3203
 
@@ -3066,6 +3216,9 @@ jQuery.Fotorama = function ($fotorama, opts) {
3066
3216
 
3067
3217
  stageNoMove();
3068
3218
 
3219
+ $arrs.blur();
3220
+ $fullscreenIcon.blur();
3221
+
3069
3222
  triggerEvent('loadvideo');
3070
3223
  }
3071
3224
  });
@@ -3109,7 +3262,6 @@ jQuery.Fotorama = function ($fotorama, opts) {
3109
3262
  pointerFLAG = x && !disableDirrection(getDirection(x)) && opts.click;
3110
3263
 
3111
3264
  if (stageCursor.p !== pointerFLAG
3112
- && (o_fade || !opts.swipe)
3113
3265
  && $stage.toggleClass(pointerClass, pointerFLAG)) {
3114
3266
  stageCursor.p = pointerFLAG;
3115
3267
  stageCursor.x = x;
@@ -3143,7 +3295,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
3143
3295
  if ($target.hasClass(videoPlayClass)) {
3144
3296
  that.playVideo();
3145
3297
  } else if (target === fullscreenIcon) {
3146
- that[(that.fullScreen ? 'cancel' : 'request') + 'FullScreen']();
3298
+ that.toggleFullScreen();
3147
3299
  } else if ($videoPlaying) {
3148
3300
  target === videoClose && unloadVideo($videoPlaying, true, true);
3149
3301
  } else {
@@ -3173,7 +3325,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
3173
3325
 
3174
3326
  ////console.log('result', result);
3175
3327
 
3176
- var toggleControlsFLAG = (MS_POINTER && !hoverFLAG || result.touch) && opts.arrows;
3328
+ var toggleControlsFLAG = (MS_POINTER && !hoverFLAG || result.touch) && opts.arrows && opts.arrows !== 'always';
3177
3329
 
3178
3330
  if (result.moved || (toggleControlsFLAG && result.pos !== result.newPos && !result.control)) {
3179
3331
  var index = getIndexByPos(result.newPos, measures.w, opts.margin, repositionIndex);
@@ -3191,7 +3343,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
3191
3343
  // getPos: function () {
3192
3344
  // return -getPosByIndex(dirtyIndex, measures.w, opts.margin, repositionIndex);
3193
3345
  // },
3194
- _001: true,
3346
+ //_001: true,
3195
3347
  timeLow: 1,
3196
3348
  timeHigh: 1,
3197
3349
  friction: 2,
@@ -3258,6 +3410,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
3258
3410
  navWheelTail.prevent = {'<': newPos >= navShaftTouchTail.max, '>': newPos <= navShaftTouchTail.min};
3259
3411
  clearTimeout(navWheelTail.t);
3260
3412
  navWheelTail.t = setTimeout(function () {
3413
+ slideNavShaft.l = newPos;
3261
3414
  thumbsDraw(newPos, true)
3262
3415
  }, TOUCH_TIMEOUT);
3263
3416
  thumbsDraw(newPos);
@@ -3268,24 +3421,26 @@ jQuery.Fotorama = function ($fotorama, opts) {
3268
3421
  function () {
3269
3422
  setTimeout(function () {
3270
3423
  if (touchedFLAG) return;
3271
- hoverFLAG = true;
3272
- toggleControlsClass(!hoverFLAG);
3424
+ toggleControlsClass(!(hoverFLAG = true));
3273
3425
  }, 0);
3274
3426
  }, function () {
3275
3427
  if (!hoverFLAG) return;
3276
- hoverFLAG = false;
3277
- toggleControlsClass(!hoverFLAG);
3428
+ toggleControlsClass(!(hoverFLAG = false));
3278
3429
  }
3279
3430
  );
3280
3431
 
3281
- function onNavFrameClick (e, time) {
3432
+ function onNavFrameClick (e) {
3282
3433
  var index = $(this).data().eq;
3283
- clickToShow({index: index, slow: e.altKey, user: true, coo: e._x - $nav.offset().left, time: time});
3434
+ clickToShow({index: index, slow: e.altKey, user: true, coo: e._x - $nav.offset().left});
3435
+ }
3436
+
3437
+ function onArrClick (e) {
3438
+ clickToShow({index: $arrs.index(this) ? '>' : '<', slow: e.altKey, user: true});
3284
3439
  }
3285
3440
 
3286
3441
  smartClick($arrs, function (e) {
3287
3442
  stopEvent(e);
3288
- clickToShow({index: $arrs.index(this) ? '>' : '<', slow: e.altKey, user: true});
3443
+ onArrClick.call(this, e);
3289
3444
  }, {
3290
3445
  onStart: function () {
3291
3446
  onTouchStart();
@@ -3294,7 +3449,29 @@ jQuery.Fotorama = function ($fotorama, opts) {
3294
3449
  onTouchEnd: onTouchEnd
3295
3450
  });
3296
3451
 
3452
+ function addFocusOnControls (el) {
3453
+ addFocus(el, function () {
3454
+ lockScroll($stage);
3455
+ setTimeout(function () {
3456
+ lockScroll($stage);
3457
+ }, 0);
3458
+ toggleControlsClass(false);
3459
+ });
3460
+ }
3461
+
3462
+ $arrs.each(function () {
3463
+ addEnterUp(this, function (e) {
3464
+ onArrClick.call(this, e);
3465
+ });
3466
+ addFocusOnControls(this);
3467
+ });
3468
+
3469
+ addEnterUp(fullscreenIcon, that.toggleFullScreen);
3470
+ addFocusOnControls(fullscreenIcon);
3471
+
3297
3472
  function reset () {
3473
+ var ok = reset.ok;
3474
+
3298
3475
  setData();
3299
3476
  setOptions();
3300
3477
 
@@ -3305,7 +3482,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
3305
3482
  if (_startindex || opts.hash && location.hash) {
3306
3483
  startIndex = getIndexFromHash(_startindex || location.hash.replace(/^#/, ''), data, that.index === 0 || _startindex, _startindex);
3307
3484
  }
3308
- activeIndex = repositionIndex = dirtyIndex = lastActiveIndex = startIndex = edgeIndex(startIndex) || 0;/*(o_rtl ? size - 1 : 0)*/;
3485
+ activeIndex = repositionIndex = dirtyIndex = lastActiveIndex = startIndex = edgeIndex(startIndex) || 0;/*(o_rtl ? size - 1 : 0)*///;
3309
3486
  }
3310
3487
 
3311
3488
  if (size) {
@@ -3318,13 +3495,13 @@ jQuery.Fotorama = function ($fotorama, opts) {
3318
3495
  activeIndexes = [];
3319
3496
  detachFrames(STAGE_FRAME_KEY);
3320
3497
 
3321
- that.show({index: activeIndex, time: 0, reset: reset.ok});
3498
+ reset.ok = true;
3499
+
3500
+ that.show({index: activeIndex, time: 0});
3322
3501
  that.resize();
3323
3502
  } else {
3324
3503
  that.destroy();
3325
3504
  }
3326
-
3327
- reset.ok = true;
3328
3505
  }
3329
3506
 
3330
3507
  function changeToRtl () {
@@ -3382,61 +3559,7 @@ $.fn.fotorama = function (opts) {
3382
3559
  * 3. Defaults */
3383
3560
  $.extend(
3384
3561
  {},
3385
- {
3386
- // dimensions
3387
- width: null, // 500 || '100%'
3388
- minwidth: null,
3389
- maxwidth: '100%', // '100%'
3390
- height: null,
3391
- minheight: null,
3392
- maxheight: null,
3393
-
3394
- ratio: null, // '16/9' || 500/333 || 1.5
3395
-
3396
- margin: MARGIN,
3397
- glimpse: 0,
3398
-
3399
- // navigation, thumbs
3400
- nav: 'dots', // 'thumbs' || false
3401
- navposition: 'bottom', // 'top'
3402
- navwidth: null,
3403
- thumbwidth: THUMB_SIZE,
3404
- thumbheight: THUMB_SIZE,
3405
- thumbmargin: MARGIN,
3406
- thumbborderwidth: MARGIN,
3407
-
3408
- allowfullscreen: false, // true || 'native'
3409
-
3410
- fit: 'contain', // 'cover' || 'scaledown' || 'none'
3411
-
3412
- transition: 'slide', // 'crossfade' || 'dissolve'
3413
- clicktransition: null,
3414
- transitionduration: TRANSITION_DURATION,
3415
-
3416
- captions: true,
3417
-
3418
- hash: false,
3419
- startindex: 0,
3420
-
3421
- loop: false,
3422
-
3423
- autoplay: false,
3424
- stopautoplayontouch: true,
3425
-
3426
- keyboard: false,
3427
-
3428
- arrows: true,
3429
- click: true,
3430
- swipe: true,
3431
- trackpad: true,
3432
-
3433
- shuffle: false,
3434
-
3435
- direction: 'ltr', // 'rtl'
3436
-
3437
- shadows: true,
3438
- spinner: null
3439
- },
3562
+ OPTIONS,
3440
3563
  window.fotoramaDefaults,
3441
3564
  opts,
3442
3565
  fotoramaData
@@ -3444,7 +3567,7 @@ $.fn.fotorama = function (opts) {
3444
3567
  );
3445
3568
  });
3446
3569
  } else {
3447
- fotorama.setOptions(opts);
3570
+ fotorama.setOptions(opts, true);
3448
3571
  }
3449
3572
  });
3450
3573
  };
@@ -3495,8 +3618,8 @@ $.Fotorama.jst.video = function(v) {
3495
3618
  var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
3496
3619
  function print() { __p += __j.call(arguments, '') }
3497
3620
  __p += '<div class="fotorama__video"><iframe src="';
3498
- print((v.type == 'youtube' ? 'http://youtube.com/embed/' + v.id +'?autoplay=1' : v.type == 'vimeo' ? 'http://player.vimeo.com/video/' + v.id + '?autoplay=1&badge=0' : v.id) + (v.s && v.type != 'custom' ? '&' + v.s : '')) ;
3499
- __p += '" frameborder="0" allowfullscreen></iframe></div>';
3621
+ print((v.type == 'youtube' ? v.p + 'youtube.com/embed/' + v.id +'?autoplay=1' : v.type == 'vimeo' ? v.p + 'player.vimeo.com/video/' + v.id + '?autoplay=1&badge=0' : v.id) + (v.s && v.type != 'custom' ? '&' + v.s : '')) ;
3622
+ __p += '" frameborder="0" allowfullscreen></iframe></div>\n';
3500
3623
  return __p
3501
3624
  };
3502
3625
  $(function () {