diff options
Diffstat (limited to 'mailnews/base/prefs/content/am-copies.js')
-rw-r--r-- | mailnews/base/prefs/content/am-copies.js | 471 |
1 files changed, 471 insertions, 0 deletions
diff --git a/mailnews/base/prefs/content/am-copies.js b/mailnews/base/prefs/content/am-copies.js new file mode 100644 index 000000000..5fc3836a6 --- /dev/null +++ b/mailnews/base/prefs/content/am-copies.js @@ -0,0 +1,471 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * 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/. */ + +Components.utils.import("resource:///modules/MailUtils.js"); + +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"); + + setupCcTextbox(true); + setupBccTextbox(true); + 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. Second argument (false) signifies + // that 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.getFolderForURI(uri, false); + 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 aGroup the prefix for the menulist we're handling (e.g. "drafts") + * @param aType "Account" for the account picker or "Folder" for the folder + * picker + * @param 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() +{ + var broadcaster = document.getElementById("broadcaster_doFcc"); + + var checked = document.getElementById("identity.doFcc").checked; + if (checked) { + broadcaster.removeAttribute("disabled"); + 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; + } + } + else + broadcaster.setAttribute("disabled", "true"); +} + +// Disable CC textbox if CC checkbox is not checked +function setupCcTextbox(init) +{ + var ccChecked = document.getElementById("identity.doCc").checked; + var ccTextbox = document.getElementById("identity.doCcList"); + + ccTextbox.disabled = !ccChecked; + + if (ccChecked) { + if (ccTextbox.value == "") { + ccTextbox.value = document.getElementById("identity.email").value; + if (!init) + ccTextbox.select(); + } + } else if ((ccTextbox.value == document.getElementById("identity.email").value) || + (init && ccTextbox.getAttribute("value") == "")) + ccTextbox.value = ""; +} + +// Disable BCC textbox if BCC checkbox is not checked +function setupBccTextbox(init) +{ + var bccChecked = document.getElementById("identity.doBcc").checked; + var bccTextbox = document.getElementById("identity.doBccList"); + + bccTextbox.disabled = !bccChecked; + + if (bccChecked) { + if (bccTextbox.value == "") { + bccTextbox.value = document.getElementById("identity.email").value; + if (!init) + bccTextbox.select(); + } + } else if ((bccTextbox.value == document.getElementById("identity.email").value) || + (init && bccTextbox.getAttribute("value") == "")) + bccTextbox.value = ""; +} + +// 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"); + return; + } +} + +// 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 archiveFolder the currently-selected folder to store archives in + */ +function updateArchiveHierarchyButton(archiveFolder) { + let isGmailImap = (archiveFolder.server.type == "imap" && + archiveFolder.server.QueryInterface( + Components.interfaces.nsIImapIncomingServer) + .isGMailServer); + document.getElementById("archiveHierarchyButton").disabled = isGmailImap; +} + +/** + * Enable or disable (as appropriate) the controls for setting archive options + */ +function setupArchiveItems() { + let broadcaster = document.getElementById("broadcaster_archiveEnabled"); + let checked = document.getElementById("identity.archiveEnabled").checked; + let archiveFolder; + + if (checked) { + broadcaster.removeAttribute("disabled"); + 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"); + return; + } + } + else + broadcaster.setAttribute("disabled", "true"); +} + +/** + * Open a dialog to edit the folder hierarchy used when archiving messages. + */ +function ChangeArchiveHierarchy() { + let identity = parent.gIdentity || parent.getCurrentAccount().defaultIdentity; + + top.window.openDialog("chrome://messenger/content/am-archiveoptions.xul", + "", "centerscreen,chrome,modal,titlebar,resizable=yes", + identity); + return true; +} |