584 lines
16 KiB
JavaScript
584 lines
16 KiB
JavaScript
var _litespeed_meta;
|
|
var _litespeed_shell_interval = 3; // seconds
|
|
var _litespeed_shell_interval_range = [3, 60];
|
|
var _litespeed_shell_handle;
|
|
var _litespeed_shell_display_handle;
|
|
var _litespeed_crawler_url;
|
|
var _litespeed_dots;
|
|
|
|
(function ($) {
|
|
'use strict';
|
|
|
|
/**
|
|
* All of the code for your public-facing JavaScript source
|
|
* should reside in this file.
|
|
*
|
|
* Note: It has been assumed you will write jQuery code here, so the
|
|
* $ function reference has been prepared for usage within the scope
|
|
* of this function.
|
|
*
|
|
* This enables you to define handlers, for when the DOM is ready:
|
|
*
|
|
* $(function() {
|
|
*
|
|
* }) ;
|
|
*
|
|
* When the window is loaded:
|
|
*
|
|
* $( window ).load(function() {
|
|
*
|
|
* }) ;
|
|
*
|
|
* ...and/or other possibilities.
|
|
*
|
|
* Ideally, it is not considered best practise to attach more than a
|
|
* single DOM-ready or window-load handler for a particular page.
|
|
* Although scripts in the WordPress core, Plugins and Themes may be
|
|
* practising this, we should strive to set a better example in our own work.
|
|
*/
|
|
|
|
jQuery(document).ready(function () {
|
|
/************** Common LiteSpeed JS **************/
|
|
// Link confirm
|
|
$('[data-litespeed-cfm]').on('click', function (event) {
|
|
if (confirm($.trim($(this).data('litespeed-cfm')).replace(/\\n/g, '\n'))) {
|
|
return true;
|
|
}
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
return false;
|
|
});
|
|
|
|
/************** LSWCP JS ****************/
|
|
// page tab switch functionality
|
|
(function () {
|
|
var hash = window.location.hash.substr(1);
|
|
var $tabs = $('[data-litespeed-tab]');
|
|
var $subtabs = $('[data-litespeed-subtab]');
|
|
|
|
// Handle tab and subtab events
|
|
var tab_action = function ($elems, type) {
|
|
type = litespeed_tab_type(type);
|
|
var data = 'litespeed-' + type;
|
|
$elems.on('click', function (_event) {
|
|
litespeed_display_tab($(this).data(data), type);
|
|
document.cookie = 'litespeed_' + type + '=' + $(this).data(data);
|
|
$(this).blur();
|
|
});
|
|
};
|
|
tab_action($tabs);
|
|
tab_action($subtabs, 'subtab');
|
|
|
|
if (!$tabs.length > 0) {
|
|
// No tabs exist
|
|
return;
|
|
}
|
|
|
|
// Find hash in tabs and subtabs
|
|
var $hash_tab = $tabs.filter('[data-litespeed-tab="' + hash + '"]:first');
|
|
var $hash_subtab = $subtabs.filter('[data-litespeed-subtab="' + hash + '"]:first');
|
|
|
|
// Find tab name
|
|
var $subtab;
|
|
var $tab;
|
|
var tab_name;
|
|
if ($hash_subtab.length > 0) {
|
|
// Hash is a subtab
|
|
$tab = $hash_subtab.closest('[data-litespeed-layout]');
|
|
if ($tab.length > 0) {
|
|
$subtab = $hash_subtab;
|
|
tab_name = $tab.data('litespeed-layout');
|
|
}
|
|
}
|
|
if (typeof $tab === 'undefined' || $tab.length < 1) {
|
|
// Maybe hash is a tab
|
|
$tab = $hash_tab;
|
|
if ($tab.length < 1) {
|
|
// Maybe tab cookie exists
|
|
$tab = litespeed_tab_cookie($tabs);
|
|
if ($tab.length < 1) {
|
|
// Use the first tab by default
|
|
$tab = $tabs.first();
|
|
}
|
|
}
|
|
if (typeof tab_name === 'undefined') {
|
|
tab_name = $tab.data('litespeed-tab');
|
|
}
|
|
}
|
|
|
|
// Always display a tab
|
|
litespeed_display_tab(tab_name);
|
|
|
|
// Find subtab name
|
|
if (typeof $subtab === 'undefined' || $subtab.length < 1) {
|
|
$subtab = litespeed_tab_cookie($subtabs, 'subtab');
|
|
}
|
|
if ($subtab.length > 0) {
|
|
var subtab_name = $subtab.data('litespeed-subtab');
|
|
// Display a subtab
|
|
litespeed_display_tab(subtab_name, 'subtab');
|
|
}
|
|
})();
|
|
|
|
// Manage page -> purge by
|
|
$('[name=purgeby]').on('change', function (event) {
|
|
$('[data-purgeby]').hide();
|
|
$('[data-purgeby=' + this.value + ']').show();
|
|
});
|
|
|
|
/*************** crawler ******************/
|
|
$('#litespeed-crawl-url-btn').on('click', function () {
|
|
if (!$(this).data('url')) {
|
|
return false;
|
|
}
|
|
$('.litespeed-shell').removeClass('litespeed-hide');
|
|
_litespeed_dots = window.setInterval(_litespeed_loading_dots, 300);
|
|
_litespeed_crawler_url = $(this).data('url');
|
|
litespeed_fetch_meta();
|
|
$(this).hide();
|
|
});
|
|
|
|
$('#litespeed_manual_trigger').on('click', function (event) {
|
|
$('#litespeed-loading-dot').before('<li>Manually Started</li>');
|
|
_litespeed_shell_interval = _litespeed_shell_interval_range[0];
|
|
litespeed_fetch_meta();
|
|
});
|
|
|
|
/******************** Clear whm msg ********************/
|
|
$(document).on('click', '.lscwp-whm-notice .notice-dismiss', function () {
|
|
$.get(litespeed_data.ajax_url_dismiss_whm);
|
|
});
|
|
/******************** Clear rule conflict msg ********************/
|
|
$(document).on('click', '.lscwp-notice-ruleconflict .notice-dismiss', function () {
|
|
$.get(litespeed_data.ajax_url_dismiss_ruleconflict);
|
|
});
|
|
|
|
/** Accesskey **/
|
|
$('[litespeed-accesskey]').map(function () {
|
|
var thiskey = $(this).attr('litespeed-accesskey');
|
|
$(this).attr('title', 'Shortcut : ' + thiskey.toLocaleUpperCase());
|
|
var that = this;
|
|
$(document).on('keydown', function (e) {
|
|
if ($(':input:focus').length > 0) return;
|
|
if (event.metaKey) return;
|
|
if (event.ctrlKey) return;
|
|
if (event.altKey) return;
|
|
if (event.shiftKey) return;
|
|
if (litespeed_keycode(thiskey.charCodeAt(0))) $(that)[0].click();
|
|
});
|
|
});
|
|
|
|
/** Lets copy one more submit button **/
|
|
if ($('input[name="LSCWP_CTRL"]').length > 0) {
|
|
var btn = $('input.litespeed-duplicate-float');
|
|
btn.clone().addClass('litespeed-float-submit').removeAttr('id').insertAfter(btn);
|
|
}
|
|
if ($('input[id="LSCWP_NONCE"]').length > 0) {
|
|
$('input[id="LSCWP_NONCE"]').removeAttr('id');
|
|
}
|
|
|
|
/** Promo banner **/
|
|
$('#litespeed-promo-done').on('click', function (event) {
|
|
$('.litespeed-banner-promo-full').slideUp();
|
|
$.get(litespeed_data.ajax_url_promo + '&done=1');
|
|
});
|
|
$('#litespeed-promo-later').on('click', function (event) {
|
|
$('.litespeed-banner-promo-full').slideUp();
|
|
$.get(litespeed_data.ajax_url_promo);
|
|
});
|
|
|
|
/**
|
|
* Human readable time conversation
|
|
* @since 3.0
|
|
*/
|
|
if ($('[data-litespeed-readable]').length > 0) {
|
|
$('[data-litespeed-readable]').each(function (index, el) {
|
|
var that = this;
|
|
var $input = $(this).siblings('input[type="text"]');
|
|
|
|
var txt = litespeed_readable_time($input.val());
|
|
$(that).html(txt ? '= ' + txt : '');
|
|
|
|
$input.on('keyup', function (event) {
|
|
var txt = litespeed_readable_time($(this).val());
|
|
$(that).html(txt ? '= ' + txt : '');
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get server IP
|
|
* @since 3.0
|
|
*/
|
|
$('#litespeed_get_ip').on('click', function (e) {
|
|
$.ajax({
|
|
url: litespeed_data.ajax_url_getIP,
|
|
dataType: 'json',
|
|
beforeSend: function (xhr) {
|
|
xhr.setRequestHeader('X-WP-Nonce', litespeed_data.nonce);
|
|
},
|
|
success: function (data) {
|
|
console.log('[litespeed] get server IP response: ' + data);
|
|
$('#litespeed_server_ip').html(data);
|
|
},
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Freeze or melt a specific crawler
|
|
* @since 4.3
|
|
*/
|
|
if ($('[data-crawler-list] [data-litespeed_toggle_id]').length > 0) {
|
|
$('[data-crawler-list] [data-litespeed_toggle_id]').on('click', function (e) {
|
|
var crawler_id = $(this).attr('data-litespeed_toggle_id');
|
|
var crawler_id = Number(crawler_id.split('-').pop());
|
|
var that = this;
|
|
$.ajax({
|
|
url: litespeed_data.ajax_url_crawler_switch,
|
|
dataType: 'json',
|
|
method: 'POST',
|
|
cache: false,
|
|
data: { crawler_id: crawler_id },
|
|
beforeSend: function (xhr) {
|
|
xhr.setRequestHeader('X-WP-Nonce', litespeed_data.nonce);
|
|
},
|
|
success: function (data) {
|
|
$(that)
|
|
.toggleClass('litespeed-toggle-btn-default litespeed-toggleoff', data == 0)
|
|
.toggleClass('litespeed-toggle-btn-primary', data == 1);
|
|
console.log('litespeed-crawler-ajax: change Activate option');
|
|
},
|
|
error: function (xhr, error) {
|
|
console.log(xhr);
|
|
console.log(error);
|
|
console.log('litespeed-crawler-ajax: option failed to save due to some error');
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Click only once
|
|
*/
|
|
if ($('[data-litespeed-onlyonce]').length > 0) {
|
|
$('[data-litespeed-onlyonce]').on('click', function (e) {
|
|
if ($(this).hasClass('disabled')) {
|
|
e.preventDefault();
|
|
}
|
|
$(this).addClass('disabled');
|
|
});
|
|
}
|
|
});
|
|
})(jQuery);
|
|
|
|
/**
|
|
* Plural handler
|
|
*/
|
|
function litespeed_plural($num, $txt) {
|
|
if ($num > 1) return $num + ' ' + $txt + 's';
|
|
|
|
return $num + ' ' + $txt;
|
|
}
|
|
|
|
/**
|
|
* Convert seconds to readable time
|
|
*/
|
|
function litespeed_readable_time(seconds) {
|
|
if (seconds < 60) {
|
|
return '';
|
|
}
|
|
|
|
var second = Math.floor(seconds % 60);
|
|
var minute = Math.floor((seconds / 60) % 60);
|
|
var hour = Math.floor((seconds / 3600) % 24);
|
|
var day = Math.floor((seconds / 3600 / 24) % 7);
|
|
var week = Math.floor(seconds / 3600 / 24 / 7);
|
|
|
|
var str = '';
|
|
if (week) str += ' ' + litespeed_plural(week, 'week');
|
|
if (day) str += ' ' + litespeed_plural(day, 'day');
|
|
if (hour) str += ' ' + litespeed_plural(hour, 'hour');
|
|
if (minute) str += ' ' + litespeed_plural(minute, 'minute');
|
|
if (second) str += ' ' + litespeed_plural(second, 'second');
|
|
|
|
return str;
|
|
}
|
|
|
|
/**
|
|
* Trigger a click event on an element
|
|
* @since 1.8
|
|
*/
|
|
function litespeed_trigger_click(selector) {
|
|
jQuery(selector).trigger('click');
|
|
}
|
|
|
|
function litespeed_keycode(num) {
|
|
var num = num || 13;
|
|
var code = window.event ? event.keyCode : event.which;
|
|
if (num == code) return true;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Normalize specified tab type
|
|
* @since 4.7
|
|
*/
|
|
function litespeed_tab_type(type) {
|
|
return 'subtab' === type ? type : 'tab';
|
|
}
|
|
|
|
/**
|
|
* Sniff cookies for tab and subtab
|
|
* @since 4.7
|
|
*/
|
|
function litespeed_tab_cookie($elems, type) {
|
|
type = litespeed_tab_type(type);
|
|
var re = new RegExp('(?:^|.*;)\\s*litespeed_' + type + '\\s*=\\s*([^;]*).*$|^.*$', 'ms');
|
|
var name = document.cookie.replace(re, '$1');
|
|
return $elems.filter('[data-litespeed-' + type + '="' + name + '"]:first');
|
|
}
|
|
|
|
function litespeed_display_tab(name, type) {
|
|
type = litespeed_tab_type(type);
|
|
var $tabs;
|
|
var $layouts;
|
|
var classname;
|
|
var layout_type;
|
|
if ('subtab' === type) {
|
|
classname = 'focus';
|
|
layout_type = 'sublayout';
|
|
$tabs = jQuery('[data-litespeed-subtab="' + name + '"]')
|
|
.siblings('[data-litespeed-subtab]')
|
|
.addBack();
|
|
$layouts = jQuery('[data-litespeed-sublayout="' + name + '"]')
|
|
.siblings('[data-litespeed-sublayout]')
|
|
.addBack();
|
|
} else {
|
|
// Maybe handle subtabs
|
|
var $subtabs = jQuery('[data-litespeed-layout="' + name + '"] [data-litespeed-subtab]');
|
|
if ($subtabs.length > 0) {
|
|
// Find subtab name
|
|
var $subtab = litespeed_tab_cookie($subtabs, 'subtab');
|
|
if ($subtab.length < 1) {
|
|
$subtab = jQuery('[data-litespeed-layout="' + name + '"] [data-litespeed-subtab]:first');
|
|
}
|
|
if ($subtab.length > 0) {
|
|
var subtab_name = $subtab.data('litespeed-subtab');
|
|
// Display a subtab
|
|
litespeed_display_tab(subtab_name, 'subtab');
|
|
}
|
|
}
|
|
classname = 'nav-tab-active';
|
|
layout_type = 'layout';
|
|
$tabs = jQuery('[data-litespeed-tab]');
|
|
$layouts = jQuery('[data-litespeed-layout]');
|
|
}
|
|
$tabs.removeClass(classname);
|
|
$tabs.filter('[data-litespeed-' + type + '="' + name + '"]').addClass(classname);
|
|
$layouts.hide();
|
|
$layouts.filter('[data-litespeed-' + layout_type + '="' + name + '"]').show();
|
|
}
|
|
|
|
function lscwpEsiEnabled(the_checkbox, esi_ids) {
|
|
var rdonly = the_checkbox.checked ? false : true;
|
|
var len = esi_ids.length;
|
|
for (var i = 0; i < len; i++) {
|
|
var node_id = 'saved_' + esi_ids[i].getAttribute('id');
|
|
var node_val = esi_ids[i].getAttribute('value');
|
|
var prev = document.getElementById(node_id);
|
|
if (rdonly === false) {
|
|
esi_ids[i].removeAttribute('disabled');
|
|
if (prev) {
|
|
esi_ids[i].removeChild(prev);
|
|
}
|
|
continue;
|
|
}
|
|
esi_ids[i].setAttribute('disabled', true);
|
|
if (prev !== null) {
|
|
if (esi_ids[i].checked) {
|
|
prev.setAttribute('value', node_val);
|
|
} else {
|
|
esi_ids[i].removeChild(prev);
|
|
}
|
|
continue;
|
|
} else if (esi_ids[i].checked === false) {
|
|
continue;
|
|
}
|
|
var hid = document.createElement('INPUT');
|
|
hid.setAttribute('type', 'hidden');
|
|
hid.setAttribute('name', esi_ids[i].getAttribute('name'));
|
|
hid.setAttribute('value', node_val);
|
|
hid.setAttribute('id', node_id);
|
|
esi_ids[i].appendChild(hid);
|
|
}
|
|
}
|
|
|
|
// Append params to uri
|
|
function litespeed_append_param(uri, key, val) {
|
|
var re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');
|
|
var separator = uri.indexOf('?') !== -1 ? '&' : '?';
|
|
if (uri.match(re)) {
|
|
return uri.replace(re, '$1' + key + '=' + val + '$2');
|
|
} else {
|
|
return uri + separator + key + '=' + val;
|
|
}
|
|
}
|
|
|
|
function litespeed_pulse() {
|
|
jQuery('#litespeed-shell-icon').animate(
|
|
{
|
|
width: 27,
|
|
height: 34,
|
|
opacity: 1,
|
|
},
|
|
700,
|
|
function () {
|
|
jQuery('#litespeed-shell-icon').animate(
|
|
{
|
|
width: 23,
|
|
height: 29,
|
|
opacity: 0.5,
|
|
},
|
|
700,
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
function litespeed_fetch_meta() {
|
|
window.clearTimeout(_litespeed_shell_handle);
|
|
jQuery('#litespeed-loading-dot').text('');
|
|
jQuery.ajaxSetup({ cache: false });
|
|
jQuery.getJSON(_litespeed_crawler_url, function (meta) {
|
|
litespeed_pulse();
|
|
var changed = false;
|
|
if (meta && 'list_size' in meta) {
|
|
new_meta =
|
|
meta.list_size + ' ' + meta.file_time + ' ' + meta.curr_crawler + ' ' + meta.last_pos + ' ' + meta.last_count + ' ' + meta.last_start_time + ' ' + meta.is_running;
|
|
if (new_meta != _litespeed_meta) {
|
|
_litespeed_meta = new_meta;
|
|
changed = true;
|
|
string = _litespeed_build_meta(meta);
|
|
jQuery('#litespeed-loading-dot').before(string);
|
|
// remove first log elements
|
|
log_length = jQuery('.litespeed-shell-body li').length;
|
|
if (log_length > 50) {
|
|
jQuery('.litespeed-shell-body li:lt(' + (log_length - 50) + ')').remove();
|
|
}
|
|
// scroll to end
|
|
jQuery('.litespeed-shell-body')
|
|
.stop()
|
|
.animate(
|
|
{
|
|
scrollTop: jQuery('.litespeed-shell-body')[0].scrollHeight,
|
|
},
|
|
800,
|
|
);
|
|
}
|
|
|
|
// dynamic adjust the interval length
|
|
_litespeed_adjust_interval(changed);
|
|
}
|
|
// display interval counting
|
|
litespeed_display_interval_reset();
|
|
_litespeed_shell_handle = window.setTimeout(_litespeed_dynamic_timeout, _litespeed_shell_interval * 1000);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Dynamic adjust interval
|
|
*/
|
|
function _litespeed_adjust_interval(changed) {
|
|
if (changed) {
|
|
_litespeed_shell_interval -= Math.ceil(_litespeed_shell_interval / 2);
|
|
} else {
|
|
_litespeed_shell_interval++;
|
|
}
|
|
|
|
if (_litespeed_shell_interval < _litespeed_shell_interval_range[0]) {
|
|
_litespeed_shell_interval = _litespeed_shell_interval_range[0];
|
|
}
|
|
if (_litespeed_shell_interval > _litespeed_shell_interval_range[1]) {
|
|
_litespeed_shell_interval = _litespeed_shell_interval_range[1];
|
|
}
|
|
}
|
|
|
|
function _litespeed_build_meta(meta) {
|
|
var string =
|
|
'<li>' +
|
|
litespeed_date(meta.last_update_time) +
|
|
' Size: ' +
|
|
meta.list_size +
|
|
' Crawler: #' +
|
|
(meta.curr_crawler * 1 + 1) +
|
|
' Position: ' +
|
|
(meta.last_pos * 1 + 1) +
|
|
' Threads: ' +
|
|
meta.last_count +
|
|
' Status: ';
|
|
if (meta.is_running) {
|
|
string += 'crawling, ' + meta.last_status;
|
|
} else {
|
|
string += meta.end_reason ? meta.end_reason : '-';
|
|
}
|
|
string += '</li>';
|
|
return string;
|
|
}
|
|
|
|
function _litespeed_dynamic_timeout() {
|
|
litespeed_fetch_meta();
|
|
}
|
|
|
|
function litespeed_display_interval_reset() {
|
|
window.clearInterval(_litespeed_shell_display_handle);
|
|
jQuery('.litespeed-shell-header-bar').data('num', _litespeed_shell_interval);
|
|
_litespeed_shell_display_handle = window.setInterval(_litespeed_display_interval, 1000);
|
|
|
|
jQuery('.litespeed-shell-header-bar')
|
|
.stop()
|
|
.animate({ width: '100%' }, 500, function () {
|
|
jQuery('.litespeed-shell-header-bar').css('width', '0%');
|
|
});
|
|
}
|
|
|
|
function _litespeed_display_interval() {
|
|
var num = jQuery('.litespeed-shell-header-bar').data('num');
|
|
jQuery('.litespeed-shell-header-bar')
|
|
.stop()
|
|
.animate({ width: litespeed_get_percent(num, _litespeed_shell_interval) + '%' }, 1000);
|
|
if (num > 0) num--;
|
|
if (num < 0) num = 0;
|
|
jQuery('.litespeed-shell-header-bar').data('num', num);
|
|
}
|
|
|
|
function litespeed_get_percent(num1, num2) {
|
|
num1 = num1 * 1;
|
|
num2 = num2 * 1;
|
|
num = (num2 - num1) / num2;
|
|
return num * 100;
|
|
}
|
|
|
|
function _litespeed_loading_dots() {
|
|
jQuery('#litespeed-loading-dot').append('.');
|
|
}
|
|
|
|
function litespeed_date(timestamp) {
|
|
var a = new Date(timestamp * 1000);
|
|
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
var year = a.getFullYear();
|
|
var month = months[a.getMonth()];
|
|
var date = litespeed_add_zero(a.getDate());
|
|
var hour = litespeed_add_zero(a.getHours());
|
|
var min = litespeed_add_zero(a.getMinutes());
|
|
var sec = litespeed_add_zero(a.getSeconds());
|
|
var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec;
|
|
return time;
|
|
}
|
|
|
|
function litespeed_add_zero(i) {
|
|
if (i < 10) {
|
|
i = '0' + i;
|
|
}
|
|
return i;
|
|
}
|