( function ( $ ) { var jmpressOpts = { fullscreen: false, hash: { use: false }, mouse: { clickSelects: false }, keyboard: { use: true }, animation: { transitionDuration: '1s' }, presentationMode: false, stepSelector: '.step', duration: { defaultValue: 0, }, }; /** * Presentation constructor */ function Presentation( wrapper ) { var _self, duration, new_css, ie_regex, matches; _self = this; _self.wrapper = $( wrapper ); // The wrapper for toggling fullscreen _self.slideshow = $( '.presentation', wrapper ); // Holds the slides for jmpress _self.navLeft = $( '.nav-arrow-left', wrapper ); _self.navRight = $( '.nav-arrow-right', wrapper ); _self.expandButton = $( '.nav-fullscreen-button', wrapper ); _self.overlay = $( '.autoplay-overlay', wrapper ); _self.fullscreen = false; _self.autoPlaying = false; _self.autoplayTime = parseFloat( _self.slideshow.attr( 'data-autoplay' ), 10 ) || 0; // The wrapper is scaled to the contents' size so that its border wraps tightly _self.wrapper.css( { width: _self.slideshow.width(), height: _self.slideshow.height(), } ); duration = _self.slideshow.attr( 'duration' ) || '1s'; jmpressOpts.animation.transitionDuration = duration; // Compensate for transition times if ( _self.autoplayTime ) { _self.autoplayTime += parseFloat( duration, 10 ) * 1000; } // Set the opacity transition duration // as it is delegated by css and not jmpress duration = 'opacity ' + duration; new_css = { width: _self.slideshow.width(), height: _self.slideshow.height(), '-webkit-transition': duration, '-moz-transition': duration, '-ms-transition': duration, '-o-transition': duration, transition: duration, }; $( '.step', _self.slideshow ).each( function ( i, step ) { $( step ).css( new_css ); } ); // Apply attribute to allow fading individual bullets here, // otherwise wp_kses will strip the attribute out $( '.step.fadebullets li', _self.slideshow ).each( function ( i, step ) { $( step ).attr( 'data-jmpress', 'fade' ); } ); // Register resizing to window when fullscreen $( window ).resize( function () { if ( _self.fullscreen ) { _self.resizePresentation(); } } ); // Register the nav bars to move the slides _self.navLeft.on( 'click', function () { _self.slideshow.jmpress( 'prev' ); _self.overlay.css( 'opacity', 0 ); return false; } ); _self.navRight.on( 'click', function () { _self.slideshow.jmpress( 'next' ); _self.overlay.css( 'opacity', 0 ); return false; } ); _self.slideshow.on( 'click', function () { _self.setAutoplay( true ); return false; } ); _self.slideshow.on( 'focusout', function () { _self.setAutoplay( false ); } ); // Register toggling fullscreen except for IE 9 or lower ie_regex = /MSIE\s(\d+)\.\d+/; matches = ie_regex.exec( navigator.userAgent ); if ( matches && parseInt( matches[ 1 ], 10 ) < 10 ) { _self.expandButton.remove(); _self.expandButton = null; } else { _self.expandButton.on( 'click', function () { _self.setFullscreen( ! _self.fullscreen ); return false; } ); } // Register ESC key to exit fullscreen $( window ).on( 'keydown', function ( event ) { if ( event.which === 27 ) { _self.setFullscreen( false ); } } ); // Start the presentation _self.slideshow.jmpress( jmpressOpts ); // Make content visible and remove error message on jmpress success if ( _self.slideshow.jmpress( 'initialized' ) ) { _self.slideshow.css( 'display', '' ); _self.overlay.css( 'display', '' ); $( '.not-supported-msg', _self.wrapper ).remove(); } // A bug in Firefox causes issues with the nav arrows appearing // on hover in presentation mode. Explicitly disabling fullscreen // on init seems to fix the issue _self.setFullscreen( false ); } $.extend( Presentation.prototype, { resizePresentation: function () { var scale, duration, settings, new_css, widthScale, heightScale; // Set the animation duration to 0 during resizing // so that there isn't an animation delay when scaling // up the slide contents settings = this.slideshow.jmpress( 'settings' ); duration = settings.animation.transitionDuration; settings.animation.transitionDuration = '0s'; this.slideshow.jmpress( 'reselect' ); scale = 1; new_css = { top: 0, left: 0, zoom: 1, }; // Expand the presentation to fill the lesser of the max width or height // This avoids content moving past the window for certain window sizes if ( this.fullscreen ) { widthScale = $( window ).width() / this.slideshow.width(); heightScale = $( window ).height() / this.slideshow.height(); scale = Math.min( widthScale, heightScale ); new_css.top = ( $( window ).height() - scale * this.slideshow.height() ) / 2; new_css.left = ( $( window ).width() - scale * this.slideshow.width() ) / 2; } // Firefox does not support the zoom property; IE does, but it does not work // well like in webkit, so we manually transform and position the slideshow if ( this.slideshow.css( '-moz-transform' ) || this.slideshow.css( '-ms-transform' ) ) { // Firefox keeps the center of the element in place and expands outward // so we must shift everything to compensate new_css.top += ( ( scale - 1 ) * this.slideshow.height() ) / 2; new_css.left += ( ( scale - 1 ) * this.slideshow.width() ) / 2; scale = 'scale(' + scale + ')'; $.extend( new_css, { '-moz-transform': scale, '-ms-transform': scale, transform: scale, } ); } else { // webkit scales everything with zoom so we need to offset the right amount // so that the content is vertically centered after scaling effects new_css.top /= scale; new_css.left /= scale; new_css.zoom = scale; } this.slideshow.css( new_css ); settings.animation.transitionDuration = duration; this.slideshow.jmpress( 'reselect' ); }, setFullscreen: function ( on ) { this.fullscreen = on; this.setAutoplay( false ); // Save the scroll positions before going into fullscreen mode if ( on ) { this.scrollVert = $( window ).scrollTop(); this.scrollHoriz = $( window ).scrollLeft(); // Chrome Bug: Force scroll to be at top // otherwise the presentation can end up offscreen $( window ).scrollTop( 0 ); $( window ).scrollLeft( 0 ); } $( 'html' ).toggleClass( 'presentation-global-fullscreen', on ); $( 'body' ).toggleClass( 'presentation-global-fullscreen', on ); this.wrapper.toggleClass( 'presentation-wrapper-fullscreen', on ); this.wrapper.parents().each( function ( i, e ) { $( e ).toggleClass( 'presentation-wrapper-fullscreen-parent', on ); } ); this.resizePresentation(); // Reset the scroll positions after exiting fullscreen mode if ( ! on ) { $( window ).scrollTop( this.scrollVert ); $( window ).scrollLeft( this.scrollHoriz ); } }, setAutoplay: function ( on ) { var _self = this, newAutoplayTime; if ( _self.autoPlaying === on ) { return; } newAutoplayTime = on && _self.autoplayTime > 0 ? _self.autoplayTime : 0; _self.slideshow.jmpress( 'settings' ).duration.defaultValue = newAutoplayTime; // Move to the next slide when activating autoplay if ( newAutoplayTime ) { _self.slideshow.jmpress( 'next' ); _self.overlay.css( 'opacity', 0 ); } else { _self.slideshow.jmpress( 'reselect' ); } _self.autoPlaying = on; }, } ); $( document ).ready( function () { $( '.presentation-wrapper' ).map( function () { new Presentation( this ); } ); } ); } )( jQuery );