/* -*- 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; }