summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/base/prefs/content/am-copies.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/base/prefs/content/am-copies.js')
-rw-r--r--comm/mailnews/base/prefs/content/am-copies.js555
1 files changed, 555 insertions, 0 deletions
diff --git a/comm/mailnews/base/prefs/content/am-copies.js b/comm/mailnews/base/prefs/content/am-copies.js
new file mode 100644
index 0000000000..f848bab0c0
--- /dev/null
+++ b/comm/mailnews/base/prefs/content/am-copies.js
@@ -0,0 +1,555 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* import-globals-from am-prefs.js */
+/* import-globals-from amUtils.js */
+
+var { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.jsm");
+
+var gFccRadioElemChoice,
+ gDraftsRadioElemChoice,
+ gArchivesRadioElemChoice,
+ gTmplRadioElemChoice;
+var gFccRadioElemChoiceLocked,
+ gDraftsRadioElemChoiceLocked,
+ gArchivesRadioElemChoiceLocked,
+ gTmplRadioElemChoiceLocked;
+var gDefaultPickerMode = "1";
+
+var gFccFolderWithDelim,
+ gDraftsFolderWithDelim,
+ gArchivesFolderWithDelim,
+ gTemplatesFolderWithDelim;
+var gAccount;
+var gCurrentServerId;
+
+function onPreInit(account, accountValues) {
+ gAccount = account;
+ var type = parent.getAccountValue(
+ account,
+ accountValues,
+ "server",
+ "type",
+ null,
+ false
+ );
+ hideShowControls(type);
+}
+
+/*
+ * Set the global radio element choices and initialize folder/account pickers.
+ * Also, initialize other UI elements (cc, bcc, fcc picker controller checkboxes).
+ */
+function onInit(aPageId, aServerId) {
+ gCurrentServerId = aServerId;
+ onInitCopiesAndFolders();
+}
+
+function onInitCopiesAndFolders() {
+ SetGlobalRadioElemChoices();
+
+ SetFolderDisplay(
+ gFccRadioElemChoice,
+ gFccRadioElemChoiceLocked,
+ "fcc",
+ "msgFccAccountPicker",
+ "identity.fccFolder",
+ "msgFccFolderPicker"
+ );
+
+ SetFolderDisplay(
+ gArchivesRadioElemChoice,
+ gArchivesRadioElemChoiceLocked,
+ "archive",
+ "msgArchivesAccountPicker",
+ "identity.archiveFolder",
+ "msgArchivesFolderPicker"
+ );
+
+ SetFolderDisplay(
+ gDraftsRadioElemChoice,
+ gDraftsRadioElemChoiceLocked,
+ "draft",
+ "msgDraftsAccountPicker",
+ "identity.draftFolder",
+ "msgDraftsFolderPicker"
+ );
+
+ SetFolderDisplay(
+ gTmplRadioElemChoice,
+ gTmplRadioElemChoiceLocked,
+ "tmpl",
+ "msgStationeryAccountPicker",
+ "identity.stationeryFolder",
+ "msgStationeryFolderPicker"
+ );
+
+ setupDoCcBccItems("identity.doCc", "identity.doCcList");
+ setupDoCcBccItems("identity.doBcc", "identity.doBccList");
+ setupFccItems();
+ setupArchiveItems();
+
+ SetSpecialFolderNamesWithDelims();
+}
+
+// Initialize the picker mode choices (account/folder picker) into global vars
+function SetGlobalRadioElemChoices() {
+ var pickerModeElement = document.getElementById(
+ "identity.fccFolderPickerMode"
+ );
+ gFccRadioElemChoice = pickerModeElement.getAttribute("value");
+ gFccRadioElemChoiceLocked = pickerModeElement.getAttribute("disabled");
+ if (!gFccRadioElemChoice) {
+ gFccRadioElemChoice = gDefaultPickerMode;
+ }
+
+ pickerModeElement = document.getElementById(
+ "identity.archivesFolderPickerMode"
+ );
+ gArchivesRadioElemChoice = pickerModeElement.getAttribute("value");
+ gArchivesRadioElemChoiceLocked = pickerModeElement.getAttribute("disabled");
+ if (!gArchivesRadioElemChoice) {
+ gArchivesRadioElemChoice = gDefaultPickerMode;
+ }
+
+ pickerModeElement = document.getElementById(
+ "identity.draftsFolderPickerMode"
+ );
+ gDraftsRadioElemChoice = pickerModeElement.getAttribute("value");
+ gDraftsRadioElemChoiceLocked = pickerModeElement.getAttribute("disabled");
+ if (!gDraftsRadioElemChoice) {
+ gDraftsRadioElemChoice = gDefaultPickerMode;
+ }
+
+ pickerModeElement = document.getElementById("identity.tmplFolderPickerMode");
+ gTmplRadioElemChoice = pickerModeElement.getAttribute("value");
+ gTmplRadioElemChoiceLocked = pickerModeElement.getAttribute("disabled");
+ if (!gTmplRadioElemChoice) {
+ gTmplRadioElemChoice = gDefaultPickerMode;
+ }
+}
+
+/*
+ * Set Account and Folder elements based on the values read from
+ * preferences file. Default picker mode, if none specified at this stage, is
+ * set to 1 i.e., Other picker displaying the folder value read from the
+ * preferences file.
+ */
+function SetFolderDisplay(
+ pickerMode,
+ disableMode,
+ radioElemPrefix,
+ accountPickerId,
+ folderPickedField,
+ folderPickerId
+) {
+ if (!pickerMode) {
+ pickerMode = gDefaultPickerMode;
+ }
+
+ var selectAccountRadioId = radioElemPrefix + "_selectAccount";
+ var selectAccountRadioElem = document.getElementById(selectAccountRadioId);
+ var selectFolderRadioId = radioElemPrefix + "_selectFolder";
+ var selectFolderRadioElem = document.getElementById(selectFolderRadioId);
+ var accountPicker = document.getElementById(accountPickerId);
+ var folderPicker = document.getElementById(folderPickerId);
+ var rg = selectAccountRadioElem.radioGroup;
+ var folderPickedElement = document.getElementById(folderPickedField);
+ var uri = folderPickedElement.getAttribute("value");
+ // Get message folder from the given uri.
+ // There is no need to check for the existence of special folders as
+ // these folders are created on demand at runtime in case of imap accounts.
+ // For POP3 accounts, special folders are created at the account creation time.
+ var msgFolder = MailUtils.getOrCreateFolder(uri);
+ InitFolderDisplay(msgFolder.server.rootFolder, accountPicker);
+ InitFolderDisplay(msgFolder, folderPicker);
+
+ switch (pickerMode) {
+ case "0":
+ rg.selectedItem = selectAccountRadioElem;
+ SetPickerEnabling(accountPickerId, folderPickerId);
+ break;
+
+ case "1":
+ rg.selectedItem = selectFolderRadioElem;
+ SetPickerEnabling(folderPickerId, accountPickerId);
+ break;
+
+ default:
+ dump("Error in setting initial folder display on pickers\n");
+ break;
+ }
+
+ // Check to see if we need to lock page elements. Disable radio buttons
+ // and account/folder pickers when locked.
+ if (disableMode) {
+ selectAccountRadioElem.setAttribute("disabled", "true");
+ selectFolderRadioElem.setAttribute("disabled", "true");
+ accountPicker.setAttribute("disabled", "true");
+ folderPicker.setAttribute("disabled", "true");
+ }
+}
+
+// Initialize the folder display based on prefs values
+function InitFolderDisplay(folder, folderPicker) {
+ folderPicker.menupopup.selectFolder(folder);
+ folderPicker.folder = folder;
+}
+
+/**
+ * Capture any menulist changes and update the folder property.
+ *
+ * @param {string} aGroup - The prefix for the menulist we're handling
+ * (e.g. "drafts")
+ * @param {"Account"|"Folder"} aType - "Account" for the account picker or
+ * "Folder" for the folder picker.
+ * @param {Event} aEvent - The event that we're responding to.
+ */
+function noteSelectionChange(aGroup, aType, aEvent) {
+ var checkedElem = document.getElementById(aGroup + "_select" + aType);
+ var folder = aEvent.target._folder;
+ var modeValue = checkedElem.value;
+ var radioGroup = checkedElem.radioGroup.getAttribute("id");
+ var picker;
+
+ switch (radioGroup) {
+ case "doFcc":
+ gFccRadioElemChoice = modeValue;
+ picker = document.getElementById("msgFcc" + aType + "Picker");
+ break;
+
+ case "messageArchives":
+ gArchivesRadioElemChoice = modeValue;
+ picker = document.getElementById("msgArchives" + aType + "Picker");
+ updateArchiveHierarchyButton(folder);
+ break;
+
+ case "messageDrafts":
+ gDraftsRadioElemChoice = modeValue;
+ picker = document.getElementById("msgDrafts" + aType + "Picker");
+ break;
+
+ case "messageTemplates":
+ gTmplRadioElemChoice = modeValue;
+ picker = document.getElementById("msgStationery" + aType + "Picker");
+ break;
+ }
+
+ picker.folder = folder;
+ picker.menupopup.selectFolder(folder);
+}
+
+// Need to append special folders when account picker is selected.
+// Create a set of global special folder vars to be suffixed to the
+// server URI of the selected account.
+function SetSpecialFolderNamesWithDelims() {
+ var folderDelim = "/";
+ /* we use internal names known to everyone like "Sent", "Templates" and "Drafts" */
+
+ gFccFolderWithDelim = folderDelim + "Sent";
+ gArchivesFolderWithDelim = folderDelim + "Archives";
+ gDraftsFolderWithDelim = folderDelim + "Drafts";
+ gTemplatesFolderWithDelim = folderDelim + "Templates";
+}
+
+// Save all changes on this page
+function onSave() {
+ onSaveCopiesAndFolders();
+}
+
+function onSaveCopiesAndFolders() {
+ SaveFolderSettings(
+ gFccRadioElemChoice,
+ "doFcc",
+ gFccFolderWithDelim,
+ "msgFccAccountPicker",
+ "msgFccFolderPicker",
+ "identity.fccFolder",
+ "identity.fccFolderPickerMode"
+ );
+
+ SaveFolderSettings(
+ gArchivesRadioElemChoice,
+ "messageArchives",
+ gArchivesFolderWithDelim,
+ "msgArchivesAccountPicker",
+ "msgArchivesFolderPicker",
+ "identity.archiveFolder",
+ "identity.archivesFolderPickerMode"
+ );
+
+ SaveFolderSettings(
+ gDraftsRadioElemChoice,
+ "messageDrafts",
+ gDraftsFolderWithDelim,
+ "msgDraftsAccountPicker",
+ "msgDraftsFolderPicker",
+ "identity.draftFolder",
+ "identity.draftsFolderPickerMode"
+ );
+
+ SaveFolderSettings(
+ gTmplRadioElemChoice,
+ "messageTemplates",
+ gTemplatesFolderWithDelim,
+ "msgStationeryAccountPicker",
+ "msgStationeryFolderPicker",
+ "identity.stationeryFolder",
+ "identity.tmplFolderPickerMode"
+ );
+}
+
+// Save folder settings and radio element choices
+function SaveFolderSettings(
+ radioElemChoice,
+ radioGroupId,
+ folderSuffix,
+ accountPickerId,
+ folderPickerId,
+ folderElementId,
+ folderPickerModeId
+) {
+ var formElement = document.getElementById(folderElementId);
+ var uri;
+
+ if (
+ radioElemChoice == "0" ||
+ !document.getElementById(folderPickerId).value
+ ) {
+ // Default or revert to default if no folder chosen.
+ radioElemChoice = "0";
+ uri = document.getElementById(accountPickerId).folder.URI;
+ if (uri) {
+ // Create Folder URI.
+ uri = uri + folderSuffix;
+ }
+ } else if (radioElemChoice == "1") {
+ uri = document.getElementById(folderPickerId).folder.URI;
+ } else {
+ dump("Error saving folder preferences.\n");
+ return;
+ }
+
+ formElement.setAttribute("value", uri);
+
+ formElement = document.getElementById(folderPickerModeId);
+ formElement.setAttribute("value", radioElemChoice);
+}
+
+// Check the Fcc Self item and setup associated picker state
+function setupFccItems() {
+ let checked = document.getElementById("identity.doFcc").checked;
+ document.querySelectorAll(".depends-on-do-fcc").forEach(e => {
+ if (checked) {
+ e.removeAttribute("disabled");
+ } else {
+ e.setAttribute("disabled", "true");
+ }
+ });
+ if (!checked) {
+ return;
+ }
+
+ switch (gFccRadioElemChoice) {
+ case "0":
+ if (!gFccRadioElemChoiceLocked) {
+ SetPickerEnabling("msgFccAccountPicker", "msgFccFolderPicker");
+ }
+ SetRadioButtons("fcc_selectAccount", "fcc_selectFolder");
+ break;
+
+ case "1":
+ if (!gFccRadioElemChoiceLocked) {
+ SetPickerEnabling("msgFccFolderPicker", "msgFccAccountPicker");
+ }
+ SetRadioButtons("fcc_selectFolder", "fcc_selectAccount");
+ break;
+
+ default:
+ dump("Error in setting Fcc elements.\n");
+ break;
+ }
+}
+
+/**
+ * Handle the initial status and value of the Auto-Cc/Bcc text input fields.
+ *
+ * @param {string} checkboxId - The ID of an Auto-Cc/Bcc checkbox.
+ * @param {string} inputId - The ID of an Auto-Cc/Bcc text input element.
+ */
+function setupDoCcBccItems(checkboxId, inputId) {
+ // Enable address input according to the status of the checkbox.
+ let input = document.getElementById(inputId);
+ input.disabled = !document.getElementById(checkboxId).checked;
+ // Safeguard against space-padded address list to ensure list visibility.
+ input.value = input.value.trim();
+}
+
+/**
+ * Handle the command event of the Auto-Cc/Bcc checkboxes.
+ * Disable the respective text input element if the checkbox is not checked, and
+ * handle the default value of the input when the checkbox is toggled.
+ *
+ * @param {Event} event - The command event of the checkbox.
+ */
+function identityDoCcBccOnCommand(event) {
+ let checkbox = event.target;
+ let checked = checkbox.checked;
+ // For checkboxes #identity.doCc and #identity.doBcc, get the corresponding
+ // inputs: #identity.doCcList and #identity.doBccList.
+ let input = document.getElementById(`${checkbox.id}List`);
+ input.disabled = !checked;
+
+ // User toggled checkbox.
+ let identityEmailAddress = document.getElementById("identity.email").value;
+ if (checked) {
+ // If user checks the checkbox and there's no address, default to identity's
+ // email address.
+ if (!input.value) {
+ input.value = identityEmailAddress;
+ }
+ input.select();
+ return;
+ }
+
+ if (input.value == identityEmailAddress) {
+ // If user unchecks checkbox and the input has default address, clear input.
+ input.value = "";
+ }
+}
+
+/**
+ * Handle the blur event of the Auto-Cc/Bcc checkboxes.
+ *
+ * @param {Event} event - The blur event of the checkbox.
+ */
+function identityDoCcBccOnBlur(event) {
+ let input = event.target;
+ // Safeguard against space-padded address list to ensure list visibility.
+ input.value = input.value.trim();
+}
+
+// Enable and disable pickers based on the radio element clicked
+function SetPickerEnabling(enablePickerId, disablePickerId) {
+ var activePicker = document.getElementById(enablePickerId);
+ activePicker.removeAttribute("disabled");
+
+ var inactivePicker = document.getElementById(disablePickerId);
+ inactivePicker.setAttribute("disabled", "true");
+}
+
+// Set radio element choices and picker states
+function setPickersState(enablePickerId, disablePickerId, event) {
+ SetPickerEnabling(enablePickerId, disablePickerId);
+
+ var radioElemValue = event.target.value;
+
+ switch (event.target.id) {
+ case "fcc_selectAccount":
+ case "fcc_selectFolder":
+ gFccRadioElemChoice = radioElemValue;
+ break;
+ case "archive_selectAccount":
+ case "archive_selectFolder":
+ gArchivesRadioElemChoice = radioElemValue;
+ updateArchiveHierarchyButton(
+ document.getElementById(enablePickerId).folder
+ );
+ break;
+ case "draft_selectAccount":
+ case "draft_selectFolder":
+ gDraftsRadioElemChoice = radioElemValue;
+ break;
+ case "tmpl_selectAccount":
+ case "tmpl_selectFolder":
+ gTmplRadioElemChoice = radioElemValue;
+ break;
+ default:
+ dump("Error in setting picker state.\n");
+ }
+}
+
+// This routine is to restore the correct radio element
+// state when the fcc self checkbox broadcasts the change
+function SetRadioButtons(selectPickerId, unselectPickerId) {
+ var activeRadioElem = document.getElementById(selectPickerId);
+ activeRadioElem.radioGroup.selectedItem = activeRadioElem;
+}
+
+/**
+ * Enable/disable the archive hierarchy button depending on what folder is
+ * currently selected (Gmail IMAP folders should have the button disabled, since
+ * changing the archive hierarchy does nothing there.
+ *
+ * @param {nsIMsgFolder} archiveFolder - The currently-selected folder to store
+ * archives in
+ */
+function updateArchiveHierarchyButton(archiveFolder) {
+ let isGmailImap =
+ archiveFolder.server.type == "imap" &&
+ archiveFolder.server.QueryInterface(Ci.nsIImapIncomingServer).isGMailServer;
+ document.getElementById("archiveHierarchyButton").disabled = isGmailImap;
+}
+
+/**
+ * Enable or disable (as appropriate) the controls for setting archive options
+ */
+function setupArchiveItems() {
+ let checked = document.getElementById("identity.archiveEnabled").checked;
+ document.querySelectorAll(".depends-on-archive").forEach(e => {
+ if (checked) {
+ e.removeAttribute("disabled");
+ } else {
+ e.setAttribute("disabled", "true");
+ }
+ });
+ if (!checked) {
+ return;
+ }
+
+ switch (gArchivesRadioElemChoice) {
+ case "0":
+ if (!gArchivesRadioElemChoiceLocked) {
+ SetPickerEnabling(
+ "msgArchivesAccountPicker",
+ "msgArchivesFolderPicker"
+ );
+ }
+ SetRadioButtons("archive_selectAccount", "archive_selectFolder");
+ updateArchiveHierarchyButton(
+ document.getElementById("msgArchivesAccountPicker").folder
+ );
+ break;
+
+ case "1":
+ if (!gArchivesRadioElemChoiceLocked) {
+ SetPickerEnabling(
+ "msgArchivesFolderPicker",
+ "msgArchivesAccountPicker"
+ );
+ }
+ SetRadioButtons("archive_selectFolder", "archive_selectAccount");
+ updateArchiveHierarchyButton(
+ document.getElementById("msgArchivesFolderPicker").folder
+ );
+ break;
+
+ default:
+ dump("Error in setting Archive elements.\n");
+ }
+}
+
+/**
+ * Open a dialog to edit the folder hierarchy used when archiving messages.
+ */
+function ChangeArchiveHierarchy() {
+ let identity = parent.gIdentity || parent.getCurrentAccount().defaultIdentity;
+ let arg = { identity };
+
+ parent.gSubDialog.open(
+ "chrome://messenger/content/am-archiveoptions.xhtml",
+ undefined,
+ arg
+ );
+}