home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 January / 01_02.iso / software / netscape62win / mail.xpi / bin / chrome / messenger.jar / content / messenger / mailWindowOverlay.js < prev    next >
Text File  |  2001-08-21  |  43KB  |  1,369 lines

  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  2.  * The contents of this file are subject to the Netscape Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/NPL/
  6.  *
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  *
  12.  * The Original Code is Mozilla Communicator client code, released
  13.  * March 31, 1998.
  14.  *
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation. Portions created by Netscape are
  17.  * Copyright (C) 1998-1999 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  *
  20.  * Contributors: timeless
  21.  *               slucy@objectivesw.co.uk
  22.  *               Hσkan Waara <hwaara@chello.se>
  23.  *               Jan Varga <varga@utcru.sk>
  24.  */
  25.  
  26. var gMessengerBundle;
  27. var gPromptService;
  28. var gOfflinePromptsBundle;
  29. var nsPrefBranch = null;
  30. var gOfflineManager;
  31. var gWindowManagerInterface;
  32.  
  33. // Disable the new account menu item if the account preference is locked.
  34. // Two other affected areas are the account central and the account manager
  35. // dialog.
  36. function menu_new_init()
  37. {
  38.   if (!nsPrefBranch) {
  39.     var prefService = Components.classes["@mozilla.org/preferences-service;1"];
  40.     prefService = prefService.getService();
  41.     prefService = prefService.QueryInterface(Components.interfaces.nsIPrefService);
  42.  
  43.     nsPrefBranch = prefService.getBranch(null);
  44.   }
  45.   var newAccountItem = document.getElementById('newAccountMenuItem');
  46.   if (nsPrefBranch.prefIsLocked("mail.accountmanager.accounts"))
  47.     newAccountItem.setAttribute("disabled","true");
  48. }
  49.  
  50. function goUpdateMailMenuItems(commandset)
  51. {
  52. //  dump("Updating commands for " + commandset.id + "\n");
  53.  
  54.   for (var i = 0; i < commandset.childNodes.length; i++)
  55.   {
  56.     var commandID = commandset.childNodes[i].getAttribute("id");
  57.     if (commandID)
  58.     {
  59.       goUpdateCommand(commandID);
  60.     }
  61.   }
  62. }
  63.  
  64. function file_init()
  65. {
  66.     if (!gMessengerBundle)
  67.         gMessengerBundle = document.getElementById("bundle_messenger");
  68.     file_attachments();
  69. /* file_attachments() can return false to indicate a load failure,
  70.    but if you return false to oncreate then
  71.    the popup menu will not display which is not a good thing.
  72.  */
  73.  
  74.   document.commandDispatcher.updateCommands('create-menu-file');
  75. }
  76.  
  77. function file_attachments()
  78. {
  79.   var numAttachments = GetNumberOfAttachmentsForDisplayedMessage();
  80.   var amParent=document.getElementById('fileAttachmentMenu');
  81.   if (!amParent)
  82.     return false;
  83.  
  84.   // hide the attachment menu item if the message does not have any messages..
  85.   if (numAttachments > 0)
  86.   {
  87.     amParent.removeAttribute('hidden');
  88.   }
  89.   else
  90.     amParent.setAttribute('hidden',true);
  91.   return true;
  92. }
  93.  
  94. function InitEditMessagesMenu()
  95. {
  96.   document.commandDispatcher.updateCommands('create-menu-edit');
  97. }
  98.  
  99. function InitSearchMessagesMenu()
  100. {
  101.   document.commandDispatcher.updateCommands('create-menu-search');
  102. }
  103.  
  104. function InitGoMessagesMenu()
  105. {
  106.   document.commandDispatcher.updateCommands('create-menu-go');
  107. }
  108.  
  109. function view_init()
  110. {
  111.   if (!gMessengerBundle)
  112.       gMessengerBundle = document.getElementById("bundle_messenger");
  113.   var message_menuitem=document.getElementById('menu_showMessage');
  114.  
  115.   if (message_menuitem)
  116.   {
  117.       var message_menuitem_hidden = message_menuitem.getAttribute("hidden");
  118.       if(message_menuitem_hidden != "true"){
  119.           message_menuitem.setAttribute('checked',!IsThreadAndMessagePaneSplitterCollapsed());
  120.       }
  121.   }
  122.   var threadColumn = document.getElementById('ThreadColumnHeader');
  123.   var thread_menuitem=document.getElementById('menu_showThreads');
  124.   if (threadColumn && thread_menuitem){
  125.       thread_menuitem.setAttribute('checked',threadColumn.getAttribute('currentView')=='threaded');
  126.   }
  127.  
  128.   document.commandDispatcher.updateCommands('create-menu-view');
  129. }
  130.  
  131. function setSortByMenuItemCheckState(id, value)
  132. {
  133.     var menuitem = document.getElementById(id);
  134.     if (menuitem) {
  135.       menuitem.setAttribute("checked", value);
  136.     }
  137. }
  138.  
  139. function InitViewSortByMenu()
  140. {
  141.     var sortType = gDBView.sortType;
  142.  
  143.     setSortByMenuItemCheckState("sortByDateMenuitem", (sortType == nsMsgViewSortType.byDate));
  144.     setSortByMenuItemCheckState("sortByFlagMenuitem", (sortType == nsMsgViewSortType.byFlagged));
  145.     setSortByMenuItemCheckState("sortByOrderReceivedMenuitem", (sortType == nsMsgViewSortType.byId));
  146.     setSortByMenuItemCheckState("sortByPriorityMenuitem", (sortType == nsMsgViewSortType.byPriority));
  147.     setSortByMenuItemCheckState("sortBySizeMenuitem", (sortType == nsMsgViewSortType.bySize));
  148.     setSortByMenuItemCheckState("sortByStatusMenuitem", (sortType == nsMsgViewSortType.byStatus));
  149.     setSortByMenuItemCheckState("sortBySubjectMenuitem", (sortType == nsMsgViewSortType.bySubject));
  150.     setSortByMenuItemCheckState("sortByThreadMenuitem", (sortType == nsMsgViewSortType.byThread));
  151.     setSortByMenuItemCheckState("sortByUnreadMenuitem", (sortType == nsMsgViewSortType.byUnread));
  152.  
  153.     // the Sender / Recipient menu is dynamic
  154.     setSortByMenuItemCheckState("sortBySenderOrRecipientMenuitem", (sortType == nsMsgViewSortType.byAuthor) || (sortType == nsMsgViewSortType.byRecipient));
  155.     var senderOrRecipientMenuitem = document.getElementById("sortBySenderOrRecipientMenuitem");
  156.     if (senderOrRecipientMenuitem) {
  157.         var currentFolder = gDBView.msgFolder;
  158.     if (IsSpecialFolder(currentFolder, MSG_FOLDER_FLAG_SENTMAIL | MSG_FOLDER_FLAG_DRAFTS | MSG_FOLDER_FLAG_QUEUE)) {
  159.       senderOrRecipientMenuitem.setAttribute('label',gMessengerBundle.getString('recipientColumnHeader'));
  160.       senderOrRecipientMenuitem.setAttribute('accesskey',gMessengerBundle.getString('recipientAccessKey'));
  161.         }
  162.         else {
  163.       senderOrRecipientMenuitem.setAttribute('label',gMessengerBundle.getString('senderColumnHeader'));
  164.       senderOrRecipientMenuitem.setAttribute('accesskey',gMessengerBundle.getString('senderAccessKey'));
  165.     }
  166.     }
  167.     var sortOrder = gDBView.sortOrder;
  168.  
  169.     setSortByMenuItemCheckState("sortAscending", (sortOrder == nsMsgViewSortOrder.ascending));
  170.     setSortByMenuItemCheckState("sortDescending", (sortOrder == nsMsgViewSortOrder.descending));
  171. }
  172.  
  173. function InitViewMessagesMenu()
  174. {
  175.   var allMenuItem = document.getElementById("viewAllMessagesMenuItem");
  176.   var viewFlags = gDBView.viewFlags;
  177.   var viewType = gDBView.viewType;
  178.  
  179.   if(allMenuItem)
  180.       allMenuItem.setAttribute("checked",  (viewFlags & nsMsgViewFlagsType.kUnreadOnly) == 0 && (viewType == nsMsgViewType.eShowAllThreads));
  181.  
  182.   var unreadMenuItem = document.getElementById("viewUnreadMessagesMenuItem");
  183.   if(unreadMenuItem)
  184.       unreadMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kUnreadOnly) != 0);
  185.  
  186.   var theadedMenuItem = document.getElementById("menu_showThreads");
  187.   if (theadedMenuItem)
  188.     theadedMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kThreadedDisplay) != 0);
  189.   document.commandDispatcher.updateCommands('create-menu-view');
  190.  
  191.   var theadsWithUnreadMenuItem = document.getElementById("viewThreadsWithUnreadMenuItem");
  192.   if(theadsWithUnreadMenuItem)
  193.       theadsWithUnreadMenuItem.setAttribute("checked", viewType == nsMsgViewType.eShowThreadsWithUnread);
  194.  
  195.   var watchedTheadsWithUnreadMenuItem = document.getElementById("viewWatchedThreadsWithUnreadMenuItem");
  196.   if(watchedTheadsWithUnreadMenuItem)
  197.       watchedTheadsWithUnreadMenuItem.setAttribute("checked", viewType == nsMsgViewType.eShowWatchedThreadsWithUnread);
  198.   var ignoredTheadsMenuItem = document.getElementById("viewIgnoredThreadsMenuItem");
  199.   if(ignoredTheadsMenuItem)
  200.       ignoredTheadsMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kShowIgnored) != 0);
  201. }
  202.  
  203. function InitMessageMenu()
  204. {
  205.   var aMessage = GetFirstSelectedMessage();
  206.   var isNews = false;
  207.   if(aMessage) {
  208.       isNews = IsNewsMessage(aMessage);
  209.   }
  210.  
  211.   //We show reply to Newsgroups only for news messages.
  212.   var replyNewsgroupMenuItem = document.getElementById("replyNewsgroupMainMenu");
  213.   if(replyNewsgroupMenuItem)
  214.   {
  215.       replyNewsgroupMenuItem.setAttribute("hidden", isNews ? "" : "true");
  216.   }
  217.  
  218.   //For mail messages we say reply. For news we say ReplyToSender.
  219.   var replyMenuItem = document.getElementById("replyMainMenu");
  220.   if(replyMenuItem)
  221.   {
  222.       replyMenuItem.setAttribute("hidden", !isNews ? "" : "true");
  223.   }
  224.  
  225.   var replySenderMenuItem = document.getElementById("replySenderMainMenu");
  226.   if(replySenderMenuItem)
  227.   {
  228.       replySenderMenuItem.setAttribute("hidden", isNews ? "" : "true");
  229.   }
  230.  
  231.   // we only kill and watch threads for news
  232.   var killThreadMenuItem = document.getElementById("killThread");
  233.   if (killThreadMenuItem) {
  234.       killThreadMenuItem.setAttribute("hidden", isNews ? "" : "true");
  235.   }
  236.   var watchThreadMenuItem = document.getElementById("watchThread");
  237.   if (watchThreadMenuItem) {
  238.       watchThreadMenuItem.setAttribute("hidden", isNews ? "" : "true");
  239.   }
  240.  
  241.   //disable the move and copy menus only if there are no messages selected.
  242.   var moveMenu = document.getElementById("moveMenu");
  243.   if(moveMenu)
  244.       moveMenu.setAttribute("disabled", !aMessage);
  245.  
  246.   var copyMenu = document.getElementById("copyMenu");
  247.   if(copyMenu)
  248.       copyMenu.setAttribute("disabled", !aMessage);
  249.  
  250.   document.commandDispatcher.updateCommands('create-menu-message');
  251. }
  252.  
  253. function IsNewsMessage(messageUri)
  254. {
  255.     if (!messageUri) return false;
  256.     return (messageUri.substring(0,14) == "news_message:/")
  257. }
  258.  
  259. function InitMessageMark()
  260. {
  261.     InitMarkReadItem("markReadMenuItem");
  262.     InitMarkReadItem("markReadToolbarItem");
  263.     InitMarkFlaggedItem("markFlaggedMenuItem");
  264.     InitMarkFlaggedItem("markFlaggedToolbarItem");
  265.     document.commandDispatcher.updateCommands('create-menu-mark');
  266. }
  267.  
  268. function InitMarkReadItem(id)
  269. {
  270.     var areMessagesRead = SelectedMessagesAreRead();
  271.     var item = document.getElementById(id);
  272.     if(item)
  273.         item.setAttribute("checked", areMessagesRead);
  274. }
  275.  
  276. function InitMarkFlaggedItem(id)
  277. {
  278.     var areMessagesFlagged = SelectedMessagesAreFlagged();
  279.     var item = document.getElementById(id);
  280.     if(item)
  281.         item.setAttribute("checked", areMessagesFlagged);
  282. }
  283.  
  284. function SelectedMessagesAreRead()
  285. {
  286.     var isRead;
  287.     try {
  288.         isRead = gDBView.hdrForFirstSelectedMessage.isRead;
  289.     }
  290.     catch (ex) {
  291.         isRead = false;
  292.     }
  293.     return isRead;
  294. }
  295.  
  296. function SelectedMessagesAreFlagged()
  297. {
  298.     var isFlagged;
  299.     try {
  300.         isFlagged = gDBView.hdrForFirstSelectedMessage.isFlagged;
  301.     }
  302.     catch (ex) {
  303.         isFlagged = false;
  304.     }
  305.     return isFlagged;
  306. }
  307.  
  308. function getMsgToolbarMenu_init()
  309. {
  310.     document.commandDispatcher.updateCommands('create-menu-getMsgToolbar');
  311. }
  312.  
  313. function GetFirstSelectedMsgFolder()
  314. {
  315.     var result = null;
  316.     var selectedFolders = GetSelectedMsgFolders();
  317.     if (selectedFolders.length > 0) {
  318.         result = selectedFolders[0];
  319.     }
  320.  
  321.     return result;
  322. }
  323.  
  324. function GetWindowMediator()
  325. {
  326.     if (gWindowManagerInterface)
  327.         return gWindowManagerInterface;
  328.  
  329.     var windowManager = Components.classes['@mozilla.org/rdf/datasource;1?name=window-mediator'].getService();
  330.     return (gWindowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator));
  331. }
  332.  
  333. function GetInboxFolder(server)
  334. {
  335.     try {
  336.         var rootFolder = server.RootFolder;
  337.         var rootMsgFolder = rootFolder.QueryInterface(Components.interfaces.nsIMsgFolder);
  338.  
  339.         //now find Inbox
  340.         var outNumFolders = new Object();
  341.         var inboxFolder = rootMsgFolder.getFoldersWithFlag(0x1000, 1, outNumFolders);
  342.  
  343.         return inboxFolder.QueryInterface(Components.interfaces.nsIMsgFolder);
  344.     }
  345.     catch (ex) {
  346.         dump(ex + "\n");
  347.     }
  348.     return null;
  349. }
  350.  
  351. function GetMessagesForInboxOnServer(server)
  352. {
  353.   var inboxFolder = GetInboxFolder(server);
  354.   if (!inboxFolder) return;
  355.  
  356.   var folders = new Array(1);
  357.   folders[0] = inboxFolder;
  358.  
  359.   var compositeDataSource = GetCompositeDataSource("GetNewMessages");
  360.   GetNewMessages(folders, compositeDataSource);
  361. }
  362.  
  363. function MsgGetMessage()
  364. {
  365.   // if offline, prompt for getting messages
  366.   if(CheckOnline()) {
  367.     GetFolderMessages();
  368.   }
  369.   else {
  370.     var option = PromptGetMessagesOffline();
  371.     if(option == 0) {
  372.       if (!gOfflineManager) 
  373.         GetOfflineMgrService();
  374.       gOfflineManager.goOnline(false /* sendUnsentMessages */, 
  375.                                false /* playbackOfflineImapOperations */, 
  376.                                msgWindow);
  377.       GetFolderMessages();
  378.     }
  379.   }
  380. }
  381.  
  382. function MsgGetMessagesForAllServers(defaultServer)
  383. {
  384.     // now log into any server
  385.     try
  386.     {
  387.         var allServers = accountManager.allServers;
  388.  
  389.         for (var i=0;i<allServers.Count();i++)
  390.         {
  391.             var currentServer = allServers.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgIncomingServer);
  392.             var protocolinfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + currentServer.type].getService(Components.interfaces.nsIMsgProtocolInfo);
  393.             if (protocolinfo.canLoginAtStartUp && currentServer.loginAtStartUp)
  394.             {
  395.                 if (defaultServer && defaultServer.equals(currentServer))
  396.                 {
  397.                     dump(currentServer.serverURI + "...skipping, already opened\n");
  398.                 }
  399.                 else
  400.                 {
  401.                     // Check to see if there are new messages on the server
  402.                     currentServer.PerformBiff();
  403.                 }
  404.             }
  405.         }
  406.     }
  407.     catch(ex)
  408.     {
  409.         dump(ex + "\n");
  410.     }
  411. }
  412.  
  413. /**
  414.   * Get messages for all those accounts which have the capability
  415.   * of getting messages and have session password available i.e.,
  416.   * curretnly logged in accounts.
  417.   * if offline, prompt for getting messages.
  418.   */
  419. function MsgGetMessagesForAllAuthenticatedAccounts()
  420. {
  421.   if(CheckOnline()) {
  422.     GetMessagesForAllAuthenticatedAccounts();
  423.   }
  424.   else {
  425.     var option = PromptGetMessagesOffline();
  426.     if(option == 0) {
  427.       if (!gOfflineManager) 
  428.         GetOfflineMgrService();
  429.       gOfflineManager.goOnline(false /* sendUnsentMessages */, 
  430.                                false /* playbackOfflineImapOperations */, 
  431.                                msgWindow);
  432.       GetMessagesForAllAuthenticatedAccounts();
  433.     }
  434.   }
  435. }
  436.  
  437. /**
  438.   * Get messages for the account selected from Menu dropdowns.
  439.   * if offline, prompt for getting messages.
  440.   */
  441. function MsgGetMessagesForAccount(aEvent)
  442. {
  443.   if (!aEvent)
  444.     return;
  445.  
  446.   if(CheckOnline()) {
  447.     GetMessagesForAccount(aEvent);
  448.   }
  449.   else {
  450.     var option = PromptGetMessagesOffline();
  451.     if(option == 0) {
  452.       if (!gOfflineManager) 
  453.         GetOfflineMgrService();
  454.       gOfflineManager.goOnline(false /* sendUnsentMessages */, 
  455.                                false /* playbackOfflineImapOperations */, 
  456.                                msgWindow);
  457.       GetMessagesForAccount(aEvent);
  458.     }
  459.   }
  460. }
  461.  
  462. // if offline, prompt for getNextNMessages
  463. function MsgGetNextNMessages()
  464. {
  465.   if(CheckOnline()) {
  466.     var folder = GetFirstSelectedMsgFolder();
  467.     if(folder) 
  468.       GetNextNMessages(folder);
  469.   }
  470.   else {
  471.     var option = PromptGetMessagesOffline();
  472.     if(option == 0) {
  473.       if (!gOfflineManager) 
  474.         GetOfflineMgrService();
  475.       gOfflineManager.goOnline(false /* sendUnsentMessages */, 
  476.                                false /* playbackOfflineImapOperations */, 
  477.                                msgWindow);
  478.       var folder = GetFirstSelectedMsgFolder();
  479.       if(folder) {
  480.         GetNextNMessages(folder);
  481.       }
  482.     }
  483.   }   
  484. }
  485.  
  486. function MsgDeleteMessage(reallyDelete, fromToolbar)
  487. {
  488.     var srcFolder = GetLoadedMsgFolder();
  489.     // if from the toolbar, return right away if this is a news message
  490.     // only allow cancel from the menu:  "Edit | Cancel / Delete Message"
  491.     if (fromToolbar)
  492.     {
  493.         var folderResource = srcFolder.QueryInterface(Components.interfaces.nsIRDFResource);
  494.         var uri = folderResource.Value;
  495.         if (isNewsURI(uri)) {
  496.             // if news, don't delete
  497.             return;
  498.         }
  499.     }
  500.  
  501.     var compositeDataSource = GetCompositeDataSource("DeleteMessages");
  502.     var messages = GetSelectedMessages();
  503.  
  504.     SetNextMessageAfterDelete();
  505.     if (reallyDelete) {
  506.         gDBView.doCommand(nsMsgViewCommandType.deleteNoTrash);
  507.     }
  508.     else {
  509.         gDBView.doCommand(nsMsgViewCommandType.deleteMsg);
  510.     }
  511. }
  512.  
  513. function MsgCopyMessage(destFolder)
  514. {
  515.   try {
  516.     // get the msg folder we're copying messages into
  517.     var destUri = destFolder.getAttribute('id');
  518.     var destResource = RDF.GetResource(destUri);
  519.     var destMsgFolder = destResource.QueryInterface(Components.interfaces.nsIMsgFolder);
  520.     gDBView.doCommandWithFolder(nsMsgViewCommandType.copyMessages, destMsgFolder);
  521.   }
  522.   catch (ex) {
  523.     dump("MsgCopyMessage failed: " + ex + "\n");
  524.   }
  525. }
  526.  
  527. function MsgMoveMessage(destFolder)
  528. {
  529.   try {
  530.     // get the msg folder we're moving messages into
  531.     var destUri = destFolder.getAttribute('id');
  532.     var destResource = RDF.GetResource(destUri);
  533.     var destMsgFolder = destResource.QueryInterface(Components.interfaces.nsIMsgFolder);
  534.     // we don't move news messages, we copy them
  535.     if (isNewsURI(gDBView.msgFolder.URI)) {
  536.       gDBView.doCommandWithFolder(nsMsgViewCommandType.copyMessages, destMsgFolder);
  537.     }
  538.     else {
  539.       SetNextMessageAfterDelete();
  540.       gDBView.doCommandWithFolder(nsMsgViewCommandType.moveMessages, destMsgFolder);
  541.     }
  542.   }
  543.   catch (ex) {
  544.     dump("MsgMoveMessage failed: " + ex + "\n");
  545.   }
  546. }
  547.  
  548. function MsgNewMessage(event)
  549. {
  550.   var loadedFolder = GetFirstSelectedMsgFolder();
  551.   var messageArray = GetSelectedMessages();
  552.  
  553.   if (event && event.shiftKey)
  554.     ComposeMessage(msgComposeType.New, msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  555.   else
  556.     ComposeMessage(msgComposeType.New, msgComposeFormat.Default, loadedFolder, messageArray);
  557. }
  558.  
  559. function MsgReplyMessage(event)
  560. {
  561.   var loadedFolder = GetLoadedMsgFolder();
  562.   var server = loadedFolder.server;
  563.  
  564.   if(server && server.type == "nntp")
  565.     MsgReplyGroup(event);
  566.   else
  567.     MsgReplySender(event);
  568. }
  569.  
  570. function MsgReplySender(event)
  571. {
  572.   var loadedFolder = GetLoadedMsgFolder();
  573.   var messageArray = GetSelectedMessages();
  574.  
  575.   if (event && event.shiftKey)
  576.     ComposeMessage(msgComposeType.ReplyToSender, msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  577.   else
  578.     ComposeMessage(msgComposeType.ReplyToSender, msgComposeFormat.Default, loadedFolder, messageArray);
  579. }
  580.  
  581. function MsgReplyGroup(event)
  582. {
  583.   var loadedFolder = GetLoadedMsgFolder();
  584.   var messageArray = GetSelectedMessages();
  585.  
  586.   if (event && event.shiftKey)
  587.     ComposeMessage(msgComposeType.ReplyToGroup, msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  588.   else
  589.     ComposeMessage(msgComposeType.ReplyToGroup, msgComposeFormat.Default, loadedFolder, messageArray);
  590. }
  591.  
  592. function MsgReplyToAllMessage(event)
  593. {
  594.   var loadedFolder = GetLoadedMsgFolder();
  595.   var messageArray = GetSelectedMessages();
  596.  
  597.   if (event && event.shiftKey)
  598.     ComposeMessage(msgComposeType.ReplyAll, msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  599.   else
  600.     ComposeMessage(msgComposeType.ReplyAll, msgComposeFormat.Default, loadedFolder, messageArray);
  601. }
  602.  
  603. function MsgForwardMessage(event)
  604. {
  605.   var forwardType = 0;
  606.   try {
  607.       forwardType = pref.GetIntPref("mail.forward_message_mode");
  608.   } catch (e) {dump ("failed to retrieve pref mail.forward_message_mode");}
  609.  
  610.   // mail.forward_message_mode could be 1, if the user migrated from 4.x
  611.   // 1 (forward as quoted) is obsolete, so we treat is as forward inline
  612.   // since that is more like forward as quoted then forward as attachment
  613.   if (forwardType == 0)
  614.       MsgForwardAsAttachment(event);
  615.   else
  616.       MsgForwardAsInline(event);
  617. }
  618.  
  619. function MsgForwardAsAttachment(event)
  620. {
  621.   var loadedFolder = GetLoadedMsgFolder();
  622.   var messageArray = GetSelectedMessages();
  623.  
  624.   //dump("\nMsgForwardAsAttachment from XUL\n");
  625.   if (event && event.shiftKey)
  626.     ComposeMessage(msgComposeType.ForwardAsAttachment,
  627.                    msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  628.   else
  629.     ComposeMessage(msgComposeType.ForwardAsAttachment, msgComposeFormat.Default, loadedFolder, messageArray);
  630. }
  631.  
  632. function MsgForwardAsInline(event)
  633. {
  634.   var loadedFolder = GetLoadedMsgFolder();
  635.   var messageArray = GetSelectedMessages();
  636.  
  637.   //dump("\nMsgForwardAsInline from XUL\n");
  638.   if (event && event.shiftKey)
  639.     ComposeMessage(msgComposeType.ForwardInline,
  640.                    msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  641.   else
  642.     ComposeMessage(msgComposeType.ForwardInline, msgComposeFormat.Default, loadedFolder, messageArray);
  643. }
  644.  
  645.  
  646. function MsgEditMessageAsNew()
  647. {
  648.     var loadedFolder = GetLoadedMsgFolder();
  649.     var messageArray = GetSelectedMessages();
  650.     ComposeMessage(msgComposeType.Template, msgComposeFormat.Default, loadedFolder, messageArray);
  651. }
  652.  
  653. function MsgHome(url)
  654. {
  655.   window.open(url, "_blank", "chrome,dependent=yes,all");
  656. }
  657.  
  658. function MsgNewFolder(callBackFunctionName)
  659. {
  660.     var preselectedFolder = GetFirstSelectedMsgFolder();
  661.     var dualUseFolders = true;
  662.     var server = null;
  663.     var destinationFolder = null;
  664.  
  665.     if (preselectedFolder)
  666.     {
  667.         try {
  668.             server = preselectedFolder.server;
  669.             if (server)
  670.             {
  671.                 destinationFolder = getDestinationFolder(preselectedFolder, server);
  672.  
  673.                 var imapServer =
  674.                     server.QueryInterface(Components.interfaces.nsIImapIncomingServer);
  675.                 if (imapServer)
  676.                     dualUseFolders = imapServer.dualUseFolders;
  677.             }
  678.         } catch (e) {
  679.             dump ("Exception: dualUseFolders = true\n");
  680.         }
  681.     }
  682.  
  683.     CreateNewSubfolder("chrome://messenger/content/newFolderDialog.xul", destinationFolder, dualUseFolders, callBackFunctionName);
  684. }
  685.  
  686.  
  687. function getDestinationFolder(preselectedFolder, server)
  688. {
  689.     var destinationFolder = null;
  690.  
  691.     var isCreateSubfolders = preselectedFolder.canCreateSubfolders;
  692.     if (!isCreateSubfolders)
  693.     {
  694.         var tmpDestFolder = server.RootFolder;
  695.         destinationFolder
  696.           = tmpDestFolder.QueryInterface(Components.interfaces.nsIMsgFolder);
  697.  
  698.         var verifyCreateSubfolders = null;
  699.         if (destinationFolder)
  700.             verifyCreateSubfolders = destinationFolder.canCreateSubfolders;
  701.  
  702.         // in case the server cannot have subfolders,
  703.         // get default account and set its incoming server as parent folder
  704.         if (!verifyCreateSubfolders)
  705.         {
  706.             try {
  707.                 var account = accountManager.defaultAccount;
  708.                 var defaultServer = account.incomingServer;
  709.                 var tmpDefaultFolder = defaultServer.RootFolder;
  710.                 var defaultFolder
  711.                   = tmpDefaultFolder.QueryInterface(Components.interfaces.nsIMsgFolder);
  712.  
  713.                 var checkCreateSubfolders = null;
  714.                 if (defaultFolder)
  715.                     checkCreateSubfolders = defaultFolder.canCreateSubfolders;
  716.  
  717.                 if (checkCreateSubfolders)
  718.                     destinationFolder = defaultFolder;
  719.  
  720.             } catch (e) {
  721.                 dump ("Exception: defaultAccount Not Available\n");
  722.             }
  723.         }
  724.     }
  725.     else
  726.         destinationFolder = preselectedFolder;
  727.  
  728.     return destinationFolder;
  729. }
  730.  
  731. function MsgSubscribe()
  732. {
  733.     var preselectedFolder = GetFirstSelectedMsgFolder();
  734.     Subscribe(preselectedFolder);
  735. }
  736.  
  737. function ConfirmUnsubscribe(folder)
  738. {
  739.     if (!gMessengerBundle)
  740.         gMessengerBundle = document.getElementById("bundle_messenger");
  741.  
  742.     var titleMsg = gMessengerBundle.getString("confirmUnsubscribeTitle");
  743.     var dialogMsg = gMessengerBundle.getFormattedString("confirmUnsubscribeText",
  744.                                         [folder.name], 1);
  745.  
  746.     var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
  747.     return promptService.confirm(window, titleMsg, dialogMsg);
  748. }
  749.  
  750. function MsgUnsubscribe()
  751. {
  752.     var folder = GetFirstSelectedMsgFolder();
  753.     if (ConfirmUnsubscribe(folder)) {
  754.         UnSubscribe(folder);
  755.     }
  756. }
  757.  
  758. function MsgSaveAsFile()
  759. {
  760.     if (GetNumSelectedMessages() == 1) {
  761.         SaveAsFile(GetFirstSelectedMessage());
  762.     }
  763. }
  764.  
  765.  
  766. function MsgSaveAsTemplate()
  767. {
  768.     var folder = GetLoadedMsgFolder();
  769.     if (GetNumSelectedMessages() == 1) {
  770.         SaveAsTemplate(GetFirstSelectedMessage(), folder);
  771.     }
  772. }
  773.  
  774. function MsgOpenNewWindowForFolder(folderUri)
  775. {
  776.     if(!folderUri)
  777.     {
  778.         var folder = GetLoadedMsgFolder();
  779.         var folderResource = folder.QueryInterface(Components.interfaces.nsIRDFResource);
  780.         folderUri = folderResource.Value;
  781.     }
  782.  
  783.     if(folderUri)
  784.     {
  785.         var layoutType = pref.GetIntPref("mail.pane_config");
  786.  
  787.         if(layoutType == 0)
  788.             window.openDialog( "chrome://messenger/content/messenger.xul", "_blank", "chrome,all,dialog=no", folderUri );
  789.         else
  790.             window.openDialog("chrome://messenger/content/mail3PaneWindowVertLayout.xul", "_blank", "chrome,all,dialog=no", folderUri );
  791.     }
  792. }
  793.  
  794. // passing in the view, so this will work for search and the thread pane
  795. function MsgOpenSelectedMessages()
  796. {
  797.   var dbView = GetDBView();
  798.  
  799.   var indices = GetSelectedIndices(dbView);
  800.   var numMessages = indices.length;
  801.  
  802.   for (var i = 0; i < numMessages; i++) {
  803.     MsgOpenNewWindowForMessage(dbView.getURIForViewIndex(indices[i]),dbView.getFolderForViewIndex(indices[i]).URI);
  804.   }
  805. }
  806.  
  807. function MsgOpenNewWindowForMessage(messageUri, folderUri)
  808. {
  809.     var currentIndex;
  810.  
  811.     if (!messageUri || !folderUri) {
  812.         var outlinerView = gDBView.QueryInterface(Components.interfaces.nsIOutlinerView);
  813.         var outlinerSelection = outlinerView.selection;
  814.         currentIndex = outlinerSelection.currentIndex;
  815.     }
  816.  
  817.     if (!messageUri) {
  818.         messageUri = gDBView.getURIForViewIndex(currentIndex);
  819.     }
  820.  
  821.     if (!folderUri) {
  822.         folderUri = gDBView.getFolderForViewIndex(currentIndex).URI;
  823.     }
  824.  
  825.     // be sure to pass in the current view....
  826.     if (messageUri && folderUri) {
  827.         window.openDialog( "chrome://messenger/content/messageWindow.xul", "_blank", "chrome,all,dialog=no", messageUri, folderUri, gDBView );
  828.     }
  829. }
  830.  
  831. function CloseMailWindow()
  832. {
  833.     //dump("\nClose from XUL\nDo something...\n");
  834.     window.close();
  835. }
  836.  
  837. function MsgMarkMsgAsRead(markRead)
  838. {
  839.     if (!markRead) {
  840.         markRead = !SelectedMessagesAreRead();
  841.     }
  842.     MarkSelectedMessagesRead(markRead);
  843. }
  844.  
  845. function MsgMarkAsFlagged(markFlagged)
  846. {
  847.     if (!markFlagged) {
  848.         markFlagged = !SelectedMessagesAreFlagged();
  849.     }
  850.     MarkSelectedMessagesFlagged(markFlagged);
  851. }
  852.  
  853. function MsgMarkAllRead()
  854. {
  855.     var compositeDataSource = GetCompositeDataSource("MarkAllMessagesRead");
  856.     var folder = GetLoadedMsgFolder();
  857.  
  858.     if(folder)
  859.         MarkAllMessagesRead(compositeDataSource, folder);
  860. }
  861.  
  862. function MsgDownloadFlagged()
  863. {
  864.   gDBView.doCommand(nsMsgViewCommandType.downloadFlaggedForOffline);
  865. }
  866.  
  867. function MsgDownloadSelected()
  868. {
  869.   gDBView.doCommand(nsMsgViewCommandType.downloadSelectedForOffline);
  870. }
  871.  
  872. function MsgMarkThreadAsRead()
  873. {
  874.     var uri = GetFirstSelectedMessage();
  875.     if (uri) {
  876.         MarkThreadAsRead(uri);
  877.     }
  878. }
  879.  
  880. function MsgViewPageSource()
  881. {
  882.     var messages = GetSelectedMessages();
  883.     ViewPageSource(messages);
  884. }
  885.  
  886. function MsgFind()
  887. {
  888.   var contentWindow = window.top._content;
  889.  
  890.   // from utilityOverlay.js
  891.   findInPage(getMessageBrowser(), contentWindow, contentWindow)
  892. }
  893.  
  894. function MsgFindAgain()
  895. {
  896.   var contentWindow = window.top._content;
  897.   findAgainInPage(getMessageBrowser(), contentWindow, contentWindow)
  898. }
  899.  
  900. function MsgCanFindAgain()
  901. {
  902.   return canFindAgainInPage();
  903. }
  904.  
  905. function MsgSearchMessages()
  906. {
  907.     var preselectedFolder = GetFirstSelectedMsgFolder();
  908.     var windowManagerInterface = GetWindowMediator();
  909.     var searchWindow = windowManagerInterface.getMostRecentWindow("mailnews:search");
  910.  
  911.     if (searchWindow)
  912.         searchWindow.focus();
  913.     else
  914.         window.openDialog("chrome://messenger/content/SearchDialog.xul", "", 
  915.                           "chrome,resizable,centerscreen,dialog=no", { folder: preselectedFolder });
  916. }
  917.  
  918. function MsgFilters()
  919. {
  920.     var preselectedFolder = GetFirstSelectedMsgFolder();
  921.     var windowManagerInterface = GetWindowMediator();
  922.     var filterList = windowManagerInterface.getMostRecentWindow("mailnews:filterlist");
  923.  
  924.     if (filterList)
  925.     {
  926.         var filterEditor = windowManagerInterface.getMostRecentWindow("mailnews:filtereditor");
  927.  
  928.         // If the filtereditor is open, then we focus that because it is modal and
  929.         // thus blocking the filterlist from focusing.
  930.         if (filterEditor)
  931.             filterEditor.focus();
  932.         else
  933.             filterList.focus();
  934.     }
  935.     else
  936.         window.openDialog("chrome://messenger/content/FilterListDialog.xul", "", 
  937.                           "chrome,resizable,centerscreen,dialog=yes", { folder: preselectedFolder });
  938. }
  939.  
  940. function MsgViewAllHeaders()
  941. {
  942.     pref.SetIntPref("mail.show_headers",2);
  943.     MsgReload();
  944.     return true;
  945. }
  946.  
  947. function MsgViewNormalHeaders()
  948. {
  949.     pref.SetIntPref("mail.show_headers",1);
  950.     MsgReload();
  951.     return true;
  952. }
  953.  
  954. function MsgViewBriefHeaders()
  955. {
  956.     pref.SetIntPref("mail.show_headers",0);
  957.     MsgReload();
  958.     return true;
  959. }
  960.  
  961. function MsgReload()
  962. {
  963.     ReloadMessage();
  964. }
  965.  
  966. function MsgStop()
  967. {
  968.     StopUrls();
  969. }
  970.  
  971. function MsgSendUnsentMsgs()
  972. {
  973.   // if offline, prompt for sendUnsentMessages
  974.   if(CheckOnline()) {
  975.     SendUnsentMessages();    
  976.   }
  977.   else {
  978.     var option = PromptSendMessagesOffline();
  979.     if(option == 0) {
  980.       if (!gOfflineManager) 
  981.         GetOfflineMgrService();
  982.       gOfflineManager.goOnline(false /* sendUnsentMessages */, 
  983.                                false /* playbackOfflineImapOperations */, 
  984.                                msgWindow);
  985.       SendUnsentMessages();
  986.     }
  987.   }
  988. }
  989.  
  990. function PrintEnginePrint()
  991. {
  992.     var messageList = GetSelectedMessages();
  993.     var numMessages = messageList.length;
  994.  
  995.     if (numMessages == 0) {
  996.         dump("PrintEnginePrint(): No messages selected.\n");
  997.         return false;
  998.     }
  999.  
  1000.     printEngineWindow = window.openDialog("chrome://messenger/content/msgPrintEngine.xul",
  1001.                                           "",
  1002.                                           "chrome,dialog=no,all",
  1003.                                           numMessages, messageList, statusFeedback);
  1004.     return true;
  1005. }
  1006.  
  1007. function IsMailFolderSelected()
  1008. {
  1009.     var selectedFolders = GetSelectedMsgFolders();
  1010.     var numFolders = selectedFolders.length;
  1011.     if(numFolders !=1)
  1012.         return false;
  1013.  
  1014.     var folder = selectedFolders[0];
  1015.     if (!folder)
  1016.         return false;
  1017.  
  1018.     var server = folder.server;
  1019.     var serverType = server.type;
  1020.  
  1021.     if((serverType == "nntp"))
  1022.         return false;
  1023.     else return true;
  1024. }
  1025.  
  1026. function IsGetNewMessagesEnabled()
  1027. {
  1028.     var selectedFolders = GetSelectedMsgFolders();
  1029.     var numFolders = selectedFolders.length;
  1030.     if(numFolders !=1)
  1031.         return false;
  1032.  
  1033.     var folder = selectedFolders[0];
  1034.     if (!folder)
  1035.         return false;
  1036.  
  1037.     var server = folder.server;
  1038.     var isServer = folder.isServer;
  1039.     var serverType = server.type;
  1040.  
  1041.     if(isServer && (serverType == "nntp"))
  1042.         return false;
  1043.     else if(serverType == "none")
  1044.         return false;
  1045.     else
  1046.         return true;
  1047. }
  1048.  
  1049. function IsGetNextNMessagesEnabled()
  1050. {
  1051.     var selectedFolders = GetSelectedMsgFolders();
  1052.     var numFolders = selectedFolders.length;
  1053.     if(numFolders !=1)
  1054.         return false;
  1055.  
  1056.     var folder = selectedFolders[0];
  1057.     if (!folder)
  1058.         return false;
  1059.  
  1060.     var server = folder.server;
  1061.     var serverType = server.type;
  1062.  
  1063.     var menuItem = document.getElementById("menu_getnextnmsg");
  1064.     if((serverType == "nntp")) {
  1065.         var newsServer = server.QueryInterface(Components.interfaces.nsINntpIncomingServer);
  1066.         var menuLabel = gMessengerBundle.getFormattedString("getNextNMessages",
  1067.                                                             [ newsServer.maxArticles ]);
  1068.         menuItem.setAttribute("label",menuLabel);
  1069.         menuItem.setAttribute("hidden","false");
  1070.         return true;
  1071.     }
  1072.     else {
  1073.         menuItem.setAttribute("hidden","true");
  1074.         return false;
  1075.     }
  1076. }
  1077.  
  1078. function IsEmptyTrashEnabled()
  1079. {
  1080.     return IsMailFolderSelected();
  1081. }
  1082.  
  1083. function IsCompactFolderEnabled()
  1084. {
  1085.     var folderOutliner = GetFolderOutliner();
  1086.     var startIndex = {};
  1087.     var endIndex = {};
  1088.     folderOutliner.outlinerBoxObject.selection.getRangeAt(0, startIndex, endIndex);
  1089.     if (startIndex.value < 0)
  1090.          return false;
  1091.  
  1092.     var folderResource = GetFolderResource(folderOutliner, startIndex.value);
  1093.     if (! folderResource)
  1094.          return false;
  1095.  
  1096.     return GetFolderAttribute(folderOutliner, folderResource, "CanCompact") == "true" && isCommandEnabled("cmd_compactFolder");
  1097. }
  1098.  
  1099. var gDeleteButton = null;
  1100. var gMarkButton = null;
  1101.  
  1102. function SetUpToolbarButtons(uri)
  1103. {
  1104.     // dump("SetUpToolbarButtons("+uri+")\n");
  1105.  
  1106.     // eventually, we might want to set up the toolbar differently for imap,
  1107.     // pop, and news.  for now, just tweak it based on if it is news or not.
  1108.     var forNews = isNewsURI(uri);
  1109.  
  1110.     if(!gMarkButton) gMarkButton = document.getElementById("button-mark");
  1111.     if(!gDeleteButton) gDeleteButton = document.getElementById("button-delete");
  1112.  
  1113.     var buttonToHide = null;
  1114.     var buttonToShow = null;
  1115.  
  1116.     if (forNews) {
  1117.         buttonToHide = gDeleteButton;
  1118.         buttonToShow = gMarkButton;
  1119.     }
  1120.     else {
  1121.         buttonToHide = gMarkButton;
  1122.         buttonToShow = gDeleteButton;
  1123.     }
  1124.  
  1125.     if (buttonToHide) {
  1126.         buttonToHide.setAttribute('hidden',true);
  1127.     }
  1128.     if (buttonToShow) {
  1129.         buttonToShow.removeAttribute('hidden');
  1130.     }
  1131. }
  1132.  
  1133. var gMessageBrowser;
  1134.  
  1135. function getMessageBrowser()
  1136. {
  1137.   if (!gMessageBrowser)
  1138.     gMessageBrowser = document.getElementById("messagepane");
  1139.  
  1140.   return gMessageBrowser;
  1141. }
  1142.  
  1143. function getMarkupDocumentViewer()
  1144. {
  1145.   return getMessageBrowser().markupDocumentViewer;
  1146. }
  1147.  
  1148. function MsgSynchronizeOffline()
  1149. {
  1150.     dump("in MsgSynchronize() \n"); 
  1151.     window.openDialog("chrome://messenger/content/msgSynchronize.xul",
  1152.           "", "centerscreen,chrome,modal,titlebar,resizable=yes",{msgWindow:msgWindow});              
  1153. }
  1154.  
  1155.  
  1156. function MsgMarkByDate() {}
  1157. function MsgOpenAttachment() {}
  1158. function MsgUpdateMsgCount() {}
  1159. function MsgImport() {}
  1160. function MsgSynchronize() {}
  1161. function MsgGetSelectedMsg() {}
  1162. function MsgGetFlaggedMsg() {}
  1163. function MsgSelectThread() {}
  1164. function MsgSelectFlaggedMsg() {}
  1165. function MsgShowFolders(){}
  1166. function MsgShowLocationbar() {}
  1167. function MsgViewAttachInline() {}
  1168. function MsgWrapLongLines() {}
  1169. function MsgIncreaseFont() {}
  1170. function MsgDecreaseFont() {}
  1171. function MsgShowImages() {}
  1172. function MsgRefresh() {}
  1173. function MsgViewPageInfo() {}
  1174. function MsgFirstUnreadMessage() {}
  1175. function MsgFirstFlaggedMessage() {}
  1176. function MsgGoBack() {}
  1177. function MsgGoForward() {}
  1178. function MsgAddSenderToAddressBook() {}
  1179. function MsgAddAllToAddressBook() {}
  1180.  
  1181. function SpaceHit()
  1182. {
  1183.   var contentWindow = window.top._content;
  1184.   var oldScrollY = contentWindow.scrollY;
  1185.  
  1186.   contentWindow.scrollByPages(1);
  1187.  
  1188.   // if at the end of the message, go to the next one
  1189.   if (oldScrollY == contentWindow.scrollY) {
  1190.     goDoCommand('cmd_nextUnreadMsg');
  1191.   }
  1192. }
  1193.  
  1194. function IsAccountOfflineEnabled()
  1195. {
  1196.   var selectedFolders = GetSelectedMsgFolders();
  1197.  
  1198.   if (selectedFolders && (selectedFolders.length == 1))
  1199.       return selectedFolders[0].supportsOffline;
  1200.      
  1201.   return false;
  1202. }
  1203.  
  1204. // init nsIPromptService and strings
  1205. function InitPrompts()
  1206. {
  1207.   if(!gPromptService) {
  1208.     gPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService();
  1209.     gPromptService = gPromptService.QueryInterface(Components.interfaces.nsIPromptService);
  1210.   }
  1211.   if (!gOfflinePromptsBundle) 
  1212.     gOfflinePromptsBundle = document.getElementById("bundle_offlinePrompts");
  1213. }
  1214.  
  1215. // prompt for getting messages when offline
  1216. function PromptGetMessagesOffline()
  1217. {
  1218.   InitPrompts();
  1219.   if (gPromptService) {
  1220.     var buttonPressed = {value:0};
  1221.     var checkValue = {value:false};
  1222.     gPromptService.confirmEx(window, 
  1223.                             gOfflinePromptsBundle.getString('getMessagesOfflineWindowTitle'), 
  1224.                             gOfflinePromptsBundle.getString('getMessagesOfflineLabel'),
  1225.                             (gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) +
  1226.                             (gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1),
  1227.                             gOfflinePromptsBundle.getString('getMessagesOfflineGoButtonLabel'),
  1228.                             null, null, null, checkValue, buttonPressed);
  1229.     if(buttonPressed) {
  1230.       return buttonPressed.value;
  1231.     }
  1232.   }
  1233. }
  1234.  
  1235. // prompt for sending messages when offline
  1236. function PromptSendMessagesOffline()
  1237. {
  1238.   InitPrompts();
  1239.   if (gPromptService) {
  1240.     var buttonPressed = {value:0};
  1241.     var checkValue= {value:false};
  1242.     gPromptService.confirmEx(window, 
  1243.                             gOfflinePromptsBundle.getString('sendMessagesOfflineWindowTitle'), 
  1244.                             gOfflinePromptsBundle.getString('sendMessagesOfflineLabel'),
  1245.                             (gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) +
  1246.                             (gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1),
  1247.                             gOfflinePromptsBundle.getString('sendMessagesOfflineGoButtonLabel'),
  1248.                             null, null, null, checkValue, buttonPressed);
  1249.     if(buttonPressed) {
  1250.       return buttonPressed.value;
  1251.     }
  1252.   }
  1253. }
  1254.  
  1255. function GetFolderMessages()
  1256. {
  1257.   var folders = GetSelectedMsgFolders();
  1258.   var compositeDataSource = GetCompositeDataSource("GetNewMessages");
  1259.   GetNewMessages(folders, compositeDataSource);
  1260. }
  1261.  
  1262. function SendUnsentMessages()
  1263. {
  1264.   var am = Components.classes["@mozilla.org/messenger/account-manager;1"]
  1265.                .getService(Components.interfaces.nsIMsgAccountManager);
  1266.   var msgSendlater = Components.classes["@mozilla.org/messengercompose/sendlater;1"]
  1267.                .getService(Components.interfaces.nsIMsgSendLater);
  1268.   var identitiesCount, allIdentities, currentIdentity, numMessages, msgFolder;
  1269.  
  1270.   if(am) { 
  1271.     allIdentities = am.allIdentities;
  1272.     identitiesCount = allIdentities.Count();
  1273.     for (var i = 0; i < identitiesCount; i++) {
  1274.       currentIdentity = allIdentities.QueryElementAt(i, Components.interfaces.nsIMsgIdentity);
  1275.       msgFolder = msgSendlater.getUnsentMessagesFolder(currentIdentity);
  1276.       if(msgFolder) {
  1277.         numMessages = msgFolder.getTotalMessages(false /* include subfolders */);
  1278.         if(numMessages > 0) {
  1279.           messenger.SendUnsentMessages(currentIdentity);
  1280.           // right now, all identities point to the same unsent messages
  1281.           // folder, so to avoid sending multiple copies of the
  1282.           // unsent messages, we only call messenger.SendUnsentMessages() once
  1283.           // see bug #89150 for details
  1284.           break;
  1285.         }
  1286.       }
  1287.     } 
  1288.   }
  1289. }
  1290.  
  1291. function GetMessagesForAllAuthenticatedAccounts()
  1292. {
  1293.    try {
  1294.     var allServers = accountManager.allServers;
  1295.     for (var i=0;i<allServers.Count();i++) {
  1296.       var currentServer = allServers.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgIncomingServer);
  1297.       var protocolinfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" +
  1298.                            currentServer.type].getService(Components.interfaces.nsIMsgProtocolInfo);
  1299.       if (protocolinfo.canGetMessages && currentServer.password) {
  1300.         // Get new messages now
  1301.         GetMessagesForInboxOnServer(currentServer);
  1302.       }
  1303.     }
  1304.   }
  1305.   catch(ex) {
  1306.     dump(ex + "\n");
  1307.   }
  1308. }
  1309.  
  1310. function GetMessagesForAccount(aEvent)
  1311. {
  1312.   var uri = aEvent.target.id;
  1313.   var server = GetServer(uri);
  1314.   GetMessagesForInboxOnServer(server);
  1315.   aEvent.preventBubble();
  1316. }
  1317.  
  1318.  
  1319. function CommandUpdate_UndoRedo()
  1320. {
  1321.     ShowMenuItem("menu_undo", true);
  1322.     EnableMenuItem("menu_undo", SetupUndoRedoCommand("cmd_undo"));
  1323.     ShowMenuItem("menu_redo", true);
  1324.     EnableMenuItem("menu_redo", SetupUndoRedoCommand("cmd_redo"));
  1325. }
  1326.  
  1327. function SetupUndoRedoCommand(command)
  1328. {
  1329.     var canUndoOrRedo = false;
  1330.     var txnType = 0;
  1331.  
  1332.     if (command == "cmd_undo")
  1333.     {
  1334.         canUndoOrRedo = messenger.CanUndo();
  1335.         txnType = messenger.GetUndoTransactionType();
  1336.     }
  1337.     else
  1338.     {
  1339.         canUndoOrRedo = messenger.CanRedo();
  1340.         txnType = messenger.GetRedoTransactionType();
  1341.     }
  1342.  
  1343.     if (canUndoOrRedo)
  1344.     {
  1345.         switch (txnType)
  1346.         {
  1347.         default:
  1348.         case 0:
  1349.             goSetMenuValue(command, 'valueDefault');
  1350.             break;
  1351.         case 1:
  1352.             goSetMenuValue(command, 'valueDeleteMsg');
  1353.             break;
  1354.         case 2:
  1355.             goSetMenuValue(command, 'valueMoveMsg');
  1356.             break;
  1357.         case 3:
  1358.             goSetMenuValue(command, 'valueCopyMsg');
  1359.             break;
  1360.         }
  1361.     }
  1362.     else
  1363.     {
  1364.         goSetMenuValue(command, 'valueDefault');
  1365.     }
  1366.     return canUndoOrRedo;
  1367. }
  1368.  
  1369.