// ========================================================================== // // SlideShow // Enables slideshow functionality // // Example of usage: // $.fancybox.getInstance().SlideShow.start() // // ========================================================================== (function(document, $) { "use strict"; $.extend(true, $.fancybox.defaults, { btnTpl: { slideShow: '" }, slideShow: { autoStart: false, speed: 3000 } }); var SlideShow = function(instance) { this.instance = instance; this.init(); }; $.extend(SlideShow.prototype, { timer: null, isActive: false, $button: null, init: function() { var self = this; self.$button = self.instance.$refs.toolbar.find("[data-fancybox-play]").on("click", function() { self.toggle(); }); if (self.instance.group.length < 2 || !self.instance.group[self.instance.currIndex].opts.slideShow) { self.$button.hide(); } }, set: function(force) { var self = this; // Check if reached last element if ( self.instance && self.instance.current && (force === true || self.instance.current.opts.loop || self.instance.currIndex < self.instance.group.length - 1) ) { self.timer = setTimeout(function() { if (self.isActive) { self.instance.jumpTo((self.instance.currIndex + 1) % self.instance.group.length); } }, self.instance.current.opts.slideShow.speed); } else { self.stop(); self.instance.idleSecondsCounter = 0; self.instance.showControls(); } }, clear: function() { var self = this; clearTimeout(self.timer); self.timer = null; }, start: function() { var self = this; var current = self.instance.current; if (current) { self.isActive = true; self.$button .attr("title", current.opts.i18n[current.opts.lang].PLAY_STOP) .removeClass("fancybox-button--play") .addClass("fancybox-button--pause"); self.set(true); } }, stop: function() { var self = this; var current = self.instance.current; self.clear(); self.$button .attr("title", current.opts.i18n[current.opts.lang].PLAY_START) .removeClass("fancybox-button--pause") .addClass("fancybox-button--play"); self.isActive = false; }, 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(); var SlideShow = instance && instance.SlideShow; if (SlideShow && SlideShow.isActive) { if (document.hidden) { SlideShow.clear(); } else { SlideShow.set(); } } }); })(document, window.jQuery || jQuery);