205 lines
5.4 KiB
JavaScript
205 lines
5.4 KiB
JavaScript
// ==========================================================================
|
|
//
|
|
// SlideShow
|
|
// Enables slideshow functionality
|
|
//
|
|
// Example of usage:
|
|
// $.fancybox.getInstance().SlideShow.start()
|
|
//
|
|
// ==========================================================================
|
|
(function (document, $) {
|
|
"use strict";
|
|
|
|
$.extend(true, $.fancybox.defaults, {
|
|
btnTpl: {
|
|
slideShow: '<button data-fancybox-play class="fancybox-button fancybox-button--play" title="{{PLAY_START}}">' +
|
|
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.5 5.4v13.2l11-6.6z"/></svg>' +
|
|
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.33 5.75h2.2v12.5h-2.2V5.75zm5.15 0h2.2v12.5h-2.2V5.75z"/></svg>' +
|
|
"</button>"
|
|
},
|
|
slideShow: {
|
|
autoStart: false,
|
|
speed: 3000,
|
|
progress: true
|
|
}
|
|
});
|
|
|
|
var SlideShow = function (instance) {
|
|
this.instance = instance;
|
|
this.init();
|
|
};
|
|
|
|
$.extend(SlideShow.prototype, {
|
|
timer: null,
|
|
isActive: false,
|
|
$button: null,
|
|
|
|
init: function () {
|
|
var self = this,
|
|
instance = self.instance,
|
|
opts = instance.group[instance.currIndex].opts.slideShow;
|
|
|
|
self.$button = instance.$refs.toolbar.find("[data-fancybox-play]").on("click", function () {
|
|
self.toggle();
|
|
});
|
|
|
|
if (instance.group.length < 2 || !opts) {
|
|
self.$button.hide();
|
|
} else if (opts.progress) {
|
|
self.$progress = $('<div class="fancybox-progress"></div>').appendTo(instance.$refs.inner);
|
|
}
|
|
},
|
|
|
|
set: function (force) {
|
|
var self = this,
|
|
instance = self.instance,
|
|
current = instance.current;
|
|
|
|
// Check if reached last element
|
|
if (current && (force === true || current.opts.loop || instance.currIndex < instance.group.length - 1)) {
|
|
if (self.isActive && current.contentType !== "video") {
|
|
if (self.$progress) {
|
|
$.fancybox.animate(self.$progress.show(), {
|
|
scaleX: 1
|
|
}, current.opts.slideShow.speed);
|
|
}
|
|
|
|
self.timer = setTimeout(function () {
|
|
if (!instance.current.opts.loop && instance.current.index == instance.group.length - 1) {
|
|
instance.jumpTo(0);
|
|
} else {
|
|
instance.next();
|
|
}
|
|
}, current.opts.slideShow.speed);
|
|
}
|
|
} else {
|
|
self.stop();
|
|
instance.idleSecondsCounter = 0;
|
|
instance.showControls();
|
|
}
|
|
},
|
|
|
|
clear: function () {
|
|
var self = this;
|
|
|
|
clearTimeout(self.timer);
|
|
|
|
self.timer = null;
|
|
|
|
if (self.$progress) {
|
|
self.$progress.removeAttr("style").hide();
|
|
}
|
|
},
|
|
|
|
start: function () {
|
|
var self = this,
|
|
current = self.instance.current;
|
|
|
|
if (current) {
|
|
self.$button
|
|
.attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_STOP)
|
|
.removeClass("fancybox-button--play")
|
|
.addClass("fancybox-button--pause");
|
|
|
|
self.isActive = true;
|
|
|
|
if (current.isComplete) {
|
|
self.set(true);
|
|
}
|
|
|
|
self.instance.trigger("onSlideShowChange", true);
|
|
}
|
|
},
|
|
|
|
stop: function () {
|
|
var self = this,
|
|
current = self.instance.current;
|
|
|
|
self.clear();
|
|
|
|
self.$button
|
|
.attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_START)
|
|
.removeClass("fancybox-button--pause")
|
|
.addClass("fancybox-button--play");
|
|
|
|
self.isActive = false;
|
|
|
|
self.instance.trigger("onSlideShowChange", false);
|
|
|
|
if (self.$progress) {
|
|
self.$progress.removeAttr("style").hide();
|
|
}
|
|
},
|
|
|
|
toggle: function () {
|
|
var self = this;
|
|
|
|
if (self.isActive) {
|
|
self.stop();
|
|
} else {
|
|
self.start();
|
|
}
|
|
}
|
|
});
|
|
|
|
$(document).on({
|
|
"onInit.fb": function (e, instance) {
|
|
if (instance && !instance.SlideShow) {
|
|
instance.SlideShow = new SlideShow(instance);
|
|
}
|
|
},
|
|
|
|
"beforeShow.fb": function (e, instance, current, firstRun) {
|
|
var SlideShow = instance && instance.SlideShow;
|
|
|
|
if (firstRun) {
|
|
if (SlideShow && current.opts.slideShow.autoStart) {
|
|
SlideShow.start();
|
|
}
|
|
} else if (SlideShow && SlideShow.isActive) {
|
|
SlideShow.clear();
|
|
}
|
|
},
|
|
|
|
"afterShow.fb": function (e, instance, current) {
|
|
var SlideShow = instance && instance.SlideShow;
|
|
|
|
if (SlideShow && SlideShow.isActive) {
|
|
SlideShow.set();
|
|
}
|
|
},
|
|
|
|
"afterKeydown.fb": function (e, instance, current, keypress, keycode) {
|
|
var SlideShow = instance && instance.SlideShow;
|
|
|
|
// "P" or Spacebar
|
|
if (SlideShow && current.opts.slideShow && (keycode === 80 || keycode === 32) && !$(document.activeElement).is("button,a,input")) {
|
|
keypress.preventDefault();
|
|
|
|
SlideShow.toggle();
|
|
}
|
|
},
|
|
|
|
"beforeClose.fb onDeactivate.fb": function (e, instance) {
|
|
var SlideShow = instance && instance.SlideShow;
|
|
|
|
if (SlideShow) {
|
|
SlideShow.stop();
|
|
}
|
|
}
|
|
});
|
|
|
|
// Page Visibility API to pause slideshow when window is not active
|
|
$(document).on("visibilitychange", function () {
|
|
var instance = $.fancybox.getInstance(),
|
|
SlideShow = instance && instance.SlideShow;
|
|
|
|
if (SlideShow && SlideShow.isActive) {
|
|
if (document.hidden) {
|
|
SlideShow.clear();
|
|
} else {
|
|
SlideShow.set();
|
|
}
|
|
}
|
|
});
|
|
})(document, jQuery); |