mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-25 18:07:31 +09:00
471 lines
17 KiB
JavaScript
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;
|
|
}
|