jQuery(function ($) { WP_Optimize_Premium = WP_Optimize_Premium(); }); /** * Main WP_Optimize_Premium - handle Premium features. */ var WP_Optimize_Premium = function() { var $ = jQuery, send_command = WP_Optimize.send_command, optimization_get_info = WP_Optimize.optimization_get_info, take_a_backup_with_updraftplus = WP_Optimize.take_a_backup_with_updraftplus, save_auto_backup_options = WP_Optimize.save_auto_backup_options; /** * Wrapper for send_command() using especially for unused images trash commands. * * @param {string} action The action to send * @param {[type]} data Data to send * @param {Function} callback Will be called with the results */ function trash_manager_send_command(action, data, callback) { if (!data) { data = {}; } data['images_trash_command'] = action; return send_command('images_trash_command', data, callback); } /** * Returns true if settings tab active. * * @return {boolean} */ function is_tab_active(tab) { var is_active = $('#wp-optimize-wrap .nav-tab-wrapper .nav-tab-active').is(['#wp-optimize-nav-tab-', tab].join('')); return is_active; } /** * Variables for image optimization. */ var unused_images_tab_container = $('#wp-optimize-nav-tab-wpo_images-unused-contents'), unused_images_section = $('#wpo-unused-images-section'), unused_image_sizes_section = $('#wpo-unused-image-sizes-section'), unused_images_container = $('#wpo_unused_images'), unused_images_trash_container = $('#wpo_unused_images_trash'), unused_images_view_images_btn = $('#wpo_unused_images_view_images_btn'), unused_images_view_trash_btn = $('#wpo_unused_images_view_trash_btn'), unused_images_before_scan_view_trash_btn = $('#wpo_scan_for_unused_images_trash_info > a'), restore_unused_images_from_trash_btn = $('#wpo_restore_unused_images_from_trash_btn'), remove_unused_images_btn = $('#wpo_remove_unused_images_btn'), move_unused_images_to_trash_btn = $('#wpo_move_unused_images_to_trash_btn'), remove_unused_images_from_trash_btn = $('#wpo_remove_unused_images_from_trash_btn'), remove_selected_sizes_btn = $('#wpo_remove_selected_sizes_btn'), unused_images_refresh_btn = $('#wpo_unused_images_refresh'), unused_image_sizes_refresh_btn = $('#wpo_unused_image_sizes_refresh'), unused_images_select_all_btn = $('#wpo_unused_images_select_all'), unused_images_select_none_btn = $('#wpo_unused_images_select_none'), scan_for_unused_images_btn = $('#wpo_scan_for_unused_images'), scan_for_unused_image_sizes_btn = $('#wpo_scan_for_unused_image_sizes'), sites_select_container = $('#wpo_unused_images_sites_select_container'), sites_select = $('#wpo_unused_images_sites_select'), take_a_backup_checkbox1 = $('#enable-auto-backup-2'), take_a_backup_checkbox2 = $('#enable-auto-backup-3'), // which elements we hide when images view container is empty hide_when_empty_view_elements = wpoptimize.sites.length > 1 ? [ // for multisite we keep block with site selector visible $('#wpo_unused_images_loaded_count') ] : [ $('#wpo_unused_images_control_panel'), $('#wpo_unused_images_loaded_count') ], // which elements we hide images trash view container is empty hide_when_empty_trash_view_elements = wpoptimize.sites.length > 1 ? [ // multisite $('#wpo_unused_images_trash_loaded_count') ] : [ $('#wpo_unused_images_control_panel'), $('#wpo_unused_images_trash_loaded_count') ], IMAGES_WORK_MODE = { DETECT_IMAGES: 'detect_unused_images', DETECT_SIZES: 'detect_images_sizes', DETECT_BOTH: 'detect_both' }, IMAGES_LOAD_STATUS = { COMPLETE: 'complete', SUCCESS: 'success', FAILURE: 'failure', BUSY: 'busy' }, IMAGES_EVENTS = { GET_INFO_START: 'optimization_get_info_images_start', GET_INFO_PROCESS: 'optimization_get_info_images', GET_INFO_PROCESS_XHR_UPDATE : 'optimization_get_info_xhr_images', GET_INFO_DONE: 'optimization_get_info_images_done', OPTIMIZATION_START: 'do_optimization_images_start', OPTIMIZATION_DONE: 'do_optimization_images_done' }, unused_images_view = new WP_Optimize_Images_View({ container: unused_images_container, no_images_found_message: wpoptimize.no_unused_images_found, related_elements: [ $('.wpo-last-scan-info', unused_images_section), $('.wpo-unused-images-el'), $('.wpo-image-sizes-section'), $('#wpo_unused_images_loaded_count'), $('#wpo_unused_images_refresh') ], row_action_buttons: [ { 'class': 'wpo_unused_images_move_to_trash_single button button-primary', 'title': wpoptimize.trash, 'hint' : wpoptimize.move_to_trash }, { 'class': 'wpo_unused_images_remove_single button button-link button-link-delete', 'title': wpoptimize.delete, 'hint' : wpoptimize.permanently_delete } ], action_buttons: [ remove_unused_images_btn, move_unused_images_to_trash_btn, ], hide_when_empty: hide_when_empty_view_elements, loader_additional_html: ''+wpoptimize.cancel_scan+'', load_next_page_callback: load_unused_images_next_page }), unused_images_trash_view = new WP_Optimize_Images_View({ container: unused_images_trash_container, no_images_found_message: wpoptimize.no_unused_trash_images_found, related_elements: [ $('.wpo-unused-images-trash-el'), $('#wpo_unused_images_trash_loaded_count'), ], row_action_buttons: [ { 'class': 'wpo_unused_images_restore_from_trash_single button', 'title': wpoptimize.restore, 'hint' : wpoptimize.restore_from_trash }, { 'class': 'wpo_unused_images_remove_single_from_trash button button-primary', 'title': wpoptimize.delete, 'hint' : wpoptimize.permanently_delete } ], action_buttons: [ restore_unused_images_from_trash_btn, remove_unused_images_from_trash_btn ], hide_when_empty: hide_when_empty_trash_view_elements, load_next_page_callback: load_unused_images_trash_next_page, onclear: function() { last_load_trash_status[get_selected_site()] = ''; } }), unused_images_tab_loaded = false, optimization_checkbox_images_val = false, images_loaded_count = {}, images_total_count = {}, images_per_page = parseInt(wpoptimize.unused_images_per_page), images_trash_loaded_count = {}, images_trash_total_count = {}, last_load_status = {}, last_load_trash_status = {}, current_load_xhr = {}; // xhr objects for currently working unused images ajax requests. /** * Called on images tab activated and load content if need. * * @return void */ function images_tab_activated() { if (unused_images_tab_loaded) return; unused_images_tab_loaded = true; unused_images_view.show(); unused_images_trash_view.hide(); // load initial information about unused images and sizes. load_unused_images(IMAGES_WORK_MODE.DETECT_BOTH, false, true); } /** * Handle click on "Scan website for unused images" button. */ scan_for_unused_images_btn.on('click', function() { load_unused_images(IMAGES_WORK_MODE.DETECT_IMAGES, true); }); /** * Handle click on "Scan website for unused image sizes" button. */ scan_for_unused_image_sizes_btn.on('click', function() { load_unused_images(IMAGES_WORK_MODE.DETECT_SIZES, true); }); /** * Handle click on cancel button. */ unused_images_tab_container.on('click', '.wpo-unused-images-cancel-scan', function() { var btn = $(this), mode = btn.data('mode'), data = { mode: mode, cancel: true }, params = { optimization_id: 'images', data: data }; if (btn.prop('disabled')) return; btn.prop('disabled', true); abort_unused_images_loading_request(mode); send_command('get_optimization_info', params, function(resp) { $(document).trigger(IMAGES_EVENTS.GET_INFO_DONE, params); }) .always(function() { btn.prop('disabled', false); }); }); /** * Abort current unused image loading request. * * @param {string} mode - one of IMAGES_WORK_MODE values. */ function abort_unused_images_loading_request(mode) { if (current_load_xhr.hasOwnProperty(mode)) { current_load_xhr[mode].abort(); delete current_load_xhr[mode]; } } /** * Handle switch to unused images trash view */ unused_images_view_trash_btn.on('click', function() { if ($(this).prop('disabled')) return false; unused_images_view_trash_btn.hide(); unused_images_view_images_btn.show(); // if this view has new information then reload it. if (unused_images_view_trash_btn.data('dirty')) { unused_images_view_trash_btn.data('dirty', false); unused_images_trash_view.clear(); } unused_images_view.hide(); unused_images_trash_view.show(); unused_images_tab_container.addClass('wpo-unused-images-trash-view'); return false; }); /** * Handle switch to unused images view */ unused_images_view_images_btn.on('click', function() { if ($(this).prop('disabled')) return false; unused_images_view_images_btn.hide(); unused_images_view_trash_btn.show(); unused_images_trash_view.hide(); unused_images_view.show(); unused_images_tab_container.removeClass('wpo-unused-images-trash-view'); // when trash was opened without unused images scanning. if (unused_images_view_images_btn.data('before-scan')) { jQuery('.wpo-unused-images-section-loaded').addClass('wpo_hidden'); jQuery('.wpo-unused-images-section-unloaded').show(); unused_images_view_images_btn.data('before-scan', false); } // if this view has new information then reload it. if (unused_images_view_images_btn.data('dirty')) { unused_images_view_images_btn.data('dirty', false); // refresh images list reload_unused_images(false); } return false; }); /** * Handle switching to unused images trash without site scanning for unused images. */ unused_images_before_scan_view_trash_btn.on('click', function() { jQuery('.wpo-unused-images-section-unloaded').hide(); jQuery('.wpo-unused-images-section-loaded').removeClass('wpo_hidden'); // show trash unused_images_view_trash_btn.trigger('click'); // set flag to 'back to unused images list' button to know which UI show unused_images_view_images_btn.data('before-scan', true); }); /** * Handle images optimization get info start event. */ $(document).on(IMAGES_EVENTS.GET_INFO_START, function(event, params) { var mode = params && params.hasOwnProperty('mode') ? params.mode : ''; unused_images_refresh_btn.prop('disabled', true); if (mode == IMAGES_WORK_MODE.DETECT_IMAGES) { $('.wpo_shade', unused_images_section).show(); $('.wpo-shade-progress-message', unused_images_section).text(''); } if (mode == IMAGES_WORK_MODE.DETECT_SIZES) { $('.wpo_shade', unused_image_sizes_section).show(); $('.wpo_unused_images_loader', unused_image_sizes_section).show(); $('.wpo-shade-progress-message', unused_image_sizes_section).text(''); } disable_image_optimization_controls(true); }); /** * Handle images optimization get info process event. */ $(document).on(IMAGES_EVENTS.GET_INFO_PROCESS, function(event, message, meta) { var mode = meta && meta.hasOwnProperty('mode') ? meta.mode : ''; if (mode == IMAGES_WORK_MODE.DETECT_IMAGES) { $('.wpo-shade-progress-message', unused_images_section).text(message); unused_images_view.loader_message(message); } if (mode == IMAGES_WORK_MODE.DETECT_IMAGES) { $('.wpo-shade-progress-message', unused_image_sizes_section).text(message); } }); /** * Handle images optimization get info xhr object update. */ $(document).on(IMAGES_EVENTS.GET_INFO_PROCESS_XHR_UPDATE, function(event, xhr, meta) { if (meta.hasOwnProperty('mode')) { current_load_xhr[meta.mode] = xhr; } }); /** * Handle images optimization get info done event. */ $(document).on(IMAGES_EVENTS.GET_INFO_DONE, function(event, data) { $('#wpo_unused_images_shade').remove(); $('.wpo_unused_images_loader').hide(); unused_images_refresh_btn.prop('disabled', false); var meta = get_meta_from_images_optimization_response(data), mode = (meta && meta.hasOwnProperty('mode')) ? meta.mode : (data && data.hasOwnProperty('data') && data.data.hasOwnProperty('mode')) ? data.data.mode : false, // if action is cancelled the don't update view. is_cancelled = (data && data.hasOwnProperty('data') && data.data.hasOwnProperty('cancel')) || mode && current_load_xhr.hasOwnProperty(mode) && current_load_xhr[mode].hasOwnProperty('statusText') && 'abort' == current_load_xhr[mode].statusText; if (IMAGES_WORK_MODE.DETECT_IMAGES == mode) { $('.wpo_shade', unused_images_section).hide(); unused_images_view.hide_loader(); if (!is_cancelled) { $('.wpo-unused-images-section-unloaded').hide(); $('.wpo-unused-images-section-loaded').removeClass('wpo_hidden'); handle_response_from_image_optimization(data, update_unused_images_view); } } if (IMAGES_WORK_MODE.DETECT_SIZES == mode) { $('.wpo_shade', unused_image_sizes_section).hide(); if (!is_cancelled) { $('.wpo-unused-image-sizes-section-unloaded').hide(); $('.wpo-unused-image-sizes-section-loaded').removeClass('wpo_hidden'); handle_response_from_image_optimization(data, update_sizes_sidebar); } } if (IMAGES_WORK_MODE.DETECT_BOTH == mode) { var last_scan_images_key = ['last_scan_', IMAGES_WORK_MODE.DETECT_IMAGES].join(''), last_scan_sizes_key = ['last_scan_', IMAGES_WORK_MODE.DETECT_SIZES].join(''); // if response has unused images last scan time value if (meta && meta[last_scan_images_key]) { $('.wpo-unused-images-section-unloaded').hide(); $('.wpo-unused-images-section-loaded').removeClass('wpo_hidden'); $('.wpo_shade', unused_images_section).hide(); handle_response_from_image_optimization(data, update_unused_images_view); } else { if (meta.hasOwnProperty('trash_images_count') && meta.trash_images_count > 0) { $('#wpo_scan_for_unused_images_trash_info > span').text(meta.trash_images_count_message); $('#wpo_scan_for_unused_images_trash_info').css('display', 'block'); } } // if response has unused image sizes last scan time value if (meta && meta[last_scan_sizes_key]) { $('.wpo-unused-image-sizes-section-unloaded').hide(); $('.wpo-unused-image-sizes-section-loaded').removeClass('wpo_hidden'); $('.wpo_shade', unused_image_sizes_section).hide(); handle_response_from_image_optimization(data, update_sizes_sidebar); } } disable_image_optimization_controls(false); }); /** * Handle images optimization start event. */ $(document).on(IMAGES_EVENTS.OPTIMIZATION_START, function() { unused_images_tab_loaded = true; $('.wpo_unused_images_loader').show(); disable_image_optimization_controls(true); }); /** * Handle images optimization done event. */ $(document).on(IMAGES_EVENTS.OPTIMIZATION_DONE, function(event, data) { $('.wpo_unused_images_loader').hide(); disable_image_optimization_controls(false); handle_response_from_image_optimization(data, update_unused_images_view); alert(data.result.meta.removed_message); }); /** * Handle clicks on image optimization buttons. */ remove_unused_images_btn.on('click', function() { // if no unused imaged then exit. if (0 == $('#wpo_unused_images input[type="checkbox"]:checked').length) return; save_auto_backup_options(); if (take_a_backup_checkbox1.is(':checked')) { take_a_backup_with_updraftplus(remove_selected_images, 'uploads'); } else { remove_selected_images(); } }); /** * Handle move images to trash button. */ move_unused_images_to_trash_btn.on('click', function() { // if no unused imaged then exit. if (0 == $('#wpo_unused_images input[type="checkbox"]:checked').length) return; save_auto_backup_options(); if (take_a_backup_checkbox1.is(':checked')) { take_a_backup_with_updraftplus(move_unused_images_to_trash, 'uploads'); } else { move_unused_images_to_trash(); } }); /** * Move selected unused images to trash. * * @param {array} selected_images list of images. */ function move_unused_images_to_trash(selected_images) { disable_image_optimization_controls(true); if (!selected_images) selected_images = unused_images_view.get_selected_images(); unused_images_view.show_custom_loader(wpoptimize.moving_selected_unused_images_to_trash); return trash_manager_send_command('move_images_to_trash', { images: selected_images }, function(resp) { alert(resp.message); disable_image_optimization_controls(false); unused_images_view.remove_selected_images(); unused_images_view.hide_loader(); // update loaded count when move to trash for (i in selected_images) { image_val = selected_images[i]; blog_id = image_val.split('_').shift(); images_loaded_count[blog_id]--; images_total_count[blog_id]--; } show_images_loaded_text(get_selected_site()); unused_images_view.update_view(); // set dirty flag for refresh unused images trash view when user switch on it. unused_images_view_trash_btn.data('dirty', true); }); } /** * Handle remove images from trash button. */ remove_unused_images_from_trash_btn.on('click', function() { // if no selected images then exit. if (0 == unused_images_trash_view.get_selected_images().length) return; save_auto_backup_options(); if (take_a_backup_checkbox1.is(':checked')) { take_a_backup_with_updraftplus(remove_unused_images_from_trash, 'uploads'); } else { remove_unused_images_from_trash(); } }); /** * Remove selected unused images from trash. */ function remove_unused_images_from_trash(selected_images, dom_elements_to_remove) { disable_image_optimization_controls(true); if (!selected_images) selected_images = unused_images_trash_view.get_selected_images(); unused_images_trash_view.show_custom_loader(wpoptimize.deleting_unused_images_from_trash); return trash_manager_send_command('remove_trash_images', { images: selected_images }, function(resp) { if (resp.error) { alert(resp.error); } else if (resp.message) { alert(resp.message); // if sent images elements then just remove them otherwise reload the trash if (dom_elements_to_remove) { dom_elements_to_remove.remove(); update_images_trash_counters(get_selected_site(), - selected_images.length); } else { // refresh trash view. unused_images_trash_view.reload(); } } unused_images_trash_view.hide_loader(); disable_image_optimization_controls(false); }); } /** * Handle restore unused images from trash. * * @return {Array} */ restore_unused_images_from_trash_btn.on('click', function() { // if no selected images then exit. if (0 == unused_images_trash_view.get_selected_images().length) return; save_auto_backup_options(); if (take_a_backup_checkbox1.is(':checked')) { take_a_backup_with_updraftplus(restore_unused_images_from_trash, 'uploads'); } else { restore_unused_images_from_trash(); } }); /** * Restore selected unused images from trash. */ function restore_unused_images_from_trash(selected_images, dom_elements_to_remove) { disable_image_optimization_controls(true); abort_unused_images_loading_request(IMAGES_WORK_MODE.DETECT_IMAGES); if (!selected_images) selected_images = unused_images_trash_view.get_selected_images(); unused_images_trash_view.show_custom_loader(wpoptimize.restoring_selected_unused_images_from_trash); return trash_manager_send_command('restore_images_from_trash', { images: selected_images }, function(resp) { if (resp.error) { alert(resp.error); } else if (resp.message) { alert(resp.message); // set dirty flag for refresh unused images view when user switch on it. unused_images_view_images_btn.data('dirty', true); // if sent images elements then just remove them otherwise reload the trash if (dom_elements_to_remove) { dom_elements_to_remove.remove(); } else { // refresh trash view. unused_images_trash_view.remove_selected_images(); } unused_images_trash_view.load_next_page_if_need(); update_images_trash_counters(get_selected_site(), - selected_images.length); } unused_images_trash_view.hide_loader(); disable_image_optimization_controls(false); }); } /** * Update trash images counter. * * @param {int} blog_id * @param {int} diff */ function update_images_trash_counters(blog_id, diff) { if (images_trash_loaded_count.hasOwnProperty(blog_id)) { images_trash_loaded_count[blog_id] += diff; } if (images_trash_total_count.hasOwnProperty(blog_id)) { images_trash_total_count[blog_id] += diff; } show_images_trash_loaded_text(blog_id); } /** * Handle remove selected sizes button click. */ remove_selected_sizes_btn.on('click', function() { save_auto_backup_options(); if (take_a_backup_checkbox2.is(':checked')) { take_a_backup_with_updraftplus(remove_selected_image_sizes); } else { remove_selected_image_sizes(); } }); /** * Handle "Scan again" unused images click. */ unused_images_refresh_btn.on('click', function(e) { e.preventDefault(); if ($(this).prop('disabled')) return; reload_unused_images(true); }); /** * Reload unused images. * * @param {boolead} forced - if true then all caches will be cleared before scanning. */ function reload_unused_images(forced) { // reset statuses for pagination. images_loaded_count = {}; images_total_count = {}; last_load_status = {}; var params = { mode: IMAGES_WORK_MODE.DETECT_IMAGES }; if (forced) { params['forced'] = true; } unused_images_view.show_loader(); $(document).trigger(IMAGES_EVENTS.GET_INFO_START, params); // run get info request with. current_load_xhr[params.mode] = optimization_get_info($('.wpo-shade-progress-message'), 'images', params) .fail(function() { $(document).trigger(IMAGES_EVENTS.GET_INFO_DONE, params); }); } /** * Handle "Scan again" unused image sizes click. */ unused_image_sizes_refresh_btn.on('click', function(e) { e.preventDefault(); if ($(this).prop('disabled')) return; var params = { forced: true, mode: IMAGES_WORK_MODE.DETECT_SIZES }; $('.wpo_unused_images_loader', unused_image_sizes_section).show(); $(document).trigger(IMAGES_EVENTS.GET_INFO_START, params); // run get info request with. optimization_get_info($('.wpo-shade-progress-message'), 'images', params) .fail(function() { $(document).trigger(IMAGES_EVENTS.GET_INFO_DONE, params); }); }); /** * Handle select all images link click. */ unused_images_select_all_btn.on('click', function() { if (unused_images_view.is_visible()) unused_images_view.select_all(); if (unused_images_trash_view.is_visible()) unused_images_trash_view.select_all(); }); /** * Handle select none images link click. */ unused_images_select_none_btn.on('click', function() { if (unused_images_view.is_visible()) unused_images_view.select_none(); if (unused_images_trash_view.is_visible()) unused_images_trash_view.select_none(); }); /** * Handle click on images tab. */ $('#wp-optimize-nav-tab-wrapper__wpo_images .nav-tab').on('click', function() { if (is_tab_active('wpo_images-unused')) images_tab_activated(); }); if (is_tab_active('wpo_images-unused')) images_tab_activated(); /** * Disable images optimization controls (buttons, checkboxes). * * @param {boolean} disable - if true then disable controls, false - enable. * * @return void */ function disable_image_optimization_controls(disable) { var optimization_checkbox_images = $('#optimization_checkbox_images'); $.each([ remove_unused_images_btn, remove_selected_sizes_btn, $('#optimization_button_images_big'), $('#optimization_button_images_small'), optimization_checkbox_images, unused_images_refresh_btn, move_unused_images_to_trash_btn, restore_unused_images_from_trash_btn, remove_unused_images_from_trash_btn, unused_images_view_images_btn, unused_images_view_trash_btn ], function(i, el) { el.prop('disabled', disable); }); if (disable) { optimization_checkbox_images_val = optimization_checkbox_images.is(':checked'); optimization_checkbox_images.prop('checked', false); } else { optimization_checkbox_images.prop('checked', optimization_checkbox_images_val); // enable action buttons only if any image selected unused_images_view.update_view(); unused_images_trash_view.update_view(); } } /** * Load and show information about unused images or sizes. * * @param {string} mode one of IMAGES_WORK_MODE object values. * @param {boolean} forced if set to true then all caches will cleaned and site scanned again * @param {boolean} quickinfo if set to true then only current information will returned without tasks queue processing. * @return void */ function load_unused_images(mode, forced, quickinfo) { var params = { mode: mode }; if (forced) { params['forced'] = forced; } if (quickinfo) { params['quickinfo'] = quickinfo; } $(document).trigger(IMAGES_EVENTS.GET_INFO_START, params); current_load_xhr[mode] = optimization_get_info($('.wpo-shade-progress-message'), 'images', params) .fail(function() { $(document).trigger(IMAGES_EVENTS.GET_INFO_DONE, params); scan_for_unused_images_btn.show(); }) .always(function() { delete current_load_xhr[mode]; }); } /** * Load next images page for unused images. * * @return void */ function load_unused_images_next_page() { var blog_id = get_selected_site(), offset = images_loaded_count.hasOwnProperty(blog_id) ? images_loaded_count[blog_id] : 0; // this function is using with WP_Optimize_Images_View for loading following unused images // pages and we don't want to use it for load the first page. The first page is loading // when IMAGES_EVENTS.GET_INFO_DONE event triggered. if (0 == offset) return; if (last_load_status.hasOwnProperty(blog_id) && (IMAGES_LOAD_STATUS.BUSY === last_load_status[blog_id] || IMAGES_LOAD_STATUS.COMPLETE === last_load_status[blog_id])) return; $('#wpo_unused_images_loader_bottom').css('visibility', 'visible'); last_load_status[blog_id] = IMAGES_LOAD_STATUS.BUSY; var data = { optimization_id: 'images', data: { mode: IMAGES_WORK_MODE.DETECT_IMAGES, blog_id: blog_id, length: images_per_page, offset: offset } }; send_command('get_optimization_info', data, function(resp) { var loaded = append_images_from_response(resp.result.meta); show_images_loaded_text(get_selected_site()); if (loaded == images_per_page) { last_load_status[blog_id] = IMAGES_LOAD_STATUS.SUCCESS; } else { last_load_status[blog_id] = IMAGES_LOAD_STATUS.COMPLETE; } $('#wpo_unused_images_loader_bottom').css('visibility', 'hidden'); unused_images_view.update_view(); }) .fail(function() { last_load_status[blog_id] = IMAGES_LOAD_STATUS.FAILURE; $('#wpo_unused_images_loader_bottom').css('visibility', 'hidden'); }); } /** * Load images from trash for selected blog and display it. * * @return {Object} jquery ajax object */ function load_unused_images_trash_next_page() { var blog_id = get_selected_site(), images_loaded = unused_images_trash_view.get_images_count(blog_id), offset = unused_images_trash_view.get_visible_images_count(blog_id); if (last_load_trash_status.hasOwnProperty(blog_id) && (IMAGES_LOAD_STATUS.BUSY === last_load_trash_status[blog_id] || IMAGES_LOAD_STATUS.COMPLETE === last_load_trash_status[blog_id])) return; last_load_trash_status[blog_id] = IMAGES_LOAD_STATUS.BUSY; $('#wpo_unused_images_loader_bottom').css('visibility', 'visible'); if (0 == images_loaded) { $('.wpo_shade', unused_images_section).show(); $('.wpo-shade-progress-message').html(''); images_trash_loaded_count[blog_id] = 0; } return trash_manager_send_command('get_trash_images', { offset: offset, length: images_per_page, blog_id: blog_id }, function(resp) { $('#wpo_unused_images_loader_bottom').css('visibility', 'hidden'); $('.wpo_shade', unused_images_section).hide(); if (resp.errors) { alert(resp.errors.join("\n")); return; } var i, value, url, title; for (i in resp.images) { if (!resp.images.hasOwnProperty(i)) continue; value = resp.images[i][0]; title = (resp.images[i].length > 1) ? [resp.images[i][0],' [id:', resp.images[i][1],' ]', ].join('') : resp.images[i][0]; url = [resp.base_url, resp.images[i][0]].join(''); unused_images_trash_view.append_image(blog_id, value, url, url, title, title); if (!images_trash_loaded_count.hasOwnProperty(blog_id)) images_trash_loaded_count[blog_id] = 0; images_trash_loaded_count[blog_id]++; } images_trash_total_count[blog_id] = resp.total; show_images_trash_loaded_text(get_selected_site()); if (resp.images && resp.images.length === images_per_page) { last_load_trash_status[blog_id] = IMAGES_LOAD_STATUS.SUCCESS; } else { last_load_trash_status[blog_id] = IMAGES_LOAD_STATUS.COMPLETE; } unused_images_trash_view.update_view(); }); } /** * Show count of loaded images for blog_id. * * @param {number} blog_id * * @return void */ function show_images_loaded_text(blog_id) { if (images_total_count.hasOwnProperty(blog_id) && images_total_count[blog_id] > 0) { var text = wpoptimize.x_of_x_images_loaded.replace('%s', images_loaded_count[blog_id]).replace('%s', images_total_count[blog_id]); $('#wpo_unused_images_loaded_count').text(text); } else { $('#wpo_unused_images_loaded_count').text(''); } } /** * Show count of loaded trashed images for blog_id. * * @param {number} blog_id * * @return void */ function show_images_trash_loaded_text(blog_id) { if (images_trash_total_count.hasOwnProperty(blog_id)) { var text = wpoptimize.x_of_x_images_loaded.replace('%s', images_trash_loaded_count[blog_id]).replace('%s', images_trash_total_count[blog_id]); $('#wpo_unused_images_trash_loaded_count').text(text); } } /** * Get response.result.meta property if it exists. * * @param {object} response * * @return {object|boolean} */ function get_meta_from_images_optimization_response(response) { if (response.result && response.result.hasOwnProperty('meta') && response.result.meta) return response.result.meta; return false; } /** * Check returned response from image optimization and call update view callback. * * @param {Object} response - response from image optimization. * @param {Function} update_view_callback - callback function to update view. * * @return void */ function handle_response_from_image_optimization(response, update_view_callback) { var meta = get_meta_from_images_optimization_response(response); if (meta) { if (update_view_callback) update_view_callback(meta); } else { alert(wpoptimize.error_unexpected_response); } } /** * Update images optimization tab view with data returned from images optimization. * * @param {Object} data - meta data returned from images optimization * * @return void */ function update_unused_images_view(data) { var new_images_loaded = !data.hasOwnProperty('removed_message'); if (new_images_loaded) unused_images_container.text(''); var last_scan_images_key = ['last_scan_', IMAGES_WORK_MODE.DETECT_IMAGES].join(''); $('.wpo-last-scan-text', unused_images_section).text(data[last_scan_images_key]); if (data && data.hasOwnProperty('unused_images')) { var blog_id, blog_url = '', show_multisite_select = false, sites_select_old_value = sites_select.val(); // append images to list from response. if (new_images_loaded) { append_images_from_response(data); } sites_select.html(''); for (blog_id in data.unused_images) { if (!data.unused_images.hasOwnProperty(blog_id)) continue; if (data.images_loaded_info.hasOwnProperty(blog_id)) { images_total_count[blog_id] = data.images_loaded_info[blog_id].total; } // update multisite sites select options list. if (/* data.unused_images[blog_id].length && */ data.multisite) { show_multisite_select = true; blog_url = [data.sites[blog_id].domain, data.sites[blog_id].path].join(''); sites_select.append([''].join('')); } } } // if unused images was not found then hide "X of X images loaded" message and set status to complete. if (data && 0 === data.files) { // hide information about loaded images. images_total_count[get_selected_site()] = 0; // block loading next page of images. last_load_status[get_selected_site()] = IMAGES_LOAD_STATUS.COMPLETE; } // show or hide multisite select. if (show_multisite_select) { sites_select_container.show(); // restore selected site value in the select/ if (sites_select_old_value) sites_select.val(sites_select_old_value); filter_images_by_site(sites_select.val()); } else { sites_select_container.hide(); } // show images loaded text. show_images_loaded_text(get_selected_site()); } /** * Update information about sizes in the sidebar. * * @param data * * @return void */ function update_sizes_sidebar(data) { var last_scan_sizes_key = ['last_scan_', IMAGES_WORK_MODE.DETECT_SIZES].join(''); $('.wpo-last-scan-text', unused_image_sizes_section).text(data[last_scan_sizes_key]); // show information in the sizes sidebar. show_sizes_list($('#registered_image_sizes'), get_array_items_by_key_value(data.image_sizes, 'used', true), wpoptimize.no_registered_image_sizes); show_sizes_list($('#unused_image_sizes'), get_array_items_by_key_value(data.image_sizes, 'used', false), wpoptimize.no_unsed_image_sizes); // disable/enable button if sizes selected or not selected. $('#registered_image_sizes, #unused_image_sizes').on('change', 'input[type="checkbox"]', function() { update_remove_selected_button_state(); }); update_remove_selected_button_state(); } /** * Append images to the list returned from ajax request. * * @param {object} data * * @return {number} */ function append_images_from_response(data) { var i, blog_id = 0, base_url = '', admin_url = '', blog_url = '', unused_image = {}, count; for (blog_id in data.unused_images) { if (!data.unused_images.hasOwnProperty(blog_id)) continue; // save images loaded count text. if (data.images_loaded_info.hasOwnProperty(blog_id)) { images_total_count[blog_id] = data.images_loaded_info[blog_id].total; } base_url = data[['baseurl_', blog_id].join('')]; admin_url = data[['adminurl_', blog_id].join('')]; count = 0; for (i in data.unused_images[blog_id]) { if (!data.unused_images[blog_id].hasOwnProperty(i)) continue; count++; unused_image = data.unused_images[blog_id][i]; if (data.multisite) { // set blog url to show on multisite image titles. blog_url = [data.sites[blog_id].domain, data.sites[blog_id].path].join(''); } append_image_to_list(unused_image, base_url, admin_url, blog_id, blog_url); } // update loaded count. if (images_loaded_count.hasOwnProperty(blog_id)) { images_loaded_count[blog_id] += count; } else { images_loaded_count[blog_id] = count; } } // lazyload images. // $('.lazyload', unused_images_container).lazyload(); return count; } /** * Handle site change. */ sites_select.on('change', function() { var selected_site = get_selected_site(); filter_images_by_site(selected_site); show_images_loaded_text(selected_site); }); /** * Filter images on site change. * * @param {number} blog_id * * @return {void} */ function filter_images_by_site(blog_id) { unused_images_view.filter_by_site(blog_id); if (unused_images_trash_view.is_visible()) { unused_images_trash_view.reload(); } } /** * Return array of items from array where array[i].key == value. * * @param array * @param key * @param value * * @return {Array} */ function get_array_items_by_key_value(array, key, value) { var i, result = []; for (i in array) { if (!array.hasOwnProperty(i)) continue; if (array[i].hasOwnProperty(key) && value == array[i][key]) { result[i] = array[i]; } } return result; } /** * Output list of sizes with checkboxes to container. * * @param {Object} container - jquery container. * @param {Object} sizes - list of image sizes. * @param {string} not_found_message - message to show if sizes list is empty. * * @return void */ function show_sizes_list(container, sizes, not_found_message) { var i, empty = true, original_unscaled = 'wpo-original-unscaled'; container.text(''); if (sizes) { // if there are any original images with scaled versions, display their information first. if (sizes.hasOwnProperty(original_unscaled)) { container.append(['