зеркало из https://github.com/mozilla/pjs.git
546 строки
16 KiB
JavaScript
546 строки
16 KiB
JavaScript
/* ***** 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.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Netscape Communications Corporation.
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* 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 ***** */
|
|
|
|
top.MAX_RECIPIENTS = 1;
|
|
var inputElementType = "";
|
|
|
|
var gParentURI;
|
|
var gListCard;
|
|
var gEditList;
|
|
var gOkCallback = null;
|
|
var oldListName = "";
|
|
var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
|
|
var gPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
|
|
var gHeaderParser = Components.classes["@mozilla.org/messenger/headerparser;1"].getService(Components.interfaces.nsIMsgHeaderParser);
|
|
|
|
try
|
|
{
|
|
var gDragService = Components.classes["@mozilla.org/widget/dragservice;1"]
|
|
.getService(Components.interfaces.nsIDragService);
|
|
}
|
|
catch (e)
|
|
{
|
|
}
|
|
|
|
function handleKeyPress(element, event)
|
|
{
|
|
// allow dialog to close on enter if focused textbox has no value
|
|
if (element.value != "" && event.keyCode == 13) {
|
|
event.stopPropagation();
|
|
event.preventDefault();
|
|
}
|
|
}
|
|
|
|
function mailingListExists(listname)
|
|
{
|
|
var addressbook = Components.classes["@mozilla.org/addressbook;1"].createInstance(Components.interfaces.nsIAddressBook);
|
|
if (addressbook.mailListNameExists(listname))
|
|
{
|
|
gPromptService.alert(window,
|
|
gAddressBookBundle.getString("mailListNameExistsTitle"),
|
|
gAddressBookBundle.getString("mailListNameExistsMessage"));
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function GetListValue(mailList, doAdd)
|
|
{
|
|
var listname = document.getElementById('ListName').value.replace(/^\s+|\s+$/g, '');
|
|
|
|
if (listname.length == 0)
|
|
{
|
|
var alertText = gAddressBookBundle.getString("emptyListName");
|
|
alert(alertText);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
var canonicalNewListName = listname.toLowerCase();
|
|
var canonicalOldListName = oldListName.toLowerCase();
|
|
if (doAdd)
|
|
{
|
|
if (mailingListExists(canonicalNewListName))
|
|
return false;
|
|
}
|
|
else if (canonicalOldListName != canonicalNewListName)
|
|
{
|
|
if (mailingListExists(canonicalNewListName))
|
|
return false;
|
|
}
|
|
}
|
|
|
|
mailList.dirName = listname;
|
|
mailList.listNickName = document.getElementById('ListNickName').value;
|
|
mailList.description = document.getElementById('ListDescription').value;
|
|
|
|
var oldTotal = mailList.addressLists.Count();
|
|
var i = 1;
|
|
var pos = 0;
|
|
var inputField, fieldValue, cardproperty;
|
|
while ((inputField = awGetInputElement(i)))
|
|
{
|
|
|
|
fieldValue = inputField.value;
|
|
|
|
if (doAdd || (!doAdd && pos >= oldTotal))
|
|
cardproperty = Components.classes["@mozilla.org/addressbook/cardproperty;1"].createInstance();
|
|
else
|
|
cardproperty = mailList.addressLists.GetElementAt(pos);
|
|
|
|
if (fieldValue == "")
|
|
{
|
|
if (!doAdd && cardproperty)
|
|
try
|
|
{
|
|
mailList.addressLists.DeleteElementAt(pos);
|
|
}
|
|
catch(ex)
|
|
{
|
|
// Ignore attempting to remove an item
|
|
// at a position greater than the number
|
|
// of elements in the addressLists attribute
|
|
}
|
|
}
|
|
else if (cardproperty)
|
|
{
|
|
cardproperty = cardproperty.QueryInterface(Components.interfaces.nsIAbCard);
|
|
if (cardproperty)
|
|
{
|
|
var addresses = {};
|
|
var names = {};
|
|
var fullNames = {};
|
|
var numAddresses = gHeaderParser.parseHeadersWithArray(fieldValue, addresses, names, fullNames);
|
|
for (var j = 0; j < numAddresses; j++)
|
|
{
|
|
if (j > 0)
|
|
{
|
|
cardproperty = Components.classes["@mozilla.org/addressbook/cardproperty;1"].createInstance();
|
|
cardproperty = cardproperty.QueryInterface(Components.interfaces.nsIAbCard);
|
|
}
|
|
cardproperty.primaryEmail = addresses.value[j];
|
|
cardproperty.displayName = names.value[j];
|
|
|
|
if (doAdd || (doAdd == false && pos >= oldTotal))
|
|
mailList.addressLists.AppendElement(cardproperty);
|
|
}
|
|
pos++;
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
|
|
--i;
|
|
|
|
if (doAdd == false && i < oldTotal)
|
|
{
|
|
for (var j = i; j < oldTotal; j++)
|
|
mailList.addressLists.DeleteElementAt(j);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function MailListOKButton()
|
|
{
|
|
var popup = document.getElementById('abPopup');
|
|
if ( popup )
|
|
{
|
|
var uri = popup.getAttribute('value');
|
|
|
|
// FIX ME - hack to avoid crashing if no ab selected because of blank option bug from template
|
|
// should be able to just remove this if we are not seeing blank lines in the ab popup
|
|
if ( !uri )
|
|
return false; // don't close window
|
|
// -----
|
|
|
|
//Add mailing list to database
|
|
var mailList = Components.classes["@mozilla.org/addressbook/directoryproperty;1"].createInstance();
|
|
mailList = mailList.QueryInterface(Components.interfaces.nsIAbDirectory);
|
|
|
|
if (GetListValue(mailList, true)) {
|
|
var parentDirectory = GetDirectoryFromURI(uri);
|
|
parentDirectory.addMailList(mailList);
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
|
|
return true; // close the window
|
|
}
|
|
|
|
function OnLoadNewMailList()
|
|
{
|
|
var selectedAB = null;
|
|
|
|
InitCommonJS();
|
|
|
|
if (window.arguments && window.arguments[0])
|
|
{
|
|
var abURI = window.arguments[0].selectedAB;
|
|
if (abURI) {
|
|
var directory = GetDirectoryFromURI(abURI);
|
|
if (directory.isMailList) {
|
|
var parentURI = GetParentDirectoryFromMailingListURI(abURI);
|
|
if (parentURI) {
|
|
selectedAB = parentURI;
|
|
}
|
|
}
|
|
else if (!(directory.operations & directory.opWrite)) {
|
|
selectedAB = kPersonalAddressbookURI;
|
|
|
|
}
|
|
else {
|
|
selectedAB = abURI;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!selectedAB)
|
|
selectedAB = kPersonalAddressbookURI;
|
|
|
|
// set popup with address book names
|
|
var abPopup = document.getElementById('abPopup');
|
|
abPopup.value = selectedAB;
|
|
|
|
AppendNewRowAndSetFocus();
|
|
awFitDummyRows(1);
|
|
|
|
document.addEventListener("keypress", awDocumentKeyPress, true);
|
|
|
|
// focus on first name
|
|
var listName = document.getElementById('ListName');
|
|
if ( listName )
|
|
setTimeout( function(firstTextBox) { firstTextBox.focus(); }, 0, listName );
|
|
|
|
moveToAlertPosition();
|
|
}
|
|
|
|
function EditListOKButton()
|
|
{
|
|
//edit mailing list in database
|
|
if (GetListValue(gEditList, false))
|
|
{
|
|
if (gListCard) {
|
|
// modify the list card (for the results pane) from the mailing list
|
|
gListCard.displayName = gEditList.dirName;
|
|
gListCard.lastName = gEditList.dirName;
|
|
gListCard.nickName = gEditList.listNickName;
|
|
gListCard.notes = gEditList.description;
|
|
}
|
|
|
|
gEditList.editMailListToDatabase(gParentURI, gListCard);
|
|
|
|
if (gOkCallback)
|
|
gOkCallback();
|
|
return true; // close the window
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
|
|
function OnLoadEditList()
|
|
{
|
|
InitCommonJS();
|
|
|
|
gParentURI = window.arguments[0].abURI;
|
|
gListCard = window.arguments[0].abCard;
|
|
var listUri = window.arguments[0].listURI;
|
|
gOkCallback = window.arguments[0].okCallback;
|
|
|
|
gEditList = GetDirectoryFromURI(listUri);
|
|
|
|
document.getElementById('ListName').value = gEditList.dirName;
|
|
document.getElementById('ListNickName').value = gEditList.listNickName;
|
|
document.getElementById('ListDescription').value = gEditList.description;
|
|
oldListName = gEditList.dirName;
|
|
|
|
if (gEditList.addressLists)
|
|
{
|
|
var total = gEditList.addressLists.Count();
|
|
if (total)
|
|
{
|
|
var listbox = document.getElementById('addressingWidget');
|
|
var newListBoxNode = listbox.cloneNode(false);
|
|
var templateNode = listbox.getElementsByTagName("listitem")[0];
|
|
|
|
top.MAX_RECIPIENTS = 0;
|
|
for ( var i = 0; i < total; i++ )
|
|
{
|
|
var card = gEditList.addressLists.GetElementAt(i);
|
|
card = card.QueryInterface(Components.interfaces.nsIAbCard);
|
|
var address = gHeaderParser.makeFullAddressWString(card.displayName, card.primaryEmail);
|
|
SetInputValue(address, newListBoxNode, templateNode);
|
|
}
|
|
var parent = listbox.parentNode;
|
|
parent.replaceChild(newListBoxNode, listbox);
|
|
}
|
|
}
|
|
|
|
document.addEventListener("keypress", awDocumentKeyPress, true);
|
|
|
|
moveToAlertPosition();
|
|
|
|
// workaround for bug 118337 - for mailing lists that have more rows than fits inside
|
|
// the display, the value of the textbox inside the new row isn't inherited into the input -
|
|
// the first row then appears to be duplicated at the end although it is actually empty.
|
|
// see awAppendNewRow which copies first row and clears it
|
|
setTimeout(AppendLastRow, 0);
|
|
}
|
|
|
|
function AppendLastRow()
|
|
{
|
|
AppendNewRowAndSetFocus();
|
|
awFitDummyRows(1);
|
|
|
|
// focus on first name
|
|
var listName = document.getElementById('ListName');
|
|
if ( listName )
|
|
listName.focus();
|
|
}
|
|
|
|
function AppendNewRowAndSetFocus()
|
|
{
|
|
var lastInput = awGetInputElement(top.MAX_RECIPIENTS);
|
|
if ( lastInput && lastInput.value )
|
|
awAppendNewRow(true);
|
|
else
|
|
awSetFocus(top.MAX_RECIPIENTS, lastInput);
|
|
}
|
|
|
|
function SetInputValue(inputValue, parentNode, templateNode)
|
|
{
|
|
top.MAX_RECIPIENTS++;
|
|
|
|
var newNode = templateNode.cloneNode(true);
|
|
parentNode.appendChild(newNode); // we need to insert the new node before we set the value of the select element!
|
|
|
|
var input = newNode.getElementsByTagName(awInputElementName());
|
|
if ( input && input.length == 1 )
|
|
{
|
|
//We need to set the value using both setAttribute and .value else we will
|
|
// lose the content when the field is not visible. See bug 37435
|
|
input[0].setAttribute("value", inputValue);
|
|
input[0].value = inputValue;
|
|
input[0].setAttribute("id", "addressCol1#" + top.MAX_RECIPIENTS);
|
|
}
|
|
}
|
|
|
|
function awNotAnEmptyArea(event)
|
|
{
|
|
//This is temporary until i figure out how to ensure to always having an empty space after the last row
|
|
|
|
var lastInput = awGetInputElement(top.MAX_RECIPIENTS);
|
|
if ( lastInput && lastInput.value )
|
|
awAppendNewRow(false);
|
|
|
|
event.stopPropagation();
|
|
}
|
|
|
|
function awClickEmptySpace(target, setFocus)
|
|
{
|
|
if (target == null ||
|
|
(target.localName != "listboxbody" &&
|
|
target.localName != "listcell" &&
|
|
target.localName != "listitem"))
|
|
return;
|
|
|
|
var lastInput = awGetInputElement(top.MAX_RECIPIENTS);
|
|
|
|
if ( lastInput && lastInput.value )
|
|
awAppendNewRow(setFocus);
|
|
else
|
|
if (setFocus)
|
|
awSetFocus(top.MAX_RECIPIENTS, lastInput);
|
|
}
|
|
|
|
function awReturnHit(inputElement)
|
|
{
|
|
var row = awGetRowByInputElement(inputElement);
|
|
if ( inputElement.value )
|
|
{
|
|
var nextInput = awGetInputElement(row+1);
|
|
if ( !nextInput )
|
|
awAppendNewRow(true);
|
|
else
|
|
awSetFocus(row+1, nextInput);
|
|
}
|
|
}
|
|
|
|
function awInputChanged(inputElement)
|
|
{
|
|
// AutoCompleteAddress(inputElement);
|
|
|
|
//Do we need to add a new row?
|
|
var lastInput = awGetInputElement(top.MAX_RECIPIENTS);
|
|
if ( lastInput && lastInput.value && !top.doNotCreateANewRow)
|
|
awAppendNewRow(false);
|
|
top.doNotCreateANewRow = false;
|
|
}
|
|
|
|
function awInputElementName()
|
|
{
|
|
if (inputElementType == "")
|
|
inputElementType = document.getElementById("addressCol1#1").localName;
|
|
return inputElementType;
|
|
}
|
|
|
|
function awAppendNewRow(setFocus)
|
|
{
|
|
var body = document.getElementById("addressingWidget");
|
|
var listitem1 = awGetListItem(1);
|
|
|
|
if ( body && listitem1 )
|
|
{
|
|
var nextDummy = awGetNextDummyRow();
|
|
var newNode = listitem1.cloneNode(true);
|
|
if (nextDummy)
|
|
body.replaceChild(newNode, nextDummy);
|
|
else
|
|
body.appendChild(newNode);
|
|
|
|
top.MAX_RECIPIENTS++;
|
|
|
|
var input = newNode.getElementsByTagName(awInputElementName());
|
|
if ( input && input.length == 1 )
|
|
{
|
|
input[0].setAttribute("value", "");
|
|
input[0].setAttribute("id", "addressCol1#" + top.MAX_RECIPIENTS);
|
|
|
|
//this copies the autocomplete sessions list from recipient#1
|
|
input[0].syncSessions(document.getElementById('addressCol1#1'));
|
|
|
|
if (input[0].getAttribute('focused') != '')
|
|
input[0].removeAttribute('focused');
|
|
}
|
|
// focus on new input widget
|
|
if (setFocus && input )
|
|
awSetFocus(top.MAX_RECIPIENTS, input[0]);
|
|
}
|
|
}
|
|
|
|
|
|
// functions for accessing the elements in the addressing widget
|
|
|
|
function awGetInputElement(row)
|
|
{
|
|
return document.getElementById("addressCol1#" + row);
|
|
}
|
|
|
|
|
|
function _awSetFocus()
|
|
{
|
|
var listbox = document.getElementById('addressingWidget');
|
|
try
|
|
{
|
|
var theNewRow = awGetListItem(top.awRow);
|
|
|
|
listbox.ensureElementIsVisible(theNewRow);
|
|
top.awInputElement.focus();
|
|
}
|
|
catch(ex)
|
|
{
|
|
top.awFocusRetry ++;
|
|
if (top.awFocusRetry < 8)
|
|
{
|
|
dump("_awSetFocus failed, try it again...\n");
|
|
setTimeout("_awSetFocus();", 0);
|
|
}
|
|
else
|
|
dump("_awSetFocus failed, forget about it!\n");
|
|
}
|
|
}
|
|
|
|
function awTabFromRecipient(element, event)
|
|
{
|
|
//If we are the last element in the listbox, we don't want to create a new row.
|
|
if (element == awGetInputElement(top.MAX_RECIPIENTS))
|
|
top.doNotCreateANewRow = true;
|
|
}
|
|
|
|
function DragOverAddressListTree(event)
|
|
{
|
|
var validFlavor = false;
|
|
var dragSession = gDragService.getCurrentSession();
|
|
|
|
// XXX add support for other flavors here
|
|
if (dragSession.isDataFlavorSupported("text/x-moz-address")) {
|
|
dragSession.canDrop = true;
|
|
}
|
|
}
|
|
|
|
function DropOnAddressListTree(event)
|
|
{
|
|
var dragSession = gDragService.getCurrentSession();
|
|
var trans;
|
|
|
|
try {
|
|
trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
|
|
trans.addDataFlavor("text/x-moz-address");
|
|
}
|
|
catch (ex) {
|
|
return;
|
|
}
|
|
|
|
for ( var i = 0; i < dragSession.numDropItems; ++i )
|
|
{
|
|
dragSession.getData ( trans, i );
|
|
var dataObj = new Object();
|
|
var bestFlavor = new Object();
|
|
var len = new Object();
|
|
trans.getAnyTransferData ( bestFlavor, dataObj, len );
|
|
if ( dataObj ) dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsString);
|
|
if ( !dataObj ) continue;
|
|
|
|
// pull the URL out of the data object
|
|
var address = dataObj.data.substring(0, len.value);
|
|
if (!address)
|
|
continue;
|
|
|
|
DropListAddress(event.target, address);
|
|
}
|
|
}
|
|
|
|
function DropListAddress(target, address)
|
|
{
|
|
awClickEmptySpace(target, true); //that will automatically set the focus on a new available row, and make sure is visible
|
|
if (top.MAX_RECIPIENTS == 0)
|
|
top.MAX_RECIPIENTS = 1;
|
|
var lastInput = awGetInputElement(top.MAX_RECIPIENTS);
|
|
lastInput.value = address;
|
|
awAppendNewRow(true);
|
|
}
|