gecko-dev/mailnews/compose/resources/content/addressingWidgetOverlay.js

382 lines
8.6 KiB
JavaScript

/*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
function FillRecipientTypeCombobox()
{
top.MAX_RECIPIENTS = 1;
var body;
for ( var row = 2; row <= top.MAX_RECIPIENTS; row++ )
{
body = document.getElementById('addressWidgetBody');
awCopyNode(awGetTreeItem(1), body, 0);
}
}
function Recipients2CompFields(msgCompFields)
{
if (msgCompFields)
{
var i = 1;
var addrTo = "";
var addrCc = "";
var addrBcc = "";
var addrReply = "";
var addrNg = "";
var addrFollow = "";
var addrOther = "";
var to_Sep = "";
var cc_Sep = "";
var bcc_Sep = "";
var reply_Sep = "";
var ng_Sep = "";
var follow_Sep = "";
while ((inputField = awGetInputElement(i)))
{
fieldValue = inputField.value;
if (fieldValue != "")
{
switch (awGetPopupElement(i).value)
{
case "addr_to" : addrTo += to_Sep + fieldValue; to_Sep = ","; break;
case "addr_cc" : addrCc += cc_Sep + fieldValue; cc_Sep = ","; break;
case "addr_bcc" : addrBcc += bcc_Sep + fieldValue; bcc_Sep = ","; break;
case "addr_reply" : addrReply += reply_Sep + fieldValue; reply_Sep = ","; break;
case "addr_newsgroups" : addrNg += ng_Sep + fieldValue; ng_Sep = ","; break;
case "addr_followup" : addrFollow += follow_Sep + fieldValue; follow_Sep = ","; break;
case "addr_other" : addrOther += other_header + ": " + fieldValue + "\n"; break;
}
}
i ++;
}
msgCompFields.SetTo(addrTo);
msgCompFields.SetCc(addrCc);
msgCompFields.SetBcc(addrBcc);
msgCompFields.SetReplyTo(addrReply);
msgCompFields.SetNewsgroups(addrNg);
msgCompFields.SetFollowupTo(addrFollow);
msgCompFields.SetOtherRandomHeaders(addrOther);
}
else
dump("Message Compose Error: msgCompFields is null (ExtractRecipients)");
}
function CompFields2Recipients(msgCompFields)
{
if (msgCompFields)
{
var row = 1;
row = awSetInputAndPopup(row, msgCompFields.GetTo(), "addr_to");
row = awSetInputAndPopup(row, msgCompFields.GetCc(), "addr_cc");
row = awSetInputAndPopup(row, msgCompFields.GetBcc(), "addr_bcc");
row = awSetInputAndPopup(row, msgCompFields.GetReplyTo(), "addr_reply");
row = awSetInputAndPopup(row, msgCompFields.GetOtherRandomHeaders(), "addr_other");
row = awSetInputAndPopup(row, msgCompFields.GetNewsgroups(), "addr_newsgroups");
row = awSetInputAndPopup(row, msgCompFields.GetFollowupTo(), "addr_followup");
if ( row > 1 ) row--;
// remove extra rows
while ( top.MAX_RECIPIENTS > row )
awRemoveRow(top.MAX_RECIPIENTS);
}
}
function awSetInputAndPopup(firstRow, inputValue, popupValue)
{
var row = firstRow;
if ( inputValue && popupValue )
{
var addressArray = inputValue.split(",");
for ( var index = 0; index < addressArray.length; index++ )
{
// remove leading spaces
while ( addressArray[index][0] == " " )
addressArray[index] = addressArray[index].substring(1, addressArray[index].length);
// we can add one row if trying to add just beyond current size
if ( row == (top.MAX_RECIPIENTS + 1))
{
var body = document.getElementById('addressWidgetBody');
awCopyNode(awGetTreeItem(1), body, 0);
top.MAX_RECIPIENTS++;
}
// if row is legal then set the values
if ( row <= top.MAX_RECIPIENTS )
{
awGetInputElement(row).value = addressArray[index];
awGetPopupElement(row).value = popupValue;
row++;
}
}
return(row);
}
return(firstRow);
}
function awClickRow()
{
dump("awClickRow\n");
return false;
}
function awClickEmptySpace()
{
// FIX ME - not currently using this because of a bug in the tree
var lastInput = awGetInputElement(top.MAX_RECIPIENTS);
if ( lastInput && lastInput.value )
{
awAppendNewRow();
}
else
lastInput.focus();
}
function awReturnHit(inputElement)
{
var row = awGetRowByInputElement(inputElement);
if ( inputElement.value )
{
var nextInput = awGetInputElement(row+1);
if ( !nextInput )
awAppendNewRow();
else
nextInput.focus();
}
else
{
// FIX ME - should tab to next field after addressing widget...probably subjec
}
}
function awAppendNewRow()
{
var body = document.getElementById('addressWidgetBody');
var treeitem1 = awGetTreeItem(1);
if ( body && treeitem1 )
{
awCopyNode(treeitem1, body, 0);
top.MAX_RECIPIENTS++;
// focus on new input widget
var newInput = awGetInputElement(top.MAX_RECIPIENTS);
if ( newInput )
newInput.focus();
}
}
// functions for accessing the elements in the addressing widget
function awGetPopupElement(row)
{
var treerow = awGetTreeRow(row);
if ( treerow )
{
var popup = treerow.getElementsByTagName('SELECT');
if ( popup && popup.length == 1 )
return popup[0];
}
return 0;
}
function awGetInputElement(row)
{
var treerow = awGetTreeRow(row);
if ( treerow )
{
var input = treerow.getElementsByTagName('INPUT');
if ( input && input.length == 1 )
return input[0];
}
return 0;
}
function awGetTreeRow(row)
{
var body = document.getElementById('addressWidgetBody');
if ( body && row > 0)
{
var treerows = body.getElementsByTagName('treerow');
if ( treerows && treerows.length >= row )
return treerows[row-1];
}
return 0;
}
function awGetTreeItem(row)
{
var body = document.getElementById('addressWidgetBody');
if ( body && row > 0)
{
var treeitems = body.getElementsByTagName('treeitem');
if ( treeitems && treeitems.length >= row )
return treeitems[row-1];
}
return 0;
}
function awGetRowByInputElement(inputElement)
{
if ( inputElement )
{
var treerow;
var inputElementTreerow = inputElement.parentNode.parentNode;
if ( inputElementTreerow )
{
for ( var row = 1; (treerow = awGetTreeRow(row)); row++ )
{
if ( treerow == inputElementTreerow )
return row;
}
}
}
return 0;
}
// Copy Node - copy this node and insert ahead of the (before) node. Append to end if before=0
function awCopyNode(node, parentNode, beforeNode)
{
dump("awCopyNode\n");
var newNode = awCopyNodeAndChildren(node);
if ( beforeNode )
parentNode.insertBefore(newNode, beforeNode);
else
parentNode.appendChild(newNode);
}
function awCopyNodeAndChildren(node)
{
var newNode;
if ( node.nodeName == "#text" )
{
// create new text node
newNode = document.createTextNode(node.data);
}
else
{
// create new node
if ( node.nodeName[0] >= 'A' && node.nodeName[0] <= 'Z' )
newNode = createHTML(node.nodeName);
else
newNode = document.createElement(node.nodeName);
var attributes = node.attributes;
if ( attributes && attributes.length )
{
var attrNode, name, value;
// copy attributes into new node
for ( var index = 0; index < attributes.length; index++ )
{
attrNode = attributes.item(index);
name = attrNode.nodeName;
value = attrNode.nodeValue;
if ( name != 'id' )
newNode.setAttribute(name, value);
}
}
if ( node.nodeName == "SELECT" )
{
// copy options inside of SELECT
if ( newNode )
{
for ( var index = 0; index < node.options.length; index++ )
{
var option = new Option(node.options.item(index).text,
node.options.item(index).value)
newNode.add(option, null);
}
}
}
else
{
// children of nodes
if ( node.childNodes )
{
var childNode;
for ( var child = 0; child < node.childNodes.length; child++ )
{
childNode = awCopyNodeAndChildren(node.childNodes[child]);
newNode.appendChild(childNode);
}
}
}
}
return newNode;
}
function createHTML(tag)
{
return document.createElementWithNameSpace(tag, "http://www.w3.org/TR/REC-html40");
}
// remove row
function awRemoveRow(row)
{
var body = document.getElementById('addressWidgetBody');
awRemoveNodeAndChildren(body, awGetTreeItem(row));
top.MAX_RECIPIENTS--;
}
function awRemoveNodeAndChildren(parent, nodeToRemove)
{
// children of nodes
var childNode;
while ( nodeToRemove.childNodes && nodeToRemove.childNodes.length )
{
childNode = nodeToRemove.childNodes[0];
awRemoveNodeAndChildren(nodeToRemove, childNode);
}
parent.removeChild(nodeToRemove);
}