(function($){
window.addEventListener('DOMContentLoaded', function(){
speedycache_handle_tab();
window.addEventListener('hashchange', speedycache_handle_tab);
if(speedycache_ajax.premium){
speedycache_image_optimization();
}
jQuery('.speedycache-save-settings-wrapper button').on('click', speedycache_save_settings);
jQuery('#speedycache-analyze').on('click', speedycache_analyze_speed);
jQuery('.speedycache-tooltip-link').on('mouseover', function(){
let jEle = jQuery(this),
tooltip = jEle.find('.speedycache-link-tooltip'),
elementHeight = Math.ceil(tooltip.outerHeight()/2);
tooltip.fadeIn('fast').css({
top: `-${elementHeight+10}px`, // Position it above the parent
});
});
jQuery('.speedycache-tooltip-link').on('mouseleave', function(){
let jEle = jQuery(this);
jEle.find('.speedycache-link-tooltip').hide();
});
// Delay JS
jQuery('#speedycache_delay_js').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache_purge_varnish').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache_critical_images').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache_lazy_load_html').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache_preload').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache_dns_prefetch').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache_preload_resources').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache_render_blocking').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
// Critical CSS Status
jQuery('#speedycache_critical_css').change(function(e) {
let prevent_open = true;
if(e.isTrigger){
prevent_open = false;
}
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this), prevent_open);
});
jQuery('#speedycache_pre_connect').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache_unused_css').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('.speedycache-action-link').on('click', function(){
let action_name = jQuery(this).attr('action-name');
switch(action_name){
case 'speedycache_critical_css':
speedycache_critical_css();
break;
}
});
// Lazy Load
jQuery('#speedycache_lazy_load').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache_update_heartbeat').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache_limit_post_revision').change(function() {
if(!jQuery(this).is(':checked')){
speedycache_toggle_settings_link(jQuery(this));
return;
}
speedycache_toggle_settings_link(jQuery(this));
speedycache_open_modal(jQuery(this));
});
// Add Suggested Scripts
var $textarea = jQuery('#speedycache_delay_js_scripts');
jQuery('.speedycache-delay-suggestions').on('click', function(event) {
event.preventDefault();
if($textarea.length){
var $suggestions_text = jQuery('.speedycache-modal-scripts').text().trim().replace(/
/gi, '\n').replace(/\n\s+/g, '\n').replace(/\s+\n/g, '\n').replace(/\n+/g, '\n'),
current_text = $textarea.val().trim(),
new_text = current_text ? current_text + '\n' + $suggestions_text : $suggestions_text;
//Only add unique values
var unique_text = [...new Set(new_text.split('\n'))].join('\n');
$textarea.val(unique_text);
}
});
//Event Listener for Settings link for popup options
jQuery('.speedycache-modal-settings-link').off('click').click(function() {
var id = jQuery(this).attr('setting-id'),
input = jQuery('#'+id);
input.trigger('change');
});
// Add Excludes Btn
jQuery('#speedycache_add_excludes').click(function() {
speedycache_open_modal(jQuery(this));
});
jQuery('#speedycache-cdn-type').change(function(e){
let cdn_type = jQuery(e.target).val(),
cdn_key = jQuery('#speedycache-cdn-key').closest('.speedycache-stacked-option-wrap'),
cdn_url = jQuery('#speedycache-cdn-url').closest('.speedycache-stacked-option-wrap');
if(cdn_type == 'cloudflare'){
cdn_url.hide();
cdn_key.show();
return;
}else if(cdn_type == 'bunny'){
cdn_url.show();
cdn_key.show();
return;
}
// For other we only need to show the URL field
cdn_url.show();
cdn_key.hide();
return;
});
// Toggle exact time field of cache lifespan
jQuery('#speedycache-run-exact-time').click(function(e){
if(jQuery(this).is(':checked')){
jQuery('#speedycache-exact-time-selector').css('display', 'flex');
return;
}
jQuery('#speedycache-exact-time-selector').hide();
});
jQuery('#speedycache-ll-type').change(function(e){
let type = jQuery(e.target).val(),
custom_input = jQuery('#speedycache-custom-ll-url');
if(type == 'default'){
custom_input.hide();
return;
}
custom_input.show();
});
jQuery('#speedycache-cdn-type').trigger('change');
jQuery('#speedycache-exclude-type').on('change', speedycache_update_excluded_options);
jQuery('#speedycache-exclude-rule-prefix').on('change', speedycache_update_excluded_prefix);
jQuery('.speedycache-exclude-btn-wrap button').on('click', speedycache_update_excludes);
jQuery('#speedycache-type-filter').on('change', speedycache_filter_exclude_type);
jQuery(document).on('click', '.speedycache-delete-rule', speedycache_delete_exclude_rule);
jQuery('.speedycache-db-optm-btn').on('click', speedycache_db_optm);
jQuery('.speedycache-preloading-add').on('click', speedycache_add_preload_resource);
jQuery('.speedycache-preloading-table').on('click', '.dashicons-trash', speedycache_delete_preload_resource);
jQuery('.speedycache-flush-db').on('click', speedycache_flush_objects);
jQuery('#speedycache-license-btn').on('click', speedycache_verify_license);
});
})(jQuery);
function speedycache_handle_tab(){
let hash = location.hash.trim().replace('#', ''),
nav = jQuery('#speedycache-navigation');
if(!hash.length){
let tab = jQuery('#speedycache-dashboard');
tab.siblings().hide();
tab.css('display', 'flex');
nav.find('.speedycache-nav-selected').removeClass('speedycache-nav-selected');
nav.find('a[href=\\#'+hash+']').addClass('speedycache-nav-selected')
return
}
let tab = jQuery('#speedycache-'+hash);
tab.siblings().hide();
tab.css('display', 'flex');
nav.find('.speedycache-nav-selected').removeClass('speedycache-nav-selected');
nav.find('a[href=\\#'+hash+']').addClass('speedycache-nav-selected')
}
function speedycache_save_settings(){
event.preventDefault();
let jEle = jQuery(event.target);
jEle.find('span').addClass('speedycache-spinner-active');
form_data = jEle.closest('form').serializeArray();
jQuery.ajax({
url : speedycache_ajax.url,
method : "POST",
data : form_data,
success: function(res){
if(res.success){
return;
}
if(res.data){
alert(res.data);
}
alert("Something went wrong");
}
}).always(function(){
jEle.find('span').removeClass('speedycache-spinner-active');
});
}
function speedycache_filter_exclude_type(){
let jEle = jQuery(event.target),
list = jQuery('.speedycache-exclude-list'),
filter = jEle.val();
list.find('tbody tr').filter(function(){
jQuery(this).toggle(jQuery(this).find('td').eq(0).text().toLowerCase().indexOf(filter) > - 1);
});
}
function speedycache_delete_exclude_rule(){
event.preventDefault();
let jEle = jQuery(event.target),
tr = jEle.closest('tr'),
rule_id = tr.data('id')
jEle.find('span').addClass('speedycache-spinner-active');
jQuery.ajax({
url : speedycache_ajax.url,
method : "POST",
data : {
'_ajax_nonce' : speedycache_ajax.nonce,
'action' : 'speedycache_delete_exclude_rule',
'rule_id' : rule_id
},
success: function(res){
if(res.success){
tr.slideUp();
return;
}
if(res.data){
alert(res.data);
return;
}
alert('Something went wrong deleting the rule');
}
}).always(function(){
jEle.find('span').removeClass('speedycache-spinner-active');
});
}
function speedycache_toggle_settings_link(jEle) {
var wrap = jEle.closest('.speedycache-option-wrap'),
setting = wrap.find('.speedycache-modal-settings-link, .speedycache-action-link');
if(jEle.is(':checked')) {
setting.show();
return;
}
setting.hide();
}
function speedycache_open_modal(jEle, prevent_open) {
var id_attr = 'id';
if(prevent_open){
return;
}
if(jEle.attr('modal-id')) {
id_attr = 'modal-id'
}
//For Settings Link
if(jEle.attr('setting-id')) {
id_attr = 'setting-id';
}
var modal_id = jEle.attr(id_attr),
speedycache_modal = jQuery("div[modal-id='"+modal_id+"']");
if(speedycache_modal && speedycache_modal.css('visibility') === 'hidden') {
speedycache_modal.css('visibility','visible');
speedycache_close_modal();
}
}
function speedycache_update_excluded_options(){
let jEle = jQuery(event.target),
prefix = jQuery('#speedycache-exclude-rule-prefix'),
exclude_type = jEle.val();
prefix.val(""); // Resets to select value option
prefix.find('option').filter(function(){
jQuery(this).toggle(jQuery(this).data('partof').toLowerCase().indexOf(exclude_type) > - 1);
});
}
// Toggles content input of excludes settings
function speedycache_update_excluded_prefix(){
let jEle = jQuery(event.target),
val = jEle.val(),
content = jQuery('#speedycache-exclude-rule-content').closest('.speedycache-input-wrap');
if(val == 'contain' || val == 'exact' || val == 'startwith' || val == 'post_id'){
content.show();
return;
}
content.hide();
}
function speedycache_update_excludes(){
event.preventDefault();
let jEle = jQuery(event.target),
form = jEle.closest('form');
jEle.find('span').addClass('speedycache-spinner-active');
form_data = form.serializeArray();
let prefix_field = form_data.find(field => field.name === 'prefix');
let content_field = form_data.find(field => field.name === 'content');
if (prefix_field && prefix_field.value === 'post_id' && content_field) {
if (!/^\d+(,\d+)*$/.test(content_field.value)) {
alert("Invalid format! Only numbers and commas are allowed, without starting, ending, or consecutive commas.");
jEle.find('span').removeClass('speedycache-spinner-active');
return;
}
}
jQuery.ajax({
url : speedycache_ajax.url,
method : "POST",
data : form_data,
success: function(res){
if(res.success){
form.trigger('reset');
jQuery('#speedycache-exclude-list').load(window.location.href + ' #speedycache-exclude-list');
return;
}
if(res.data){
alert(res.data);
return;
}
alert('Something went wrong saving the details');
}
}).always(function(){
jEle.find('span').removeClass('speedycache-spinner-active');
});
}
//Close SpeedyCache Modal
function speedycache_close_modal() {
jQuery('.speedycache-modal-footer > button, .speedycache-close-modal').on('click', function() {
//Remove duplicate entries when Submit or Close Button is clicked
var $textarea = jQuery(this).closest('.speedycache-modal').find('#speedycache_delay_js_scripts');
if ($textarea.length) {
var current_text = $textarea.val().trim();
var unique_text = [...new Set(current_text.split('\n'))].join('\n');
$textarea.val(unique_text);
}
jQuery(this).closest('.speedycache-modal').find('form').trigger('reset');
jQuery(this).closest('.speedycache-modal *').off();
jQuery(this).closest('.speedycache-modal').css('visibility','hidden');
});
}
function speedycache_analyze_speed(){
jEle = jQuery(event.target);
jEle.text('[Analysing...]');
jQuery.ajax({
url : speedycache_ajax.url,
method : 'GET',
data : {
security : speedycache_ajax.nonce,
action : 'speedycache_test_pagespeed',
},
success : function(res){
if(!res.data || !res.data['score']){
return
}
let donut = jQuery('.speedycache-perf-score-donut'),
tspan = donut.find('tspan'),
lowerCircle = donut.find('circle:first-child'),
strokeCircle = lowerCircle.next();
lowerCircle.attr('fill', res.data['color'][1]);
strokeCircle.css('stroke', res.data['color'][0]);
strokeCircle.attr('stroke-dasharray', res.data['score']+' '+(100 - res.data['score']));
tspan.text(res.data['score']); // Updated the score
tspan.css('fill', res.data['color'][2]);
}
}).always(function(){
jEle.text('[Updating results]');
setTimeout(() => {jEle.text('[Analyse]')}, 1000)
});
}
function speedycache_db_optm(){
event.preventDefault();
let proceed = confirm('Are you sure you want to proceed with this DB optimization action');
if(!proceed){
return;
}
let jEle = jQuery(event.target),
db_action = jEle.closest('.speedycache-db-row').attr('speedycache-db-name'),
spinner = jEle.find('.speedycache-spinner');
spinner.addClass('speedycache-spinner-active');
jQuery.ajax({
url : speedycache_ajax.url,
method : 'POST',
data : {
security : speedycache_ajax.nonce,
action : 'speedycache_optm_db',
db_action : db_action,
},
success: function(res){
if(res.success){
// TODO: make this update the UI too chaning the numbers.
return false;
}
if(res.message){
alert(res.message);
return;
}
alert("Something went wrong unable to optimize this option");
}
}).always(function(){
spinner.removeClass('speedycache-spinner-active');
});
}
function speedycache_add_preload_resource() {
event.preventDefault();
let ele = jQuery(event.target),
loader = ele.find('.speedycache-spinner'),
form = ele.closest('form'),
error = false;
if(!form){
alert('Unable to get the form details!');
return;
}
let form_type = form.data('type');
// Disabling Add Button
ele.prop('disabled', true);
let form_val = {};
form_data = form.serializeArray();
form_data.forEach((field) => {
form_val[field.name] = field.value;
if(!field.value){
error = true;
}
});
if(error){
alert('Fill all the fields before adding');
ele.prop('disabled', false);
return;
}
loader.addClass('speedycache-spinner-active');
jQuery.ajax({
'method' : 'POST',
'url' : speedycache_ajax.url,
'data' : {
action : 'speedycache_preloading_add_settings',
settings : form_val,
type : form_type,
security : speedycache_ajax.nonce
},
'success' : function(res){
ele.prop('disabled', false);
if(!res){
alert('Something went wrong, the response returned is empty');
return;
}
if(!res.success){
alert(res.data);
return;
}
let table = ele.closest('.speedycache-modal-content').find('table');
html = `
Something Went Wrong
${res.message}