File "scripts.js"

Full Path: /var/www/bvnghean.vn/save_bvnghean.vn/wp-content/plugins/swift-performance/js/scripts.js
File size: 42.42 KB
MIME-type: text/plain
Charset: utf-8

jQuery(function(){
      var _interval, cache_status_interval;

      jQuery(window).on('blur', function(){
		clearTimeout(cache_status_interval);
	});
	jQuery(window).on('focus load', function(){
            // Cache status
            if (jQuery('#swift-cache-status-box').length > 0){
                  clearTimeout(cache_status_interval);
                  cache_status();
            }
	});

      // Show pointers if any
      jQuery(window).on('load', pointers);

      // Fire cron if WP cron is disabled
      if (swift_performance.cron.length > 0){
            jQuery.get(swift_performance.cron);
            setInterval(function(){
                  jQuery.get(swift_performance.cron);
            },60000);
      }

      // Clear messages and container if any buttons was clicked
      jQuery(document).on('click', '.swift-performance-control', function(){
            if (jQuery(this).hasClass('clear-response-container')){
                  jQuery('.swift-preformatted-box .response-container').empty();
            }
            clear_messages();
      });

      jQuery(document).on('click', '.swift-box-close', function(){
            jQuery(this).closest('.swift-box').addClass('swift-hidden');
      });

      // Initialize charts and counters
      jQuery(window).on('load', function(){
            // Pie chart
            if (jQuery('.swift-pie-chart').length > 0){
                  jQuery('.swift-pie-chart').each(function(index, element) {
                        var that = jQuery(this);
                        var num = +(jQuery(that).attr('data-value'));
                        jQuery(that).html('<svg class="swift-pie" viewBox="0 0 32 32"><circle class="swift-pie-fill" r="16" cx="16" cy="16" style="stroke-dasharray: 0 100" /></svg>');
                        setTimeout(function(){
                              jQuery(that).find('.swift-pie-fill').css('stroke-dasharray', num + ' 100');
                        },1);
                  });

            }

            // Bar chart
            jQuery(".swift-bar-chart-bar .swift-bar-chart-bar-outer").each(function() {
                  var that = jQuery(this);
                  if (!jQuery(that).hasClass("swift-animated")) {
                    jQuery(that).addClass("swift-animated");
                    jQuery(that).animate({ width: jQuery(that).attr("data-value") + "%" }, {duration: 2000, easing:'swing'});
                  }
            });

            // Run counters
            jQuery('.swift-counter').each(function() {
                  jQuery(this).swiftCount();
            });
      });

      // Increase/decrease threads
      jQuery(document).on('click', '#swift-cache-status-box .change-thread-limit', function(){
            clearInterval(cache_status_interval);
            jQuery('body').addClass('swift-loading');
            var limit = (jQuery(this).hasClass('thread-plus') ? 1 : -1);
            jQuery.post(ajaxurl, {action: 'swift_performance_change_thread_limit', '_wpnonce' : swift_performance.nonce, 'limit' : limit}, function(){
                  cache_status(function(){
                        jQuery('body').removeClass('swift-loading');
                  });
            });
      });

      // Paginate list table
      jQuery(document).on('click', '#swift-performance-list-table-container .pagination-links a, .swift-performance-list-table thead th a', function(e){
            e.preventDefault();
            jQuery('body').addClass('swift-loading');
            jQuery('#swift-performance-list-table-url').val(jQuery(this).attr('href'));
            history.pushState(null, null, jQuery(this).attr('href'));
            jQuery.get(jQuery(this).attr('href'), function(source){
                  var html = jQuery.parseHTML(source);
                  jQuery('#swift-performance-list-table-container').replaceWith(jQuery(html).find('#swift-performance-list-table-container'));
                  jQuery('body').trigger('swift-list-table-paginated');
                  jQuery('body').removeClass('swift-loading');
            });
      });

      // Filter list table
      jQuery(document).on('submit', '.swift-list-table-filter', function(e){
            e.preventDefault();
            jQuery('body').addClass('swift-loading');
            history.pushState(null, null, jQuery(this).attr('action') + '?' + jQuery(this).serialize());
            jQuery.get(jQuery(this).attr('action'), jQuery(this).serialize(), function(source){
                  var html = jQuery.parseHTML(source);
                  jQuery('#swift-performance-list-table-container').replaceWith(jQuery(html).find('#swift-performance-list-table-container'));
                  jQuery('body').removeClass('swift-loading');
            });
      });

      // Refresh warmup
      jQuery(document).on('click', '#swift-performance-refresh-list-table', function(e){
            e.preventDefault();
            jQuery('body').addClass('swift-loading');
            jQuery.get(document.location.href, function(source){
                  var html = jQuery.parseHTML(source);
                  jQuery('#swift-performance-list-table-container').replaceWith(jQuery(html).find('#swift-performance-list-table-container'));
                  jQuery('body').removeClass('swift-loading');
            });
      });

      // Reset warmup
      jQuery(document).on('click', '#swift-performance-reset-warmup', function(e){
            e.preventDefault();
            if (confirm(__('Do you want to reset prebuild links?'))){
                  jQuery('body').addClass('swift-loading');
                  jQuery.post(ajaxurl, {action: 'swift_performance_reset_warmup', '_wpnonce' : swift_performance.nonce}, function(){
                        jQuery('#swift-performance-refresh-list-table').trigger('click');
                  });
            }
      });

      // Clear cache
      jQuery(document).on('click', '.swift-performance-clear-cache', function(e){
            jQuery('body').addClass('swift-loading');
            var type = jQuery(this).attr('data-type');
            jQuery.post(ajaxurl, {action: 'swift_performance_clear_cache', '_wpnonce' : swift_performance.nonce, 'type': type}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery('body').removeClass('swift-loading');
                  show_message(response);
                  jQuery('#swift-performance-refresh-list-table').trigger('click');
            });
            e.preventDefault();
      });

      // Clear assets cache
      jQuery(document).on('click', '#swift-performance-clear-assets-cache', function(e){
            jQuery('body').addClass('swift-loading');
            jQuery.post(ajaxurl, {action: 'swift_performance_clear_assets_cache', '_wpnonce' : swift_performance.nonce}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery('body').removeClass('swift-loading');
                  show_message(response);
            });
            e.preventDefault();
      });

      // Start prebuild cache
      jQuery(document).on('click', '#swift-performance-prebuild-cache', function(e){
            jQuery('#swift-performance-prebuild-cache').addClass('swift-hidden');
            jQuery('#swift-performance-stop-prebuild-cache').removeClass('swift-hidden');
            jQuery('body').addClass('swift-loading');
            jQuery.post(ajaxurl, {action: 'swift_performance_prebuild_cache', '_wpnonce' : swift_performance.nonce}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery('body').removeClass('swift-loading');
                  show_message(response);
            });
            e.preventDefault();
      });

      // Stop prebuild cache
      jQuery(document).on('click', '#swift-performance-stop-prebuild-cache', function(e){
            jQuery('#swift-performance-stop-prebuild-cache').addClass('swift-hidden');
            jQuery('#swift-performance-prebuild-cache').removeClass('swift-hidden');
            jQuery('body').addClass('swift-loading');
            jQuery.post(ajaxurl, {action: 'swift_performance_stop_prebuild_cache', '_wpnonce' : swift_performance.nonce}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery('body').removeClass('swift-loading');
                  show_message(response);
            });
            e.preventDefault();
      });

      // Change prebuild priority
      jQuery(document).on('submit', '.swift-priority-update', function(e){
            e.preventDefault();
            var form = jQuery(this);
            var data = jQuery(form).serialize();
            jQuery(form).closest('td').addClass('swift-loading');
            jQuery.post(ajaxurl, {action: 'swift_performance_update_prebuild_priority', '_wpnonce' : swift_performance.nonce, 'data' : data}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery(form).closest('td').removeClass('swift-loading');
                  show_message(response);
            });
      });

      // Single prebuild
      jQuery(document).on('click', '.swift-performance-list-table .do-cache', function(e){
            e.preventDefault();
            var button = jQuery(this);
            var row = jQuery(button).closest('tr');
            jQuery(button).closest('td').addClass('swift-loading');
            jQuery.post(ajaxurl, {action: 'swift_performance_single_prebuild', '_wpnonce' : swift_performance.nonce, 'url' : jQuery(button).attr('data-url')}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery(button).closest('td').removeClass('swift-loading');
                  show_message(response);
                  update_warmup_row(row, response);
            });
      });

      // Clear single
      jQuery(document).on('click', '.swift-performance-list-table .clear-cache', function(e){
            e.preventDefault();
            var button = jQuery(this);
            var row = jQuery(button).closest('tr');
            jQuery(button).closest('td').addClass('swift-loading');
            jQuery.post(ajaxurl, {action: 'swift_performance_single_clear_cache', '_wpnonce' : swift_performance.nonce, 'url' : jQuery(button).attr('data-url')}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery(button).closest('td').removeClass('swift-loading');
                  show_message(response);

                  // Remove if 404 cleared
                  if (jQuery(button).attr('data-status') == '404'){
                        jQuery(row).remove();
                  }
                  else {
                        update_warmup_row(row, response);
                  }
            });
      });

      // Remove warmup URL
      jQuery(document).on('click', '.remove-warmup-url', function(e){
            e.preventDefault();
            var button = jQuery(this);
            var row = jQuery(button).closest('tr');
            jQuery(button).closest('td').addClass('swift-loading');
            jQuery.post(ajaxurl, {action: 'swift_performance_remove_warmup_url', '_wpnonce' : swift_performance.nonce, 'url' : jQuery(button).attr('data-url')}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery(button).closest('td').removeClass('swift-loading');
                  show_message(response);

                  // Remove if 404 cleared
                  if (response.type == 'success'){
                        jQuery(row).remove();
                  }
                  else {
                        update_warmup_row(row, response);
                  }
            });
      });

      // Add warmup link
      jQuery(document).on('click', '#swift-performance-add-warmup-link', function(e){
            e.preventDefault();
            jQuery('.swift-add-warmup-link-container').removeClass('swift-hidden');
      });

      jQuery(document).on('click', '#swift-performance-cancel-add-warmup-link', function(e){
            e.preventDefault();
            jQuery('.swift-add-warmup-link-container').addClass('swift-hidden');
      });

      jQuery(document).on('click', '#swift-save-warmup-link', function(e){
            e.preventDefault();
            var form = jQuery(this).closest('.field-container');
            jQuery.post(ajaxurl, {action: 'swift_performance_add_warmup_url', '_wpnonce' : swift_performance.nonce, 'url' : jQuery(form).find('[name="url"]').val(), 'priority' : jQuery(form).find('[name="priority"]').val()}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);
                  show_message(response)

                  // Link was successfully added
                  if (response.type == 'success'){
                        jQuery(form).find('input').val('');
                        jQuery('#swift-performance-refresh-list-table').trigger('click');
                  }
            });
      });

      // Show Rewrite Rules
      jQuery(document).on('click', '#swift-performance-show-rewrite', function(e){
            clearInterval(_interval);

            jQuery('body').addClass('swift-loading');
            jQuery.post(ajaxurl, {action: 'swift_performance_show_rewrites', '_wpnonce' : swift_performance.nonce}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);
                  show_message(response);

                  jQuery('.swift-preformatted-box').removeClass('swift-hidden');
                  jQuery('.swift-preformatted-box h3 .title').text(response.title);
                  jQuery('.swift-preformatted-box pre.response-container').text(response.rewrites);
                  jQuery('body').removeClass('swift-loading');
            });
            e.preventDefault();
      });

      // Show Log
      jQuery(document).on('click', '#swift-performance-log', function(e){
            clearInterval(_interval);

            jQuery('body').addClass('swift-loading');
            jQuery.post(ajaxurl, {action: 'swift_performance_show_log', '_wpnonce' : swift_performance.nonce}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);
                  show_message(response);

                  jQuery('.swift-preformatted-box').removeClass('swift-hidden');
                  jQuery('.swift-preformatted-box h3 .title').text(response.title);
                  jQuery('.swift-preformatted-box pre.response-container').text(response.status);
                  jQuery('body').removeClass('swift-loading');
            });
            _interval = setInterval(function(){
                  var scroll_top = jQuery('.swift-preformatted-box .response-container').scrollTop();
                  jQuery.post(ajaxurl, {action: 'swift_performance_show_log', '_wpnonce' : swift_performance.nonce}, function(response){
                        response = (typeof response === 'string' ? JSON.parse(response) : response);

                        jQuery('.swift-preformatted-box pre.response-container').text(response.status);
                        jQuery('.swift-preformatted-box .response-container').scrollTop(scroll_top);
                  });
            }, 5000);
            e.preventDefault();
      });

      // Clear logs
      jQuery(document).on('click', '#swift-performance-clear-logs', function(e){
            if (confirm(__('Do you want to clear all logs'))){
                  jQuery('body').addClass('swift-loading');
                  jQuery.post(ajaxurl, {action: 'swift_performance_clear_logs', '_wpnonce' : swift_performance.nonce}, function(){
                        jQuery('#swift-performance-log').trigger('click');
                  });
            }
      });

      // Developer Mode
      jQuery(document).on('click', '#swift-performance-toggle-developer-mode', function(e){
            e.preventDefault();
            jQuery('body').addClass('swift-loading');
            jQuery.post(ajaxurl, {action: 'swift_performance_toggle_dev_mode', '_wpnonce' : swift_performance.nonce}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery('body').removeClass('swift-loading');
                  jQuery('#swift-performance-toggle-developer-mode > span').toggleClass('swift-hidden');
                  show_message(response);
            });
      });

      /*
       * DB Optimizer
       */

      // Backup confirmation
      jQuery(document).on('click','.swift-confirm-backup', function(e){
            e.preventDefault();
            jQuery('.swift-dashboard').removeClass('content-blurred');
            jQuery(this).parent().remove();
      });

      // Ajax actions
      jQuery(document).on('click', '.swift-db-optimizer-action', function(e){
            e.preventDefault();
            var action  = jQuery(this).attr('id');
            var count   = jQuery(this).closest('ul').find('.count');
            jQuery(count).html('<span class="dashicons dashicons-update swift-spin"></span>');
            jQuery.post(ajaxurl, {'action': 'swift_performance_db_optimizer', 'swift-action': action, '_wpnonce' : swift_performance.nonce}, function(response){
                  jQuery(count).html(response);
            });
      });

      // Toggle schedule form
      jQuery(document).on('click', '.swift-toggle-scheduled-dbo', function(e){
            e.preventDefault();
            jQuery('#schedule-' + jQuery(this).attr('data-option')).toggleClass('swift-hidden');
      });

      // Change status for scheduled event
      jQuery(document).on('click', '.swift-scheduled-dbo-change', function(e){
            e.preventDefault();
            var option  = jQuery(this).closest('form').find('[name="option"]').val();
            var data    = jQuery(this).closest('form').serialize();
            data        += '&action=swift_performance_db_optimizer&swift-action=' + jQuery(this).attr('data-action') + '&_wpnonce=' + swift_performance.nonce;

            jQuery.post(ajaxurl, data, function(response){
                  jQuery('#trigger-' + option).html(response);
            });

            jQuery(this).closest('form').addClass('swift-hidden');
      });

      /*
       * Critical Font
       */

      // Select icons
      jQuery(document).on('click', '.swift-font-selector li', function(){
            jQuery(this).toggleClass('active');
      });

      // Filter
      jQuery(document).on('keypress focus blur change', '.swift-critical-font-filter', function(){
            var container     = jQuery(this).closest('.swift-critical-font-container');
            var that          = jQuery(this);

            setTimeout(function(){
                  var key = jQuery(that).val();
                  if (key == ''){
                        jQuery(container).find('.swift-font-selector li').removeClass('swift-hidden');
                  }

                  jQuery(container).find('.swift-font-selector li').each(function(){
                        if (jQuery(this).attr('data-selector').match(key)){
                              jQuery(this).removeClass('swift-hidden');
                        }
                        else {
                              jQuery(this).addClass('swift-hidden');
                        }
                  });
            }, 100);
      });

      // Clear font filter
      jQuery(document).on('click', '.swift-clear-critical-font-filter', function(e){
            e.preventDefault();
            jQuery(this).closest('.swift-critical-font-container').find('.swift-critical-font-filter').val('').trigger('change');
      });

      // Clear selected icons
      jQuery(document).on('click', '.swift-critical-font-clear-all', function(e){
            e.preventDefault();
            jQuery(this).closest('.swift-critical-font-container').find('.swift-font-selector li.active').removeClass('active');
      });

      // Enqueue font
      jQuery(document).on('click', '.swift-enqueue-critical-font', function(e){
            e.preventDefault();
            jQuery('body').addClass('swift-loading');
            var css           = '';
            var content       = [];
            var active        = [];
            var container     = jQuery(this).closest('.swift-critical-font-container');
            var font          = jQuery(container).attr('data-font');
            jQuery(container).find('.swift-font-selector li').each(function(){
                  if (jQuery(this).hasClass('active')){
                        css += jQuery(this).attr('data-selector') + '{content:"' + jQuery(this).attr('data-content') + '"}';
                        content.push(jQuery(this).attr('data-content'));
                        active.push(jQuery(this).attr('data-class'));
                  }
            });
            jQuery.post(ajaxurl, {'action': 'swift_performance_enqueue_critical_font', 'font': font, 'css': css, 'content': content, 'active': active, '_wpnonce' : swift_performance.nonce}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery(container).find('.status').text(response.status_message)
                  jQuery(container).find('.swift-dequeue-critical-font').removeClass('swift-hidden');

                  show_message(response);
                  jQuery('body').removeClass('swift-loading');
            });
      });

      // Dequeue font
      jQuery(document).on('click', '.swift-dequeue-critical-font', function(e){
            e.preventDefault();
            jQuery('body').addClass('swift-loading');
            var container     = jQuery(this).closest('.swift-critical-font-container');
            var font          = jQuery(container).attr('data-font');
            jQuery.post(ajaxurl, {'action': 'swift_performance_dequeue_critical_font', 'font': font, '_wpnonce' : swift_performance.nonce}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  jQuery(container).find('.status').text(response.status_message)
                  jQuery(container).find('.swift-dequeue-critical-font').addClass('swift-hidden');
                  jQuery(container).find(response.selector).addClass('active');
                  show_message(response);
                  jQuery('body').removeClass('swift-loading');
            });
      });

      // Scan used icons
      jQuery(document).on('click', '.swift-scan-used-icons', function(e){
            e.preventDefault();
            jQuery('body').addClass('swift-loading');
            var container     = jQuery(this).closest('.swift-critical-font-container');
            var font          = jQuery(container).attr('data-font');
            jQuery.post(ajaxurl, {'action': 'swift_performance_scan_used_icons', 'font': font, '_wpnonce' : swift_performance.nonce}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  if (typeof response.selectors !== 'undefined'){
                        for (var i in response.selectors){
                              console.log('[data-selector*="'+response.selectors[i]+'"]');
                              jQuery(container).find('[data-selector*="'+response.selectors[i]+'"]').addClass('active');
                        }
                  }

                  show_message(response);
                  jQuery('body').removeClass('swift-loading');
            });
      });


      // Edit Plugin Rule
      jQuery(document).on('click', '.swift-performance-edit-plugin-rule', function(e){
            e.preventDefault();
            var summary       = '';
            var container     = jQuery(this).closest('.swift-box-inner');
            if (jQuery(this).closest('.plugin-rule').find('select').length > 0){
                  jQuery(this).closest('.plugin-rule').find('select option:selected').each(function(){
                        summary += jQuery(this).text() + ', ';
                  });
                  summary = summary.replace(/,\s$/, '');
            }
            else {
                  summary = jQuery(this).closest('.plugin-rule').find('input').val();
            }

            if (summary == ''){
                summary = __('Not set');
            }

            if (jQuery(this).closest('.plugin-rule').hasClass('is-editing')){
                  save_plugin_organizer_rule();
            }

            jQuery(this).closest('.plugin-rule').toggleClass('is-editing');
            jQuery(container).toggleClass('disabled');
            jQuery(this).closest('.plugin-rule').find('.rule-summary').empty().text(summary);
      });

      // Cancel editing
      jQuery(document).on('click', '.cancel-editing', function(e){
            e.preventDefault();
            jQuery(this).closest('.plugin-rule').removeClass('is-editing');
            jQuery(this).closest('.swift-box-inner').removeClass('disabled');
      });

      // Remove Plugin Rule
      jQuery(document).on('click', '.swift-performance-remove-plugin-rule', function(e){
           e.preventDefault();
           jQuery(this).closest('.swift-box-inner').removeClass('disabled');
           jQuery(this).closest('.plugin-rule').remove();
           save_plugin_organizer_rule();
      });

      // Show rule help
      jQuery(document).on('change', '.rule-mode-selector', function(){
            var mode = jQuery(this).val();
            if (mode !== ''){
                  jQuery(this).closest('.swift-box-inner').find('.swift-plugin-rule-help').addClass('swift-hidden');
                  jQuery(this).closest('.swift-box-inner').find('.swift-plugin-rule-help.swift-help-' + mode).removeClass('swift-hidden');
            }
      });
      jQuery('.rule-mode-selector').trigger('change');

      // Add Disable Plugin Rule
      jQuery(document).on('click', '.swift-add-plugin-rule', function(e){
            e.preventDefault();
            var container     = jQuery(this).closest('.swift-box-inner');
            var type          = jQuery(container).find('.rule-mode-selector option:selected').attr('data-type');
            var mode          = jQuery(container).find('.rule-mode-selector').val();
            var slug          = jQuery(container).attr('data-plugin');
            var clone         = jQuery('#swift-plugin-rule-samples').find('.' + mode + '-sample').clone();

            var randid        = parseInt(Math.random()*1000000000);

            if (mode !== ''){
                  if (jQuery(clone).hasClass('editable')){
                        jQuery(clone).addClass('is-editing');
                        jQuery(container).addClass('disabled');
                  }
                  jQuery(clone).find('input, select').each(function(){
                        jQuery(this).attr('name', jQuery(this).attr('name').replace('%SLUG%', slug));
                        jQuery(this).attr('name', jQuery(this).attr('name').replace('%TYPE%', type));
                        jQuery(this).attr('name', jQuery(this).attr('name').replace('%RANDID%', randid));
                        if (type == 'exception'){
                              jQuery(clone).find('i.fa-ban').attr('class', 'fa fa-check');
                        }
                  });

                  jQuery(clone).appendTo(jQuery(container).find('ul.rule-container'));
                  if (!jQuery(clone).hasClass('is-editing')) {
                        save_plugin_organizer_rule();
                  }
            }
      });

      /**
       * Save plugin organizer rule
       */
       function save_plugin_organizer_rule(){
            jQuery('body').addClass('swift-loading');
            jQuery.post(document.location.href, jQuery('#plugin-organizer').serialize(), function(){
                  jQuery('body').removeClass('swift-loading');
            });
       }

      /**
       * Show Cache Status
       */
      function cache_status(callback){
            jQuery.post(ajaxurl, {action: 'swift_performance_cache_status', '_wpnonce' : swift_performance.nonce}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  if (typeof response.text !== 'undefined' && response.text.length > 0){
                        jQuery('.swift-message').removeClass('swift-hidden');
                        jQuery('.swift-message').addClass(response.type).text(response.text);
                  }

                  jQuery('#swift-cache-status-box .prebuild-status').text(response.prebuild);
                  if (response.prebuild == ''){
                        jQuery('#swift-performance-stop-prebuild-cache').addClass('swift-hidden');
                        jQuery('#swift-performance-prebuild-cache').removeClass('swift-hidden');
                  }
                  else {
                        jQuery('#swift-performance-prebuild-cache').addClass('swift-hidden');
                        jQuery('#swift-performance-stop-prebuild-cache').removeClass('swift-hidden');
                  }

                  jQuery('#swift-cache-status-box .warmup-pages-count').text(response.all_pages);
                  jQuery('#swift-cache-status-box .cached-pages-count').text(response.cached_pages);

                  jQuery('#swift-cache-status-box .cache-size-count').text(response.size);
                  jQuery('#swift-cache-status-box .thread-count').html(response.threads);

                  jQuery('#swift-cache-status-box .ajax-object-count').text(response.ajax_objects);
                  jQuery('#swift-cache-status-box .ajax-size-count').text(response.ajax_size);

                  jQuery('#swift-cache-status-box .cached-dynamic-pages-count').html(response.dynamic_pages);
                  jQuery('#swift-cache-status-box .cached-dynamic-size-count').html(response.dynamic_size);
                  if (typeof callback === 'function'){
                        callback();
                  }

                  clearTimeout(cache_status_interval);
                  cache_status_interval = setTimeout(cache_status, 5000);

            });
      }

      /**
       * Update warmup table row
       * @param Object row
       * @param Object response
       */
      function update_warmup_row(row, response){
            // Status
            if (typeof response.status !== 'undefined'){
                  jQuery(row).find('.column-status .dashicons').addClass('swift-hidden');
                  if (response.status == 'html'){
                        jQuery(row).find('.view-cached').removeClass('swift-hidden');
                        jQuery(row).find('.column-status .dashicons-yes').removeClass('swift-hidden');
                        jQuery(row).find('.do-cache').addClass('swift-hidden');
                        jQuery(row).find('.clear-cache').removeClass('swift-hidden');
                  }
                  else {
                        jQuery(row).find('.view-cached').addClass('swift-hidden');
                        jQuery(row).find('.column-status .dashicons-no').removeClass('swift-hidden');
                        jQuery(row).find('.do-cache').removeClass('swift-hidden');
                        jQuery(row).find('.clear-cache').addClass('swift-hidden');
                  }
            }

            // Date
            if (typeof response.date !== 'undefined'){
                  jQuery(row).find('.column-date').empty().text(response.date);
            }
      }

      /**
       * Show message if any
       * @param object response
       */
      function show_message(response){
            if (typeof response.text !== 'undefined' && response.text.length > 0){
                  jQuery('.swift-message').removeClass('success warning critical swift-hidden').addClass(response.type).text(response.text);
                  var message_top = jQuery('.swift-message').offset().top - 42;
                  if (jQuery("html").scrollTop() > message_top || jQuery("body").scrollTop() > message_top){
                        jQuery("html, body").animate({scrollTop: message_top});
                  }
                  setTimeout(clear_messages,3000);
            }
      }

      /**
       * Clear messages
       */
      function clear_messages(){
            jQuery('.swift-message').empty();
            jQuery('.swift-message').attr('class', 'swift-message swift-hidden');
      }

      /**
       * Add new meta box row
       */
      jQuery(document).on('click', '.swift-meta-box-group .add-new-row', function(e){
            e.preventDefault();
            var row = jQuery(this).closest('.swift-meta-box-group').find('.sample').clone().removeClass('swift-hidden sample');
            jQuery(row).insertBefore(this);
      });

       /**
        * Delete meta box row
        */
      jQuery(document).on('click', '.swift-meta-box-group .remove-row', function(e){
            e.preventDefault();
            jQuery(this).closest('.swift-meta-box-row').remove();
      });

      /**
       * Show tooltips
       */
      function pointers(){
            var item = jQuery('[data-swift-pointer]:first');
            if (jQuery(item).length > 0){
                  jQuery(item).pointer({
                        content: jQuery(item).attr('data-swift-pointer-content'),
                        position: jQuery(item).attr('data-swift-pointer-position'),
                        buttons: function( event, t ) {
      				var close  = swift_performance.i18n['Dismiss'],
      					button = jQuery('<a class="close" href="#">' + close + '</a>');

      				return button.bind( 'click.pointer', function(e) {
      					e.preventDefault();
      					t.element.pointer('close');
      				});
      			},
                        hide: function( event, t ) {
      				t.pointer.hide();
      				t.closed();
                              jQuery.post(ajaxurl, {'action': 'swift_performance_dismiss_pointer', 'id': jQuery(item).attr('data-swift-pointer'), '_wpnonce': swift_performance.nonce})
      			},
                  }).pointer('open');
            }
      }

      /* FRAMEWORK CUSTOMIZATIONS */

      // Hide info popups on tab chane
      jQuery('.luv-framework-tab').on('luv-tab-changed', function(){
            jQuery('.wp-pointer').css('display', 'none');
      });

      // Settings mode switch
      jQuery(document).on('change', '.swift-settings-mode input', function(){
            jQuery('[name="_luv_settings-mode"]').val(jQuery('.swift-settings-mode input:checked').val()).trigger('change');
      });

      //Image Optimizer Preset buttons
      jQuery(document).on('change', '.swift-performance-io-preset', function(){
            jQuery('[name="_luv_jpeg-quality"]').val(jQuery(this).attr('data-jpeg')).trigger('change');
            jQuery('[name="_luv_png-quality"]').val(jQuery(this).attr('data-png')).trigger('change');
            if (jQuery(this).attr('data-jpeg') * 1 < 100){
                  jQuery('[name="_luv_resize-large-images"]').attr('checked', true).trigger('change');
                  jQuery('[name="_luv_maximum-image-width"]').val('1920').trigger('change');
            }
            else {
                  jQuery('[name="_luv_resize-large-images"]').removeAttr('checked').trigger('change');
            }
      });

      // Clear cache after change settings
      jQuery(document).on('change', '.should-clear-cache input, .should-clear-cache select, .should-clear-cache textarea', function(){
            jQuery('.luv-framework-container.swift-performance-settings').attr('data-clear-cache', 'true');
            jQuery('.swift-performance-ajax-preview').addClass('swift-visible');
      });

      jQuery(document).on('luv-saved', '.luv-framework-container.swift-performance-settings', function(){
            if (jQuery(this).attr('data-clear-cache')){
                  jQuery('.luv-modal').empty().append(jQuery('.swift-confirm-clear-cache').clone().removeClass('luv-hidden')).removeClass('luv-modal-hide').show();
            }
            jQuery('.swift-performance-ajax-preview').removeClass('swift-visible');
            jQuery(this).removeAttr('data-clear-cache');
      });

      // Reset Image Optimizer Presets
      jQuery(document).on('luv-reset', '.luv-framework-tab', function(){
            if (jQuery(this).find('#io-preset-lossless').length > 0){
                  jQuery(this).find('#io-preset-lossless').trigger('click');
            }
      });

      // Preview
      jQuery(document).on('click', '.swift-performance-ajax-preview', function(e){
            e.preventDefault();
            jQuery('body').addClass('swift-loading');

            jQuery.post(luv_framework_fields.ajax_url, _serialize(jQuery(this).attr('data-fieldset')) + '&action=' + 'swift_performance_preview&_wpnonce=' + swift_performance.nonce, function(response){
                  jQuery('.luv-framework-section-header .has-issues').each(function(){
                        jQuery(this).removeClass('has-issues').removeClass('has-error').removeClass('has-warning');
                  });
                  window.open(response.url);
                  jQuery('body').removeClass('swift-loading');
            });
      });

      // Clear cache
      jQuery(document).on('click', '[data-swift-clear-cache]', function(e){
		e.preventDefault();
            if (jQuery(this).closest('.luv-modal').length > 0){
                  jQuery(this).closest('.luv-modal').addClass('luv-modal-hide');
            }
            else if (jQuery(this).closest('[data-message-id]').length > 0){
                  jQuery.post(ajaxurl, {action: 'swift_performance_dismiss_notice', '_wpnonce' : swift_performance.nonce, 'id': jQuery(this).closest('[data-message-id]').attr('data-message-id')});
                  jQuery(this).closest('[data-message-id]').fadeOut();
            }

            jQuery.post(ajaxurl, {action: 'swift_performance_clear_cache', '_wpnonce' : swift_performance.nonce, 'type': 'all'}, function(response){
                  response = (typeof response === 'string' ? JSON.parse(response) : response);

                  var result = (response.type == 'success' ? 'luv-success' : 'luv-error');
      		var notice = jQuery('<div>', {
                        'class': 'luv-framework-notice ' + result,
                  }).append(jQuery('<span>', {
                        'class': 'luv-framework-notice-inner',
                        'text': response.text
                  }));

                  jQuery('body').append(notice);
                  setTimeout(function(){
                        jQuery(notice).find('.luv-framework-notice-inner').css('max-width', '100%');
                  }, 100);
                  setTimeout(function(){
                        jQuery(notice).remove();
                  }, 5000);
            });
	});

      // Should clear cache after change
      jQuery(document).on('change', '.should-clear-cache input, .should-clear-cache select, .should-clear-cache textarea', function(){
		jQuery('.luv-framework-container.swift-performance-settings').attr('data-clear-cache', 'true');
            jQuery('.swift-performance-ajax-preview').addClass('swift-visible');
	});

	jQuery(document).on('luv-saved', '.luv-framework-container.swift-performance-settings', function(){
		if (jQuery(this).attr('data-clear-cache')){
			jQuery('.luv-modal').empty().append(jQuery('.swift-confirm-clear-cache').clone().removeClass('luv-hidden')).removeClass('luv-modal-hide').show();
		}
            jQuery('.swift-performance-ajax-preview').removeClass('swift-visible');
		jQuery(this).removeAttr('data-clear-cache');
	});

      // Reset Image Optimizer
      jQuery(document).on('luv-reset', '.luv-framework-tab', function(){
            if (jQuery(this).find('#io-preset-lossless').length > 0){
                  jQuery(this).find('#io-preset-lossless').trigger('click');
            }
      });

      // Dismiss notice
      jQuery(document).on('click', '[data-swift-dismiss-notice]', function(){
            jQuery.post(ajaxurl, {action: 'swift_performance_dismiss_notice', '_wpnonce' : swift_performance.nonce, 'id': jQuery(this).closest('[data-message-id]').attr('data-message-id')});
            jQuery(this).closest('[data-message-id]').fadeOut();
      });

      /**
       * Serialize fieldset
       * @param string s
       * @return string
       */
      function _serialize(s){
            var params = '';
            jQuery(s).find('input:not([type="checkbox"]):not([type="radio"]), input[type="checkbox"]:checked, input[type="radio"]:checked , option:selected, textarea').each(function(){
                  var name = (jQuery(this).is('option') ? jQuery(this).closest('select').attr('name') : jQuery(this).attr('name'));
                  params += name + '=' + encodeURIComponent(jQuery(this).val()) + '&';
            });
            return _trim(params, '&');
      }

      /**
       * Trim characters from string
       * @param string s
       * @param string c
       * @return string
       */
      function _trim (s, c) {
       if (c === "]") c = "\\]";
       if (c === "\\") c = "\\\\";
       return s.replace(new RegExp(
          "^[" + c + "]+|[" + c + "]+$", "g"
       ), "");
      }

      /**
       * Localize strings
       * @param string text
       * @return string
       */
      function __(text){
            if (typeof swift_performance.i18n[text] === 'string'){
                  return swift_performance.i18n[text]
            }
            else {
                  return text;
            }
      }
});

/**
 * Counter effect
 * @param int countTo
 */
jQuery.fn.swiftCount = function(countTo, duration, easing){
      var that    = jQuery(this),
      unit        = n(countTo)[1] || n(jQuery(that).attr('data-count'))[1],
      countTo     = n(countTo)[0] || n(jQuery(that).attr('data-count'))[0],
      size        = countTo.split(".")[1] ? countTo.split(".")[1].length : 0,
      duration    = duration || 2000,
      easing      = easing || 'swing';

      jQuery({countNum: n(jQuery(that).text())[0]}).animate({
          countNum: countTo
      },
      {
          duration: duration,
          easing: easing,
          step: function(now) {
            jQuery(that).text(parseFloat(now).toFixed(size) + unit);
          }
      });

      /**
       * Return numeric and unit part of a string
       * @param string text
       * @return array
       */
      function n(text){
            if (typeof text !== 'undefined'){
                  text = text.toString();
                  var v = u = '';
                  for (var i in text){
                        if (u == '' && text[i].match(/[\d\.]/)){
                              v += text[i];
                        }
                        else if (typeof text[i] !== 'undefined'){
                              u += text[i];
                        }
                  }
                  return [v,u];
            }
            return [0,''];
      }
}