📁
SKYSHELL MANAGER
PHP v8.2.31
Create
Create
Path:
root
/
home
/
thevaxnx
/
nativize.com
/
staging
/
wp-includes
/
js
/
tinymce
/
themes
/
Name
Size
Perm
Actions
📁
inlite
-
0755
🗑️
🏷️
🔒
📁
modern
-
0755
🗑️
🏷️
🔒
📄
wp-links-opml.php
6.83 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
Edit: archive.js
// ------------------------ // Shortcuts // ------------------------ var DOM = YAHOO.util.Dom; var cpDOM = CPANEL.dom; var EVENT = YAHOO.util.Event; // ------------------------ // Globals // ------------------------ var domain_current_days_saved = {}; /** * Configures the actions... * @name configure_actions * @param {string} domain The domain name to configure. */ function configure_actions(domain) { var has_archive = 0; // Determin if archiving is enabled for this domain for (var archive_type in archive_types) { var ctl = DOM.get("archive_" + archive_type + "_" + domain); if (ctl.checked) { has_archive = 1; break; } } // Animate the visibility depending on enabled or disabled. var controlsEl = DOM.get("archive_controls_" + domain); if (has_archive) { if (cpDOM.isHidden(controlsEl)) { CPANEL.animate.slide_down(controlsEl); } } else { if (cpDOM.isVisible(controlsEl)) { CPANEL.animate.slide_up(controlsEl); } } } /** * Parses the details from the id * @name parse_archive_info * @param {string} id The id of a configuration row; * has the following format: * archive_{archive_type}_{domain} */ function parse_archive_info(id) { var archiveInfo = id.split("_"); archiveInfo.shift(); // archive var archive_type = archiveInfo.shift(); var domain = archiveInfo.join("_"); return { "archive_type": archive_type, "domain": domain }; } /** * Parses the retention details from the id * @name parse_archive_info * @param {string} id The id of a configuration row; * has the following format: * archive_{archive_type}_retain_days_{domain} * download_{archive_type}_archives_{domain} */ function parse_retention_info(id) { var archiveInfo = id.split("_"); archiveInfo.shift(); // archive var archive_type = archiveInfo.shift(); archiveInfo.shift(); // retain archiveInfo.shift(); // days var domain = archiveInfo.join("_"); return { "archive_type": archive_type, "domain": domain }; } /** * Parses the retention details from the id * @name parse_archive_info * @param {string} id The id of a configuration row; * has the following format: * download_{archive_type}_archives_{domain} */ function parse_download_info(id) { var archiveInfo = id.split("_"); archiveInfo.shift(); // download var archive_type = archiveInfo.shift(); archiveInfo.shift(); // archives var domain = archiveInfo.join("_"); return { "archive_type": archive_type, "domain": domain }; } /** * Parses the retention details from the id * @name parse_custom_retention_info * @param {string} id The id of a configuration row; * has the following format: * custom_archive_{archive_type}_retain_days_{domain} */ function parse_custom_retention_info(id) { var archiveInfo = id.split("_"); archiveInfo.shift(); // custom archiveInfo.shift(); // archive var archive_type = archiveInfo.shift(); archiveInfo.shift(); // retain archiveInfo.shift(); // days var domain = archiveInfo.join("_"); return { "archive_type": archive_type, "domain": domain }; } /** * Extracts the default configuration data from the form. * @name getDefaultConfigurationData * @param [Boolean ] excludeEmpty - set to true to include the disabled ones */ function getDefaultConfigurationData(excludeEmpty) { var data = {}; for (var type in archive_types) { var checkbox = DOM.get("archive_" + type + "_GLOBAL"); var droplist = DOM.get("archive_" + type + "_retain_days_GLOBAL"); var textbox = DOM.get("custom_archive_" + type + "_retain_days_GLOBAL"); if (checkbox.checked) { var value = droplist.options[droplist.selectedIndex].value; data[type] = value !== "" ? value : textbox.value; } else if (!excludeEmpty) { data[type] = ""; } } return data; } /** * Registeres the event handlers for the ui elements * @name register_archive_domain * @param {string} domain The domain name to configure. * @param {bool} global Use the global or local event model */ function register_archive_domain(domain, global) { var spinner_id = "spinner_" + domain; for (var archive_type in archive_types) { // Setup the click event on the checkbox EVENT.on("archive_" + archive_type + "_" + domain, "click", function(e) { var thisCheckBox = this; var thisId = this.id; var info = parse_archive_info(thisId); var msg = ""; var data; var retention_containerEl = DOM.get("archive_" + info.archive_type + "_retain_days_" + info.domain + "_container"); var custom_retention_container = DOM.get("archive_" + info.archive_type + "_retain_days_" + info.domain + "_custom_container"); if (this.checked) { var retention_select = DOM.get("archive_" + info.archive_type + "_retain_days_" + info.domain); // Find the element with 0 as the value for (var i = 0, l = retention_select.length; i < l; i++) { if (retention_select[i].value === "0") { retention_select[i].selected = true; break; } } CPANEL.animate.slide_down(retention_containerEl); if (!global) { configure_actions(info.domain); // AJAX CALL TO ENABLE ARCHIVING switch (info.archive_type) { case "mailman": msg = LOCALE.maketext("Enabled archiving of mailing lists on “[_1]”.", info.domain); break; case "incoming": msg = LOCALE.maketext("Enabled archiving of incoming email on “[_1]”.", info.domain); break; case "outgoing": msg = LOCALE.maketext("Enabled archiving of outgoing email on “[_1]”.", info.domain); break; default: msg = LOCALE.maketext("Enabled archiving of “[_1]” email on “[_2]”.", archive_types[info.archive_type].toLowerCase(), info.domain); break; } configure_archive( msg, info.domain, info.archive_type, 0, function() { CPANEL.animate.slide_up(retention_containerEl); thisCheckBox.checked = false; configure_actions(info.domain); }); } else { data = getDefaultConfigurationData(); switch (info.archive_type) { case "mailman": msg = LOCALE.maketext("Enabled archiving of mailing lists for all new domains."); break; case "incoming": msg = LOCALE.maketext("Enabled archiving of incoming email for all new domains."); break; case "outgoing": msg = LOCALE.maketext("Enabled archiving of outgoing email for all new domains."); break; default: msg = LOCALE.maketext("Enabled archiving of “[_1]” email for all new domains.", archive_types[info.archive_type].toLowerCase(), info.domain); break; } configure_default( msg, data, function() { CPANEL.animate.slide_up(retention_containerEl); thisCheckBox.checked = false; configure_actions(info.domain); }); } retention_select.focus(); } else { // Confirm an actual change to the preserved sets // but not to the default configuration. if (!global) { switch (info.archive_type) { case "mailman": msg = LOCALE.maketext("Are you sure you want to disable archiving of mailing lists for “[_1]”?", info.domain); break; case "incoming": msg = LOCALE.maketext("Are you sure you want to disable archiving of incoming email for “[_1]”?", info.domain); break; case "outgoing": msg = LOCALE.maketext("Are you sure you want to disable archiving of outgoing email for “[_1]”?", info.domain); break; default: msg = LOCALE.maketext("Are you sure you want to disable archiving of “[_1]” email for “[_2]”?", archive_types[info.archive_type].toLowerCase(), info.domain); break; } if (!confirm(msg)) { this.checked = true; return; } } CPANEL.animate.slide_up(retention_containerEl); if (!global) { configure_actions(info.domain); // AJAX CALL TO DISABLE ARCHIVING switch (info.archive_type) { case "mailman": msg = LOCALE.maketext("Disabled archiving of mailing lists for “[_1]”.", info.domain); break; case "incoming": msg = LOCALE.maketext("Disabled archiving of incoming mail for “[_1]”.", info.domain); break; case "outgoing": msg = LOCALE.maketext("Disabled archiving of outgoing email for “[_1]”.", info.domain); break; default: msg = LOCALE.maketext("Disabled archiving of “[_1]” email for “[_2]”.", archive_types[info.archive_type].toLowerCase(), info.domain); break; } configure_archive( msg, info.domain, info.archive_type, "", function() { CPANEL.animate.slide_down(retention_containerEl); thisCheckBox.checked = true; configure_actions(info.domain); }, function() { cpDOM.hide(custom_retention_container); DOM.setStyle("height", ""); }); } else { data = getDefaultConfigurationData(true); switch (info.archive_type) { case "mailman": msg = LOCALE.maketext("Disabled archiving of mailing lists for all new domains."); break; case "incoming": msg = LOCALE.maketext("Disabled archiving of incoming email for all new domains."); break; case "outgoing": msg = LOCALE.maketext("Disabled archiving of outgoing email for all new domains."); break; default: msg = LOCALE.maketext("Disabled archiving of “[_1]” for all new domains.", archive_types[info.archive_type].toLowerCase()); break; } configure_default( msg, data, function() { CPANEL.animate.slide_down(retention_containerEl); thisCheckBox.checked = true; }, function() { cpDOM.hide(custom_retention_container); DOM.setStyle("height", ""); }); } } }); // Setup the cache of saved states if (!domain_current_days_saved[domain]) { domain_current_days_saved[domain] = {}; } domain_current_days_saved[domain][archive_type] = true; // Setup the change event on the retention days dropbox. EVENT.on("archive_" + archive_type + "_retain_days_" + domain, "change", function(e) { var thisId = this.id; var info = parse_retention_info(thisId); var customEl = DOM.get("archive_" + info.archive_type + "_retain_days_" + info.domain + "_custom_container"); var selected = this.options[this.selectedIndex]; var elCustomInput = DOM.get("custom_archive_" + info.archive_type + "_retain_days_" + info.domain); if (selected.value === "") { // Force these to be the same. if (elCustomInput.value == "-1") { elCustomInput.value = 1; } cpDOM.show(customEl); domain_current_days_saved[info.domain][info.archive_type] = false; var doFocus = (function(id) { return function() { el = DOM.get(id); // Select the invalid text var len = el.value ? el.value.length : 0; el.focus(); selectText(el, 0, len); }; })("custom_archive_" + info.archive_type + "_retain_days_" + info.domain); setTimeout(doFocus); } else { // Hide the custom element container CPANEL.animate.slide_up(customEl, function() { // Sync the custom value field var elCustomInput = DOM.get("custom_archive_" + info.archive_type + "_retain_days_" + info.domain); if (elCustomInput) { elCustomInput.value = selected.value; } }); if (!global) { // AJAX CALL TO CHANGE RETENTION DAYS configure_archive( info.archive_type != "mailman" ? LOCALE.maketext("The archive retention period of “[_1]” email for “[_2]” is now “[_3]”.", archive_types[info.archive_type].toLowerCase(), info.domain, selected.text) : LOCALE.maketext("The archive retention period of “[_1]” for “[_2]” is now “[_3]”.", archive_types[info.archive_type].toLowerCase(), info.domain, selected.text), info.domain, info.archive_type, selected.value); } else { // AJAX CALL TO CHANGE RETENTION DAYS var data = getDefaultConfigurationData(); configure_default( info.archive_type != "mailman" ? LOCALE.maketext("The archive retention period of “[_1]” email for all new domains is now “[_2]”.", archive_types[info.archive_type].toLowerCase(), selected.text) : LOCALE.maketext("The archive retention period of “[_1]” email for all new domains is now “[_2]”.", archive_types[info.archive_type].toLowerCase(), selected.text), data); } } }); // Setup the return key save operation var onReturnCommitRetention = function(e) { if (CPANEL.keyboard.isReturnKey(e)) { return onSetCustomRetention.apply(this, [e]); } }; // Setup the special navigation when we select custom, but accept the default var onNavigateAwaySaveRetention = function(e) { return onSetCustomRetention.apply(this, [e]); }; // Setup he change event on the custom retention days dropbox. var onSetCustomRetention = function(e) { var thisId = this.id; var info = parse_custom_retention_info(thisId); var retain_txt = this.value; var retain_days = parseInt(this.value, 10); // Check if this is an attempt to set the same custom // value triggered by multiple event listeners... if (onSetCustomRetention.last) { var last = onSetCustomRetention.last; if (last.domain == info.domain && last.archive_type == info.archive_type && last.retain_days == retain_days) { return; } } // Save this one as the last attempted onSetCustomRetention.last = { domain: info.domain, archive_type: info.archive_type, retain_days: retain_days }; // Do not save if we saved with previous method if (domain_current_days_saved[info.domain][info.archive_type] === true) { return; } // Validate the inputs if (retain_days < 0 || isNaN(retain_days)) { var status_bar_row_id = "archive_status_bar_row_" + info.domain; cpDOM.show(status_bar_row_id); var status_bar_id = "archive_status_bar_" + info.domain; CPANEL.widgets.status_bar( status_bar_id, "error", LOCALE.maketext("Error"), LOCALE.maketext("An archive retention period of “[_1]” is not valid.", retain_txt.html_encode())); return; } var successMsg = ""; if (retain_days === 0) { if (info.archive_type != "mailman") { successMsg = !global ? LOCALE.maketext("The archive retention period of “[_1]” email for “[_2]” is now Forever.", archive_types[info.archive_type].toLowerCase(), info.domain, retain_days) : LOCALE.maketext("The archive retention period of “[_1]” email for all new domains is now Forever.", archive_types[info.archive_type].toLowerCase(), retain_days); } else { successMsg = !global ? LOCALE.maketext("The archive retention period of “[_1]” for “[_2]” is now Forever.", archive_types[info.archive_type].toLowerCase(), info.domain, retain_days) : LOCALE.maketext("The archive retention period of “[_1]” for all new domains is now Forever.", archive_types[info.archive_type].toLowerCase(), retain_days); } } else { if (info.archive_type != "mailman") { successMsg = !global ? LOCALE.maketext("The archive retention period of “[_1]” email for “[_2]” is now [quant,_3,day,days].", archive_types[info.archive_type].toLowerCase(), info.domain, retain_days) : LOCALE.maketext("The archive retention period of “[_1]” email for all new domains is now [quant,_2,day,days].", archive_types[info.archive_type].toLowerCase(), retain_days); } else { successMsg = !global ? LOCALE.maketext("The archive retention period of “[_1]” for “[_2]” is now [quant,_3,day,days].", archive_types[info.archive_type].toLowerCase(), info.domain, retain_days) : LOCALE.maketext("The archive retention period of “[_1]” for all new domains is now [quant,_2,day,days].", archive_types[info.archive_type].toLowerCase(), retain_days); } } if (!global) { // AJAX CALL TO CHANGE RETENTION DAYS configure_archive( successMsg, info.domain, info.archive_type, retain_days); } else { // AJAX CALL TO CHANGE RETENTION DAYS var data = getDefaultConfigurationData(); configure_default( successMsg, data); } }; var retainTextEl = DOM.get("custom_archive_" + archive_type + "_retain_days_" + domain); EVENT.on(retainTextEl, "change", onSetCustomRetention); EVENT.on(retainTextEl, "focusout", onNavigateAwaySaveRetention); EVENT.on(retainTextEl, "keypress", function(e) { if (!CPANEL.keyboard.allowNumericKey(e)) { return false; } var thisId = this.id; var info = parse_custom_retention_info(thisId); domain_current_days_saved[info.domain][info.archive_type] = false; return true; }); EVENT.on(retainTextEl, "keydown", onReturnCommitRetention); } } /** * Call the archiving_configure api2 call to save the configuration. * @name configure_default * @param {string} successtxt * @param {Hash} formdata * @param {string} retention_period * @param {Function} onerror * @param {Function} onsuccess */ function configure_default(successtxt, formdata, onerror, onsuccess) { var data = {}; // Merge the data for (var data_key in formdata) { data[data_key] = formdata[data_key]; } var status_bar_id = "archive_status_bar_GLOBAL"; var spinner_id = "spinner_GLOBAL"; cpDOM.show(spinner_id); disable_default_archiving_controls(); CPANEL.api({ module: "Email", func: "set_archiving_default_configuration", data: data, callback: { // API Success handler success: function(o) { enable_default_archiving_controls(); // Shortcuts var status_bar = CPANEL.widgets.status_bar; cpDOM.hide(spinner_id); if (o.cpanel_data[0].status == "1") { for (var archive_type in archive_types) { domain_current_days_saved["GLOBAL"][archive_type] = true; } status_bar(status_bar_id, "success", successtxt, ""); if (onsuccess) { onsuccess(); } } else { status_bar(status_bar_id, "error", LOCALE.maketext("Error"), data.cpanelresult.data[0].statusmsg); if (onerror) { onerror(); } } }, // API Failure handler failure: function(o) { enable_default_archiving_controls(); // Shortcuts var status_bar = CPANEL.widgets.status_bar; cpDOM.hide(spinner_id); status_bar(status_bar_id, "error", LOCALE.maketext("AJAX Error"), LOCALE.maketext("Please refresh the page and try again.")); if (onerror) { onerror(); } } } }); } // Returns [ checkbox, select, custom ] function get_domain_controls(domain, archive_type) { return [ "archive_" + archive_type + "_" + domain, "archive_" + archive_type + "_retain_days_" + domain, "custom_archive_" + archive_type + "_retain_days_" + domain ].map(DOM.get.bind(DOM)); } /** * Call the archiving_configure api2 call to save the configuration. * @name configure_archive * @param {string} successtxt * @param {string} domain * @param {string} archive_type * @param {string} retention_period * @param {Function} onerror * @param {Function} onsuccess */ function configure_archive(successtxt, domain, archive_type, retention_period, onerror, onsuccess) { var spinner = DOM.get("spinner_" + domain); var status_bar_id = "archive_status_bar_" + domain; var status_bar_row_id = "archive_status_bar_row_" + domain; DOM.setStyle(spinner, "visibility", ""); var form_els = get_domain_controls(domain, archive_type); form_els.forEach(function(el) { el.disabled = true; }); cpDOM.hide(status_bar_row_id); var onreturn = function() { form_els.forEach(function(fc) { if (fc) { fc.disabled = false; } }); DOM.setStyle(spinner, "visibility", "hidden"); cpDOM.show(status_bar_row_id); }; var post_notice_config = { callbackFunc: function() { cpDOM.hide(status_bar_row_id); } }; var data = { domains: domain }; data[archive_type] = retention_period; CPANEL.api({ module: "Email", func: "set_archiving_configuration", data: data, callback: { // API Success handler success: function(o) { onreturn(); // Shortcuts var status_bar = CPANEL.widgets.status_bar; if (o.cpanel_data[0].status == "1") { domain_current_days_saved[domain][archive_type] = true; status_bar(status_bar_id, "success", successtxt, "", post_notice_config); if (onsuccess) { onsuccess(); } } else { status_bar(status_bar_id, "error", LOCALE.maketext("Error"), data.cpanelresult.data[0].statusmsg, post_notice_config); if (onerror) { onerror(); } } }, // API Failure handler failure: function(o) { onreturn(); CPANEL.widgets.status_bar(status_bar_id, "error", LOCALE.maketext("Error"), (o.cpanel_error || o.error || "").html_encode(), post_notice_config); if (onerror) { onerror(); } } } }); } /** * Setups the archive download popup and shows it. * @name archive_download * @param {string} domain * @param {string} targetEl */ function archive_download(domain, targetEl) { // Setup the popup box var noticebox = new CPANEL.ajax.Common_Dialog("", { width: "300px" }); DOM.addClass(noticebox.element, "cjt_notice_dialog cjt_info_dialog"); noticebox.setHeader(CPANEL.widgets.Dialog.applyDialogHeader(LOCALE.maketext("Archive Download Selection"))); // Omit the cancel button noticebox.cfg.getProperty("buttons").pop(); // Setup the submit noticebox.cfg.getProperty("buttons")[0].text = LOCALE.maketext("Close"); noticebox.submit = function() { this.hide(); }; // Auto center it. noticebox.beforeShowEvent.subscribe(noticebox.center, noticebox, true); var substitute = YAHOO.lang.substitute; // Build the list var itemTemplate = DOM.get("download_archive_item_template").text; var items = ""; for (var archive_type in archive_types) { items += substitute(itemTemplate, { "archive_type": archive_type, "domain": domain, "archive_type_name": archive_types[archive_type] }); } // Build the dialog text var html = substitute(DOM.get("download_archive_template").text, { "domain": domain, "list": items }); noticebox.setBody(html); noticebox.show_from_source(targetEl); // no fade so this stands out more // ??? May be a race condition, should be in the onshow event handler. for (var archive_type in archive_types) { // Setup the click event for the EVENT.on("download_" + archive_type + "_archives_" + domain, "click", function(e, x, y) { // Capture in closure var thisId = this.id; var info = parse_download_info(thisId); // Download the file frames.archivedown.location.href = CPANEL.security_token + "/fetchemailarchive/" + info.domain + "/" + info.archive_type; EVENT.preventDefault(e); }); } EVENT.on("download_all_archives_" + domain, "click", function(e) { frames.archivedown.location.href = CPANEL.security_token + "/fetchemailarchive/" + domain; EVENT.preventDefault(e); }); } /** * Event handler for the search box clear button. * Clears the search text box and submits the form. * @name onSearchClear * @param {EventObject} e */ function onSearchClear(e) { var form = this.form; var text = DOM.get("search-regex"); text.value = ""; form.submit(); } /** * Sets the focus to the correct "first" control * @name setDefaultFocus */ function setDefaultFocus() { var searchTextEl = DOM.get("search-regex"); if (searchTextEl) { var len = searchTextEl.value ? searchTextEl.value.length : 0; searchTextEl.focus(); setCaretPosition(searchTextEl, len); } } /** * Tests if the object passed is a string. * @name isString * @param [Object] obj */ function isString(obj) { return obj !== undefined && obj !== null && obj.toLowerCase !== undefined; } /** * Sets the caret to the indicated position in the input element * @name setCaretPosition * @param [HTMLElement] el - input element to select the text in. * @param [Number] pos - postion to set the caret to0 */ function setCaretPosition(el, pos) { if (el.setSelectionRange) { el.focus(); el.setSelectionRange(pos, pos); } else if (el.createTextRange) { var range = el.createTextRange(); range.collapse(true); range.moveEnd("character", pos); range.moveStart("character", pos); range.select(); } } /** * Selects the text in the input element from start to finish character * @name selectText * @param [HTMLElement] el - input element to select the text in. * @param [Number] start - postion to set at the beginning of the selection. * @param [Number] end - position to set at the end of the selection. */ function selectText(el, start, end) { if (el.setSelectionRange) { el.focus(); el.setSelectionRange(start, end); } else if (el.createTextRange) { var range = el.createTextRange(); range.collapse(true); range.moveEnd("character", end); range.moveStart("character", start); range.select(); } } /** * Checks if there is unsaved state and prompts the user to save their changes * @name onBeforeUnload * @param [EventObject] e - */ function onBeforeUnload(e) { for (var domain in domain_current_days_saved) { for (var type in domain_current_days_saved[domain]) { if (domain_current_days_saved[domain][type] === false) { // Return the focus to the unsaved element var elCustomInput = DOM.get("custom_archive_" + type + "_retain_days_" + domain); if (elCustomInput) { setTimeout(function() { elCustomInput.focus(); }); } var warning = LOCALE.maketext("You have unsaved changes."); e = e || window.event; // For IE<8 and Firefox prior to version 4 if (e) { e.returnValue = warning; } // For Chrome, Safari, IE8+ and Opera 12+ return warning; } } } return; } /** * Updates the domains on the page to match the now saved state * @name update_visible_elements * @param [Hash] data - */ function update_visible_elements(data, domains) { var i, l; data.forEach(function(d) { get_domain_controls(d.domain, d.direction).forEach(function(el) { if (el) { el.disabled = false; } }); }); for (var de in domains) { var domain = domains[de]; var chk = null; for (var archive_type in archive_types) { chk = DOM.get("archive_" + archive_type + "_" + domain); // See if this one is on the page if (!chk) { // Domain not on the page break; } var setting = null; for (i = 0, l = data.length; i < l; i++) { if (data[i].direction == archive_type && data[i].domain == domain) { setting = data[i]; break; } } var value = ""; var enabled = false; if (setting && setting.status !== 0) { // Change failed or not made value = setting.retention_period; enabled = setting.enabled; } // Update the UI. var ddl = DOM.get("archive_" + archive_type + "_retain_days_" + domain); var txt = DOM.get("custom_archive_" + archive_type + "_retain_days_" + domain); var container = DOM.get("archive_" + archive_type + "_retain_days_" + domain + "_container"); var customContainer = DOM.get("archive_" + archive_type + "_retain_days_" + domain + "_custom_container"); // Initialize all the values chk.checked = enabled; var found = false; for (i = 0, l = ddl.options.length; i < l; i++) { if (ddl.options[i].value == value.toString()) { ddl.selectedIndex = i; found = true; break; } } if (!found) { // Select the custom one. for (i = 0, l = ddl.options.length; i < l; i++) { if (ddl.options[i].value === "") { ddl.selectedIndex = i; break; } } } txt.value = value; // Configure the display if (chk.checked) { cpDOM.show(container); if (ddl.value === "") { cpDOM.show(customContainer); } else { // Hide the custom element container cpDOM.hide(customContainer); } } else { cpDOM.hide(container); cpDOM.hide(customContainer); } configure_actions(domain); } } } /** * Enable the default archiving controls. * @name enable_default_archiving_controls * @param [bool] to_disable - Enable or disable the controls. */ function enable_default_archiving_controls(to_disable) { var controls = CPANEL.Y("default_config").all("input, select"); controls.push(DOM.get("save_and_apply_default_config")); controls.forEach(function(c) { c.disabled = !!to_disable; }); } /** * Disables the default archiving controls. * @name disable_default_archiving_controls */ function disable_default_archiving_controls() { enable_default_archiving_controls(true); } /** * Saves the default archiving configuration and applies it to all the existing domains. * @name onSaveAndApplyDefaultConfiguration * @param [EventObject] e - */ function onSaveAndApplyDefaultConfiguration(e) { var BATCH_SIZE = 5; var num_domains = all_archive_domains.length; var data = getDefaultConfigurationData(); disable_default_archiving_controls(); // Clear the progressbar markup. DOM.get("archive_progress_bar_GLOBAL").innerHTML = ""; var progressText = DOM.get("archive_progress_bar_message_GLOBAL"); var progressBar = new YAHOO.widget.ProgressBar({ minValue: 0, maxValue: num_domains, value: 0, anim: true, // Setup an aria template to provide information to screen readers. ariaTextTemplate: LOCALE.maketext("Currently processing domain # [numf,_1] of [numf,_2].", "{value}", "{maxValue}") }); _isProgressRunning = true; progressBar.render("archive_progress_bar_GLOBAL"); progressBar.on("progress", function(value) { if (_isProgressRunning) { progressText.innerHTML = LOCALE.maketext("Applied to [numf,_1] of [quant,_2,domain,domains].", value, num_domains); } }); var bar_img_el = CPANEL.Y.one("#archive_progress_bar_GLOBAL .yui-pb-bar"); progressBar.on("complete", function(value) { if (value === num_domains) { window.setTimeout(function() { if (bar_img_el && DOM.inDocument(bar_img_el)) { DOM.setStyle(bar_img_el, "background-image", "none"); } }, 1500); } }); progressText.innerHTML = LOCALE.maketext("Applied to [numf,_1] of [quant,_2,domain,domains].", 0, num_domains); DOM.setAttribute(DOM.get("save_and_apply_default_config"), "disabled", "disabled"); // Setup the api2 call var call_data = {}; // Merge the data for (var data_key in data) { call_data[data_key] = data[data_key]; } cpDOM.show("spinner_GLOBAL"); // The call to saveBatch will progressively re-enable these elements. CPANEL.Y("emailarchtbl").all("input, select").forEach(function(el) { el.disabled = true; }); saveBatch(call_data, progressBar, progressText, 0, all_archive_domains.length < BATCH_SIZE ? all_archive_domains.length : BATCH_SIZE, BATCH_SIZE, num_domains); } var _isProgressRunning = false; /** * Saves the a batch of the domains at a time... * @name saveBatch * @param [Hash] callData - data hash, includes only the config settings, need to add domains in this method. * @param [ProgressBar] progressBar - reference to the progress bar for this run. * @param [HTMLElement] progressText - refernce to the progress bars text label. * @param [Number] start - Start index for this batch. * @param [Number] end - End index for this batch. * @param [Number] size - Batch size to help in calculating the next batch. * @param [Number] length - Total number of domains to process. */ function saveBatch(callData, progressBar, progressText, start, end, size, length) { var domains = []; for (var i = start; i < end; i++) { domains.push(all_archive_domains[i]); } // Setup the api2 call for this batch callData["domains"] = domains.join(","); var status_bar_id = "archive_status_bar_GLOBAL"; var spinner_id = "spinner_GLOBAL"; var enable_form_controls = function() { CPANEL.Y("emailarchtbl").all("input, select").forEach(function(el) { el.disabled = false; }); }; CPANEL.api({ module: "Email", func: "set_archiving_configuration", data: callData, callback: { // API Success handler success: function(o) { // Shortcuts var status_bar = CPANEL.widgets.status_bar; var nextStart = end; var nextEnd = nextStart + size > length ? length : nextStart + size; var isDone = nextStart >= length; if (isDone) { cpDOM.hide(spinner_id); } if (o.cpanel_data) { update_visible_elements(o.cpanel_data, domains); if (isDone) { // Finalize the progress bar progressBar.set("value", length); enable_default_archiving_controls(); _isProgressRunning = false; progressText.innerHTML = LOCALE.maketext("Applied to [numf,_1] of [quant,_2,domain,domains].", length, length); status_bar( status_bar_id, "success", LOCALE.maketext("Applied the default email archive configuration to all the domains on this account."), "", { callbackFunc: function() { // Prevent a race between queued runs if (_isProgressRunning === false) { var bar = DOM.get("archive_progress_bar_GLOBAL"); bar.innerHTML = ""; progressText.innerHTML = ""; cpDOM.hide(spinner_id); } } }); } else { progressBar.set("value", end + 1); // Trigger the next batch saveBatch(callData, progressBar, progressText, nextStart, nextEnd, size, length); } } else { enable_form_controls(); status_bar(status_bar_id, "error", LOCALE.maketext("Error"), o.cpanelresults[0].statusmsg); cpDOM.hide(spinner_id); if (onerror) { onerror(); } } }, // API Failure handler failure: function(o) { enable_form_controls(); // Shortcuts var status_bar = CPANEL.widgets.status_bar; // Enable the button var button = DOM.get("save_and_apply_default_config"); DOM.removeAttribute(button, "disabled"); // We are done so clear this _isProgressRunning = false; cpDOM.hide(spinner_id); status_bar(status_bar_id, "error", LOCALE.maketext("AJAX Error"), LOCALE.maketext("Please refresh the page and try again."), { callbackFunc: function() { // Prevent a race between queued runs if (_isProgressRunning === false) { bar.innerHTML = ""; progressText.innerHTML = ""; } } }); } } }); } if (typeof (DOM.removeAttribute) === "undefined") { /** * Remove the named attribute from the element. * @name removeAttribute * @param [HTMLElement] elem - Element to remove the attribute from * @param [String] name - name of the attribute to remove * @note Extracted from JQUERY attributes.js since YUI does not have this method. */ DOM.removeAttribute = function(elem, name) { if (name && elem.nodeType === 1) { propName = DOM.removeAttribute.propFix[name] || name; isBool = DOM.removeAttribute.rboolean.test(name); // See #9699 for explanation of this approach (setting first, then removal) // Do not do this for boolean attributes (see #10870) if (!isBool) { DOM.setAttribute(elem, name, ""); } elem.removeAttribute(DOM.removeAttribute.getSetAttribute ? name : propName); // Set corresponding property to false for boolean attributes if (isBool && propName in elem) { elem[propName] = false; } } }; (function() { var div = document.createElement("div"); div.setAttribute("className", "t"); DOM.removeAttribute.getSetAttribute = div.className !== "t"; })(); DOM.removeAttribute.rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i; DOM.removeAttribute.propFix = { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }; } if (typeof (DOM.setTBODYInnerHTML) === "undefined") { /** * Correctly sets the innerHTML of a TBODY element cross-browser * @name setTBODYInnerHTML * @param [HTMLElement] tbody - reference to the tbody element to fill in. * @param [String] html - html string to apply to the innerHTML of the tbody element. */ DOM.setTBODYInnerHTML = function(tbody, html) { if (navigator && navigator.userAgent.match(/MSIE/i)) { // fix MS Internet Exploder’s lameness var temp = DOM.setTBODYInnerHTML.temp; temp.innerHTML = "<table><tbody>" + html + "</tbody></table>"; tbody.parentNode.replaceChild(temp.firstChild.firstChild, tbody); } else { tbody.innerHTML = html; } }; DOM.setTBODYInnerHTML.temp = document.createElement("div"); } /** * Click hander for initiating a table sorting via the server. * @name onSortClick * @param [EventArg] e - */ function onSortClick(e) { // Filter var searchregex = DOM.get("search-regex"); // Sort var sort_column = DOM.get("search-sort-column"); var sort_reverse = DOM.get("search-sort-reverse"); var th = e.currentTarget; // Gather the new state var column_name = th.getAttribute("sort-column"); var reverse = "1"; if (sort_column.value === column_name) { if (sort_reverse.value === "0") { reverse = "1"; } else { reverse = "0"; } } else { if (column_name === "domain") { reverse = "0"; } else { reverse = "1"; } } // Update the parameters CPANEL.ui.widgets.pager.setParameters("DEFAULT", { api2_sort_column: column_name, api2_sort_reverse: reverse, fragment: 1 }); // Get the related query string var postData = CPANEL.ui.widgets.pager.getQuery("DEFAULT"); var parts = window.location.href.split("/"); parts.pop(); parts.pop(); var rootUrl = parts.join("/"); var sUrl = rootUrl + "/mail/archive_table.html?" + postData; var callback = { success: onSortSuccess, failure: onSortFailure, argument: [{ sort_column_name: column_name, sort_reverse: reverse }] }; cpDOM.show("spinner_sorting"); // And submit var request = YAHOO.util.Connect.asyncRequest("GET", sUrl, callback); } /** * What to do in a sort callback success * @name onSortSuccess * @param [AsyncCallbackObject] o - callback argument object. */ function onSortSuccess(o) { var table = DOM.get("emailarchtbl"); if (!table) { return; } // Clear the array and allow new code to fill it. archive_domains = []; var tbody = table.getElementsByTagName("tbody")[0]; var scripts = []; var fragement = document.createElement("div"); var html = o.responseText; fragement.innerHTML = "<table><tbody>" + html + "</tbody></table>"; var regex = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gim; scripts = html.match(regex); html = html.replace(regex, ""); DOM.setTBODYInnerHTML(tbody, html); window.setTimeout(function() { var strip = /<script\b[^>]*?>([^<]*?)<\/script>/mi; var block = null; for (var i = 0; i < scripts.length; i++) { try { block = scripts[i].match(strip); if (block && block.length > 1 && block[1]) { eval(block[1]); } } catch (e) { // Ignore these for now. alert(e); } } // Reinitialize the events on the new rows. for (var i = 0, l = archive_domains.length; i < l; i++) { register_archive_domain(archive_domains[i]); } }); cpDOM.hide("spinner_sorting"); // Set the new state DOM.get("search-sort-column").value = o.argument[0].sort_column_name; DOM.get("search-sort-reverse").value = o.argument[0].sort_reverse; var parameters = { api2_sort_column: o.argument[0].sort_column_name, api2_sort_reverse: o.argument[0].sort_reverse }; CPANEL.ui.widgets.pager.setParameters("DEFAULT", parameters); } /** * What to do in a sort callback failure. * @name onSortFailure * @param [AsyncCallbackObject] o - callback argument object. */ function onSortFailure(o) { cpDOM.hide("spinner_sorting"); } /** * Initialize the drop down state to the correct value. This is primarly used if users * navigate back and then forward again on browsers that have weird caching rules. * @name initialize_archive_domain * @param [String] domain - domain name to initialize. */ function initialize_archive_domain(domain) { for (var archive_type in archive_types) { var val = DOM.get("custom_archive_" + archive_type + "_retain_days_" + domain).value; var dropdown = DOM.get("archive_" + archive_type + "_retain_days_" + domain); if (dropdown.val != val) { var index = -1; var customIndex = -1; for (ii = 0, ll = dropdown.options.length; ii < ll; ii++) { if (dropdown.options[ii].value == val) { index = ii; break; } if (dropdown.options[ii].value === "") { customIndex = ii; } } if (index != -1) { // Found a match dropdown.selectedIndex = index; } else { // Its a custom one. dropdown.selectedIndex = customIndex; } } } } /** * Initialize the page * @global */ (function() { EVENT.addListener(window, "load", function() { for (var i = 0, l = archive_domains.length; i < l; i++) { register_archive_domain(archive_domains[i]); initialize_archive_domain(archive_domains[i]); } register_archive_domain("GLOBAL", true); // Setup the show/hide EVENT.addListener("save_and_apply_default_config", "click", onSaveAndApplyDefaultConfiguration); // Sets up the handler for the clear button. EVENT.addListener(DOM.get("search-clear"), "click", onSearchClear); // Setup the before unload handler. EVENT.addListener(window, "beforeunload", onBeforeUnload); // Sets the focus to the first visible element setDefaultFocus(); // If the page reloads before an AJAX call returned, // the browser might still have some form elements disabled on load. CPANEL.Y.all("input, select").forEach(function(el) { el.disabled = false; }); }); })();
Save