promethee 1.6.60 → 1.6.61

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/promethee.js +1 -1
  3. data/app/assets/stylesheets/promethee.sass +1 -1
  4. data/app/views/promethee/show/_image.srcset.html.erb +1 -1
  5. data/lib/promethee/rails/version.rb +1 -1
  6. data/node_modules/@fancyapps/fancybox/README.md +62 -0
  7. data/node_modules/@fancyapps/fancybox/bower.json +23 -0
  8. data/node_modules/@fancyapps/fancybox/dist/jquery.fancybox.css +770 -0
  9. data/node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js +5138 -0
  10. data/node_modules/@fancyapps/fancybox/dist/jquery.fancybox.min.css +1 -0
  11. data/node_modules/@fancyapps/fancybox/dist/jquery.fancybox.min.js +12 -0
  12. data/node_modules/@fancyapps/fancybox/docs/index.html +1923 -0
  13. data/node_modules/@fancyapps/fancybox/gulpfile.js +67 -0
  14. data/node_modules/@fancyapps/fancybox/package.json +80 -0
  15. data/node_modules/@fancyapps/fancybox/src/css/core.css +634 -0
  16. data/node_modules/@fancyapps/fancybox/src/css/fullscreen.css +11 -0
  17. data/node_modules/@fancyapps/fancybox/src/css/share.css +96 -0
  18. data/node_modules/@fancyapps/fancybox/src/css/slideshow.css +26 -0
  19. data/node_modules/@fancyapps/fancybox/src/css/thumbs.css +120 -0
  20. data/node_modules/@fancyapps/fancybox/src/js/core.js +3064 -0
  21. data/node_modules/@fancyapps/fancybox/src/js/fullscreen.js +169 -0
  22. data/node_modules/@fancyapps/fancybox/src/js/guestures.js +885 -0
  23. data/node_modules/@fancyapps/fancybox/src/js/hash.js +216 -0
  24. data/node_modules/@fancyapps/fancybox/src/js/media.js +201 -0
  25. data/node_modules/@fancyapps/fancybox/src/js/share.js +104 -0
  26. data/node_modules/@fancyapps/fancybox/src/js/slideshow.js +181 -0
  27. data/node_modules/@fancyapps/fancybox/src/js/thumbs.js +259 -0
  28. data/node_modules/@fancyapps/fancybox/src/js/wheel.js +41 -0
  29. metadata +24 -1
@@ -0,0 +1,169 @@
1
+ // ==========================================================================
2
+ //
3
+ // FullScreen
4
+ // Adds fullscreen functionality
5
+ //
6
+ // ==========================================================================
7
+ (function(document, $) {
8
+ "use strict";
9
+
10
+ // Collection of methods supported by user browser
11
+ var fn = (function() {
12
+ var fnMap = [
13
+ ["requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror"],
14
+ // new WebKit
15
+ [
16
+ "webkitRequestFullscreen",
17
+ "webkitExitFullscreen",
18
+ "webkitFullscreenElement",
19
+ "webkitFullscreenEnabled",
20
+ "webkitfullscreenchange",
21
+ "webkitfullscreenerror"
22
+ ],
23
+ // old WebKit (Safari 5.1)
24
+ [
25
+ "webkitRequestFullScreen",
26
+ "webkitCancelFullScreen",
27
+ "webkitCurrentFullScreenElement",
28
+ "webkitCancelFullScreen",
29
+ "webkitfullscreenchange",
30
+ "webkitfullscreenerror"
31
+ ],
32
+ [
33
+ "mozRequestFullScreen",
34
+ "mozCancelFullScreen",
35
+ "mozFullScreenElement",
36
+ "mozFullScreenEnabled",
37
+ "mozfullscreenchange",
38
+ "mozfullscreenerror"
39
+ ],
40
+ ["msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError"]
41
+ ];
42
+
43
+ var ret = {};
44
+
45
+ for (var i = 0; i < fnMap.length; i++) {
46
+ var val = fnMap[i];
47
+
48
+ if (val && val[1] in document) {
49
+ for (var j = 0; j < val.length; j++) {
50
+ ret[fnMap[0][j]] = val[j];
51
+ }
52
+
53
+ return ret;
54
+ }
55
+ }
56
+
57
+ return false;
58
+ })();
59
+
60
+ // If browser does not have Full Screen API, then simply unset default button template and stop
61
+ if (!fn) {
62
+ if ($ && $.fancybox) {
63
+ $.fancybox.defaults.btnTpl.fullScreen = false;
64
+ }
65
+
66
+ return;
67
+ }
68
+
69
+ var FullScreen = {
70
+ request: function(elem) {
71
+ elem = elem || document.documentElement;
72
+
73
+ elem[fn.requestFullscreen](elem.ALLOW_KEYBOARD_INPUT);
74
+ },
75
+ exit: function() {
76
+ document[fn.exitFullscreen]();
77
+ },
78
+ toggle: function(elem) {
79
+ elem = elem || document.documentElement;
80
+
81
+ if (this.isFullscreen()) {
82
+ this.exit();
83
+ } else {
84
+ this.request(elem);
85
+ }
86
+ },
87
+ isFullscreen: function() {
88
+ return Boolean(document[fn.fullscreenElement]);
89
+ },
90
+ enabled: function() {
91
+ return Boolean(document[fn.fullscreenEnabled]);
92
+ }
93
+ };
94
+
95
+ $.extend(true, $.fancybox.defaults, {
96
+ btnTpl: {
97
+ fullScreen:
98
+ '<button data-fancybox-fullscreen class="fancybox-button fancybox-button--fullscreen" title="{{FULL_SCREEN}}">' +
99
+ '<svg viewBox="0 0 40 40">' +
100
+ '<path d="M9,12 v16 h22 v-16 h-22 v8" />' +
101
+ "</svg>" +
102
+ "</button>"
103
+ },
104
+ fullScreen: {
105
+ autoStart: false
106
+ }
107
+ });
108
+
109
+ $(document).on({
110
+ "onInit.fb": function(e, instance) {
111
+ var $container;
112
+
113
+ if (instance && instance.group[instance.currIndex].opts.fullScreen) {
114
+ $container = instance.$refs.container;
115
+
116
+ $container.on("click.fb-fullscreen", "[data-fancybox-fullscreen]", function(e) {
117
+ e.stopPropagation();
118
+ e.preventDefault();
119
+
120
+ FullScreen.toggle();
121
+ });
122
+
123
+ if (instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true) {
124
+ FullScreen.request();
125
+ }
126
+
127
+ // Expose API
128
+ instance.FullScreen = FullScreen;
129
+ } else if (instance) {
130
+ instance.$refs.toolbar.find("[data-fancybox-fullscreen]").hide();
131
+ }
132
+ },
133
+
134
+ "afterKeydown.fb": function(e, instance, current, keypress, keycode) {
135
+ // "F"
136
+ if (instance && instance.FullScreen && keycode === 70) {
137
+ keypress.preventDefault();
138
+
139
+ instance.FullScreen.toggle();
140
+ }
141
+ },
142
+
143
+ "beforeClose.fb": function(e, instance) {
144
+ if (instance && instance.FullScreen && instance.$refs.container.hasClass("fancybox-is-fullscreen")) {
145
+ FullScreen.exit();
146
+ }
147
+ }
148
+ });
149
+
150
+ $(document).on(fn.fullscreenchange, function() {
151
+ var isFullscreen = FullScreen.isFullscreen(),
152
+ instance = $.fancybox.getInstance();
153
+
154
+ if (instance) {
155
+ // If image is zooming, then force to stop and reposition properly
156
+ if (instance.current && instance.current.type === "image" && instance.isAnimating) {
157
+ instance.current.$content.css("transition", "none");
158
+
159
+ instance.isAnimating = false;
160
+
161
+ instance.update(true, true, 0);
162
+ }
163
+
164
+ instance.trigger("onFullscreenChange", isFullscreen);
165
+
166
+ instance.$refs.container.toggleClass("fancybox-is-fullscreen", isFullscreen);
167
+ }
168
+ });
169
+ })(document, window.jQuery || jQuery);
@@ -0,0 +1,885 @@
1
+ // ==========================================================================
2
+ //
3
+ // Guestures
4
+ // Adds touch guestures, handles click and tap events
5
+ //
6
+ // ==========================================================================
7
+ (function(window, document, $) {
8
+ "use strict";
9
+
10
+ var requestAFrame = (function() {
11
+ return (
12
+ window.requestAnimationFrame ||
13
+ window.webkitRequestAnimationFrame ||
14
+ window.mozRequestAnimationFrame ||
15
+ window.oRequestAnimationFrame ||
16
+ // if all else fails, use setTimeout
17
+ function(callback) {
18
+ return window.setTimeout(callback, 1000 / 60);
19
+ }
20
+ );
21
+ })();
22
+
23
+ var cancelAFrame = (function() {
24
+ return (
25
+ window.cancelAnimationFrame ||
26
+ window.webkitCancelAnimationFrame ||
27
+ window.mozCancelAnimationFrame ||
28
+ window.oCancelAnimationFrame ||
29
+ function(id) {
30
+ window.clearTimeout(id);
31
+ }
32
+ );
33
+ })();
34
+
35
+ var getPointerXY = function(e) {
36
+ var result = [];
37
+
38
+ e = e.originalEvent || e || window.e;
39
+ e = e.touches && e.touches.length ? e.touches : e.changedTouches && e.changedTouches.length ? e.changedTouches : [e];
40
+
41
+ for (var key in e) {
42
+ if (e[key].pageX) {
43
+ result.push({
44
+ x: e[key].pageX,
45
+ y: e[key].pageY
46
+ });
47
+ } else if (e[key].clientX) {
48
+ result.push({
49
+ x: e[key].clientX,
50
+ y: e[key].clientY
51
+ });
52
+ }
53
+ }
54
+
55
+ return result;
56
+ };
57
+
58
+ var distance = function(point2, point1, what) {
59
+ if (!point1 || !point2) {
60
+ return 0;
61
+ }
62
+
63
+ if (what === "x") {
64
+ return point2.x - point1.x;
65
+ } else if (what === "y") {
66
+ return point2.y - point1.y;
67
+ }
68
+
69
+ return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2));
70
+ };
71
+
72
+ var isClickable = function($el) {
73
+ if (
74
+ $el.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio') ||
75
+ $.isFunction($el.get(0).onclick) ||
76
+ $el.data("selectable")
77
+ ) {
78
+ return true;
79
+ }
80
+
81
+ // Check for attributes like data-fancybox-next or data-fancybox-close
82
+ for (var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++) {
83
+ if (atts[i].nodeName.substr(0, 14) === "data-fancybox-") {
84
+ return true;
85
+ }
86
+ }
87
+
88
+ return false;
89
+ };
90
+
91
+ var hasScrollbars = function(el) {
92
+ var overflowY = window.getComputedStyle(el)["overflow-y"],
93
+ overflowX = window.getComputedStyle(el)["overflow-x"],
94
+ vertical = (overflowY === "scroll" || overflowY === "auto") && el.scrollHeight > el.clientHeight,
95
+ horizontal = (overflowX === "scroll" || overflowX === "auto") && el.scrollWidth > el.clientWidth;
96
+
97
+ return vertical || horizontal;
98
+ };
99
+
100
+ var isScrollable = function($el) {
101
+ var rez = false;
102
+
103
+ while (true) {
104
+ rez = hasScrollbars($el.get(0));
105
+
106
+ if (rez) {
107
+ break;
108
+ }
109
+
110
+ $el = $el.parent();
111
+
112
+ if (!$el.length || $el.hasClass("fancybox-stage") || $el.is("body")) {
113
+ break;
114
+ }
115
+ }
116
+
117
+ return rez;
118
+ };
119
+
120
+ var Guestures = function(instance) {
121
+ var self = this;
122
+
123
+ self.instance = instance;
124
+
125
+ self.$bg = instance.$refs.bg;
126
+ self.$stage = instance.$refs.stage;
127
+ self.$container = instance.$refs.container;
128
+
129
+ self.destroy();
130
+
131
+ self.$container.on("touchstart.fb.touch mousedown.fb.touch", $.proxy(self, "ontouchstart"));
132
+ };
133
+
134
+ Guestures.prototype.destroy = function() {
135
+ this.$container.off(".fb.touch");
136
+ };
137
+
138
+ Guestures.prototype.ontouchstart = function(e) {
139
+ var self = this,
140
+ $target = $(e.target),
141
+ instance = self.instance,
142
+ current = instance.current,
143
+ $content = current.$content,
144
+ isTouchDevice = e.type == "touchstart";
145
+
146
+ // Do not respond to both (touch and mouse) events
147
+ if (isTouchDevice) {
148
+ self.$container.off("mousedown.fb.touch");
149
+ }
150
+
151
+ // Ignore right click
152
+ if (e.originalEvent && e.originalEvent.button == 2) {
153
+ return;
154
+ }
155
+
156
+ // Ignore taping on links, buttons, input elements
157
+ if (!$target.length || isClickable($target) || isClickable($target.parent())) {
158
+ return;
159
+ }
160
+
161
+ // Ignore clicks on the scrollbar
162
+ if (!$target.is("img") && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left) {
163
+ return;
164
+ }
165
+
166
+ // Ignore clicks while zooming or closing
167
+ if (!current || instance.isAnimating || instance.isClosing) {
168
+ e.stopPropagation();
169
+ e.preventDefault();
170
+
171
+ return;
172
+ }
173
+
174
+ self.realPoints = self.startPoints = getPointerXY(e);
175
+
176
+ if (!self.startPoints.length) {
177
+ return;
178
+ }
179
+
180
+ e.stopPropagation();
181
+
182
+ self.startEvent = e;
183
+
184
+ self.canTap = true;
185
+ self.$target = $target;
186
+ self.$content = $content;
187
+ self.opts = current.opts.touch;
188
+
189
+ self.isPanning = false;
190
+ self.isSwiping = false;
191
+ self.isZooming = false;
192
+ self.isScrolling = false;
193
+
194
+ self.startTime = new Date().getTime();
195
+ self.distanceX = self.distanceY = self.distance = 0;
196
+
197
+ self.canvasWidth = Math.round(current.$slide[0].clientWidth);
198
+ self.canvasHeight = Math.round(current.$slide[0].clientHeight);
199
+
200
+ self.contentLastPos = null;
201
+ self.contentStartPos = $.fancybox.getTranslate(self.$content) || {top: 0, left: 0};
202
+ self.sliderStartPos = self.sliderLastPos || $.fancybox.getTranslate(current.$slide);
203
+
204
+ // Since position will be absolute, but we need to make it relative to the stage
205
+ self.stagePos = $.fancybox.getTranslate(instance.$refs.stage);
206
+
207
+ self.sliderStartPos.top -= self.stagePos.top;
208
+ self.sliderStartPos.left -= self.stagePos.left;
209
+
210
+ self.contentStartPos.top -= self.stagePos.top;
211
+ self.contentStartPos.left -= self.stagePos.left;
212
+
213
+ $(document)
214
+ .off(".fb.touch")
215
+ .on(isTouchDevice ? "touchend.fb.touch touchcancel.fb.touch" : "mouseup.fb.touch mouseleave.fb.touch", $.proxy(self, "ontouchend"))
216
+ .on(isTouchDevice ? "touchmove.fb.touch" : "mousemove.fb.touch", $.proxy(self, "ontouchmove"));
217
+
218
+ if ($.fancybox.isMobile) {
219
+ document.addEventListener("scroll", self.onscroll, true);
220
+ }
221
+
222
+ if (!(self.opts || instance.canPan()) || !($target.is(self.$stage) || self.$stage.find($target).length)) {
223
+ if ($target.is(".fancybox-image")) {
224
+ e.preventDefault();
225
+ }
226
+
227
+ return;
228
+ }
229
+
230
+ if (!($.fancybox.isMobile && (isScrollable($target) || isScrollable($target.parent())))) {
231
+ e.preventDefault();
232
+ }
233
+
234
+ if (self.startPoints.length === 1 || current.hasError) {
235
+ if (self.instance.canPan()) {
236
+ $.fancybox.stop(self.$content);
237
+
238
+ self.$content.css("transition-duration", "");
239
+
240
+ self.isPanning = true;
241
+ } else {
242
+ self.isSwiping = true;
243
+ }
244
+
245
+ self.$container.addClass("fancybox-controls--isGrabbing");
246
+ }
247
+
248
+ if (self.startPoints.length === 2 && current.type === "image" && (current.isLoaded || current.$ghost)) {
249
+ self.canTap = false;
250
+ self.isSwiping = false;
251
+ self.isPanning = false;
252
+
253
+ self.isZooming = true;
254
+
255
+ $.fancybox.stop(self.$content);
256
+
257
+ self.$content.css("transition-duration", "");
258
+
259
+ self.centerPointStartX = (self.startPoints[0].x + self.startPoints[1].x) * 0.5 - $(window).scrollLeft();
260
+ self.centerPointStartY = (self.startPoints[0].y + self.startPoints[1].y) * 0.5 - $(window).scrollTop();
261
+
262
+ self.percentageOfImageAtPinchPointX = (self.centerPointStartX - self.contentStartPos.left) / self.contentStartPos.width;
263
+ self.percentageOfImageAtPinchPointY = (self.centerPointStartY - self.contentStartPos.top) / self.contentStartPos.height;
264
+
265
+ self.startDistanceBetweenFingers = distance(self.startPoints[0], self.startPoints[1]);
266
+ }
267
+ };
268
+
269
+ Guestures.prototype.onscroll = function(e) {
270
+ var self = this;
271
+
272
+ self.isScrolling = true;
273
+
274
+ document.removeEventListener("scroll", self.onscroll, true);
275
+ };
276
+
277
+ Guestures.prototype.ontouchmove = function(e) {
278
+ var self = this,
279
+ $target = $(e.target);
280
+
281
+ // Make sure user has not released over iframe or disabled element
282
+ if (e.originalEvent.buttons !== undefined && e.originalEvent.buttons === 0) {
283
+ self.ontouchend(e);
284
+ return;
285
+ }
286
+
287
+ if (self.isScrolling || !($target.is(self.$stage) || self.$stage.find($target).length)) {
288
+ self.canTap = false;
289
+
290
+ return;
291
+ }
292
+
293
+ self.newPoints = getPointerXY(e);
294
+
295
+ if (!(self.opts || self.instance.canPan()) || !self.newPoints.length || !self.newPoints.length) {
296
+ return;
297
+ }
298
+
299
+ if (!(self.isSwiping && self.isSwiping === true)) {
300
+ e.preventDefault();
301
+ }
302
+
303
+ self.distanceX = distance(self.newPoints[0], self.startPoints[0], "x");
304
+ self.distanceY = distance(self.newPoints[0], self.startPoints[0], "y");
305
+
306
+ self.distance = distance(self.newPoints[0], self.startPoints[0]);
307
+
308
+ // Skip false ontouchmove events (Chrome)
309
+ if (self.distance > 0) {
310
+ if (self.isSwiping) {
311
+ self.onSwipe(e);
312
+ } else if (self.isPanning) {
313
+ self.onPan();
314
+ } else if (self.isZooming) {
315
+ self.onZoom();
316
+ }
317
+ }
318
+ };
319
+
320
+ Guestures.prototype.onSwipe = function(e) {
321
+ var self = this,
322
+ swiping = self.isSwiping,
323
+ left = self.sliderStartPos.left || 0,
324
+ angle;
325
+
326
+ // If direction is not yet determined
327
+ if (swiping === true) {
328
+ // We need at least 10px distance to correctly calculate an angle
329
+ if (Math.abs(self.distance) > 10) {
330
+ self.canTap = false;
331
+
332
+ if (self.instance.group.length < 2 && self.opts.vertical) {
333
+ self.isSwiping = "y";
334
+ } else if (self.instance.isDragging || self.opts.vertical === false || (self.opts.vertical === "auto" && $(window).width() > 800)) {
335
+ self.isSwiping = "x";
336
+ } else {
337
+ angle = Math.abs(Math.atan2(self.distanceY, self.distanceX) * 180 / Math.PI);
338
+
339
+ self.isSwiping = angle > 45 && angle < 135 ? "y" : "x";
340
+ }
341
+
342
+ self.canTap = false;
343
+
344
+ if (self.isSwiping === "y" && $.fancybox.isMobile && (isScrollable(self.$target) || isScrollable(self.$target.parent()))) {
345
+ self.isScrolling = true;
346
+
347
+ return;
348
+ }
349
+
350
+ self.instance.isDragging = self.isSwiping;
351
+
352
+ // Reset points to avoid jumping, because we dropped first swipes to calculate the angle
353
+ self.startPoints = self.newPoints;
354
+
355
+ $.each(self.instance.slides, function(index, slide) {
356
+ $.fancybox.stop(slide.$slide);
357
+
358
+ slide.$slide.css("transition-duration", "");
359
+
360
+ slide.inTransition = false;
361
+
362
+ if (slide.pos === self.instance.current.pos) {
363
+ self.sliderStartPos.left = $.fancybox.getTranslate(slide.$slide).left - $.fancybox.getTranslate(self.instance.$refs.stage).left;
364
+ }
365
+ });
366
+
367
+ // Stop slideshow
368
+ if (self.instance.SlideShow && self.instance.SlideShow.isActive) {
369
+ self.instance.SlideShow.stop();
370
+ }
371
+ }
372
+
373
+ return;
374
+ }
375
+
376
+ // Sticky edges
377
+ if (swiping == "x") {
378
+ if (
379
+ self.distanceX > 0 &&
380
+ (self.instance.group.length < 2 || (self.instance.current.index === 0 && !self.instance.current.opts.loop))
381
+ ) {
382
+ left = left + Math.pow(self.distanceX, 0.8);
383
+ } else if (
384
+ self.distanceX < 0 &&
385
+ (self.instance.group.length < 2 ||
386
+ (self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop))
387
+ ) {
388
+ left = left - Math.pow(-self.distanceX, 0.8);
389
+ } else {
390
+ left = left + self.distanceX;
391
+ }
392
+ }
393
+
394
+ self.sliderLastPos = {
395
+ top: swiping == "x" ? 0 : self.sliderStartPos.top + self.distanceY,
396
+ left: left
397
+ };
398
+
399
+ if (self.requestId) {
400
+ cancelAFrame(self.requestId);
401
+
402
+ self.requestId = null;
403
+ }
404
+
405
+ self.requestId = requestAFrame(function() {
406
+ if (self.sliderLastPos) {
407
+ $.each(self.instance.slides, function(index, slide) {
408
+ var pos = slide.pos - self.instance.currPos;
409
+
410
+ $.fancybox.setTranslate(slide.$slide, {
411
+ top: self.sliderLastPos.top,
412
+ left: self.sliderLastPos.left + pos * self.canvasWidth + pos * slide.opts.gutter
413
+ });
414
+ });
415
+
416
+ self.$container.addClass("fancybox-is-sliding");
417
+ }
418
+ });
419
+ };
420
+
421
+ Guestures.prototype.onPan = function() {
422
+ var self = this;
423
+
424
+ // Prevent accidental movement (sometimes, when tapping casually, finger can move a bit)
425
+ if (distance(self.newPoints[0], self.realPoints[0]) < ($.fancybox.isMobile ? 10 : 5)) {
426
+ self.startPoints = self.newPoints;
427
+ return;
428
+ }
429
+
430
+ self.canTap = false;
431
+
432
+ self.contentLastPos = self.limitMovement();
433
+
434
+ if (self.requestId) {
435
+ cancelAFrame(self.requestId);
436
+
437
+ self.requestId = null;
438
+ }
439
+
440
+ self.requestId = requestAFrame(function() {
441
+ $.fancybox.setTranslate(self.$content, self.contentLastPos);
442
+ });
443
+ };
444
+
445
+ // Make panning sticky to the edges
446
+ Guestures.prototype.limitMovement = function() {
447
+ var self = this;
448
+
449
+ var canvasWidth = self.canvasWidth;
450
+ var canvasHeight = self.canvasHeight;
451
+
452
+ var distanceX = self.distanceX;
453
+ var distanceY = self.distanceY;
454
+
455
+ var contentStartPos = self.contentStartPos;
456
+
457
+ var currentOffsetX = contentStartPos.left;
458
+ var currentOffsetY = contentStartPos.top;
459
+
460
+ var currentWidth = contentStartPos.width;
461
+ var currentHeight = contentStartPos.height;
462
+
463
+ var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY, newOffsetX, newOffsetY;
464
+
465
+ if (currentWidth > canvasWidth) {
466
+ newOffsetX = currentOffsetX + distanceX;
467
+ } else {
468
+ newOffsetX = currentOffsetX;
469
+ }
470
+
471
+ newOffsetY = currentOffsetY + distanceY;
472
+
473
+ // Slow down proportionally to traveled distance
474
+ minTranslateX = Math.max(0, canvasWidth * 0.5 - currentWidth * 0.5);
475
+ minTranslateY = Math.max(0, canvasHeight * 0.5 - currentHeight * 0.5);
476
+
477
+ maxTranslateX = Math.min(canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5);
478
+ maxTranslateY = Math.min(canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5);
479
+
480
+ // ->
481
+ if (distanceX > 0 && newOffsetX > minTranslateX) {
482
+ newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8) || 0;
483
+ }
484
+
485
+ // <-
486
+ if (distanceX < 0 && newOffsetX < maxTranslateX) {
487
+ newOffsetX = maxTranslateX + 1 - Math.pow(maxTranslateX - currentOffsetX - distanceX, 0.8) || 0;
488
+ }
489
+
490
+ // \/
491
+ if (distanceY > 0 && newOffsetY > minTranslateY) {
492
+ newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8) || 0;
493
+ }
494
+
495
+ // /\
496
+ if (distanceY < 0 && newOffsetY < maxTranslateY) {
497
+ newOffsetY = maxTranslateY + 1 - Math.pow(maxTranslateY - currentOffsetY - distanceY, 0.8) || 0;
498
+ }
499
+
500
+ return {
501
+ top: newOffsetY,
502
+ left: newOffsetX
503
+ };
504
+ };
505
+
506
+ Guestures.prototype.limitPosition = function(newOffsetX, newOffsetY, newWidth, newHeight) {
507
+ var self = this;
508
+
509
+ var canvasWidth = self.canvasWidth;
510
+ var canvasHeight = self.canvasHeight;
511
+
512
+ if (newWidth > canvasWidth) {
513
+ newOffsetX = newOffsetX > 0 ? 0 : newOffsetX;
514
+ newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX;
515
+ } else {
516
+ // Center horizontally
517
+ newOffsetX = Math.max(0, canvasWidth / 2 - newWidth / 2);
518
+ }
519
+
520
+ if (newHeight > canvasHeight) {
521
+ newOffsetY = newOffsetY > 0 ? 0 : newOffsetY;
522
+ newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY;
523
+ } else {
524
+ // Center vertically
525
+ newOffsetY = Math.max(0, canvasHeight / 2 - newHeight / 2);
526
+ }
527
+
528
+ return {
529
+ top: newOffsetY,
530
+ left: newOffsetX
531
+ };
532
+ };
533
+
534
+ Guestures.prototype.onZoom = function() {
535
+ var self = this;
536
+
537
+ // Calculate current distance between points to get pinch ratio and new width and height
538
+ var contentStartPos = self.contentStartPos;
539
+
540
+ var currentWidth = contentStartPos.width;
541
+ var currentHeight = contentStartPos.height;
542
+
543
+ var currentOffsetX = contentStartPos.left;
544
+ var currentOffsetY = contentStartPos.top;
545
+
546
+ var endDistanceBetweenFingers = distance(self.newPoints[0], self.newPoints[1]);
547
+
548
+ var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers;
549
+
550
+ var newWidth = Math.floor(currentWidth * pinchRatio);
551
+ var newHeight = Math.floor(currentHeight * pinchRatio);
552
+
553
+ // This is the translation due to pinch-zooming
554
+ var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX;
555
+ var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY;
556
+
557
+ // Point between the two touches
558
+ var centerPointEndX = (self.newPoints[0].x + self.newPoints[1].x) / 2 - $(window).scrollLeft();
559
+ var centerPointEndY = (self.newPoints[0].y + self.newPoints[1].y) / 2 - $(window).scrollTop();
560
+
561
+ // And this is the translation due to translation of the centerpoint
562
+ // between the two fingers
563
+ var translateFromTranslatingX = centerPointEndX - self.centerPointStartX;
564
+ var translateFromTranslatingY = centerPointEndY - self.centerPointStartY;
565
+
566
+ // The new offset is the old/current one plus the total translation
567
+ var newOffsetX = currentOffsetX + (translateFromZoomingX + translateFromTranslatingX);
568
+ var newOffsetY = currentOffsetY + (translateFromZoomingY + translateFromTranslatingY);
569
+
570
+ var newPos = {
571
+ top: newOffsetY,
572
+ left: newOffsetX,
573
+ scaleX: pinchRatio,
574
+ scaleY: pinchRatio
575
+ };
576
+
577
+ self.canTap = false;
578
+
579
+ self.newWidth = newWidth;
580
+ self.newHeight = newHeight;
581
+
582
+ self.contentLastPos = newPos;
583
+
584
+ if (self.requestId) {
585
+ cancelAFrame(self.requestId);
586
+
587
+ self.requestId = null;
588
+ }
589
+
590
+ self.requestId = requestAFrame(function() {
591
+ $.fancybox.setTranslate(self.$content, self.contentLastPos);
592
+ });
593
+ };
594
+
595
+ Guestures.prototype.ontouchend = function(e) {
596
+ var self = this;
597
+ var dMs = Math.max(new Date().getTime() - self.startTime, 1);
598
+
599
+ var swiping = self.isSwiping;
600
+ var panning = self.isPanning;
601
+ var zooming = self.isZooming;
602
+ var scrolling = self.isScrolling;
603
+
604
+ self.endPoints = getPointerXY(e);
605
+
606
+ self.$container.removeClass("fancybox-controls--isGrabbing");
607
+
608
+ $(document).off(".fb.touch");
609
+
610
+ document.removeEventListener("scroll", self.onscroll, true);
611
+
612
+ if (self.requestId) {
613
+ cancelAFrame(self.requestId);
614
+
615
+ self.requestId = null;
616
+ }
617
+
618
+ self.isSwiping = false;
619
+ self.isPanning = false;
620
+ self.isZooming = false;
621
+ self.isScrolling = false;
622
+
623
+ self.instance.isDragging = false;
624
+
625
+ if (self.canTap) {
626
+ return self.onTap(e);
627
+ }
628
+
629
+ self.speed = 366;
630
+
631
+ // Speed in px/ms
632
+ self.velocityX = self.distanceX / dMs * 0.5;
633
+ self.velocityY = self.distanceY / dMs * 0.5;
634
+
635
+ self.speedX = Math.max(self.speed * 0.5, Math.min(self.speed * 1.5, 1 / Math.abs(self.velocityX) * self.speed));
636
+
637
+ if (panning) {
638
+ self.endPanning();
639
+ } else if (zooming) {
640
+ self.endZooming();
641
+ } else {
642
+ self.endSwiping(swiping, scrolling);
643
+ }
644
+
645
+ return;
646
+ };
647
+
648
+ Guestures.prototype.endSwiping = function(swiping, scrolling) {
649
+ var self = this,
650
+ ret = false,
651
+ len = self.instance.group.length;
652
+
653
+ self.sliderLastPos = null;
654
+
655
+ // Close if swiped vertically / navigate if horizontally
656
+ if (swiping == "y" && !scrolling && Math.abs(self.distanceY) > 50) {
657
+ // Continue vertical movement
658
+ $.fancybox.animate(
659
+ self.instance.current.$slide,
660
+ {
661
+ top: self.sliderStartPos.top + self.distanceY + self.velocityY * 150,
662
+ opacity: 0
663
+ },
664
+ 200
665
+ );
666
+
667
+ ret = self.instance.close(true, 200);
668
+ } else if (swiping == "x" && self.distanceX > 50 && len > 1) {
669
+ ret = self.instance.previous(self.speedX);
670
+ } else if (swiping == "x" && self.distanceX < -50 && len > 1) {
671
+ ret = self.instance.next(self.speedX);
672
+ }
673
+
674
+ if (ret === false && (swiping == "x" || swiping == "y")) {
675
+ if (scrolling || len < 2) {
676
+ self.instance.centerSlide(self.instance.current, 150);
677
+ } else {
678
+ self.instance.jumpTo(self.instance.current.index);
679
+ }
680
+ }
681
+
682
+ self.$container.removeClass("fancybox-is-sliding");
683
+ };
684
+
685
+ // Limit panning from edges
686
+ // ========================
687
+ Guestures.prototype.endPanning = function() {
688
+ var self = this;
689
+ var newOffsetX, newOffsetY, newPos;
690
+
691
+ if (!self.contentLastPos) {
692
+ return;
693
+ }
694
+
695
+ if (self.opts.momentum === false) {
696
+ newOffsetX = self.contentLastPos.left;
697
+ newOffsetY = self.contentLastPos.top;
698
+ } else {
699
+ // Continue movement
700
+ newOffsetX = self.contentLastPos.left + self.velocityX * self.speed;
701
+ newOffsetY = self.contentLastPos.top + self.velocityY * self.speed;
702
+ }
703
+
704
+ newPos = self.limitPosition(newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height);
705
+
706
+ newPos.width = self.contentStartPos.width;
707
+ newPos.height = self.contentStartPos.height;
708
+
709
+ $.fancybox.animate(self.$content, newPos, 330);
710
+ };
711
+
712
+ Guestures.prototype.endZooming = function() {
713
+ var self = this;
714
+
715
+ var current = self.instance.current;
716
+
717
+ var newOffsetX, newOffsetY, newPos, reset;
718
+
719
+ var newWidth = self.newWidth;
720
+ var newHeight = self.newHeight;
721
+
722
+ if (!self.contentLastPos) {
723
+ return;
724
+ }
725
+
726
+ newOffsetX = self.contentLastPos.left;
727
+ newOffsetY = self.contentLastPos.top;
728
+
729
+ reset = {
730
+ top: newOffsetY,
731
+ left: newOffsetX,
732
+ width: newWidth,
733
+ height: newHeight,
734
+ scaleX: 1,
735
+ scaleY: 1
736
+ };
737
+
738
+ // Reset scalex/scaleY values; this helps for perfomance and does not break animation
739
+ $.fancybox.setTranslate(self.$content, reset);
740
+
741
+ if (newWidth < self.canvasWidth && newHeight < self.canvasHeight) {
742
+ self.instance.scaleToFit(150);
743
+ } else if (newWidth > current.width || newHeight > current.height) {
744
+ self.instance.scaleToActual(self.centerPointStartX, self.centerPointStartY, 150);
745
+ } else {
746
+ newPos = self.limitPosition(newOffsetX, newOffsetY, newWidth, newHeight);
747
+
748
+ // Switch from scale() to width/height or animation will not work correctly
749
+ $.fancybox.setTranslate(self.$content, $.fancybox.getTranslate(self.$content));
750
+
751
+ $.fancybox.animate(self.$content, newPos, 150);
752
+ }
753
+ };
754
+
755
+ Guestures.prototype.onTap = function(e) {
756
+ var self = this;
757
+ var $target = $(e.target);
758
+
759
+ var instance = self.instance;
760
+ var current = instance.current;
761
+
762
+ var endPoints = (e && getPointerXY(e)) || self.startPoints;
763
+
764
+ var tapX = endPoints[0] ? endPoints[0].x - $(window).scrollLeft() - self.stagePos.left : 0;
765
+ var tapY = endPoints[0] ? endPoints[0].y - $(window).scrollTop() - self.stagePos.top : 0;
766
+
767
+ var where;
768
+
769
+ var process = function(prefix) {
770
+ var action = current.opts[prefix];
771
+
772
+ if ($.isFunction(action)) {
773
+ action = action.apply(instance, [current, e]);
774
+ }
775
+
776
+ if (!action) {
777
+ return;
778
+ }
779
+
780
+ switch (action) {
781
+ case "close":
782
+ instance.close(self.startEvent);
783
+
784
+ break;
785
+
786
+ case "toggleControls":
787
+ instance.toggleControls(true);
788
+
789
+ break;
790
+
791
+ case "next":
792
+ instance.next();
793
+
794
+ break;
795
+
796
+ case "nextOrClose":
797
+ if (instance.group.length > 1) {
798
+ instance.next();
799
+ } else {
800
+ instance.close(self.startEvent);
801
+ }
802
+
803
+ break;
804
+
805
+ case "zoom":
806
+ if (current.type == "image" && (current.isLoaded || current.$ghost)) {
807
+ if (instance.canPan()) {
808
+ instance.scaleToFit();
809
+ } else if (instance.isScaledDown()) {
810
+ instance.scaleToActual(tapX, tapY);
811
+ } else if (instance.group.length < 2) {
812
+ instance.close(self.startEvent);
813
+ }
814
+ }
815
+
816
+ break;
817
+ }
818
+ };
819
+
820
+ // Ignore right click
821
+ if (e.originalEvent && e.originalEvent.button == 2) {
822
+ return;
823
+ }
824
+
825
+ // Skip if clicked on the scrollbar
826
+ if (!$target.is("img") && tapX > $target[0].clientWidth + $target.offset().left) {
827
+ return;
828
+ }
829
+
830
+ // Check where is clicked
831
+ if ($target.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container")) {
832
+ where = "Outside";
833
+ } else if ($target.is(".fancybox-slide")) {
834
+ where = "Slide";
835
+ } else if (
836
+ instance.current.$content &&
837
+ instance.current.$content
838
+ .find($target)
839
+ .addBack()
840
+ .filter($target).length
841
+ ) {
842
+ where = "Content";
843
+ } else {
844
+ return;
845
+ }
846
+
847
+ // Check if this is a double tap
848
+ if (self.tapped) {
849
+ // Stop previously created single tap
850
+ clearTimeout(self.tapped);
851
+ self.tapped = null;
852
+
853
+ // Skip if distance between taps is too big
854
+ if (Math.abs(tapX - self.tapX) > 50 || Math.abs(tapY - self.tapY) > 50) {
855
+ return this;
856
+ }
857
+
858
+ // OK, now we assume that this is a double-tap
859
+ process("dblclick" + where);
860
+ } else {
861
+ // Single tap will be processed if user has not clicked second time within 300ms
862
+ // or there is no need to wait for double-tap
863
+ self.tapX = tapX;
864
+ self.tapY = tapY;
865
+
866
+ if (current.opts["dblclick" + where] && current.opts["dblclick" + where] !== current.opts["click" + where]) {
867
+ self.tapped = setTimeout(function() {
868
+ self.tapped = null;
869
+
870
+ process("click" + where);
871
+ }, 500);
872
+ } else {
873
+ process("click" + where);
874
+ }
875
+ }
876
+
877
+ return this;
878
+ };
879
+
880
+ $(document).on("onActivate.fb", function(e, instance) {
881
+ if (instance && !instance.Guestures) {
882
+ instance.Guestures = new Guestures(instance);
883
+ }
884
+ });
885
+ })(window, document, window.jQuery || jQuery);