Revision control

Copy as Markdown

Other Tools

/* -*- indent-tabs-mode: nil; js-indent-level: 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/. */
const {encodeABTermValue, getModelQuery} = ChromeUtils.import("resource:///modules/ABQueryUtils.jsm");
var addressbook = 0;
var composeWindow = 0;
var msgCompFields = 0;
var editCardCallback = 0;
var gSearchInput;
var gSearchTimer = null;
var gQueryURIFormat = null;
// localization strings
var prefixTo;
var prefixCc;
var prefixBcc;
var gToButton;
var gCcButton;
var gBccButton;
var gActivatedButton;
var gDragService = Cc["@mozilla.org/widget/dragservice;1"]
.getService(Ci.nsIDragService);
var gSelectAddressesAbViewListener = {
onSelectionChanged: function() {
ResultsPaneSelectionChanged();
},
onCountChanged: function(total) {
// do nothing
}
};
function GetAbViewListener()
{
return gSelectAddressesAbViewListener;
}
function OnLoadSelectAddress()
{
InitCommonJS();
prefixTo = gAddressBookBundle.getString("prefixTo") + ": ";
prefixCc = gAddressBookBundle.getString("prefixCc") + ": ";
prefixBcc = gAddressBookBundle.getString("prefixBcc") + ": ";
UpgradeAddressBookResultsPaneUI("mailnews.ui.select_addresses_results.version");
var toAddress="", ccAddress="", bccAddress="";
// look in arguments[0] for parameters
if (window.arguments && window.arguments[0])
{
// keep parameters in global for later
if ( window.arguments[0].composeWindow )
top.composeWindow = window.arguments[0].composeWindow;
if ( window.arguments[0].msgCompFields )
top.msgCompFields = window.arguments[0].msgCompFields;
if ( window.arguments[0].toAddress )
toAddress = window.arguments[0].toAddress;
if ( window.arguments[0].ccAddress )
ccAddress = window.arguments[0].ccAddress;
if ( window.arguments[0].bccAddress )
bccAddress = window.arguments[0].bccAddress;
// put the addresses into the bucket
AddAddressFromComposeWindow(toAddress, prefixTo);
AddAddressFromComposeWindow(ccAddress, prefixCc);
AddAddressFromComposeWindow(bccAddress, prefixBcc);
}
gSearchInput = document.getElementById("searchInput");
// Reselect the persisted address book if possible, if not just select the
// first in the list.
var temp = abList.value;
abList.selectedItem = null;
abList.value = temp;
if (!abList.selectedItem)
abList.selectedIndex = 0;
ChangeDirectoryByURI(abList.value);
DialogBucketPaneSelectionChanged();
var workPhoneCol = document.getElementById("WorkPhone");
workPhoneCol.setAttribute("hidden", "true");
var companyCol = document.getElementById("Company");
companyCol.setAttribute("hidden", "true");
gToButton = document.getElementById("toButton");
gCcButton = document.getElementById("ccButton");
gBccButton = document.getElementById("bccButton");
gAbResultsTree.focus();
gActivatedButton = gToButton;
document.documentElement.addEventListener("keypress", OnReturnHit, true);
}
function OnUnloadSelectAddress()
{
CloseAbView();
}
function AddAddressFromComposeWindow(addresses, prefix)
{
if ( addresses )
{
var emails = {};
var names = {};
var fullNames = {};
var numAddresses = MailServices.headerParser.parseHeadersWithArray(addresses, emails, names, fullNames);
for ( var index = 0; index < numAddresses; index++ )
{
AddAddressIntoBucket(prefix, fullNames.value[index], emails.value[index]);
}
}
}
function SelectAddressOKButton()
{
// Empty email checks are now done in AddAddressIntoBucket below.
var body = document.getElementById('bucketBody');
var item, row, cell, prefix, address, email;
var toAddress="", ccAddress="", bccAddress="", emptyEmail="";
for ( var index = 0; index < body.childNodes.length; index++ )
{
item = body.childNodes[index];
if ( item.childNodes && item.childNodes.length )
{
row = item.childNodes[0];
if ( row.childNodes && row.childNodes.length )
{
cell = row.childNodes[0];
prefix = cell.getAttribute('prefix');
address = cell.getAttribute('address');
email = cell.getAttribute('email');
if ( prefix )
{
switch ( prefix )
{
case prefixTo:
if ( toAddress )
toAddress += ", ";
toAddress += address;
break;
case prefixCc:
if ( ccAddress )
ccAddress += ", ";
ccAddress += address;
break;
case prefixBcc:
if ( bccAddress )
bccAddress += ", ";
bccAddress += address;
break;
}
}
}
}
}
// reset the UI in compose window
msgCompFields.to = toAddress;
msgCompFields.cc = ccAddress;
msgCompFields.bcc = bccAddress;
top.composeWindow.CompFields2Recipients(top.msgCompFields);
return true;
}
function SelectAddressToButton()
{
AddSelectedAddressesIntoBucket(prefixTo);
gActivatedButton = gToButton;
}
function SelectAddressCcButton()
{
AddSelectedAddressesIntoBucket(prefixCc);
gActivatedButton = gCcButton;
}
function SelectAddressBccButton()
{
AddSelectedAddressesIntoBucket(prefixBcc);
gActivatedButton = gBccButton;
}
function AddSelectedAddressesIntoBucket(prefix)
{
var cards = GetSelectedAbCards();
var count = cards.length;
for (var i = 0; i < count; i++) {
AddCardIntoBucket(prefix, cards[i]);
}
}
function AddCardIntoBucket(prefix, card)
{
var address = GenerateAddressFromCard(card);
if (card.isMailList) {
AddAddressIntoBucket(prefix, address, card.displayName);
}
else {
AddAddressIntoBucket(prefix, address, card.primaryEmail);
}
}
function AddAddressIntoBucket(prefix, address, email)
{
if (!email)
{
Services.prompt.alert(window,
gAddressBookBundle.getString("emptyEmailAddCardTitle"),
gAddressBookBundle.getString("emptyEmailAddCard"));
}
else
{
var body = document.getElementById("bucketBody");
var item = document.createElement('treeitem');
var row = document.createElement('treerow');
var cell = document.createElement('treecell');
cell.setAttribute('label', prefix + address);
cell.setAttribute('prefix', prefix);
cell.setAttribute('address', address);
cell.setAttribute('email', email);
row.appendChild(cell);
item.appendChild(row);
body.appendChild(item);
}
}
function RemoveSelectedFromBucket()
{
var bucketTree = document.getElementById("addressBucket");
if ( bucketTree )
{
var body = document.getElementById("bucketBody");
var selection = bucketTree.view.selection;
var rangeCount = selection.getRangeCount();
for (var i = rangeCount-1; i >= 0; --i)
{
var start = {}, end = {};
selection.getRangeAt(i,start,end);
for (var j = end.value; j >= start.value; --j)
{
bucketTree.contentView.getItemAtIndex(j).remove();
}
}
}
}
/* Function: ResultsPaneSelectionChanged()
* Callers : OnLoadSelectAddress(), abCommon.js:ResultsPaneSelectionChanged()
* -------------------------------------------------------------------------
* This function is used to grab the selection state of the results tree to maintain
* the appropriate enabled/disabled states of the "Edit", "To:", "CC:", and "Bcc:" buttons.
* If an entry is selected in the results Tree, then the "disabled" attribute is removed.
* Otherwise, if nothing is selected, "disabled" is set to true.
*/
function ResultsPaneSelectionChanged()
{;
var editButton = document.getElementById("edit");
var toButton = document.getElementById("toButton");
var ccButton = document.getElementById("ccButton");
var bccButton = document.getElementById("bccButton");
var numSelected = GetNumSelectedCards();
if (numSelected > 0)
{
if (numSelected == 1)
editButton.removeAttribute("disabled");
else
editButton.setAttribute("disabled", "true");
toButton.removeAttribute("disabled");
ccButton.removeAttribute("disabled");
bccButton.removeAttribute("disabled");
}
else
{
editButton.setAttribute("disabled", "true");
toButton.setAttribute("disabled", "true");
ccButton.setAttribute("disabled", "true");
bccButton.setAttribute("disabled", "true");
}
}
/* Function: DialogBucketPaneSelectionChanged()
* Callers : OnLoadSelectAddress(), abSelectAddressesDialog.xul:id="addressBucket"
* -------------------------------------------------------------------------------
* This function is used to grab the selection state of the bucket tree to maintain
* the appropriate enabled/disabled states of the "Remove" button.
* If an entry is selected in the bucket Tree, then the "disabled" attribute is removed.
* Otherwise, if nothing is selected, "disabled" is set to true.
*/
function DialogBucketPaneSelectionChanged()
{
var bucketTree = document.getElementById("addressBucket");
var removeButton = document.getElementById("remove");
removeButton.disabled = bucketTree.view.selection.count == 0;
}
function AbResultsPaneDoubleClick(card)
{
AddCardIntoBucket(prefixTo, card);
}
function OnClickedCard(card)
{
// in the select address dialog, do nothing on click
}
function UpdateCardView()
{
// in the select address dialog, do nothing
}
function DropRecipient(address)
{
AddAddressFromComposeWindow(address, prefixTo);
}
function OnReturnHit(event)
{
if (event.keyCode == 13) {
var focusedElement = document.commandDispatcher.focusedElement;
if (focusedElement && (focusedElement.id == "addressBucket"))
return;
event.stopPropagation();
if (focusedElement && (focusedElement.id == "abResultsTree"))
gActivatedButton.doCommand();
}
}
function onEnterInSearchBar()
{
var selectedNode = abList.selectedItem;
if (!selectedNode)
return;
if (!gQueryURIFormat) {
// Get model query from pref. We don't want the query starting with "?"
// as we have to prefix "?and" to this format.
gQueryURIFormat = getModelQuery("mail.addr_book.quicksearchquery.format");
}
var searchURI = selectedNode.value;
// Use helper method to split up search query to multi-word search
// query against multiple fields.
let searchWords = getSearchTokens(gSearchInput.value);
searchURI += generateQueryURI(gQueryURIFormat, searchWords);
SetAbView(searchURI);
SelectFirstCard();
}
function DirPaneSelectionChangeMenulist()
{
if (abList && abList.selectedItem) {
if (gSearchInput.value && (gSearchInput.value != ""))
onEnterInSearchBar();
else
ChangeDirectoryByURI(abList.value);
}
// Hide the addressbook column if the selected addressbook isn't
// "All address books". Since the column is redundant in all other cases.
let addrbookColumn = document.getElementById("addrbook");
if (abList.value.startsWith(kAllDirectoryRoot + "?")) {
addrbookColumn.hidden = !gShowAbColumnInComposeSidebar;
addrbookColumn.removeAttribute("ignoreincolumnpicker");
} else {
addrbookColumn.hidden = true;
addrbookColumn.setAttribute("ignoreincolumnpicker", "true");
}
}