( function( $ ) { ResponsiveLightboxGallery = { modal: null, lastGalleryID: 0, lastGalleryImage: '', currentGalleryID: 0, resetFilters: false, galleries: {}, gutenberg: false, primaryButtonClass: '', secondaryButtonClass: '', /** * Initialize galleries. */ init: function() { this.gutenberg = typeof rlBlockEditor !== 'undefined'; this.searchGalleries = _.debounce( this.getGalleries, 500 ), this.bindEvents(); this.setButtons(); }, /** * Search galleries. */ searchGalleries: function() {}, /** * Set modal buttons. */ setButtons: function() { if ( this.gutenberg ) { this.primaryButtonClass = '.rl-media-button-select-gallery'; this.secondaryButtonClass = '.rl-media-button-insert-gallery'; } else { this.primaryButtonClass = '.rl-media-button-insert-gallery'; this.secondaryButtonClass = '.rl-media-button-select-gallery'; } }, /** * Get modal primary button. */ getModalButton: function() { return this.modal[0].getElementsByClassName( 'rl-media-button-select-gallery' )[0]; }, /** * Open modal. */ open: function( galleryID ) { if ( typeof galleryID === 'undefined' ) var galleryID = 0; var phrase = ''; $( this.primaryButtonClass ).show(); $( this.secondaryButtonClass ).hide(); // reset filters? if ( this.resetFilters ) { phrase = ''; // clear searh input $( '#rl-media-search-input' ).val( '' ); // reset categories this.modal.find( '#rl-media-attachment-categories' ).val( 0 ); } else phrase = $( '#rl-media-search-input' ).val(); // display modal this.modal.show(); // fix columns this.setColumns(); // get galleries this.getGalleries( phrase, galleryID ); }, /** * Close modal. */ close: function( event ) { event.preventDefault(); this.modal.hide(); }, /** * Calculate column width. */ setColumns: function() { var list = this.modal.find( '.rl-galleries-list' ); var listWidth = list.width(); var content = this.modal.find( '.media-frame-content' ); var columns = parseInt( content.attr( 'data-columns' ) ); var oldColumns = newColumns = columns; if ( listWidth ) { // get sidebar width var width = this.modal.find( '.media-sidebar' ).outerWidth() + 'px'; // set attachment list new width list.css( 'right', width ); // do the same for primary toolbar this.modal.find( '.attachments-browser .media-toolbar' ).css( 'right', width ); // calculate new columns number newColumns = Math.min( Math.round( listWidth / 170 ), 12 ) || 1; // set new columns number if ( ! oldColumns || oldColumns !== newColumns ) content.attr( 'data-columns', newColumns ); } }, /** * Click gallery event handler. */ handleClickGallery: function( event ) { event.preventDefault(); var gallery = $( event.target ).closest( 'li' ); // set current gallery id this.currentGalleryID = parseInt( gallery.data( 'id' ) ); // clicked different gallery? if ( this.lastGalleryID !== this.currentGalleryID ) { gallery.parent().find( 'li' ).removeClass( 'selected details' ); this.lastGalleryID = this.currentGalleryID; // get full source image var fullSource = gallery.find( '.centered' ).data( 'full-src' ); // invalid full source image? if ( fullSource === '' ) this.lastGalleryImage = gallery.find( 'img' ).first().attr( 'src' ); else this.lastGalleryImage = fullSource; gallery.addClass( 'selected details' ); this.clickGallery( this.currentGalleryID, false ); } else { // already selected? if ( gallery.hasClass( 'selected details' ) ) { // unselect gallery this.currentGalleryID = 0; gallery.removeClass( 'selected details' ); this.clickGallery( this.currentGalleryID, true ); } else { gallery.addClass( 'selected details' ); this.clickGallery( this.currentGalleryID, false ); } } }, /** * Load gallery thumbnails from cache or via AJAX. */ clickGallery: function( gallery_id, toggle ) { var _this = this; _this.modal.find( '.media-selection' ).toggleClass( 'empty', toggle ); _this.modal.find( this.primaryButtonClass ).prop( 'disabled', toggle ); // load gallery preview images? if ( ! toggle ) { // clear images _this.modal.find( '.rl-attachments-list' ).empty(); if ( _this.galleries[gallery_id].inProgress ) { // display spinner _this.toggleSpinner( true ); return; } // load cached images if ( _this.galleries[gallery_id].ready ) { // hide spinner _this.toggleSpinner( false ); // update images _this.updateGalleryPreview( _this.galleries[gallery_id].data, false ); // get images for the first time } else { // display spinner _this.toggleSpinner( true ); // set in progress flag _this.galleries[gallery_id].inProgress = true; $.post( ajaxurl, { action: 'rl-post-gallery-preview', post_id: rlArgsGallery.post_id, gallery_id: gallery_id, page: rlArgsGallery.page, nonce: rlArgsGallery.nonce } ).done( function( response ) { try { if ( response.success ) { // store gallery data _this.galleries[gallery_id].data = response.data; // set ready flag _this.galleries[gallery_id].ready = true; // same gallery? if ( _this.currentGalleryID === gallery_id ) { // update gallery data _this.updateGalleryPreview( _this.galleries[gallery_id].data, true ); } } else { // set ready flag _this.galleries[gallery_id].ready = false; } } catch( e ) { // set ready flag _this.galleries[gallery_id].ready = false; } } ).fail( function() { // set ready flag _this.galleries[gallery_id].ready = false; } ).always( function() { // set in progress flag _this.galleries[gallery_id].inProgress = false; // same gallery? if ( _this.currentGalleryID === gallery_id ) { // hide spinner _this.toggleSpinner( false ); } } ); } } }, /** * Select gallery (block editor). */ selectGallery: function( event ) { event.preventDefault(); if ( $( this ).attr( 'disabled' ) ) return; this.modal.hide(); }, /** * Insert gallery (classic editor). */ insertGallery: function( event ) { event.preventDefault(); if ( $( this ).attr( 'disabled' ) ) return; var shortcode = '[rl_gallery id="' + this.lastGalleryID + '"]'; var editor = tinyMCE.get( 'content' ); if ( editor && ! editor.isHidden() ) editor.execCommand( 'mceInsertContent', false, shortcode ); else wp.media.editor.insert( shortcode ); this.modal.hide(); }, /** * Load galleries. */ getGalleries: function( search, galleryID ) { var modal = this.modal; var spinner = $( '.rl-gallery-reload-spinner' ); var galleries = modal.find( '.rl-galleries-list' ); var _this = this; // clear galleries galleries.empty(); // hide gallery info modal.find( '.media-selection' ).addClass( 'empty' ); // clear images modal.find( '.rl-attachments-list' ).empty(); // display spinner spinner.fadeIn( 'fast' ); // get galleries $.post( ajaxurl, { action: 'rl-post-get-galleries', post_id: rlArgsGallery.post_id, search: search, page: rlArgsGallery.page, nonce: rlArgsGallery.nonce, category: _this.resetFilters ? 0 : modal.find( '#rl-media-attachment-categories' ).val() } ).done( function( response ) { try { if ( response.success ) { if ( response.data.html !== '' ) { modal.find( '.rl-no-galleries' ).hide(); modal.find( '.rl-galleries-list' ).empty().append( response.data.html ); // set up galleries response.data.galleries.forEach( function( gallery_id ) { _this.galleries[gallery_id] = { 'inProgress': false, 'ready': false, 'data': {} }; } ); // select gallery if ( galleryID !== 0 ) galleries.find( 'li[data-id="' + galleryID + '"] .js--select-attachment' ).trigger( 'click' ); } else modal.find( '.rl-no-galleries' ).show(); } else { // } } catch( e ) { // } } ).always( function() { // hide spinner spinner.fadeOut( 'fast' ); } ); }, /** * Toggle spinner. */ toggleSpinner: function( display ) { var spinner = this.modal.find( '.rl-gallery-images-spinner' ); var info = this.modal.find( '.selection-info' ); if ( display ) { // display spinner spinner.fadeIn( 'fast' ).css( 'visibility', 'visible' ); // turn off info info.addClass( 'rl-loading-content' ); } else { // hide spinner spinner.fadeOut( 'fast' ); // turn on info info.removeClass( 'rl-loading-content' ); } }, /** * Clear and load maximum 20 gallery thumbnails. */ updateGalleryPreview: function( gallery, animate ) { // update gallery attachments this.modal.find( '.rl-attachments-list' ).empty().append( gallery.attachments ).fadeOut( 0 ).delay( animate? 'fast' : 0 ).fadeIn( 0 ); // update number of images in gallery this.modal.find( '.rl-gallery-count' ).text( gallery.count ); // update gallery edit link if ( gallery.edit_url !== '' ) this.modal.find( '.rl-edit-gallery-link' ).removeClass( 'hidden' ).attr( 'href', gallery.edit_url ); else this.modal.find( '.rl-edit-gallery-link' ).addClass( 'hidden' ).attr( 'href', '' ); }, /** * Reload galleries. */ reloadGalleries: function( event ) { event.preventDefault(); // hide "no galleries" box this.modal.find( '.rl-no-galleries' ).hide(); // reset galleries this.galleries = {}; // reset filters this.resetFilters = false; // load galleries this.getGalleries( $( '#rl-media-search-input' ).val(), 0 ); }, /** * Bind all events. */ bindEvents: function() { var _this = this; // add gallery $( document ).on( 'click', '#rl-insert-modal-gallery-button', function( e ) { _this.open( 0 ); } ); // ready event $( function() { _this.modal = $( '#rl-modal-gallery' ); // search galleries _this.modal.on( 'keyup', '#rl-media-search-input', function() { _this.searchGalleries( $( this ).val() ); } ); // reload galleries _this.modal.on( 'click', '.rl-reload-galleries', function( e ) { _this.reloadGalleries( e ); } ); // change category _this.modal.on( 'change', '#rl-media-attachment-categories', function( e ) { _this.reloadGalleries( e ); } ); // close gallery _this.modal.on( 'click', '.media-modal-close, .media-modal-backdrop, .rl-media-button-cancel-gallery', function( e ) { _this.close( e ); } ); // click gallery _this.modal.on( 'click', '.rl-galleries-list li .js--select-attachment, .rl-galleries-list li button', function( e ) { _this.handleClickGallery( e ); } ); // insert gallery (classic editor) _this.modal.on( 'click', '.rl-media-button-insert-gallery', function( e ) { _this.insertGallery( e ); } ); // select gallery (block editor) _this.modal.on( 'click', '.rl-media-button-select-gallery', function( e ) { _this.selectGallery( e ); } ); // resize window $( window ).on( 'resize', function() { _this.setColumns(); } ); } ); } } ResponsiveLightboxGallery.init(); } )( jQuery );