: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
var supportUserID = etSupportCenter.supportUserID || null;
var debugLogViewer = window.wp && window.wp.codeEditor;
var $save_message = $('#epanel-ajax-saving');
var $etSystemStatusTable = $('.et_system_status');
var $etSupportUserToggle = $('.et_support_user_toggle .et_pb_yes_no_button');
var $et_documentation_videos_list_li = $('.et_documentation_videos_list li');
var $modalSafeModeWarningTemplate = $('#et-ajax-safe-mode-template').html();
function confirmClipboardCopy() {
$save_message.addClass('success-animation').fadeIn('fast');
$save_message.fadeOut('slow');
// Remote Access: Toggle ET Support User On/Off
function supportUserActivationToggle($toggle, newState, silentMode) {
// If Silent Mode is `true` then we'll run AJAX without rendering display changes
silentMode = silentMode || false;
if (typeof newState === 'undefined') {
action: 'et_support_user_update',
nonce: etSupportCenter.nonce
postData.support_update = 'activate';
postData.support_update = 'deactivate';
// Ajax toggle ET Support User
url: etSupportCenter.ajaxURL,
action: 'support_user_update_via_ajax',
beforeSend: function(xhr) {
// Don't execute DOM changes in Silent Mode
$('.et-remote-access-error').first().hide(showHideDelay);
$save_message.addClass('et_loading').removeClass('success-animation');
$save_message.fadeIn('fast');
success: function(response) {
// Don't execute DOM changes in Silent Mode
$save_message.removeClass('et_loading').removeClass('success-animation');
$save_message.fadeOut('slow');
var $msgExpiry = $('.et-support-user-expiry').first();
if ('activate' === postData.support_update) {
$('.et-remote-access-error').first().text(response.error).show(showHideDelay);
$('#et-remote-access-error').remove();
$toggle.removeClass('et_pb_off_state').addClass('et_pb_on_state');
$msgExpiry.attr('data-expiry', response.expiry);
supportUserTimeToExpiry();
$msgExpiry.show(showHideDelay);
$('.et-support-user-elevated').show(showHideDelay);
$('.card.et_remote_access .et_card_cta').append(
'class': 'copy_support_token',
'data-token': response.token
.text('Copy Support Token')
} else if ('deactivate' === postData.support_update) {
// First switch & hide the "elevated" toggle
// (not a click event because we don't need to trigger AJAX)
$('.et-support-user-elevated').hide(showHideDelay);
$('.et_support_user_elevated_toggle .et_pb_yes_no_button').removeClass('et_pb_on_state').addClass('et_pb_off_state');
// Now clean up the Remote Access toggle
$msgExpiry.hide(showHideDelay);
$toggle.removeClass('et_pb_on_state').addClass('et_pb_off_state');
$('.copy_support_token').fadeOut('slow');
$('.copy_support_token').remove();
$save_message.addClass('success-animation');
console.log(data.responseText);
// Remote Access: Calculate of Time To Auto-Deactivation
function supportUserTimeToExpiry() {
if (! $('.et_support_user_toggle .et_pb_on_state').length) {
var $supportUserExpiry = $('.et-support-user-expiry').first();
var expiry = parseInt($supportUserExpiry.attr('data-expiry'));
var timeToExpiry = (expiry - (new Date().getTime() / 1000));
var $timer = $supportUserExpiry.find('.support-user-time-to-expiry').first();
if (30 >= timeToExpiry) {
// Don't bother calculating; expiration will happen before the next check, so let's trigger deactivation now.
$timer.html('0 minutes');
// Go ahead and turn off the user (don't need to wait for WP Cron)
$etSupportUserToggle.click();
days = parseInt(timeToExpiry / 86400);
days = days > 0 ? days : 0;
timeToExpiry = timeToExpiry % 86400;
hours = parseInt(timeToExpiry / 3600);
hours = hours > 0 ? hours : 0;
timeToExpiry = timeToExpiry % 3600;
minutes = parseInt(timeToExpiry / 60);
minutes = minutes > 0 ? minutes : 0;
timerContent = timerContent + days + (1 < days ? ' days, ' : ' day, ');
timerContent = timerContent + hours + (1 < hours ? ' hours, ' : ' hour, ');
timerContent = timerContent + minutes + (1 !== minutes ? ' minutes' : ' minute');
$timer.html(timerContent);
// Documentation: Recalculate video dimensions (typically on viewport resize)
function et_core_correct_video_proportions() {
var parentHeight = (parseInt($('.et_docs_videos').first().width()) * .5625) + 'px';
$('.et_docs_videos .wrapper').css('max-height', parentHeight);
$('.et_docs_videos iframe').css('max-height', parentHeight);
// Documentation: Initialize YouTube Iframe player
function loadYouTubeIframe() {
if (('undefined' !== typeof YT) && YT && YT.Player) {
// Default video: 'Getting Started With The Divi Builder'
var firstVideo = 'T-Oe01_J62c';
var $firstVideoItem = $('.et_docs_videos li:first-of-type');
// If the Documentation videos list has YouTube IDs, grab the first one
if ($firstVideoItem.length > 0 && $firstVideoItem[0].hasAttribute('data-ytid')) {
firstVideo = $firstVideoItem.attr('data-ytid');
docPlayer = new YT.Player('et_documentation_player', {
et_core_correct_video_proportions();
setTimeout(loadYouTubeIframe, 100);
// Safe Mode: Activate/Deactivate
function toggleETSafeMode($toggle) {
action: 'et_safe_mode_update',
nonce: etSupportCenter.nonce
if ($toggle.hasClass('et_pb_off_state')) {
postData.support_update = 'activate';
} else if ($toggle.hasClass('et_pb_on_state') || $toggle.hasClass('et-safe-mode-indicator') || $toggle.hasClass('et-core-modal-action')) {
postData.support_update = 'deactivate';
if ('activate' === postData.support_update) {
var safeModeProduct = $toggle.parents('#et_card_safe_mode').data('et-product');
// Continue only if the product is in our allowlist
switch (safeModeProduct) {
case 'divi_builder_plugin':
postData.product = safeModeProduct;
url: etSupportCenter.ajaxURL,
action: 'safe_mode_update_via_ajax',
beforeSend: function(xhr) {
$('.et-core-safe-mode-block-modal').removeClass('et-core-active');
$save_message.addClass('et_loading').removeClass('success-animation');
$save_message.fadeIn('fast');
success: function(response) {
$save_message.removeClass('et_loading').addClass('success-animation');
var $msgExpiry = $('.et-support-user-expiry').first();
if ('activate' === postData.support_update) {
$('.et_safe_mode_toggle .et_pb_yes_no_button').removeClass('et_pb_off_state').addClass('et_pb_on_state');
} else if ('deactivate' === postData.support_update) {
$('.et_safe_mode_toggle .et_pb_yes_no_button').removeClass('et_pb_on_state').addClass('et_pb_off_state');
$('.et-safe-mode-indicator').fadeOut('slow');
$('.et-safe-mode-indicator').remove();
$('.wp-admin').removeClass('et-safe-mode-active');
$save_message.fadeOut('slow');
window.location.reload(true);
console.log(data.responseText);
$save_message.fadeOut('slow');
// Safe Mode: Interrupt Actions when Safe Mode is Active
function preventActionWhenSafeModeActive() {
$('body').append($modalSafeModeWarningTemplate);
$('.et-core-safe-mode-block-modal').addClass('et-core-active');
$(window).trigger('et-core-modal-active');
// Logs: Add CodeMirror Instance with Custom Formatting Rules
function addLogViewerInstance(codeEditor, $element, config) {
if (! $element || $element.length === 0) {
var instance = codeEditor.initialize($element, {
if (instance && instance.codemirror) {
logViewers.push(instance.codemirror);
// Dismiss Card in the Support Center
function dismissCard($button) {
action: 'et_dismiss_support_center_card',
nonce: etSupportCenter.nonce,
product: $button.data('product'),
card_key: $button.data('key'),
// Dismiss the Card via AJAX
url: etSupportCenter.ajaxURL,
beforeSend: function(xhr) {
$button.prop('disabled', true);
$save_message.addClass('et_loading').removeClass('success-animation');
$save_message.fadeIn('fast');
success: function(response) {
$button.parent().remove();
$save_message.removeClass('et_loading').addClass('success-animation');
$save_message.fadeOut('slow');
$button.prop('disabled', false);
console.log(data.responseText);
$save_message.fadeOut('slow');
$(window).on('resize', function() {
resizeTimer = _.debounce(et_core_correct_video_proportions(), showHideDelay);
$(document).ready(function() {
* Support Center :: System Status
// System Status: display message if all checks passed
if (0 === $('.et-system-status-report').children(':not(.et_system_status_pass)').length) {
$('.et-system-status-congratulations').show(showHideDelay);
// System Status: Show Full Report
$('.full_report_show').on('click', function() {
$etSystemStatusTable.find('.et_system_status_pass').show(showHideDelay);
$etSystemStatusTable.removeClass('summary').addClass('full');
// System Status: Show Summary Report
$('.full_report_hide').on('click', function() {
$etSystemStatusTable.find('.et_system_status_pass').hide(showHideDelay);
$etSystemStatusTable.addClass('summary').removeClass('full');
// System Status: Copy Full Report to Clipboard
$('.full_report_copy').on('click', function() {
$('#et_system_status_plain').select();
document.execCommand('copy');
* Support Center :: Remote Access
if ($('.card.et_remote_access').length > 0) {
// Remote Access: Initial Calculation of Time To Auto-Deactivation
supportUserTimeToExpiry();
// Remote Access: Recalculate Time To Auto-Deactivation (every 30 seconds)
setInterval(supportUserTimeToExpiry, 30000);
// Remote Access: Display Auto-Deactivation Countdown
if ($etSupportUserToggle.hasClass('et_pb_on_state')) {
$('.et-support-user-expiry').first().show(0);
// If the Support User account toggle is off, send a quick AJAX request to verify the account is deactivated
supportUserActivationToggle($etSupportUserToggle, 'deactivate', true);
// Remote Access: Activate/Deactivate
$etSupportUserToggle.on('click', function(e) {
if ($etSupportUserToggle.hasClass('et_pb_off_state')) {
supportUserActivationToggle($(this), 'activate');
} else if ($etSupportUserToggle.hasClass('et_pb_on_state')) {
supportUserActivationToggle($(this), 'deactivate');
// Remote Access: Elevate/Reset Divi Support user role
$('.et_support_user_elevated_toggle .et_pb_yes_no_button').on('click', function(e) {
action: 'et_support_user_update',
nonce: etSupportCenter.nonce
if ($toggle.hasClass('et_pb_off_state')) {
postData.support_update = 'elevate';
} else if ($toggle.hasClass('et_pb_on_state')) {
postData.support_update = 'activate';
// Ajax toggle ET Support User Admin Mode
url: etSupportCenter.ajaxURL,
action: 'support_user_update_via_ajax',
beforeSend: function(xhr) {
$save_message.addClass('et_loading').removeClass('success-animation');
$save_message.fadeIn('fast');
success: function(response) {
$save_message.removeClass('et_loading').removeClass('success-animation');
$save_message.fadeOut('slow');
if ('elevate' === postData.support_update) {
$toggle.removeClass('et_pb_off_state').addClass('et_pb_on_state');
} else if ('activate' === postData.support_update) {
$toggle.removeClass('et_pb_on_state').addClass('et_pb_off_state');
$save_message.addClass('success-animation');
console.log(data.responseText);
// Remote Access: Copy Support Token to clipboard
$('body').on('click', '.copy_support_token', function() {
var token = $(this).attr('data-token');
var $temp = $('<input>');
$temp.val(token).select();
document.execCommand('copy');
* Support Center :: Documentation & Help
if ($('body').find('[data-et-page="wp-admin-support-center"]').length > 0) {
// Load the IFrame Player API code asynchronously.
var tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// Documentation & Help: YouTube Video Navigation
$et_documentation_videos_list_li.on('click', function() {
$et_documentation_videos_list_li.removeClass('active');
$active.addClass('active');
docPlayer.cueVideoById($active.attr('data-ytid'), 0, 'large');
* Support Center :: Safe Mode
if ($save_message.length === 0) {
$('body.wp-admin').append(
$('<div>').attr({ 'id': 'et-ajax-saving', 'class': 'et_loading' }).append(
$('<img>').attr({ 'src': etSupportCenter.ajaxLoaderImg, 'alt': 'loading', 'id': 'loading' })
$save_message = $('#et-ajax-saving');
// Safe Mode: Activate/Deactivate
$('body').on('click', '.et-safe-mode-indicator', function(e) {
toggleETSafeMode($toggle);
$('body').on('click', '.et_safe_mode_toggle .et_pb_yes_no_button', function(e) {
toggleETSafeMode($toggle);
$('body').on('click', '.et-core-safe-mode-block-modal .et-core-modal-action', function(e) {
toggleETSafeMode($toggle);
// Safe Mode: Interrupt Plugin/Theme Toggles
$('body.et-safe-mode-active').on('click', '.theme .activate', function(e) {
preventActionWhenSafeModeActive();
$('body.et-safe-mode-active').on('click', '.plugins .activate a', function(e) {
preventActionWhenSafeModeActive();