# -*- 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. # # Contributors: timeless # slucy@objectivesw.co.uk # Håkan Waara # Jan Varga # Seth Spitzer # David Bienvenu const MSG_FLAG_READ = 0x000001; const MSG_FLAG_IMAP_DELETED = 0x200000; const MSG_FLAG_MDN_REPORT_NEEDED = 0x400000; const MSG_FLAG_MDN_REPORT_SENT = 0x800000; const MDN_DISPOSE_TYPE_DISPLAYED = 0; const ADDR_DB_LARGE_COMMIT = 1; const MSG_DB_LARGE_COMMIT = 1; const kClassicMailLayout = 0; const kWideMailLayout = 1; const kVerticalMailLayout = 2; // Per message headder flags to keep track of whether the user is allowing remote // content for a particular message. // if you change or add more values to these constants, be sure to modify // the corresponding definitions in nsMsgContentPolicy.cpp const kNoRemoteContentPolicy = 0; const kBlockRemoteContent = 1; const kAllowRemoteContent = 2; var gMessengerBundle; var gPromptService; var gOfflinePromptsBundle; var gOfflineManager; var gWindowManagerInterface; var gPrefBranch = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch(null); var gPrintSettings = null; var gWindowReuse = 0; var gMarkViewedMessageAsReadTimer = null; // if the user has configured the app to mark a message as read if it is viewed for more than n seconds var gTimelineService = null; var gTimelineEnabled = ("@mozilla.org;timeline-service;1" in Components.classes); if (gTimelineEnabled) { try { gTimelineEnabled = gPrefBranch.getBoolPref("mailnews.timeline_is_enabled"); if (gTimelineEnabled) { gTimelineService = Components.classes["@mozilla.org;timeline-service;1"].getService(Components.interfaces.nsITimelineService); } } catch (ex) { gTimelineEnabled = false; } } var disallow_classes_no_html = 1; /* the user preference, if HTML is not allowed. I assume, that the user could have set this to a value > 1 in his prefs.js or user.js, but that the value will not change during runtime other than through the MsgBody*() functions below.*/ // Disable the new account menu item if the account preference is locked. // Two other affected areas are the account central and the account manager // dialog. function menu_new_init() { if (!gMessengerBundle) gMessengerBundle = document.getElementById("bundle_messenger"); var newAccountItem = document.getElementById('newAccountMenuItem'); if (gPrefBranch.prefIsLocked("mail.disable_new_account_addition")) newAccountItem.setAttribute("disabled","true"); // Change "New Folder..." menu according to the context var folderArray = GetSelectedMsgFolders(); if (folderArray.length == 0) return; var msgFolder = folderArray[0]; var isServer = msgFolder.isServer; var serverType = msgFolder.server.type; var canCreateNew = msgFolder.canCreateSubfolders; var isInbox = IsSpecialFolder(msgFolder, MSG_FOLDER_FLAG_INBOX, false); var isIMAPFolder = serverType == "imap"; var ioService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var showNew = ((serverType != 'nntp') && canCreateNew) || isInbox; ShowMenuItem("menu_newFolder", showNew); ShowMenuItem("menu_newVirtualFolder", showNew); EnableMenuItem("menu_newFolder", !isIMAPFolder || !ioService.offline); EnableMenuItem("menu_newVirtualFolder", true); if (showNew) SetMenuItemLabel("menu_newFolder", gMessengerBundle.getString((isServer || isInbox) ? "newFolder" : "newSubfolder")); } function goUpdateMailMenuItems(commandset) { // dump("Updating commands for " + commandset.id + "\n"); for (var i = 0; i < commandset.childNodes.length; i++) { var commandID = commandset.childNodes[i].getAttribute("id"); if (commandID) { goUpdateCommand(commandID); } } } function file_init() { document.commandDispatcher.updateCommands('create-menu-file'); } function InitEditMessagesMenu() { goSetMenuValue('cmd_delete', 'valueDefault'); goSetAccessKey('cmd_delete', 'valueDefaultAccessKey'); document.commandDispatcher.updateCommands('create-menu-edit'); } function InitGoMessagesMenu() { document.commandDispatcher.updateCommands('create-menu-go'); } function view_init() { if (!gMessengerBundle) gMessengerBundle = document.getElementById("bundle_messenger"); var message_menuitem=document.getElementById('menu_showMessage'); if (message_menuitem) { var message_menuitem_hidden = message_menuitem.getAttribute("hidden"); if(message_menuitem_hidden != "true"){ message_menuitem.setAttribute('checked', !IsMessagePaneCollapsed()); message_menuitem.setAttribute('disabled', gAccountCentralLoaded); } } // Disable some menus if account manager is showing var sort_menuitem = document.getElementById('viewSortMenu'); if (sort_menuitem) { sort_menuitem.setAttribute("disabled", gAccountCentralLoaded); } var view_menuitem = document.getElementById('viewMessageViewMenu'); if (view_menuitem) { view_menuitem.setAttribute("disabled", gAccountCentralLoaded); } var threads_menuitem = document.getElementById('viewMessagesMenu'); if (threads_menuitem) { threads_menuitem.setAttribute("disabled", gAccountCentralLoaded); } // Initialize the View Attachment Inline menu var viewAttachmentInline = pref.getBoolPref("mail.inline_attachments"); document.getElementById("viewAttachmentsInlineMenuitem").setAttribute("checked", viewAttachmentInline ? "true" : "false"); document.commandDispatcher.updateCommands('create-menu-view'); } function InitViewLayoutStyleMenu() { var paneConfig = pref.getIntPref("mail.pane_config.dynamic"); switch (paneConfig) { case kClassicMailLayout: id ="messagePaneClassic"; break; case kWideMailLayout: id = "messagePaneWide"; break; case kVerticalMailLayout: id = "messagePaneVertical"; break; } var layoutStyleMenuitem = document.getElementById(id); if (layoutStyleMenuitem) layoutStyleMenuitem.setAttribute("checked", "true"); } function setSortByMenuItemCheckState(id, value) { var menuitem = document.getElementById(id); if (menuitem) { menuitem.setAttribute("checked", value); } } function InitViewSortByMenu() { var sortType = gDBView.sortType; setSortByMenuItemCheckState("sortByDateMenuitem", (sortType == nsMsgViewSortType.byDate)); setSortByMenuItemCheckState("sortByFlagMenuitem", (sortType == nsMsgViewSortType.byFlagged)); setSortByMenuItemCheckState("sortByOrderReceivedMenuitem", (sortType == nsMsgViewSortType.byId)); setSortByMenuItemCheckState("sortByPriorityMenuitem", (sortType == nsMsgViewSortType.byPriority)); setSortByMenuItemCheckState("sortBySizeMenuitem", (sortType == nsMsgViewSortType.bySize)); setSortByMenuItemCheckState("sortByStatusMenuitem", (sortType == nsMsgViewSortType.byStatus)); setSortByMenuItemCheckState("sortBySubjectMenuitem", (sortType == nsMsgViewSortType.bySubject)); setSortByMenuItemCheckState("sortByUnreadMenuitem", (sortType == nsMsgViewSortType.byUnread)); setSortByMenuItemCheckState("sortByLabelMenuitem", (sortType == nsMsgViewSortType.byLabel)); setSortByMenuItemCheckState("sortByJunkStatusMenuitem", (sortType == nsMsgViewSortType.byJunkStatus)); setSortByMenuItemCheckState("sortBySenderMenuitem", (sortType == nsMsgViewSortType.byAuthor)); setSortByMenuItemCheckState("sortByRecipientMenuitem", (sortType == nsMsgViewSortType.byRecipient)); setSortByMenuItemCheckState("sortByAttachmentsMenuitem", (sortType == nsMsgViewSortType.byAttachments)); var sortOrder = gDBView.sortOrder; var sortTypeSupportsGrouping = (sortType == nsMsgViewSortType.byAuthor || sortType == nsMsgViewSortType.byDate || sortType == nsMsgViewSortType.byPriority || sortType == nsMsgViewSortType.bySubject || sortType == nsMsgViewSortType.byLabel || sortType == nsMsgViewSortType.byRecipient || sortType == nsMsgViewSortType.byAccount || sortType == nsMsgViewSortType.byStatus); setSortByMenuItemCheckState("sortAscending", (sortOrder == nsMsgViewSortOrder.ascending)); setSortByMenuItemCheckState("sortDescending", (sortOrder == nsMsgViewSortOrder.descending)); var grouped = ((gDBView.viewFlags & nsMsgViewFlagsType.kGroupBySort) != 0); var threaded = ((gDBView.viewFlags & nsMsgViewFlagsType.kThreadedDisplay) != 0 && !grouped); var sortThreadedMenuItem = document.getElementById("sortThreaded"); var sortUnthreadedMenuItem = document.getElementById("sortUnthreaded"); sortThreadedMenuItem.setAttribute("checked", threaded); sortUnthreadedMenuItem.setAttribute("checked", !threaded && !grouped); sortThreadedMenuItem.setAttribute("disabled", !gDBView.supportsThreading); sortUnthreadedMenuItem.setAttribute("disabled", !gDBView.supportsThreading); var groupBySortOrderMenuItem = document.getElementById("groupBySort"); groupBySortOrderMenuItem.setAttribute("disabled", !gDBView.supportsThreading || !sortTypeSupportsGrouping); groupBySortOrderMenuItem.setAttribute("checked", grouped); } function InitViewMessagesMenu() { var viewFlags = (gDBView) ? gDBView.viewFlags : 0; var viewType = (gDBView) ? gDBView.viewType : 0; var allMenuItem = document.getElementById("viewAllMessagesMenuItem"); if(allMenuItem) allMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kUnreadOnly) == 0 && (viewType == nsMsgViewType.eShowAllThreads)); var unreadMenuItem = document.getElementById("viewUnreadMessagesMenuItem"); if(unreadMenuItem) unreadMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kUnreadOnly) != 0); var theadsWithUnreadMenuItem = document.getElementById("viewThreadsWithUnreadMenuItem"); if(theadsWithUnreadMenuItem) theadsWithUnreadMenuItem.setAttribute("checked", viewType == nsMsgViewType.eShowThreadsWithUnread); var watchedTheadsWithUnreadMenuItem = document.getElementById("viewWatchedThreadsWithUnreadMenuItem"); if(watchedTheadsWithUnreadMenuItem) watchedTheadsWithUnreadMenuItem.setAttribute("checked", viewType == nsMsgViewType.eShowWatchedThreadsWithUnread); var ignoredTheadsMenuItem = document.getElementById("viewIgnoredThreadsMenuItem"); if(ignoredTheadsMenuItem) ignoredTheadsMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kShowIgnored) != 0); } function InitViewMessageViewMenu() { var viewType = (gDBView) ? gDBView.viewType : 0; var currentViewValue = document.getElementById("viewPicker").value; var allMenuItem = document.getElementById("viewAll"); if(allMenuItem) allMenuItem.setAttribute("checked", currentViewValue == 0); // from msgViewPickerOveraly.xul var unreadMenuItem = document.getElementById("viewUnread"); if(unreadMenuItem) unreadMenuItem.setAttribute("checked", currentViewValue == 1); // from msgViewPickerOveraly.xul, for (var i = 1; i <= 5; i++) { var prefString = gPrefBranch.getComplexValue("mailnews.labels.description." + i, Components.interfaces.nsIPrefLocalizedString).data; var viewLabelMenuItem = document.getElementById("viewLabelMenuItem" + i); viewLabelMenuItem.setAttribute("label", prefString); viewLabelMenuItem.setAttribute("checked", (i == (currentViewValue - 1))); // 1=2-1, from msgViewPickerOveraly.xul, } viewRefreshCustomMailViews(currentViewValue); } function viewRefreshCustomMailViews(aCurrentViewValue) { // for each mail view in the msg view list, add a menu item var mailViewList = Components.classes["@mozilla.org/messenger/mailviewlist;1"].getService(Components.interfaces.nsIMsgMailViewList); // XXX TODO, fix code in msgViewPickerOverlay.js, to be like this. // remove any existing entries... var menupopupNode = document.getElementById('viewMessageViewPopup'); var userDefinedItems = menupopupNode.getElementsByAttribute("userdefined","true"); for (var i=0; userDefinedItems.item(i); ) { if (!menupopupNode.removeChild(userDefinedItems[i])) ++i; } // now rebuild the list var numItems = mailViewList.mailViewCount; var viewCreateCustomViewSeparator = document.getElementById('viewCreateCustomViewSeparator'); for (i = 0; i < numItems; i++) { var newMenuItem = document.createElement("menuitem"); newMenuItem.setAttribute("label", mailViewList.getMailViewAt(i).mailViewName); newMenuItem.setAttribute("userdefined", "true"); var oncommandStr = "ViewMessagesBy('userdefinedview" + (kLastDefaultViewIndex + i) + "');"; newMenuItem.setAttribute("oncommand", oncommandStr); var item = menupopupNode.insertBefore(newMenuItem, viewCreateCustomViewSeparator); item.setAttribute("value", kLastDefaultViewIndex + i); item.setAttribute("type", "radio"); // for checked item.setAttribute("name", "viewmessages"); // for checked item.setAttribute("checked", (kLastDefaultViewIndex + i == aCurrentViewValue)); } if (!numItems) viewCreateCustomViewSeparator.setAttribute('collapsed', true); else viewCreateCustomViewSeparator.removeAttribute('collapsed'); } // called by the View | Messages | Views ... menu items // see mailWindowOverlay.xul function ViewMessagesBy(id) { var viewPicker = document.getElementById('viewPicker'); viewPicker.selectedItem = document.getElementById(id); viewChange(viewPicker, viewPicker.value); } function InitMessageMenu() { var aMessage = GetFirstSelectedMessage(); var isNews = false; if(aMessage) { isNews = IsNewsMessage(aMessage); } //We show reply to Newsgroups only for news messages. var replyNewsgroupMenuItem = document.getElementById("replyNewsgroupMainMenu"); if(replyNewsgroupMenuItem) { replyNewsgroupMenuItem.setAttribute("hidden", isNews ? "" : "true"); } //For mail messages we say reply. For news we say ReplyToSender. var replyMenuItem = document.getElementById("replyMainMenu"); if(replyMenuItem) { replyMenuItem.setAttribute("hidden", !isNews ? "" : "true"); } var replySenderMenuItem = document.getElementById("replySenderMainMenu"); if(replySenderMenuItem) { replySenderMenuItem.setAttribute("hidden", isNews ? "" : "true"); } // we only kill and watch threads for news var threadMenuSeparator = document.getElementById("threadItemsSeparator"); if (threadMenuSeparator) { threadMenuSeparator.setAttribute("hidden", isNews ? "" : "true"); } var killThreadMenuItem = document.getElementById("killThread"); if (killThreadMenuItem) { killThreadMenuItem.setAttribute("hidden", isNews ? "" : "true"); } var watchThreadMenuItem = document.getElementById("watchThread"); if (watchThreadMenuItem) { watchThreadMenuItem.setAttribute("hidden", isNews ? "" : "true"); } // disable the move and copy menus if there are no messages selected. // disable the move menu if we can't delete msgs from the folder var moveMenu = document.getElementById("moveMenu"); var msgFolder = GetLoadedMsgFolder(); if(moveMenu) { var enableMenuItem = aMessage && msgFolder && msgFolder.canDeleteMessages; moveMenu.setAttribute("disabled", !enableMenuItem); } var copyMenu = document.getElementById("copyMenu"); if(copyMenu) copyMenu.setAttribute("disabled", !aMessage); // Disable Forward as/Label menu items if no message is selected var forwardAsMenu = document.getElementById("forwardAsMenu"); if(forwardAsMenu) forwardAsMenu.setAttribute("disabled", !aMessage); var labelMenu = document.getElementById("labelMenu"); if(labelMenu) labelMenu.setAttribute("disabled", !aMessage); // Disable mark menu when we're not in a folder var markMenu = document.getElementById("markMenu"); if(markMenu) markMenu.setAttribute("disabled", !msgFolder); document.commandDispatcher.updateCommands('create-menu-message'); } function InitViewHeadersMenu() { var id = null; var headerchoice = 1; try { headerchoice = pref.getIntPref("mail.show_headers"); } catch (ex) { dump("failed to get the header pref\n"); } switch (headerchoice) { case 2: id = "viewallheaders"; break; case 1: default: id = "viewnormalheaders"; break; } var menuitem = document.getElementById(id); if (menuitem) menuitem.setAttribute("checked", "true"); } function InitViewBodyMenu() { var html_as = 0; var prefer_plaintext = false; var disallow_classes = 0; try { prefer_plaintext = pref.getBoolPref("mailnews.display.prefer_plaintext"); html_as = pref.getIntPref("mailnews.display.html_as"); disallow_classes = pref.getIntPref("mailnews.display.disallow_mime_handlers"); if (disallow_classes > 0) disallow_classes_no_html = disallow_classes; // else disallow_classes_no_html keeps its inital value (see top) } catch (ex) { dump("failed to get the body plaintext vs. HTML prefs\n"); } var AllowHTML_checked = false; var Sanitized_checked = false; var AsPlaintext_checked = false; if (!prefer_plaintext && !html_as && !disallow_classes) AllowHTML_checked = true; else if (!prefer_plaintext && html_as == 3 && disallow_classes > 0) Sanitized_checked = true; else if (prefer_plaintext && html_as == 1 && disallow_classes > 0) AsPlaintext_checked = true; // else (the user edited prefs/user.js) check none of the radio menu items var AllowHTML_menuitem = document.getElementById("bodyAllowHTML"); var Sanitized_menuitem = document.getElementById("bodySanitized"); var AsPlaintext_menuitem = document.getElementById("bodyAsPlaintext"); if (AllowHTML_menuitem && Sanitized_menuitem && AsPlaintext_menuitem) { AllowHTML_menuitem.setAttribute("checked", AllowHTML_checked ? "true" : "false"); Sanitized_menuitem.setAttribute("checked", Sanitized_checked ? "true" : "false"); AsPlaintext_menuitem.setAttribute("checked", AsPlaintext_checked ? "true" : "false"); } else dump("Where is my View|Body menu?\n"); } function IsNewsMessage(messageUri) { return (/^news-message:/.test(messageUri)); } function IsImapMessage(messageUri) { return (/^imap-message:/.test(messageUri)); } function SetMenuItemLabel(menuItemId, customLabel) { var menuItem = document.getElementById(menuItemId); if(menuItem) menuItem.setAttribute('label', customLabel); } function InitMessageLabel(menuType) { var color; try { var msgFolder = GetLoadedMsgFolder(); var msgDatabase = msgFolder.getMsgDatabase(msgWindow); var numSelected = GetNumSelectedMessages(); var indices = GetSelectedIndices(gDBView); var isChecked = true; var checkedLabel; var msgKey; if (numSelected > 0) { msgKey = gDBView.getKeyAt(indices[0]); checkedLabel = msgDatabase.GetMsgHdrForKey(msgKey).label; if (numSelected > 1) { for (var i = 1; i < indices.length; i++) { msgKey = gDBView.getKeyAt(indices[i]); if (msgDatabase.GetMsgHdrForKey(msgKey).label == checkedLabel) { continue; } isChecked = false; break; } } } else { isChecked = false; } } catch(ex) { isChecked = false; } for (var label = 0; label <= 5; label++) { try { var prefString = gPrefBranch.getComplexValue("mailnews.labels.description." + label, Components.interfaces.nsIPrefLocalizedString); var formattedPrefString = gMessengerBundle.getFormattedString("labelMenuItemFormat" + label, [prefString], 1); var menuItemId = menuType + "-labelMenuItem" + label; var menuItem = document.getElementById(menuItemId); SetMenuItemLabel(menuItemId, formattedPrefString); if (isChecked && label == checkedLabel) menuItem.setAttribute("checked", "true"); else menuItem.setAttribute("checked", "false"); // commented out for now until UE decides on how to show the Labels menu items. // This code will color either the text or background for the Labels menu items. /***** if (label != 0) { color = prefBranch.getCharPref("mailnews.labels.color." + label); // this colors the text of the menuitem only. //menuItem.setAttribute("style", ("color: " + color)); // this colors the background of the menuitem and // when selected, text becomes white. //menuItem.setAttribute("style", ("color: #FFFFFF")); //menuItem.setAttribute("style", ("background-color: " + color)); } ****/ } catch(ex) { } } document.commandDispatcher.updateCommands('create-menu-label'); } function InitMessageMark() { var areMessagesRead = SelectedMessagesAreRead(); var readItem = document.getElementById("cmd_markAsRead"); if(readItem) readItem.setAttribute("checked", areMessagesRead); var areMessagesFlagged = SelectedMessagesAreFlagged(); var flaggedItem = document.getElementById("cmd_markAsFlagged"); if(flaggedItem) flaggedItem.setAttribute("checked", areMessagesFlagged); document.commandDispatcher.updateCommands('create-menu-mark'); } function UpdateJunkToolbarButton() { var junkButtonDeck = document.getElementById("junk-deck"); if (junkButtonDeck) junkButtonDeck.selectedIndex = SelectedMessagesAreJunk() ? 1 : 0; } function UpdateDeleteCommand() { var value = "value"; var uri = GetFirstSelectedMessage(); if (IsNewsMessage(uri)) value += "News"; else if (SelectedMessagesAreDeleted()) value += "IMAPDeleted"; if (GetNumSelectedMessages() < 2) value += "Message"; else value += "Messages"; goSetMenuValue("cmd_delete", value); goSetAccessKey("cmd_delete", value + "AccessKey"); } function SelectedMessagesAreDeleted() { try { return gDBView.hdrForFirstSelectedMessage.flags & MSG_FLAG_IMAP_DELETED; } catch (ex) { return 0; } } function SelectedMessagesAreJunk() { var isJunk; try { var junkScore = gDBView.hdrForFirstSelectedMessage.getStringProperty("junkscore"); isJunk = ((junkScore != "") && (junkScore != "0")); } catch (ex) { isJunk = false; } return isJunk; } function SelectedMessagesAreRead() { var isRead; try { isRead = gDBView.hdrForFirstSelectedMessage.isRead; } catch (ex) { isRead = false; } return isRead; } function SelectedMessagesAreFlagged() { var isFlagged; try { isFlagged = gDBView.hdrForFirstSelectedMessage.isFlagged; } catch (ex) { isFlagged = false; } return isFlagged; } function getMsgToolbarMenu_init() { document.commandDispatcher.updateCommands('create-menu-getMsgToolbar'); } function GetFirstSelectedMsgFolder() { var result = null; var selectedFolders = GetSelectedMsgFolders(); if (selectedFolders.length > 0) { result = selectedFolders[0]; } return result; } function GetWindowMediator() { if (gWindowManagerInterface) return gWindowManagerInterface; var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(); return (gWindowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator)); } function GetInboxFolder(server) { try { var rootMsgFolder = server.rootMsgFolder; //now find Inbox var outNumFolders = new Object(); var inboxFolder = rootMsgFolder.getFoldersWithFlag(0x1000, 1, outNumFolders); return inboxFolder.QueryInterface(Components.interfaces.nsIMsgFolder); } catch (ex) { dump(ex + "\n"); } return null; } function GetMessagesForInboxOnServer(server) { var inboxFolder = GetInboxFolder(server); // if the server doesn't support an inbox it could be an RSS server or some other server type.. // just use the root folder and the server implementation can figure out what to do. if (!inboxFolder) inboxFolder = server.rootFolder; var folders = new Array(1); folders[0] = inboxFolder; var compositeDataSource = GetCompositeDataSource("GetNewMessages"); GetNewMessages(folders, server, compositeDataSource); } function MsgGetMessage() { // if offline, prompt for getting messages if(CheckOnline()) GetFolderMessages(); else if (DoGetNewMailWhenOffline()) GetFolderMessages(); } function MsgGetMessagesForAllServers(defaultServer) { // now log into any server try { var allServers = accountManager.allServers; // array of isupportsarrays of servers for a particular folder var pop3DownloadServersArray = new Array; // parallel isupports array of folders to download to... var localFoldersToDownloadTo = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); var pop3Server; for (var i=0;i 1) && (numMessages >= openWindowWarning)) { InitPrompts(); if (!gMessengerBundle) gMessengerBundle = document.getElementById("bundle_messenger"); var title = gMessengerBundle.getString("openWindowWarningTitle"); var text = gMessengerBundle.getFormattedString("openWindowWarningText", [numMessages]); if (!gPromptService.confirm(window, title, text)) return; } for (var i = 0; i < numMessages; i++) { MsgOpenNewWindowForMessage(dbView.getURIForViewIndex(indices[i]), dbView.getFolderForViewIndex(indices[i]).URI); } } function MsgOpenSelectedMessageInExistingWindow() { var windowID = GetWindowByWindowType("mail:messageWindow"); if (!windowID) return false; try { var messageURI = gDBView.URIForFirstSelectedMessage; var msgHdr = gDBView.hdrForFirstSelectedMessage; // Reset the window's message uri and folder uri vars, and // update the command handlers to what's going to be used. // This has to be done before the call to CreateView(). windowID.gCurrentMessageUri = messageURI; windowID.gCurrentFolderUri = msgHdr.folder.URI; windowID.UpdateMailToolbar('MsgOpenExistingWindowForMessage'); // even if the folder uri's match, we can't use the existing view // (msgHdr.folder.URI == windowID.gCurrentFolderUri) // the reason is quick search and mail views. // see bug #187673 // // for the sake of simplicity, // let's always call CreateView(gDBView) // which will clone gDBView windowID.CreateView(gDBView); windowID.LoadMessageByMsgKey(msgHdr.messageKey); // bring existing window to front windowID.focus(); return true; } catch (ex) { dump("reusing existing standalone message window failed: " + ex + "\n"); } return false; } const nsIFilePicker = Components.interfaces.nsIFilePicker; function MsgOpenFromFile() { var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); var strBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].getService(); strBundleService = strBundleService.QueryInterface(Components.interfaces.nsIStringBundleService); var extbundle = strBundleService.createBundle("chrome://messenger/locale/messenger.properties"); var filterLabel = extbundle.GetStringFromName("EMLFiles"); var windowTitle = extbundle.GetStringFromName("OpenEMLFiles"); fp.init(window, windowTitle, nsIFilePicker.modeOpen); fp.appendFilter(filterLabel, "*.eml"); // Default or last filter is "All Files" fp.appendFilters(nsIFilePicker.filterAll); try { var ret = fp.show(); if (ret == nsIFilePicker.returnCancel) return; } catch (ex) { dump("filePicker.chooseInputFile threw an exception\n"); return; } var uri = fp.fileURL; uri.query = "type=x-message-display"; MsgOpenNewWindowForMessage(uri, null); } function MsgOpenNewWindowForMessage(messageUri, folderUri) { if (!messageUri) // use GetFirstSelectedMessage() to find out which message to open // instead of gDBView.getURIForViewIndex(currentIndex). This is // required because on a right-click, the currentIndex value will be // different from the actual row that is highlighted. // GetFirstSelectedMessage() will return the message that is // highlighted. messageUri = GetFirstSelectedMessage(); if (!folderUri) // use GetSelectedFolderURI() to find out which message to open // instead of gDBView.getURIForViewIndex(currentIndex). This is // required because on a right-click, the currentIndex value will be // different from the actual row that is highlighted. // GetSelectedFolderURI() will return the message that is // highlighted. folderUri = GetSelectedFolderURI(); // be sure to pass in the current view.... if (messageUri && folderUri) { window.openDialog( "chrome://messenger/content/messageWindow.xul", "_blank", "all,chrome,dialog=no,status,toolbar", messageUri, folderUri, gDBView ); } } function CloseMailWindow() { //dump("\nClose from XUL\nDo something...\n"); window.close(); } function MsgJunk() { MsgJunkMailInfo(true); JunkSelectedMessages(!SelectedMessagesAreJunk()); } function MsgMarkMsgAsRead(markRead) { if (!markRead) { markRead = !SelectedMessagesAreRead(); } MarkSelectedMessagesRead(markRead); } function MsgMarkAsFlagged(markFlagged) { if (!markFlagged) { markFlagged = !SelectedMessagesAreFlagged(); } MarkSelectedMessagesFlagged(markFlagged); } function MsgMarkReadByDate() { window.openDialog( "chrome://messenger/content/markByDate.xul","", "chrome,modal,titlebar,centerscreen", GetLoadedMsgFolder() ); } function MsgMarkAllRead() { var compositeDataSource = GetCompositeDataSource("MarkAllMessagesRead"); var folder = GetMsgFolderFromUri(GetSelectedFolderURI(), true); if(folder) MarkAllMessagesRead(compositeDataSource, folder); } function MsgDownloadFlagged() { gDBView.doCommand(nsMsgViewCommandType.downloadFlaggedForOffline); } function MsgDownloadSelected() { gDBView.doCommand(nsMsgViewCommandType.downloadSelectedForOffline); } function MsgMarkThreadAsRead() { gDBView.doCommand(nsMsgViewCommandType.markThreadRead); } function MsgViewPageSource() { var messages = GetSelectedMessages(); ViewPageSource(messages); } var gFindInstData; function getFindInstData() { if (!gFindInstData) { gFindInstData = new nsFindInstData(); gFindInstData.browser = getMessageBrowser(); gFindInstData.__proto__.rootSearchWindow = window.top.content; gFindInstData.__proto__.currentSearchWindow = window.top.content; } return gFindInstData; } function MsgFind() { findInPage(getFindInstData()); } function MsgFindAgain(reverse) { findAgainInPage(getFindInstData(), reverse); } function MsgCanFindAgain() { return canFindAgainInPage(); } function MsgFilters(emailAddress, folder) { if (!folder) { // try to determine the folder from the selected message. if (gDBView) { try { var msgHdr = gDBView.hdrForFirstSelectedMessage; var accountKey = msgHdr.accountKey; if (accountKey.length > 0) { var account = accountManager.getAccount(accountKey); if (account) { server = account.incomingServer; if (server) folder = server.rootFolder; } } } catch (ex) {} } if (!folder) { folder = GetFirstSelectedMsgFolder(); // if this is the local folders account, check if the default account // defers to it; if so, we'll use the default account so the simple case // of one pop3 account with the global inbox creates filters for the right server. if (folder && folder.server.type == "none" && folder.server.isDeferredTo) { var defaultServer = accountManager.defaultAccount.incomingServer; if (defaultServer.rootMsgFolder == folder.server.rootFolder) folder = defaultServer.rootFolder; } } } var args; if (emailAddress) { /* we have to do prefill filter so we are going to launch the filterEditor dialog and prefill that with the emailAddress */ var curFilterList = folder.getFilterList(msgWindow); args = {filterList: curFilterList}; args.filterName = emailAddress; window.openDialog("chrome://messenger/content/FilterEditor.xul", "", "chrome, modal, resizable,centerscreen,dialog=yes", args); /* if the user hits ok in the filterEditor dialog we set args.refresh=true there we check this here in args to show filterList dialog */ if ("refresh" in args && args.refresh) { args = { refresh: true, folder: folder }; MsgFilterList(args); } } else // just launch filterList dialog { args = { refresh: false, folder: folder }; MsgFilterList(args); } } function MsgApplyFilters() { var filterService = Components.classes["@mozilla.org/messenger/services/filters;1"].getService(Components.interfaces.nsIMsgFilterService); var preselectedFolder = GetFirstSelectedMsgFolder(); var selectedFolders = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); selectedFolders.AppendElement(preselectedFolder); var curFilterList = preselectedFolder.getFilterList(msgWindow); // create a new filter list and copy over the enabled filters to it. // We do this instead of having the filter after the fact code ignore // disabled filters because the Filter Dialog filter after the fact // code would have to clone filters to allow disabled filters to run, // and we don't support cloning filters currently. var tempFilterList = filterService.getTempFilterList(preselectedFolder); var numFilters = curFilterList.filterCount; // make sure the temp filter list uses the same log stream tempFilterList.logStream = curFilterList.logStream; tempFilterList.loggingEnabled = curFilterList.loggingEnabled; var newFilterIndex = 0; for (var i = 0; i < numFilters; i++) { var curFilter = curFilterList.getFilterAt(i); if (curFilter.enabled) { tempFilterList.insertFilterAt(newFilterIndex, curFilter); newFilterIndex++; } } filterService.applyFiltersToFolders(tempFilterList, selectedFolders, msgWindow); } function ChangeMailLayout(newLayout) { gPrefBranch.setIntPref("mail.pane_config.dynamic", newLayout); return true; } function MsgViewAllHeaders() { gPrefBranch.setIntPref("mail.show_headers",2); MsgReload(); return true; } function MsgViewNormalHeaders() { gPrefBranch.setIntPref("mail.show_headers",1); MsgReload(); return true; } function MsgViewBriefHeaders() { gPrefBranch.setIntPref("mail.show_headers",0); MsgReload(); return true; } function MsgBodyAllowHTML() { gPrefBranch.setBoolPref("mailnews.display.prefer_plaintext", false); gPrefBranch.setIntPref("mailnews.display.html_as", 0); gPrefBranch.setIntPref("mailnews.display.disallow_mime_handlers", 0); MsgReload(); return true; } function MsgBodySanitized() { gPrefBranch.setBoolPref("mailnews.display.prefer_plaintext", false); gPrefBranch.setIntPref("mailnews.display.html_as", 3); gPrefBranch.setIntPref("mailnews.display.disallow_mime_handlers", disallow_classes_no_html); MsgReload(); return true; } function MsgBodyAsPlaintext() { gPrefBranch.setBoolPref("mailnews.display.prefer_plaintext", true); gPrefBranch.setIntPref("mailnews.display.html_as", 1); gPrefBranch.setIntPref("mailnews.display.disallow_mime_handlers", disallow_classes_no_html); MsgReload(); return true; } function ToggleInlineAttachment(target) { var viewAttachmentInline = !pref.getBoolPref("mail.inline_attachments"); pref.setBoolPref("mail.inline_attachments", viewAttachmentInline) target.setAttribute("checked", viewAttachmentInline ? "true" : "false"); MsgReload(); } function MsgReload() { ReloadMessage(); } function MsgStop() { StopUrls(); } function MsgSendUnsentMsgs() { // if offline, prompt for sendUnsentMessages if(CheckOnline()) { SendUnsentMessages(); } else { var option = PromptSendMessagesOffline(); if(option == 0) { if (!gOfflineManager) GetOfflineMgrService(); gOfflineManager.goOnline(false /* sendUnsentMessages */, false /* playbackOfflineImapOperations */, msgWindow); SendUnsentMessages(); } } } function GetPrintSettings() { var prevPS = gPrintSettings; try { if (gPrintSettings == null) { var useGlobalPrintSettings = gPrefBranch.getBoolPref("print.use_global_printsettings"); // I would rather be using nsIWebBrowserPrint API // but I really don't have a document at this point var printSettingsService = Components.classes["@mozilla.org/gfx/printsettings-service;1"] .getService(Components.interfaces.nsIPrintSettingsService); if (useGlobalPrintSettings) { gPrintSettings = printSettingsService.globalPrintSettings; } else { gPrintSettings = printSettingsService.CreatePrintSettings(); } } } catch (e) { dump("GetPrintSettings "+e); } return gPrintSettings; } function PrintEnginePrintInternal(messageList, numMessages, doPrintPreview, msgType) { if (numMessages == 0) { dump("PrintEnginePrint(): No messages selected.\n"); return false; } if (gPrintSettings == null) { gPrintSettings = GetPrintSettings(); } printEngineWindow = window.openDialog("chrome://messenger/content/msgPrintEngine.xul", "", "chrome,dialog=no,all,centerscreen", numMessages, messageList, statusFeedback, gPrintSettings, doPrintPreview, msgType, window); return true; } function PrintEnginePrint() { var messageList = GetSelectedMessages(); return PrintEnginePrintInternal(messageList, messageList.length, false, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINT_MSG); } function PrintEnginePrintPreview() { var messageList = GetSelectedMessages(); return PrintEnginePrintInternal(messageList, 1, true, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINTPREVIEW_MSG); } function IsMailFolderSelected() { var selectedFolders = GetSelectedMsgFolders(); var numFolders = selectedFolders.length; if(numFolders !=1) return false; var folder = selectedFolders[0]; if (!folder) return false; var server = folder.server; var serverType = server.type; if((serverType == "nntp")) return false; else return true; } function IsGetNewMessagesEnabled() { // users don't like it when the "Get Msgs" button is disabled // so let's never do that. // we'll just handle it as best we can in GetFolderMessages() // when they click "Get Msgs" and // Local Folders or a news server is selected // see bugs #89404 and #111102 return true; } function IsGetNextNMessagesEnabled() { var selectedFolders = GetSelectedMsgFolders(); var numFolders = selectedFolders.length; if(numFolders !=1) return false; var folder = selectedFolders[0]; if (!folder) return false; var server = folder.server; var serverType = server.type; var menuItem = document.getElementById("menu_getnextnmsg"); if ((serverType == "nntp") && !folder.isServer) { var newsServer = server.QueryInterface(Components.interfaces.nsINntpIncomingServer); var menuLabel = gMessengerBundle.getFormattedString("getNextNMessages", [ newsServer.maxArticles ]); menuItem.setAttribute("label",menuLabel); menuItem.removeAttribute("hidden"); return true; } menuItem.setAttribute("hidden","true"); return false; } function IsEmptyTrashEnabled() { var folderURI = GetSelectedFolderURI(); var server = GetServer(folderURI); return (server && server.canEmptyTrashOnExit?IsMailFolderSelected():false); } function IsCompactFolderEnabled() { var server = GetServer(GetSelectedFolderURI()); return (server && ((server.type != 'imap') || server.canCompactFoldersOnServer) && isCommandEnabled("cmd_compactFolder")); // checks e.g. if IMAP is offline } var gDeleteButton = null; var gMarkButton = null; function SetUpToolbarButtons(uri) { //dump("SetUpToolbarButtons("+uri+")\n"); // eventually, we might want to set up the toolbar differently for imap, // pop, and news. for now, just tweak it based on if it is news or not. var forNews = isNewsURI(uri); if(!gDeleteButton) gDeleteButton = document.getElementById("button-delete"); var buttonToHide = null; var buttonToShow = null; if (forNews) { buttonToHide = gDeleteButton; } else { buttonToShow = gDeleteButton; } if (buttonToHide) { buttonToHide.setAttribute('hidden',true); } if (buttonToShow) { buttonToShow.removeAttribute('hidden'); } } var gMessageBrowser; function getMessageBrowser() { if (!gMessageBrowser) gMessageBrowser = document.getElementById("messagepane"); return gMessageBrowser; } function getMarkupDocumentViewer() { return getMessageBrowser().markupDocumentViewer; } function MsgSynchronizeOffline() { //dump("in MsgSynchronize() \n"); window.openDialog("chrome://messenger/content/msgSynchronize.xul", "", "centerscreen,chrome,modal,titlebar,resizable=yes",{msgWindow:msgWindow}); } function MsgMarkByDate() {} function MsgOpenAttachment() {} function MsgUpdateMsgCount() {} function MsgImport() {} function MsgSynchronize() {} function MsgGetSelectedMsg() {} function MsgGetFlaggedMsg() {} function MsgSelectThread() {} function MsgShowFolders(){} function MsgShowLocationbar() {} function MsgViewAttachInline() {} function MsgWrapLongLines() {} function MsgIncreaseFont() {} function MsgDecreaseFont() {} function MsgShowImages() {} function MsgRefresh() {} function MsgViewPageInfo() {} function MsgFirstUnreadMessage() {} function MsgFirstFlaggedMessage() {} function MsgGoBack() {} function MsgGoForward() {} function MsgAddSenderToAddressBook() {} function MsgAddAllToAddressBook() {} function SpaceHit(event) { var contentWindow = window.top._content; var rssiframe = contentWindow.document.getElementById('_mailrssiframe'); // if we are displaying an RSS article, we really want to scroll the nested iframe if (rssiframe) contentWindow = rssiframe.contentWindow; if (event && event.shiftKey) { // if at the start of the message, go to the previous one if (contentWindow.scrollY > 0) { contentWindow.scrollByPages(-1); } else { goDoCommand("cmd_previousUnreadMsg"); } } else { // if at the end of the message, go to the next one if (contentWindow.scrollY < contentWindow.scrollMaxY) { contentWindow.scrollByPages(1); } else { goDoCommand("cmd_nextUnreadMsg"); } } } function IsAccountOfflineEnabled() { var selectedFolders = GetSelectedMsgFolders(); if (selectedFolders && (selectedFolders.length == 1)) return selectedFolders[0].supportsOffline; return false; } // init nsIPromptService and strings function InitPrompts() { if(!gPromptService) { gPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(); gPromptService = gPromptService.QueryInterface(Components.interfaces.nsIPromptService); } if (!gOfflinePromptsBundle) gOfflinePromptsBundle = document.getElementById("bundle_offlinePrompts"); } function DoGetNewMailWhenOffline() { var sendUnsent = false; var goOnline = PromptGetMessagesOffline() == 0; if (goOnline) { if (this.CheckForUnsentMessages != undefined && CheckForUnsentMessages()) { sendUnsent = gPromptService.confirmEx(window, gOfflinePromptsBundle.getString('sendMessagesOfflineWindowTitle'), gOfflinePromptsBundle.getString('sendMessagesLabel'), gPromptService.BUTTON_TITLE_IS_STRING * (gPromptService.BUTTON_POS_0 + gPromptService.BUTTON_POS_1), gOfflinePromptsBundle.getString('sendMessagesSendButtonLabel'), gOfflinePromptsBundle.getString('sendMessagesNoSendButtonLabel'), null, null, {value:0}) == 0; } if (!gOfflineManager) GetOfflineMgrService(); gOfflineManager.goOnline(sendUnsent /* sendUnsentMessages */, false /* playbackOfflineImapOperations */, msgWindow); } return goOnline; } // prompt for getting messages when offline function PromptGetMessagesOffline() { var buttonPressed = false; InitPrompts(); if (gPromptService) { var checkValue = {value:false}; buttonPressed = gPromptService.confirmEx(window, gOfflinePromptsBundle.getString('getMessagesOfflineWindowTitle'), gOfflinePromptsBundle.getString('getMessagesOfflineLabel'), (gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) + (gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1), gOfflinePromptsBundle.getString('getMessagesOfflineGoButtonLabel'), null, null, null, checkValue); } return buttonPressed; } // prompt for sending messages when offline function PromptSendMessagesOffline() { var buttonPressed = false; InitPrompts(); if (gPromptService) { var checkValue= {value:false}; buttonPressed = gPromptService.confirmEx(window, gOfflinePromptsBundle.getString('sendMessagesOfflineWindowTitle'), gOfflinePromptsBundle.getString('sendMessagesOfflineLabel'), (gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) + (gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1), gOfflinePromptsBundle.getString('sendMessagesOfflineGoButtonLabel'), null, null, null, checkValue, buttonPressed); } return buttonPressed; } function GetDefaultAccountRootFolder() { try { var account = accountManager.defaultAccount; var defaultServer = account.incomingServer; var defaultFolder = defaultServer.rootMsgFolder; return defaultFolder; } catch (ex) { } return null; } function GetFolderMessages() { var selectedFolders = GetSelectedMsgFolders(); var defaultAccountRootFolder = GetDefaultAccountRootFolder(); // if no default account, get msg isn't going do anything anyways // so bail out if (!defaultAccountRootFolder) return; // if nothing selected, use the default var folder = selectedFolders.length ? selectedFolders[0] : defaultAccountRootFolder; var serverType = folder.server.type; if (folder.isServer && (serverType == "nntp")) { // if we're doing "get msgs" on a news server // update unread counts on this server folder.server.performExpand(msgWindow); return; } else if (serverType == "none") { // if "Local Folders" is selected // and the user does "Get Msgs" // and LocalFolders is not deferred to, // get new mail for the default account // // XXX TODO // should shift click get mail for all (authenticated) accounts? // see bug #125885 if (!folder.server.isDeferredTo) folder = defaultAccountRootFolder; } var folders = new Array(1); folders[0] = folder; var compositeDataSource = GetCompositeDataSource("GetNewMessages"); GetNewMessages(folders, folder.server, compositeDataSource); } function SendUnsentMessages() { var msgSendlater = Components.classes["@mozilla.org/messengercompose/sendlater;1"] .getService(Components.interfaces.nsIMsgSendLater); var identitiesCount, allIdentities, currentIdentity, numMessages, msgFolder; if (accountManager) { allIdentities = accountManager.allIdentities; identitiesCount = allIdentities.Count(); for (var i = 0; i < identitiesCount; i++) { currentIdentity = allIdentities.QueryElementAt(i, Components.interfaces.nsIMsgIdentity); msgFolder = msgSendlater.getUnsentMessagesFolder(currentIdentity); if(msgFolder) { numMessages = msgFolder.getTotalMessages(false /* include subfolders */); if(numMessages > 0) { messenger.sendUnsentMessages(currentIdentity, msgWindow); // right now, all identities point to the same unsent messages // folder, so to avoid sending multiple copies of the // unsent messages, we only call messenger.SendUnsentMessages() once // see bug #89150 for details break; } } } } } function CoalesceGetMsgsForPop3ServersByDestFolder(currentServer, pop3DownloadServersArray, localFoldersToDownloadTo) { var outNumFolders = new Object(); var inboxFolder = currentServer.rootMsgFolder.getFoldersWithFlag(0x1000, 1, outNumFolders); pop3Server = currentServer.QueryInterface(Components.interfaces.nsIPop3IncomingServer); // coalesce the servers that download into the same folder... var index = localFoldersToDownloadTo.GetIndexOf(inboxFolder); if (index == -1) { if(inboxFolder) { inboxFolder.biffState = Components.interfaces.nsIMsgFolder.nsMsgBiffState_NoMail; inboxFolder.clearNewMessages(); } localFoldersToDownloadTo.AppendElement(inboxFolder); index = pop3DownloadServersArray.length pop3DownloadServersArray[index] = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); pop3DownloadServersArray[index].AppendElement(currentServer); } else { pop3DownloadServersArray[index].AppendElement(currentServer); } } function GetMessagesForAllAuthenticatedAccounts() { // now log into any server try { var allServers = accountManager.allServers; // array of isupportsarrays of servers for a particular folder var pop3DownloadServersArray = new Array; // parallel isupports array of folders to download to... var localFoldersToDownloadTo = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); var pop3Server; for (var i=0;i 0) { var readMailDB = outputPFC.getMsgDatabase(msgWindow); if (readMailDB) { var hdrInDestDB = readMailDB.getMsgHdrForMessageID(messageID); if (hdrInDestDB) copyToOfflineFolder = false; } } } if (copyToOfflineFolder) { var messages = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); messages.AppendElement(msgHdr); res = outputPFC.copyMessages(currentMsgFolder, messages, false /*isMove*/, msgWindow /* nsIMsgWindow */, null /* listener */, false /* isFolder */, false /*allowUndo*/ ); } } } // // This function handles all mdn response generation (ie, imap and pop). // For pop the msg uid can be 0 (ie, 1st msg in a local folder) so no // need to check uid here. No one seems to set mimeHeaders to null so // no need to check it either. // function HandleMDNResponse(aUrl) { if (!aUrl) return; var msgFolder = aUrl.folder; var msgURI = GetLoadedMessage(); if (!msgFolder || !msgURI) return; if (IsNewsMessage(msgURI)) return; // if the message is marked as junk, do NOT attempt to process a return receipt // in order to better protect the user if (SelectedMessagesAreJunk()) return; var msgHdr = messenger.messageServiceFromURI(msgURI).messageURIToMsgHdr(msgURI); var mimeHdr; try { mimeHdr = aUrl.mimeHeaders; } catch (ex) { return 0;} // If we didn't get the message id when we downloaded the message header, // we cons up an md5: message id. If we've done that, we'll try to extract // the message id out of the mime headers for the whole message. var msgId = msgHdr.messageId; if (msgId.split(":")[0] == "md5") { var mimeMsgId = mimeHdr.extractHeader("Message-Id", false); if (mimeMsgId) msgHdr.messageId = mimeMsgId; } // After a msg is downloaded it's already marked READ at this point so we must check if // the msg has a "Disposition-Notification-To" header and no MDN report has been sent yet. var msgFlags = msgHdr.flags; if ((msgFlags & MSG_FLAG_IMAP_DELETED) || (msgFlags & MSG_FLAG_MDN_REPORT_SENT)) return; var DNTHeader = mimeHdr.extractHeader("Disposition-Notification-To", false); var oldDNTHeader = mimeHdr.extractHeader("Return-Receipt-To", false); if (!DNTHeader && !oldDNTHeader) return; // Everything looks good so far, let's generate the MDN response. var mdnGenerator = Components.classes["@mozilla.org/messenger-mdn/generator;1"]. createInstance(Components.interfaces.nsIMsgMdnGenerator); mdnGenerator.process(MDN_DISPOSE_TYPE_DISPLAYED, msgWindow, msgFolder, msgHdr.messageKey, mimeHdr, false); // Reset mark msg MDN "Sent" and "Not Needed". msgHdr.flags = (msgFlags & ~MSG_FLAG_MDN_REPORT_NEEDED); msgHdr.OrFlags(MSG_FLAG_MDN_REPORT_SENT); // Commit db changes. var msgdb = msgFolder.getMsgDatabase(msgWindow); if (msgdb) msgdb.Commit(ADDR_DB_LARGE_COMMIT); } function QuickSearchFocus() { var quickSearchTextBox = document.getElementById('searchInput'); if (quickSearchTextBox) quickSearchTextBox.focus(); } function MsgSearchMessages() { var preselectedFolder = null; if ("GetFirstSelectedMsgFolder" in window) preselectedFolder = GetFirstSelectedMsgFolder(); var args = { folder: preselectedFolder }; OpenOrFocusWindow(args, "mailnews:search", "chrome://messenger/content/SearchDialog.xul"); } function MsgJunkMail() { MsgJunkMailInfo(true); var preselectedFolder = null; if ("GetFirstSelectedMsgFolder" in window) preselectedFolder = GetFirstSelectedMsgFolder(); var args = { folder: preselectedFolder }; OpenOrFocusWindow(args, "mailnews:junk", "chrome://messenger/content/junkMail.xul"); } function MsgJunkMailInfo(aCheckFirstUse) { if (aCheckFirstUse) { if (!pref.getBoolPref("mailnews.ui.junk.firstuse")) return; pref.setBoolPref("mailnews.ui.junk.firstuse", false); // check to see if this is an existing profile where the user has started using // the junk mail feature already var junkmailPlugin = Components.classes["@mozilla.org/messenger/filter-plugin;1?name=bayesianfilter"] .getService(Components.interfaces.nsIJunkMailPlugin); if (junkmailPlugin.userHasClassified) return; } var desiredWindow = GetWindowByWindowType("mailnews:junkmailinfo"); if (desiredWindow) desiredWindow.focus(); else window.openDialog("chrome://messenger/content/junkMailInfo.xul", "mailnews:junkmailinfo", "centerscreen,resizeable=no,titlebar,chrome,modal", null); } function MsgSearchAddresses() { var args = { directory: null }; OpenOrFocusWindow(args, "mailnews:absearch", "chrome://messenger/content/ABSearchDialog.xul"); } function MsgFilterList(args) { OpenOrFocusWindow(args, "mailnews:filterlist", "chrome://messenger/content/FilterListDialog.xul"); } function GetWindowByWindowType(windowType) { var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator); return windowManager.getMostRecentWindow(windowType); } function OpenOrFocusWindow(args, windowType, chromeURL) { var desiredWindow = GetWindowByWindowType(windowType); if (desiredWindow) { desiredWindow.focus(); if ("refresh" in args && args.refresh) desiredWindow.refresh(); } else window.openDialog(chromeURL, "", "chrome,resizable,status,centerscreen,dialog=no", args); } function loadThrobberUrl(urlPref) { var url; try { url = gPrefBranch.getComplexValue(urlPref, Components.interfaces.nsIPrefLocalizedString).data; messenger.launchExternalURL(url); } catch (ex) {} }