зеркало из https://github.com/mozilla/pjs.git
438 строки
12 KiB
JavaScript
438 строки
12 KiB
JavaScript
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is Mozilla Communicator client code, released
|
|
* March 31, 1998.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Netscape Communications Corporation.
|
|
* Portions created by the Initial Developer are Copyright (C) 1998-1999
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* Paul Hangas <hangas@netscape.com>
|
|
* Alec Flett <alecf@netscape.com>
|
|
* Seth Spitzer <sspitzer@netscape.com>
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
* the provisions above, a recipient may use your version of this file under
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
*
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
var addressbook = 0;
|
|
var composeWindow = 0;
|
|
var msgCompFields = 0;
|
|
var editCardCallback = 0;
|
|
|
|
var gPromptService = GetPromptService();
|
|
|
|
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 = Components.classes["@mozilla.org/widget/dragservice;1"].getService();
|
|
gDragService = gDragService.QueryInterface(Components.interfaces.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="";
|
|
|
|
doSetOKCancel(SelectAddressOKButton, 0);
|
|
|
|
// 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");
|
|
SearchInputChanged();
|
|
|
|
SelectFirstAddressBookMenulist();
|
|
|
|
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");
|
|
|
|
var abResultsTree = document.getElementById("abResultsTree");
|
|
abResultsTree.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 = gHeaderParser.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 == "")
|
|
{
|
|
if (gPromptService)
|
|
gPromptService.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)
|
|
{
|
|
var item = bucketTree.contentView.getItemAtIndex(j);
|
|
body.removeChild(item);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 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)
|
|
{
|
|
AddAddressIntoBucket(prefixTo, address, address);
|
|
}
|
|
|
|
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) {
|
|
gQueryURIFormat = gPrefs.getComplexValue("mail.addr_book.quicksearchquery.format",
|
|
Components.interfaces.nsIPrefLocalizedString).data;
|
|
}
|
|
|
|
var searchURI = selectedNode.getAttribute("id");
|
|
|
|
if (gSearchInput.value != "") {
|
|
searchURI += gQueryURIFormat.replace(/@V/g, encodeURIComponent(gSearchInput.value));
|
|
}
|
|
|
|
SetAbView(searchURI, true);
|
|
|
|
SelectFirstCard();
|
|
}
|
|
|
|
function SelectFirstAddressBookMenulist()
|
|
{
|
|
ChangeDirectoryByURI(abList.selectedItem.id);
|
|
return;
|
|
}
|
|
|
|
function DirPaneSelectionChangeMenulist()
|
|
{
|
|
if (abList && abList.selectedItem) {
|
|
if (gSearchInput.value && (gSearchInput.value != ""))
|
|
onEnterInSearchBar();
|
|
else
|
|
ChangeDirectoryByURI(abList.selectedItem.id);
|
|
}
|
|
}
|
|
|
|
function GetPromptService()
|
|
{
|
|
try {
|
|
return Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
|
|
.getService(Components.interfaces.nsIPromptService);
|
|
}
|
|
catch (e) {
|
|
return null;
|
|
}
|
|
}
|