"use strict";
var itsecSettingsPage = {
events: jQuery( {} ),
init: function() {
jQuery( '.itsec-module-settings-container' ).hide();
this.bindEvents();
jQuery( '.itsec-settings-view-toggle .itsec-selected' ).removeClass( 'itsec-selected' ).trigger( 'click' );
jQuery( '.itsec-settings-toggle' ).trigger( 'change' );
this.initFilters();
this.initCurrentModule();
this.makeNoticesDismissible();
},
initFilters: function() {
var module_type = this.getUrlParameter( 'module_type' );
if ( false === module_type || 0 === jQuery( '#itsec-module-filter-' + module_type.replace( /[^\w-]/g, '' ) ).length ) {
module_type = 'recommended';
}
jQuery( '#itsec-module-filter-' + module_type.replace( /[^\w-]/g, '' ) + ' a' ).trigger( 'click' );
},
initCurrentModule: function() {
var module = this.getUrlParameter( 'module' );
if ( 'string' === typeof module ) {
jQuery( '#itsec-module-card-' + module.replace( /[^\w-]/g, '' ) + ' button.itsec-toggle-settings' ).trigger( 'click' );
}
},
bindEvents: function() {
if ( itsecSettingsPage.bindEvents.bound ) {
return;
}
jQuery(window).on("popstate", function(e, data) {
if ( null !== e.originalEvent.state && 'string' == typeof e.originalEvent.state.module && '' !== e.originalEvent.state.module.replace( /[^\w-]/g, '' ) ) {
jQuery( '#itsec-module-card-' + e.originalEvent.state.module.replace( /[^\w-]/g, '' ) + ' button.itsec-toggle-settings' ).trigger( 'itsec-popstate' );
} else {
itsecSettingsPage.closeGridSettingsModal( e );
}
if ( null !== e.originalEvent.state && 'string' == typeof e.originalEvent.state.module_type && '' !== e.originalEvent.state.module_type.replace( /[^\w-]/g, '' ) ) {
jQuery( '#itsec-module-filter-' + e.originalEvent.state.module_type.replace( /[^\w-]/g, '' ) + ' a' ).trigger( 'itsec-popstate' );
}
});
var $container = jQuery( '#wpcontent' );
$container.on( 'click', '.itsec-module-filter a', this.filterView );
$container.on( 'itsec-popstate', '.itsec-module-filter a', this.filterView );
$container.on( 'click', '.itsec-settings-view-toggle a', this.toggleView );
// $container.on( 'click', '.itsec-toggle-settings, .itsec-module-card-content h2', this.toggleSettings );
$container.on( 'click', 'a[data-module-link]', this.openModuleFromLink );
$container.on( 'click', '.list .itsec-module-card:not(.itsec-module-pro-upsell) .itsec-module-card-content, .itsec-toggle-settings, .itsec-module-settings-cancel', this.toggleSettings );
$container.on( 'itsec-popstate', '.list .itsec-module-card-content, .itsec-toggle-settings', this.toggleSettings );
$container.on( 'click', '.itsec-close-modal, .itsec-modal-background', this.closeGridSettingsModal );
$container.on( 'keyup', this.closeGridSettingsModal );
$container.on( 'click', '.itsec-toggle-activation', this.toggleModuleActivation );
$container.on( 'click', '.itsec-module-settings-save', this.saveSettings );
$container.on( 'click', '.itsec-reload-module', this.reloadModule );
$container.on( 'click', '.itsec-details-toggle-container a[href="#"]', this.toggleDetails );
$container.on( 'change', '#itsec-filter', this.logPageChangeFilter );
// For use by module content to show/hide settings sections based upon an input.
$container.on( 'change', '.itsec-settings-toggle', this.toggleModuleContent );
$container.on( 'click', '.itsec-copy-trigger', this.handleCopy );
itsecSettingsPage.bindEvents.bound = true;
},
toggleDetails: function( e ) {
e.preventDefault();
var $details = jQuery(this).parent().find( '.itsec-details-toggle-details' ).toggleClass( 'hide-if-js' );
if ( $details.hasClass( 'hide-if-js' ) ) {
jQuery(this).html( itsec_page.translations.show_information );
} else {
jQuery(this).html( itsec_page.translations.hide_description );
}
},
logPageChangeFilter: function( e ) {
var filter = jQuery( this ).val();
var url = itsec_page.logs_page_url + '&filter=' + filter;
window.location.href = url;
},
toggleModuleContent: function( e ) {
if ( 'checkbox' === jQuery(this).attr( 'type' ) ) {
var show = jQuery(this).prop( 'checked' );
} else {
var show = ( jQuery(this).val() ) ? true : false;
}
var $content = jQuery( '.' + jQuery(this).attr( 'id' ) + '-content' );
if ( show ) {
$content.show();
var $container = jQuery( '.itsec-module-cards-container' );
if ( $container.hasClass( 'grid' ) ) {
var $modal = jQuery(this).parents( '.itsec-module-settings-content-container' );
var scrollOffset = $modal.scrollTop() + jQuery(this).parent().position().top;
$modal.animate( {'scrollTop': scrollOffset}, 'slow' );
}
} else {
$content.hide();
}
},
handleCopy: function( e ) {
e.preventDefault();
var $trigger = jQuery( e.currentTarget );
var fromId = $trigger.data( 'copy-from' );
if ( ! fromId.length ) {
return;
}
var el = document.getElementById( fromId );
var removeSelect = itsecSettingsPage.selectText( el );
try {
document.execCommand( 'copy' );
removeSelect();
$trigger.text( itsec_page.translations.copied );
} catch ( e ) {
var $p = jQuery( '
' ).text( itsec_page.translations.copy_instruction ),
$notice = jQuery( '' ).append( $p ),
$el = jQuery( el );
$trigger.after( $notice );
var removeNotice = function () {
$notice.fadeOut( function () {
$notice.remove();
} );
};
var copy = function () {
setTimeout( function () {
removeNotice();
removeSelect();
}, 100 );
$el.off( 'copy', copy );
return true;
};
$el.on( 'copy', copy );
setTimeout( removeNotice, 5000 );
}
},
// https://stackoverflow.com/a/987376
selectText: function( element ) {
var doc = document, text = element, range, selection;
if ( doc.body.createTextRange ) { // ie
range = document.body.createTextRange();
range.moveToElementText( text );
range.select();
} else if ( window.getSelection ) {
selection = window.getSelection();
range = document.createRange();
range.selectNodeContents( text );
selection.removeAllRanges();
selection.addRange( range );
}
return function() {
if ( selection ) {
selection.removeAllRanges();
} else {
range.collapse();
}
};
},
saveSettings: function( e ) {
e.preventDefault();
var $button = jQuery(this);
if ( $button.hasClass( 'itsec-module-settings-save' ) ) {
var module = $button.parents( '.itsec-module-card' ).attr( 'id' ).replace( 'itsec-module-card-', '' );
} else {
var module = '';
}
$button.prop( 'disabled', true );
var data = {
'--itsec-form-serialized-data': jQuery( '#itsec-module-settings-form' ).serialize()
};
itsecSettingsPage.sendAJAXRequest( module, 'save', data, itsecSettingsPage.saveSettingsCallback );
},
saveSettingsCallback: function( results ) {
if ( '' === results.module ) {
jQuery( '#itsec-save' ).prop( 'disabled', false );
} else {
jQuery( '#itsec-module-card-' + results.module + ' button.itsec-module-settings-save' ).prop( 'disabled', false );
}
var $container = jQuery( '.itsec-module-cards-container' );
if ( $container.hasClass( 'grid' ) ) {
var view = 'grid';
} else {
var view = 'list';
}
itsecSettingsPage.clearMessages();
if ( results.errors.length > 0 || results.warnings.length > 0 || ! results.closeModal ) {
itsecSettingsPage.showErrors( results.errors, results.module, 'open' );
itsecSettingsPage.showErrors( results.warnings, results.module, 'open', 'warning' );
itsecSettingsPage.showMessages( results.messages, results.module, 'open' );
itsecSettingsPage.showMessages( results.infos, results.module, 'open', 'info' );
if ( 'grid' === view ) {
$container.find( '.itsec-module-settings-content-container:visible' ).animate( {'scrollTop': 0}, 'fast' );
}
if ( 'list' === view ) {
jQuery(document).scrollTop( 0 );
}
} else {
itsecSettingsPage.showMessages( results.messages, results.module, 'closed' );
itsecSettingsPage.showMessages( results.infos, results.module, 'closed', 'info' );
if ( 'grid' === view ) {
$container.find( '.itsec-module-settings-content-container:visible' ).scrollTop( 0 );
itsecSettingsPage.closeGridSettingsModal();
}
}
},
clearMessages: function() {
jQuery( '#itsec-settings-messages-container, .itsec-module-messages-container' ).empty();
},
showErrors: function( errors, module, containerStatus, type ) {
jQuery.each( errors, function( index, error ) {
itsecSettingsPage.showError( error, module, containerStatus, type );
} );
},
showError: function( error, module, containerStatus, type ) {
type = type || 'error';
if ( jQuery( '.itsec-module-cards-container' ).hasClass( 'grid' ) ) {
var view = 'grid';
} else {
var view = 'list';
}
if ( 'closed' !== containerStatus && 'open' !== containerStatus ) {
containerStatus = 'closed';
}
if ( 'string' !== typeof module ) {
module = '';
}
if ( 'closed' === containerStatus || '' === module ) {
var container = jQuery( '#itsec-settings-messages-container' );
if ( '' === module ) {
container.addClass( 'no-module' );
}
} else {
var container = jQuery( '#itsec-module-card-' + module + ' .itsec-module-messages-container' );
}
var $notice = jQuery( '' );
$notice.addClass( 'notice-' + type );
if ( containerStatus === 'open' || module.length ) {
$notice.addClass( 'notice-alt' );
}
container.append( $notice ).addClass( 'visible' );
},
showMessages: function( messages, module, containerStatus, type ) {
jQuery.each( messages, function( index, message ) {
itsecSettingsPage.showMessage( message, module, containerStatus, type );
} );
},
showMessage: function( message, module, containerStatus, type ) {
type = type || 'success';
if ( jQuery( '.itsec-module-cards-container' ).hasClass( 'grid' ) ) {
var view = 'grid';
} else {
var view = 'list';
}
if ( 'closed' !== containerStatus && 'open' !== containerStatus ) {
containerStatus = 'closed';
}
if ( 'string' !== typeof module ) {
module = '';
}
if ( 'closed' === containerStatus || '' === module ) {
var container = jQuery( '#itsec-settings-messages-container' );
var dismiss = function () {
if ( container.is( ':hover' ) ) {
return setTimeout( dismiss, 2000 );
}
container.removeClass( 'visible' );
setTimeout( function () {
container.find( 'div' ).remove();
}, 500 );
};
setTimeout( dismiss, 4000 );
} else {
var container = jQuery( '#itsec-module-card-' + module + ' .itsec-module-messages-container' );
}
var $notice = jQuery( '' );
$notice.addClass( 'notice-' + type );
if ( containerStatus === 'open' || module.length ) {
$notice.addClass( 'notice-alt' );
}
container.append( $notice ).addClass( 'visible' );
},
filterView: function( e ) {
e.preventDefault();
var $activeLink = jQuery(this),
$oldLink = $activeLink.parents( '.itsec-feature-tabs' ).find( '.current' ),
type = $activeLink.parent().attr( 'id' ).substr( 20 );
$oldLink.removeClass( 'current' );
$activeLink.addClass( 'current' );
if ( 'all' === type ) {
jQuery( '.itsec-module-card' ).show();
} else {
jQuery( '.itsec-module-type-' + type ).show();
jQuery( '.itsec-module-card' ).not( '.itsec-module-type-' + type ).hide();
}
// We use this to avoid pushing a new state when we're trying to handle a popstate
if ( 'itsec-popstate' !== e.type ) {
var url = '?page=itsec&module_type=' + type;
var module = itsecSettingsPage.getUrlParameter( 'module' );
if ( 'string' === typeof module ) {
url += '&module=' + module;
}
window.history.pushState( {'module_type':type}, type, url );
}
},
toggleView: function( e ) {
e.preventDefault();
var $self = jQuery(this);
if ( $self.hasClass( 'itsec-selected' ) ) {
// Do nothing if already selected.
return;
}
var $view = $self.attr( 'class' ).replace( 'itsec-', '' );
$self.addClass( 'itsec-selected' ).siblings().removeClass( 'itsec-selected' );
jQuery( '.itsec-module-settings-container' ).hide();
jQuery( '.itsec-toggle-settings' ).each(function( index ) {
var $button = jQuery( this );
if ( $button.parents( '.itsec-module-card' ).hasClass( 'itsec-module-type-enabled' ) && ! $button.hasClass( 'information-only' ) ) {
$button.html( itsec_page.translations.show_settings );
} else if ( $button.hasClass( 'information-only' ) ) {
$button.html( itsec_page.translations.information_only );
} else {
$button.html( itsec_page.translations.show_description );
}
});
var $cardContainer = jQuery( '.itsec-module-cards-container' );
jQuery.post( ajaxurl, {
'action': 'itsec-set-user-setting',
'itsec-user-setting-nonce': $self.parent().data( 'nonce' ),
'setting': 'itsec-settings-view',
'value': $view
} );
$cardContainer.fadeOut( 100, function() {
$cardContainer.removeClass( 'grid list' ).addClass( $view );
} );
$cardContainer.fadeIn( 100 );
},
openModuleFromLink: function( e ) {
var $link = jQuery( this ), module = $link.data( 'module-link' ),
$module = jQuery( '.itsec-module-card[data-module-id="' + module + '"]' ),
highlight = $link.data( 'highlight-setting-id' );
if ( ! $module.length ) {
return; // safety check
}
e.preventDefault();
jQuery( '.itsec-module-settings-container:visible' ).hide();
var $listClassElement = $module.parents( '.itsec-module-cards-container' ),
$toggleButton = $module.find( '.itsec-toggle-settings' );
if ( highlight && highlight.length ) {
jQuery( 'label[for="' + highlight + '"]', $module ).parents( 'tr' ).addClass( 'itsec-highlighted-setting' );
}
if ( $listClassElement.hasClass( 'list' ) ) {
itsecSettingsPage.toggleListSettingsCard.call( $toggleButton, e );
} else if ( $listClassElement.hasClass( 'grid' ) ) {
itsecSettingsPage.showGridSettingsModal.call( $toggleButton, e );
}
var type = $module.hasClass( 'itsec-module-type-advanced' ) ? 'advanced' : 'recommended';
window.history.pushState( {module: module}, module, '?page=itsec&module=' + module + '&module_type=' + type );
var href = $link.attr( 'href' );
if ( href && href.length > 1 && href.charAt( 0 ) === '#' ) {
setTimeout( function () {
jQuery( '.itsec-module-settings-content-container', '#itsec-module-card-notification-center' ).scrollTo( jQuery( href ), 'swing', { offset: -30 } );
}, 350 );
}
},
toggleSettings: function( e ) {
e.stopPropagation();
var $listClassElement = jQuery(e.currentTarget).parents( '.itsec-module-cards-container' );
if ( $listClassElement.hasClass( 'list') ) {
itsecSettingsPage.toggleListSettingsCard.call( this, e );
} else if ( $listClassElement.hasClass( 'grid' ) ) {
itsecSettingsPage.showGridSettingsModal.call( this, e );
}
// We use this to avoid pushing a new state when we're trying to handle a popstate
if ( 'itsec-popstate' !== e.type ) {
var module_id = jQuery(this).closest('.itsec-module-card').data( 'module-id' );
var module_type = itsecSettingsPage.getUrlParameter( 'module_type' );
if ( false === module_type || 0 === jQuery( '#itsec-module-filter-' + module_type.replace( /[^\w-]/g, '' ) ).length ) {
module_type = 'recommended';
}
window.history.pushState( {'module':module_id}, module_id, '?page=itsec&module=' + module_id + '&module_type=' + module_type );
}
},
toggleListSettingsCard: function( e ) {
e.preventDefault();
var $container = jQuery(this);
if ( ! $container.hasClass( 'itsec-module-card-content' ) ) {
$container = $container.parents( '.itsec-module-card' ).find( '.itsec-module-card-content' );
}
var $settings = $container.siblings( '.itsec-module-settings-container' ),
isVisible = $settings.is( ':visible' );
$settings.stop().slideToggle( 300 );
if ( ! isVisible ) {
var $highlighted = jQuery( '.itsec-highlighted-setting', $settings );
if ( $highlighted.length ) {
setTimeout( function () {
jQuery.scrollTo( $highlighted.first(), 'swing', {
offset: { top: -30 },
onAfter: function() {
var $el = jQuery( 'input[type!="button"], textarea, select', $highlighted ).not( ':hidden' ).first();
itsecSettingsPage.focus( $el, $highlighted );
}
} );
}, 50 );
} else {
var $el = jQuery( 'input[type!="button"], textarea, select', $settings ).not( ':hidden' ).first();
itsecSettingsPage.focus( $el, $settings );
}
}
var $button = $container.find( '.itsec-toggle-settings' );
if ( $container.parent().hasClass( 'itsec-module-type-enabled' ) ) {
if ( $button.html() == itsec_page.translations.show_settings ) {
$button.html( itsec_page.translations.hide_settings );
} else {
$button.html( itsec_page.translations.show_settings );
}
} else {
if ( $button.hasClass( 'information-only' ) ) {
if ( $button.html() == itsec_page.translations.show_information ) {
$button.html( itsec_page.translations.hide_description );
} else {
$button.html( itsec_page.translations.show_information );
}
} else {
if ( $button.html() == itsec_page.translations.show_description ) {
$button.html( itsec_page.translations.hide_description );
} else {
$button.html( itsec_page.translations.show_description );
}
}
}
},
showGridSettingsModal: function( e ) {
e.preventDefault();
var $module = jQuery(this).parents( '.itsec-module-card' ),
$settingsContainer = $module.find( '.itsec-module-settings-container' ),
$modalBackground = jQuery( '.itsec-modal-background' );
$module.show();
$modalBackground.fadeIn();
$settingsContainer.fadeIn( 200 );
jQuery( 'body' ).addClass( 'itsec-modal-open' );
var $highlighted = jQuery( '.itsec-highlighted-setting', $module ).first();
if ( $highlighted.length ) {
jQuery( '.itsec-module-settings-content-container', $module ).scrollTo( $highlighted, 'swing', {
offset: { top: -20 },
onAfter: function() {
var $el = jQuery( 'input[type!="button"], textarea, select', $highlighted ).not( ':hidden' ).first();
itsecSettingsPage.focus( $el, $highlighted );
}
} );
} else {
var $el = jQuery( 'input[type!="button"], textarea, select', $settingsContainer ).not( ':hidden' ).first();
itsecSettingsPage.focus( $el, $settingsContainer );
}
},
focus: function( $el, $fallback ) {
if ( itsecSettingsPage.isElementVisible( $el ) && jQuery( window ).height() > 800 ) {
$el.focus();
} else {
$fallback.prop( 'tabindex', -1 ).focus();
}
},
isElementVisible: function( $el ) {
var $window = jQuery( window ), height = $window.height(), width = $window.width(), offset = $el.offset();
if ( ! $el || ! offset ) {
return false;
}
return offset.top < height && offset.left < width;
},
closeGridSettingsModal: function( e ) {
if ( 'undefined' !== typeof e ) {
e.preventDefault();
// For keyup events, only process esc
if ( 'keyup' === e.type && 27 !== e.which ) {
return;
}
}
jQuery( '.itsec-modal-background' ).fadeOut();
jQuery( '.itsec-module-settings-container' ).fadeOut( 200 );
jQuery( 'body' ).removeClass( 'itsec-modal-open' );
if ( 'undefined' === typeof e || 'popstate' !== e.type ) {
var module_type = itsecSettingsPage.getUrlParameter( 'module_type' );
if ( false === module_type || 0 === jQuery( '#itsec-module-filter-' + module_type.replace( /[^\w-]/g, '' ) ).length ) {
module_type = 'recommended';
}
window.history.pushState( {'module':'', 'module_type':module_type}, module_type, '?page=itsec&module_type=' + module_type );
}
if ( jQuery( '#search' ).val().length ) {
jQuery( '#search' ).focus();
}
},
toggleModuleActivation: function( e ) {
e.preventDefault();
e.stopPropagation();
var $button = jQuery(this),
$card = $button.parents( '.itsec-module-card' ),
$buttons = $card.find( '.itsec-toggle-activation' ),
module = $card.attr( 'id' ).replace( 'itsec-module-card-', '' );
$buttons.prop( 'disabled', true );
if ( $button.html() == itsec_page.translations.activate ) {
var method = 'activate';
} else {
var method = 'deactivate';
}
itsecSettingsPage.sendAJAXRequest( module, method, {}, itsecSettingsPage.toggleModuleActivationCallback );
},
setModuleToActive: function( module ) {
var args = {
'module': module,
'method': 'activate',
'errors': []
};
itsecSettingsPage.toggleModuleActivationCallback( args );
},
setModuleToInactive: function( module ) {
var args = {
'module': module,
'method': 'deactivate',
'errors': []
};
itsecSettingsPage.toggleModuleActivationCallback( args );
},
toggleModuleActivationCallback: function( results ) {
var module = results.module;
var method = results.method;
var $card = jQuery( '#itsec-module-card-' + module ),
$buttons = $card.find( '.itsec-toggle-activation' )
if ( results.errors.length > 0 ) {
$buttons
.html( itsec_page.translations.error )
.addClass( 'button-secondary' )
.removeClass( 'button-primary' );
setTimeout( function() {
itsecSettingsPage.isModuleActive( module );
}, 1000 );
return;
}
if ( 'activate' === method ) {
$buttons
.html( itsec_page.translations.deactivate )
.addClass( 'button-secondary' )
.removeClass( 'button-primary' )
.prop( 'disabled', false );
$card
.addClass( 'itsec-module-type-enabled' )
.removeClass( 'itsec-module-type-disabled' );
var newToggleSettingsLabel = itsec_page.translations.show_settings;
} else {
$buttons
.html( itsec_page.translations.activate )
.addClass( 'button-primary' )
.removeClass( 'button-secondary' )
.prop( 'disabled', false );
$card
.addClass( 'itsec-module-type-disabled' )
.removeClass( 'itsec-module-type-enabled' );
var newToggleSettingsLabel = itsec_page.translations.show_description;
}
$card.find( '.itsec-toggle-settings' ).html( newToggleSettingsLabel );
var enabledCount = jQuery( '.itsec-module-type-enabled' ).length,
disabledCount = jQuery( '.itsec-module-type-disabled' ).length;
jQuery( '#itsec-module-filter-enabled .count' ).html( '(' + enabledCount + ')' );
jQuery( '#itsec-module-filter-disabled .count' ).html( '(' + disabledCount + ')' );
itsecSettingsPage.showErrors( results.warnings, results.module, 'closed', 'warning' );
itsecSettingsPage.showMessages( results.messages, results.module, 'closed' );
itsecSettingsPage.showMessages( results.infos, results.module, 'closed', 'info' );
},
isModuleActive: function( module ) {
var data = {
'module': module,
'method': 'is_active'
};
itsecSettingsPage.sendAJAXRequest( module, 'is_active', {}, itsecSettingsPage.isModuleActiveCallback );
},
isModuleActiveCallback: function( results ) {
if ( true === results.response ) {
results.method = 'activate';
} else if ( false === results.response ) {
results.method = 'deactivate';
} else {
return;
}
itsecSettingsPage.toggleModuleActivationCallback( results );
},
reloadModule: function( module ) {
if ( module.preventDefault ) {
module.preventDefault();
module = jQuery(this).parents( '.itsec-module-card' ).attr( 'id' ).replace( 'itsec-module-card-', '' );
}
var method = 'get_refreshed_module_settings';
var data = {};
itsecSettingsPage.sendAJAXRequest( module, method, data, function( results ) {
if ( results.success && results.response ) {
var $card = jQuery( '#itsec-module-card-' + module );
var isHidden = $card.is( ':hidden' );
jQuery( '.itsec-module-settings-content-main', $card ).html( results.response );
if ( isHidden ) {
$card.hide();
} else {
jQuery( '.itsec-settings-toggle' ).trigger( 'change' );
}
} else if ( results.errors && results.errors.length > 0 ) {
itsecSettingsPage.showErrors( results.errors, results.module, 'open' );
} else if ( results.warnings && results.warnings.length > 0 ) {
itsecSettingsPage.showErrors( results.warnings, results.module, 'open', 'warning' );
}
itsecSettingsPage.events.trigger( 'moduleReloaded', module );
itsecSettingsPage.makeNoticesDismissible();
} );
},
reloadAllModules: function( _, initialResponse) {
itsecSettingsPage.sendAJAXRequest( '#', 'get_refreshed_module_form', null, function ( response ) {
if ( ! response.success || response.errors.length ) {
return;
}
var $open;
if ( jQuery( 'body' ).hasClass( 'itsec-modal-open' ) ) {
var $newModules = jQuery( response.response ), $cardsList = jQuery( '.itsec-module-cards' );
$open = jQuery( '.itsec-module-settings-container:visible' ).parents( '.itsec-module-card' );
jQuery( '.itsec-module-card', $newModules ).each( function () {
var $new = jQuery( this ), $current = jQuery( '#' + $new.attr( 'id' ), $cardsList );
if ( $new.attr( 'id' ).length && $new.attr( 'id' ) === $open.attr( 'id' ) ) {
jQuery( '.itsec-module-settings-content-main', $current ).html( jQuery( '.itsec-module-settings-content-main', $new ).html() );
} else {
jQuery( '.itsec-module-settings-container', $new ).hide();
$current.replaceWith( $new );
}
} );
} else {
jQuery( '.itsec-module-cards-container' ).html( response.response );
}
itsecSettingsPage.initFilters();
if ( ! $open ) {
jQuery( '.itsec-module-settings-container' ).hide();
}
if ( initialResponse ) {
itsecSettingsPage.showMessages( initialResponse.messages, initialResponse.module, $open ? 'open' : 'closed' );
itsecSettingsPage.showMessages( initialResponse.infos, initialResponse.module, $open ? 'open' : 'closed', 'info' );
itsecSettingsPage.showErrors( initialResponse.errors, initialResponse.module, $open ? 'open' : 'closed' );
itsecSettingsPage.showErrors( initialResponse.warnings, initialResponse.module, $open ? 'open' : 'closed', 'warning' );
}
itsecSettingsPage.makeNoticesDismissible();
itsecSettingsPage.events.trigger( 'modulesReloaded', initialResponse );
} );
},
reloadWidget: function( widget ) {
var method = 'get_refreshed_widget_settings';
var data = {};
itsecSettingsPage.sendAJAXRequest( module, method, data, function( results ) {
if ( results.success && results.response ) {
jQuery( '#itsec-sidebar-widget-' + module + ' .inside' ).html( results.response );
} else {
itsecSettingsPage.showErrors( results.errors, results.module, 'closed' );
itsecSettingsPage.showErrors( results.warnings, results.module, 'closed', 'warning' );
}
} );
},
sendAJAXRequest: function( module, method, data, callback ) {
var postData = {
'action': itsec_page.ajax_action,
'nonce': itsec_page.ajax_nonce,
'module': module,
'method': method,
'data': data,
};
jQuery.post( ajaxurl, postData )
.always(function( a, status, b ) {
itsecSettingsPage.processAjaxResponse( a, status, b, module, method, data, callback );
});
},
processAjaxResponse: function( a, status, b, module, method, data, callback ) {
var results = {
'module': module,
'method': method,
'data': data,
'status': status,
'jqxhr': null,
'success': false,
'response': null,
'errors': [],
'warnings': [],
'messages': [],
'infos': [],
'functionCalls': [],
'redirect': false,
'closeModal': true
};
if ( 'ITSEC_Response' === a.source && 'undefined' !== a.response ) {
// Successful response with a valid format.
results.jqxhr = b;
results.success = a.success;
results.response = a.response;
results.errors = a.errors;
results.warnings = a.warnings;
results.messages = a.messages;
results.infos = a.infos;
results.functionCalls = a.functionCalls;
results.redirect = a.redirect;
results.closeModal = a.closeModal;
} else if ( a.responseText ) {
// Failed response.
results.jqxhr = a;
var errorThrown = b;
if ( 'undefined' === typeof results.jqxhr.status ) {
results.jqxhr.status = -1;
}
if ( 'timeout' === status ) {
var error = itsec_page.translations.ajax_timeout;
} else if ( 'parsererror' === status ) {
var error = itsec_page.translations.ajax_parsererror;
} else if ( 403 == results.jqxhr.status ) {
var error = itsec_page.translations.ajax_forbidden;
} else if ( 404 == results.jqxhr.status ) {
var error = itsec_page.translations.ajax_not_found;
} else if ( 500 == results.jqxhr.status ) {
var error = itsec_page.translations.ajax_server_error;
} else {
var error = itsec_page.translations.ajax_unknown;
}
error = error.replace( '%1$s', status );
error = error.replace( '%2$s', errorThrown );
results.errors = [ error ];
} else {
// Successful response with an invalid format.
results.jqxhr = b;
results.response = a;
results.errors = [ itsec_page.translations.ajax_invalid ];
}
if ( results.redirect ) {
window.location = results.redirect;
}
if ( 'function' === typeof callback ) {
callback( results );
} else if ( 'function' === typeof console.log ) {
console.log( 'ERROR: Unable to handle settings AJAX request due to an invalid callback:', callback, {'data': postData, 'results': results} );
}
if ( results.functionCalls ) {
for ( var i = 0; i < results.functionCalls.length; i++ ) {
if ( 'object' === typeof results.functionCalls[i] && 'string' === typeof results.functionCalls[i][0] && 'function' === typeof itsecSettingsPage[results.functionCalls[i][0]] ) {
itsecSettingsPage[results.functionCalls[i][0]]( results.functionCalls[i][1], results );
} else if ( 'string' === typeof results.functionCalls[i] && 'function' === typeof window[results.functionCalls[i]] ) {
window[results.functionCalls[i]]();
} else if ( 'object' === typeof results.functionCalls[i] && 'string' === typeof results.functionCalls[i][0] && 'function' === typeof window[results.functionCalls[i][0]] ) {
window[results.functionCalls[i][0]]( results.functionCalls[i][1] );
} else if ( 'function' === typeof console.log ) {
console.log( 'ERROR: Unable to call missing function:', results.functionCalls[i] );
}
}
}
},
sendModuleAJAXRequest: function( module, data, callback ) {
itsecSettingsPage.sendAJAXRequest( module, 'handle_module_request', data, callback );
},
sendWidgetAJAXRequest: function( widget, data, callback ) {
itsecSettingsPage.sendAJAXRequest( widget, 'handle_widget_request', data, callback );
},
getUrlParameter: function( name ) {
var pageURL = decodeURIComponent( window.location.search.substring( 1 ) ),
URLParameters = pageURL.split( '&' ),
parameterName,
i;
// Loop through all parameters
for ( i = 0; i < URLParameters.length; i++ ) {
parameterName = URLParameters[i].split( '=' );
// If this is the parameter we're looking for
if ( parameterName[0] === name ) {
// Return the value or true if there is no value
return parameterName[1] === undefined ? true : parameterName[1];
}
}
// If the requested parameter doesn't exist, return false
return false;
},
// Make notices dismissible
makeNoticesDismissible: function() {
jQuery( '.notice.itsec-is-dismissible' ).each( function() {
var $el = jQuery( this ),
$button = jQuery( '' ),
btnText = itsec_page.translations.dismiss || '';
// Don't rebind twice
if ( jQuery( '.notice-dismiss', $el ).length ) {
return;
}
// Ensure plain text
$button.find( '.screen-reader-text' ).text( btnText );
$button.on( 'click.wp-dismiss-notice', function( event ) {
event.preventDefault();
$el.trigger( 'itsec-dismiss-notice' );
$el.fadeTo( 100, 0, function() {
$el.slideUp( 100, function() {
$el.remove();
});
});
});
$el.append( $button );
});
},
refreshPage: function() {
location.reload( true );
}
};
jQuery(document).ready(function( $ ) {
itsecSettingsPage.init();
if ( itsec_page.show_security_check ) {
jQuery( '.itsec-settings-view-toggle a.itsec-grid' ).trigger( 'click' );
jQuery( '#itsec-module-card-security-check .itsec-toggle-settings' ).trigger( 'click' );
}
jQuery( '.dialog' ).click( function ( event ) {
event.preventDefault();
var target = jQuery( this ).attr( 'href' );
var title = jQuery( this ).parents( '.inside' ).siblings( 'h3.hndle' ).children( 'span' ).text();
jQuery( '#' + target ).dialog( {
dialogClass : 'wp-dialog itsec-dialog itsec-dialog-logs',
modal : true,
closeOnEscape: true,
title : title,
height : ( jQuery( window ).height() * 0.8 ),
width : ( jQuery( window ).width() * 0.8 ),
open : function ( event, ui ) {
jQuery( '.ui-widget-overlay' ).bind( 'click', function () {
jQuery( this ).siblings( '.ui-dialog' ).find( '.ui-dialog-content' ).dialog( 'close' );
} );
}
} );
jQuery( '.ui-dialog :button' ).blur();
} );
var regex = /[^\w]/ig;
var $search = $( '#search' ), $cardsContainer = $( '.itsec-module-cards' ),
$cards = $( '.itsec-module-card', $cardsContainer ),
$searchFilter = $( '#itsec-module-filter-search' ),
$currentFilter = $( '.itsec-feature-tabs .current' ).parent();
itsecSettingsPage.events.on( 'modulesReloaded', function() {
$cardsContainer = $( '.itsec-module-cards' );
$cards = $( '.itsec-module-card', $cardsContainer );
} );
$search.on( 'input', _.debounce( function () {
var query = $search.val().trim().replace( regex, ' ' );
var $maybeCurrent = $( '.itsec-feature-tabs .current' ).parent();
if ( $maybeCurrent && $maybeCurrent.prop( 'id' ) !== 'itsec-module-filter-search' ) {
$currentFilter = $maybeCurrent;
}
$( '.itsec-highlighted-setting', $cards ).removeClass( 'itsec-highlighted-setting' );
if ( !query.length ) {
$searchFilter.addClass( 'hide-if-js' );
$( 'a', $searchFilter ).removeClass( 'current' );
$( 'a', $currentFilter ).addClass( 'current' );
var type = $currentFilter.prop( 'id' ).substr( 20 );
if ( 'all' === type ) {
$cards.show();
} else {
$( '.itsec-module-type-' + type ).show();
$( '.itsec-module-card' ).not( '.itsec-module-type-' + type ).hide();
}
return;
}
var $titleMatches = $( ".itsec-module-card-content > h2:itsecContains('" + query + "')", $cards ),
$titleMatchesCards = $titleMatches.parents( '.itsec-module-card' );
var $descriptionMatches = $( ".itsec-module-card-content > p:itsecContains('" + query + "')", $cards ),
$descriptionMatchesCards = $descriptionMatches.parents( '.itsec-module-card' );
var $settingMatches = $( ".itsec-module-settings-container .form-table tr > th > label:itsecContains('" + query + "')", $cards ),
$settingMatchesCards = $settingMatches.parents( '.itsec-module-card' );
var $matches = $titleMatchesCards.add( $descriptionMatchesCards ).add( $settingMatchesCards );
$searchFilter.removeClass( 'hide-if-js' );
$( 'a', $currentFilter ).removeClass( 'current' );
$( 'a', $searchFilter ).addClass( 'current' );
$( '.count', $searchFilter ).text( '(' + $matches.length + ')' );
$cards.hide();
$matches.show();
$settingMatches.parents( 'tr' ).addClass( 'itsec-highlighted-setting' );
if ( $matches.length === 1 ) {
$( '.itsec-toggle-settings', $matches.first() ).click();
}
}, 250 ) );
$.expr[":"].itsecContains = $.expr.createPseudo( function ( arg ) {
return function ( elem ) {
var candidate = $( elem ).text().toUpperCase().replace( regex, ' ' ), term = arg.toUpperCase();
var index = candidate.indexOf( term );
if ( index === -1 ) {
return false;
}
if ( index === 0 ) {
return true;
}
var prior = candidate.charAt( index - 1 ), next = candidate.charAt( term.length + index );
// full word
return prior === ' ' && ( next === ' ' || next === '' );
};
} );
});