Dactyloidae/mailnews/base/prefs/content/am-copies.js

471 lines
17 KiB
JavaScript

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