/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* The contents of this file are subject to the Netscape 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/NPL/
*
* 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 Netscape are
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
* Rights Reserved.
*/
var msgCompDeliverMode = Components.interfaces.nsIMsgCompDeliverMode;
var msgCompSendFormat = Components.interfaces.nsIMsgCompSendFormat;
var accountManagerProgID = "component://netscape/messenger/account-manager";
var accountManager = Components.classes[accountManagerProgID].getService(Components.interfaces.nsIMsgAccountManager);
var messengerMigratorProgID = "component://netscape/messenger/migrator";
var msgComposeService = Components.classes["component://netscape/messengercompose"].getService();
msgComposeService = msgComposeService.QueryInterface(Components.interfaces.nsIMsgComposeService);
var msgCompose = null;
var MAX_RECIPIENTS = 0;
var currentAttachment = null;
var documentLoaded = false;
var Bundle = srGetStrBundle("chrome://messengercompose/locale/composeMsgs.properties");
var other_header = "";
var update_compose_title_as_you_type = true;
var sendFormat = msgCompSendFormat.AskUser;
var prefs = Components.classes["component://netscape/preferences"].getService();
if (prefs) {
prefs = prefs.QueryInterface(Components.interfaces.nsIPref);
if (prefs) {
try {
update_compose_title_as_you_type = prefs.GetBoolPref("mail.update_compose_title_as_you_type");
}
catch (ex) {
dump("failed to get the mail.update_compose_title_as_you_type pref\n");
}
try {
other_header = prefs.CopyCharPref("mail.compose.other.header");
}
catch (ex) {
dump("failed to get the mail.compose.other.header pref\n");
}
}
}
var stateListener = {
NotifyComposeFieldsReady: function() {
// dump("\n RECEIVE NotifyComposeFieldsReady\n\n");
documentLoaded = true;
msgCompose.UnregisterStateListener(stateListener);
}
};
var currentMailSendCharset = null;
function GetArgs()
{
var args = new Object();
var originalData = document.getElementById("args").getAttribute("value");
var data = "";
var separator = String.fromCharCode(1);
var quoteChar = "";
var prevChar = "";
var nextChar = "";
for (var i = 0; i < originalData.length; i ++, prevChar = aChar)
{
var aChar = originalData.charAt(i)
var aCharCode = originalData.charCodeAt(i)
if ( i < originalData.length - 1)
nextChar = originalData.charAt(i + 1);
else
nextChar = "";
if (aChar == quoteChar && (nextChar == "," || nextChar == ""))
{
quoteChar = "";
data += aChar;
}
else if ((aCharCode == 39 || aCharCode == 34) && prevChar == "=") //quote or double quote
{
if (quoteChar == "")
quoteChar = aChar;
data += aChar;
}
else if (aChar == ",")
{
if (quoteChar == "")
data += separator;
else
data += aChar
}
else
data += aChar
}
var pairs = data.split(separator);
// dump("Compose: argument: {" + data + "}\n");
for (var i = pairs.length - 1; i >= 0; i--)
{
var pos = pairs[i].indexOf('=');
if (pos == -1)
continue;
var argname = pairs[i].substring(0, pos);
var argvalue = pairs[i].substring(pos + 1);
if (argvalue.charAt(0) == "'" && argvalue.charAt(argvalue.length - 1) == "'")
args[argname] = argvalue.substring(1, argvalue.length - 1);
else
args[argname] = unescape(argvalue);
dump("[" + argname + "=" + args[argname] + "]\n");
}
return args;
}
function WaitFinishLoadingDocument()
{
if (documentLoaded)
{
CompFields2Recipients(msgCompose.compFields);
SetComposeWindowTitle(13);
AdjustFocus();
}
else
setTimeout("WaitFinishLoadingDocument();", 200);
}
function ComposeStartup()
{
dump("Compose: ComposeStartup\n");
// Get arguments
var args = GetArgs();
// fill in Identity combobox
var identitySelect = document.getElementById("msgIdentity");
if (identitySelect) {
fillIdentitySelect(identitySelect);
}
var identity;
if (args.preselectid)
identity = getIdentityForKey(args.preselectid);
else
{
// no preselect, so use the default account
var identities = accountManager.defaultAccount.identities;
identity = identities.QueryElementAt(0, Components.interfaces.nsIMsgIdentity);
}
identitySelect.value = identity.key;
// fill in Recipient type combobox
FillRecipientTypeCombobox();
if (msgComposeService)
{
// this is frustrating, we need to convert the preselect identity key
// back to an identity, to pass to initcompose
// it would be nice if there was some way to actually send the
// identity through "args"
msgCompose = msgComposeService.InitCompose(window, args.originalMsg, args.type, args.format, args.fieldsAddr, identity);
if (msgCompose)
{
//Creating a Editor Shell
var editorShell = Components.classes["component://netscape/editor/editorshell"].createInstance();
editorShell = editorShell.QueryInterface(Components.interfaces.nsIEditorShell);
if (!editorShell)
{
dump("Failed to create editorShell!\n");
return;
}
// save the editorShell in the window. The editor JS expects to find it there.
window.editorShell = editorShell;
window.editorShell.Init();
dump("Created editorShell\n");
contentWindow = window.content;
// setEditorType MUST be call before setContentWindow
if (msgCompose.composeHTML)
{
window.editorShell.SetEditorType("htmlmail");
dump("editor initialized in HTML mode\n");
}
else
{
//Remove HTML toolbar as we are editing in plain text mode
document.getElementById("FormatToolbar").setAttribute("hidden", true);
window.editorShell.SetEditorType("text");
try
{
window.editorShell.wrapColumn = msgCompose.wrapLength;
}
catch (e)
{
dump("### window.editorShell.wrapColumn exception text: " + e + " - failed\n");
}
dump("editor initialized in PLAIN TEXT mode\n");
}
window.editorShell.SetContentWindow(contentWindow);
window.editorShell.SetWebShellWindow(window);
window.editorShell.SetToolbarWindow(window);
var msgCompFields = msgCompose.compFields;
if (msgCompFields)
{
if (args.body) //We need to set the body before setting
//msgCompose.editor;
{
if (args.bodyislink == "true" && msgCompose.composeHTML)
{
msgCompFields.SetBody("" + unescape(args.body)
+ "");
}
else
{
msgCompFields.SetBody(args.body);
}
}
if (args.to)
msgCompFields.SetTo(args.to);
if (args.cc)
msgCompFields.SetCc(args.cc);
if (args.bcc)
msgCompFields.SetBcc(args.bcc);
if (args.newsgroups)
msgCompFields.SetNewsgroups(args.newsgroups);
if (args.subject)
msgCompFields.SetSubject(args.subject);
if (args.attachment)
msgCompFields.SetAttachments(args.attachment);
var subjectValue = msgCompFields.GetSubject();
if (subjectValue != "") {
document.getElementById("msgSubject").value = subjectValue;
}
var attachmentValue = msgCompFields.GetAttachments();
if (attachmentValue != "") {
var atts = attachmentValue.split(",");
for (var i=0; i < atts.length; i++)
{
AddAttachment(atts[i]);
}
}
}
// Now that we have an Editor AppCore, we can finish to initialize the Compose AppCore
msgCompose.editor = window.editorShell;
msgCompose.RegisterStateListener(stateListener);
WaitFinishLoadingDocument();
}
}
}
function MsgAccountWizard()
{
var result = {refresh: false};
window.openDialog("chrome://messenger/content/AccountWizard.xul",
"AccountWizard", "chrome,modal", result);
if (result.refresh) {
dump("anything to refresh here?\n");
}
}
function MigratePrefsIfNecessary()
{
var accounts = accountManager.accounts;
// as long as we have some accounts, we're fine.
if (accounts.Count() > 0) return;
try {
messengerMigrator = Components.classes[messengerMigratorProgID].getService(Components.interfaces.nsIMessengerMigrator);
messengerMigrator.UpgradePrefs();
}
catch (ex) {
var alertText = Bundle.GetStringFromName("noIdentities");
window.alert(alertText);
MsgAccountWizard();
}
}
function ComposeLoad()
{
dump("\nComposeLoad from XUL\n");
MigratePrefsIfNecessary();
var selectNode = document.getElementById('msgRecipientType#1');
if (other_header != "") {
var opt = new Option(other_header + ":", "addr_other");
selectNode.add(opt, null);
}
// See if we got arguments.
if ( window.arguments && window.arguments[0] != null ) {
// Window was opened via window.openDialog. Copy argument
// and perform compose initialization (as if we were
// opened via toolkitCore's ShowWindowWithArgs).
document.getElementById( "args" ).setAttribute( "value", window.arguments[0] );
ComposeStartup();
}
}
function ComposeUnload(calledFromExit)
{
dump("\nComposeUnload from XUL\n");
if (msgCompose && msgComposeService)
msgComposeService.DisposeCompose(msgCompose, false);
//...and what's about the editor appcore, how can we release it?
}
function SetDocumentCharacterSet(aCharset)
{
dump("SetDocumentCharacterSet Callback!\n");
dump(aCharset + "\n");
if (msgCompose) {
msgCompose.SetDocumentCharset(aCharset);
currentMailSendCharset = aCharset;
}
else
dump("Compose has not been created!\n");
}
function SetDefaultMailSendCharacterSet()
{
// Set the current menu selection as the default
if (currentMailSendCharset != null) {
// try to get preferences service
var prefs = null;
try {
prefs = Components.classes['component://netscape/preferences'];
prefs = prefs.getService();
prefs = prefs.QueryInterface(Components.interfaces.nsIPref);
}
catch (ex) {
dump("failed to get prefs service!\n");
prefs = null;
}
if (msgCompose) {
// write to the pref file
prefs.SetCharPref("mailnews.send_default_charset", currentMailSendCharset);
dump("Set send_default_charset to" + currentMailSendCharset + "\n");
}
else
dump("Compose has not been created!\n");
}
}
function InitCharsetMenuCheckMark()
{
// dump("msgCompose.compFields is " + msgCompose.compFields.GetCharacterSet() + "\n");
// return if the charset is already set explitily
if (currentMailSendCharset != null) {
dump("already set to " + currentMailSendCharset + "\n");
return;
}
var menuitem;
// try to get preferences service
var prefs = null;
try {
prefs = Components.classes['component://netscape/preferences'];
prefs = prefs.getService();
prefs = prefs.QueryInterface(Components.interfaces.nsIPref);
}
catch (ex) {
dump("failed to get prefs service!\n");
prefs = null;
}
var send_default_charset = prefs.CopyCharPref("mailnews.send_default_charset");
var compFieldsCharset = msgCompose.compFields.GetCharacterSet();
compFieldsCharset = compFieldsCharset.toUpperCase();
if (compFieldsCharset == "US-ASCII")
compFieldsCharset = "ISO-8859-1";
send_default_charset = send_default_charset.toUpperCase();
menuitem = document.getElementById(compFieldsCharset);
// charset may have been set implicitly in case of reply/forward
if (send_default_charset != compFieldsCharset) {
menuitem.setAttribute('checked', 'true');
return;
}
// use pref default
menuitem = document.getElementById(send_default_charset);
if (menuitem)
menuitem.setAttribute('checked', 'true');
// Set a document charset to a default mail send charset.
SetDocumentCharacterSet(send_default_charset);
}
function GenericSendMessage( msgType )
{
dump("GenericSendMessage from XUL\n");
dump("Identity = " + getCurrentIdentity() + "\n");
if (msgCompose != null)
{
var msgCompFields = msgCompose.compFields;
if (msgCompFields)
{
Recipients2CompFields(msgCompFields);
msgCompFields.SetSubject(document.getElementById("msgSubject").value);
dump("attachments = " + GenerateAttachmentsString() + "\n");
try {
msgCompFields.SetAttachments(GenerateAttachmentsString());
}
catch (ex) {
dump("failed to SetAttachments\n");
}
// Before sending the message, check what to do with HTML message, eventually abort.
action = DetermineHTMLAction();
if (action == msgCompSendFormat.AskUser)
{
var result = {action:msgCompSendFormat.PlainText, abort:false};
window.openDialog("chrome://messengercompose/content/askSendFormat.xul",
"askSendFormatDialog", "chrome,modal",
result);
if (result.abort)
return;
action = result.action;
}
switch (action)
{
case msgCompSendFormat.PlainText:
msgCompFields.SetTheForcePlainText(true);
msgCompFields.SetUseMultipartAlternativeFlag(false);
break;
case msgCompSendFormat.HTML:
msgCompFields.SetTheForcePlainText(false);
msgCompFields.SetUseMultipartAlternativeFlag(false);
break;
case msgCompSendFormat.Both:
msgCompFields.SetTheForcePlainText(false);
msgCompFields.SetUseMultipartAlternativeFlag(true);
break;
default: dump("\###SendMessage Error: invalid action value\n"); return;
}
try {
msgCompose.SendMsg(msgType, getCurrentIdentity(), null);
}
catch (ex) {
dump("failed to SendMsg\n");
}
}
}
else
dump("###SendMessage Error: composeAppCore is null!\n");
}
function SendMessage()
{
dump("SendMessage from XUL\n");
// 0 = nsMsgDeliverNow
// RICHIE: We should really have a way of using constants and not
// hardcoded numbers for the first argument
GenericSendMessage(msgCompDeliverMode.Now);
}
function SendMessageLater()
{
dump("SendMessageLater from XUL\n");
// 1 = nsMsgQueueForLater
// RICHIE: We should really have a way of using constants and not
// hardcoded numbers for the first argument
GenericSendMessage(msgCompDeliverMode.Later);
}
function SaveAsDraft()
{
dump("SaveAsDraft from XUL\n");
// 4 = nsMsgSaveAsDraft
// RICHIE: We should really have a way of using constants and not
// hardcoded numbers for the first argument
GenericSendMessage(msgCompDeliverMode.SaveAsDraft);
}
function SaveAsTemplate()
{
dump("SaveAsDraft from XUL\n");
// 5 = nsMsgSaveAsTemplate
// RICHIE: We should really have a way of using constants and not
// hardcoded numbers for the first argument
GenericSendMessage(msgCompDeliverMode.SaveAsTemplate);
}
function MessageFcc(menuItem)
{
// Get the id for the folder we're FCC into
// This is the additional FCC in addition to the
// default FCC
destUri = menuItem.getAttribute('id');
if (msgCompose)
{
var msgCompFields = msgCompose.compFields;
if (msgCompFields)
{
if (msgCompFields.GetFcc2() == destUri)
{
msgCompFields.SetFcc2("nocopy://");
dump("FCC2: none\n");
}
else
{
msgCompFields.SetFcc2(destUri);
dump("FCC2: " + destUri + "\n");
}
}
}
}
function PriorityMenuSelect(target)
{
dump("Set Message Priority to " + target.getAttribute('id') + "\n");
if (msgCompose)
{
var msgCompFields = msgCompose.compFields;
if (msgCompFields)
msgCompFields.SetPriority(target.getAttribute('id'));
}
}
function ReturnReceiptMenuSelect()
{
if (msgCompose)
{
var msgCompFields = msgCompose.compFields;
if (msgCompFields)
{
if (msgCompFields.GetReturnReceipt())
{
dump("Set Return Receipt to FALSE\n");
msgCompFields.SetReturnReceipt(false);
}
else
{
dump("Set Return Receipt to TRUE\n");
msgCompFields.SetReturnReceipt(true);
}
}
}
}
function UUEncodeMenuSelect()
{
if (msgCompose)
{
var msgCompFields = msgCompose.compFields;
if (msgCompFields)
{
if (msgCompFields.GetUUEncodeAttachments())
{
dump("Set Return UUEncodeAttachments to FALSE\n");
msgCompFields.SetUUEncodeAttachments(false);
}
else
{
dump("Set Return UUEncodeAttachments to TRUE\n");
msgCompFields.SetUUEncodeAttachments(true);
}
}
}
}
function OutputFormatMenuSelect(target)
{
dump("Set Message Format to " + target.getAttribute('id') + "\n");
if (msgCompose)
{
var msgCompFields = msgCompose.compFields;
if (msgCompFields)
{
switch (target.getAttribute('id'))
{
case "1": sendFormat = msgCompSendFormat.AskUser; break;
case "2": sendFormat = msgCompSendFormat.PlainText; break;
case "3": sendFormat = msgCompSendFormat.HTML; break;
case "4": sendFormat = msgCompSendFormat.Both; break;
default: break;
}
}
}
}
function SelectAddress()
{
var msgCompFields = msgCompose.compFields;
Recipients2CompFields(msgCompFields);
var toAddress = msgCompFields.GetTo();
var ccAddress = msgCompFields.GetCc();
var bccAddress = msgCompFields.GetBcc();
dump("toAddress: " + toAddress + "\n");
window.openDialog("chrome://addressbook/content/abSelectAddressesDialog.xul",
"",
"chrome,resizable,modal",
{composeWindow:top.window,
msgCompFields:msgCompFields,
toAddress:toAddress,
ccAddress:ccAddress,
bccAddress:bccAddress});
}
function queryISupportsArray(supportsArray, iid) {
var result = new Array;
for (var i=0; i= 0; item-- )
body.removeChild(bucketTree.selectedItems[item]);
}
}
}
function AttachVCard()
{
dump("AttachVCard()\n");
}
function DetermineHTMLAction()
{
if (! msgCompose.composeHTML)
return msgCompSendFormat.PlainText;
if (sendFormat == msgCompSendFormat.AskUser)
{
//Well, before we ask, see if we can figure out what to do for ourselves
var noHtmlRecipients;
var noHtmlnewsgroups;
//Check the address book for the HTML property for each recipient
try {
noHtmlRecipients = msgCompose.GetNoHtmlRecipients(null);
} catch(ex)
{
var msgCompFields = msgCompose.compFields;
noHtmlRecipients = msgCompFields.GetTo() + "," + msgCompFields.GetCc() + "," + msgCompFields.GetBcc();
}
dump("DetermineHTMLAction: noHtmlRecipients are " + noHtmlRecipients + "\n");
//Check newsgroups now...
try {
noHtmlnewsgroups = msgCompose.GetNoHtmlNewsgroups(null);
} catch(ex)
{
noHtmlnewsgroups = msgCompose.compFields.GetNewsgroups();
}
if (noHtmlRecipients != "" || noHtmlnewsgroups != "")
{
//Do we really need to send in HTML?
//FIX ME: need to ask editor is the body containg any formatting or non plaint text elements.
if (noHtmlnewsgroups == "")
{
//See if a preference has been set to tell us what to do. Note that we do not honor that
//preference for newsgroups. Only for e-mail addresses.
action = prefs.GetIntPref("mail.default_html_action");
switch (action)
{
case msgCompSendFormat.PlainText :
case msgCompSendFormat.HTML :
case msgCompSendFormat.Both :
return action;
}
}
return msgCompSendFormat.AskUser;
}
else
return msgCompSendFormat.HTML;
}
return sendFormat;
}