home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 January / 01_02.iso / software / netscape62win / mail.xpi / bin / chrome / messenger.jar / content / messenger / messageWindow.js < prev    next >
Text File  |  2001-10-16  |  19KB  |  724 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.  
  21. /* This is where functions related to the standalone message window are kept */
  22.  
  23. /* globals for a particular window */
  24.  
  25. var compositeDataSourceContractID        = datasourceContractIDPrefix + "composite-datasource";
  26.  
  27. var gCompositeDataSource;
  28. var gCurrentMessageUri;
  29. var gCurrentFolderUri;
  30. var gThreadPaneCommandUpdater = null;
  31. var gCurrentMessageIsDeleted = false;
  32. var gNextMessageViewIndexAfterDelete = -1;
  33.  
  34. // the folderListener object
  35. var folderListener = {
  36.   OnItemAdded: function(parentItem, item, view) {},
  37.  
  38.     OnItemRemoved: function(parentItem, item, view)
  39.     {
  40.         var parentFolderResource = parentItem.QueryInterface(Components.interfaces.nsIRDFResource);
  41.         if(!parentFolderResource)
  42.             return;
  43.  
  44.         var parentURI = parentFolderResource.Value;
  45.         if(parentURI != gCurrentFolderUri)
  46.             return;
  47.  
  48.         var deletedMessageHdr = item.QueryInterface(Components.interfaces.nsIMsgDBHdr);
  49.     if (extractMsgKeyFromURI() == deletedMessageHdr.messageKey)
  50.             gCurrentMessageIsDeleted = true;
  51.     },
  52.  
  53.     OnItemPropertyChanged: function(item, property, oldValue, newValue) {},
  54.  
  55.     OnItemIntPropertyChanged: function(item, property, oldValue, newValue)
  56.     {
  57.     },
  58.  
  59.     OnItemBoolPropertyChanged: function(item, property, oldValue, newValue) {},
  60.  
  61.   OnItemUnicharPropertyChanged: function(item, property, oldValue, newValue){},
  62.     OnItemPropertyFlagChanged: function(item, property, oldFlag, newFlag) {},
  63.  
  64.   OnItemEvent: function(folder, event) {
  65.           if (event.GetUnicode() == "DeleteOrMoveMsgCompleted") {
  66.               HandleDeleteOrMoveMsgCompleted(folder);
  67.           }     
  68.       else if (event.GetUnicode() == "DeleteOrMoveMsgFailed") {
  69.             HandleDeleteOrMoveMsgFailed(folder);
  70.       }
  71.     }
  72. }
  73.  
  74. function nsMsgDBViewCommandUpdater()
  75. {}
  76.  
  77. nsMsgDBViewCommandUpdater.prototype = 
  78. {
  79.   updateCommandStatus : function()
  80.     {
  81.       // the back end is smart and is only telling us to update command status
  82.       // when the # of items in the selection has actually changed.
  83.           document.commandDispatcher.updateCommands('mail-toolbar');
  84.     },
  85.  
  86.   displayMessageChanged : function(aFolder, aSubject)
  87.   {
  88.     setTitleFromFolder(aFolder, aSubject);
  89.     gCurrentMessageUri = gDBView.URIForFirstSelectedMessage;
  90.   },
  91.  
  92.   QueryInterface : function(iid)
  93.   {
  94.     if(iid.equals(Components.interfaces.nsIMsgDBViewCommandUpdater))
  95.         return this;
  96.       
  97.     throw Components.results.NS_NOINTERFACE;
  98.     return null;
  99.   }
  100. }
  101.  
  102. function HandleDeleteOrMoveMsgCompleted(folder)
  103. {
  104.     dump("In HandleDeleteOrMoveMsgCompleted\n");
  105.     var folderResource = folder.QueryInterface(Components.interfaces.nsIRDFResource);
  106.     if(!folderResource)
  107.         return;
  108.  
  109.     var folderUri = folderResource.Value;
  110.     if((folderUri == gCurrentFolderUri) && gCurrentMessageIsDeleted)
  111.     {
  112.     gCurrentMessageIsDeleted = false;
  113.     if (gNextMessageViewIndexAfterDelete != -1) 
  114.     {
  115.       var nextMstKey = gDBView.getKeyAt(gNextMessageViewIndexAfterDelete);
  116.       if (nextMstKey != -1) {
  117.         gDBView.loadMessageByMsgKey(nextMstKey);
  118.       }
  119.       else {
  120.         window.close();
  121.       }
  122.     }
  123.     else
  124.     {
  125.       // close the stand alone window because there are no more messages in the folder
  126.       window.close();
  127.     }
  128.     }
  129. }
  130.  
  131. function HandleDeleteOrMoveMsgFailed(folder)
  132. {
  133.   var folderResource = folder.QueryInterface(Components.interfaces.nsIRDFResource);
  134.   if(!folderResource)
  135.      return;
  136.  
  137.   var folderUri = folderResource.Value;
  138.   if((folderUri == gCurrentFolderUri) && gCurrentMessageIsDeleted)
  139.   {
  140.     gCurrentMessageIsDeleted = false;
  141.   }    
  142. }
  143.  
  144. function OnLoadMessageWindow()
  145. {
  146.     HideMenus();
  147.       AddMailOfflineObserver();
  148.     CreateMailWindowGlobals();
  149.     CreateMessageWindowGlobals();
  150.     verifyAccounts();
  151.  
  152.     InitMsgWindow();
  153.  
  154.     messenger.SetWindow(window, msgWindow);
  155.     InitializeDataSources();
  156.     // FIX ME - later we will be able to use onload from the overlay
  157.     OnLoadMsgHeaderPane();
  158.  
  159.   try {
  160.     mailSession.AddFolderListener(folderListener);
  161.     } catch (ex) {
  162.     dump("Error adding to session\n");
  163.   }
  164.  
  165.   var originalView = null;
  166.  
  167.     if(window.arguments)
  168.     {
  169.         if(window.arguments[0])
  170.         {
  171.             gCurrentMessageUri = window.arguments[0];
  172.         }
  173.         else
  174.         {
  175.             gCurrentMessageUri = null;
  176.         }
  177.  
  178.         if(window.arguments[1])
  179.         {
  180.             gCurrentFolderUri = window.arguments[1];
  181.         }
  182.         else
  183.         {
  184.             gCurrentFolderUri = null;
  185.         }
  186.  
  187.     if (window.arguments[2])
  188.       originalView = window.arguments[2];      
  189.     }    
  190.  
  191.   // extract the sort type, the sort order, 
  192.   var sortType;
  193.   var sortOrder;
  194.   var viewFlags;
  195.   var viewType;
  196.  
  197.   if (originalView)
  198.   {
  199.     viewType = originalView.viewType;
  200.     viewFlags = originalView.viewFlags;
  201.     sortType = originalView.sortType;
  202.     sortOrder = originalView.sortOrder;
  203.   }
  204.   
  205.   var msgFolder = GetLoadedMsgFolder();
  206.   CreateBareDBView(msgFolder,viewType, viewFlags, sortType, sortOrder); // create a db view for 
  207.  
  208.   if (gCurrentMessageUri) {
  209.     SetUpToolbarButtons(gCurrentMessageUri);
  210.   }
  211.   else if (gCurrentFolderUri) {
  212.     SetUpToolbarButtons(gCurrentFolderUri);
  213.   }
  214.  
  215.   setTimeout("var msgKey = extractMsgKeyFromURI(gCurrentMessageUri); gDBView.loadMessageByMsgKey(msgKey); gNextMessageViewIndexAfterDelete = gDBView.msgToSelectAfterDelete;", 0);
  216.  
  217.   SetupCommandUpdateHandlers();
  218.   var messagePaneFrame = top.frames['messagepane'];
  219.   if(messagePaneFrame)
  220.     messagePaneFrame.focus();
  221. }
  222.  
  223. function extractMsgKeyFromURI()
  224. {
  225.   var msgKey = -1;
  226.   var msgService = messenger.messageServiceFromURI(gCurrentMessageUri);
  227.   if (msgService)
  228.   {
  229.     var msgHdr = msgService.messageURIToMsgHdr(gCurrentMessageUri);
  230.     if (msgHdr)
  231.       msgKey = msgHdr.messageKey;
  232.   }
  233.  
  234.   return msgKey;
  235. }
  236.  
  237. function HideMenus()
  238. {
  239.     var message_menuitem=document.getElementById('menu_showMessage');
  240.     if(message_menuitem)
  241.         message_menuitem.setAttribute("hidden", "true");
  242.  
  243.     var expandOrCollapseMenu = document.getElementById('menu_expandOrCollapse');
  244.     if(expandOrCollapseMenu)
  245.         expandOrCollapseMenu.setAttribute("hidden", "true");
  246.  
  247.     var renameFolderMenu = document.getElementById('menu_renameFolder');
  248.     if(renameFolderMenu)
  249.         renameFolderMenu.setAttribute("hidden", "true");
  250.  
  251.     var viewMessagesMenu = document.getElementById('viewMessagesMenu');
  252.     if(viewMessagesMenu)
  253.         viewMessagesMenu.setAttribute("hidden", "true");
  254.  
  255.     var openMessageMenu = document.getElementById('openMessageWindowMenuitem');
  256.     if(openMessageMenu)
  257.         openMessageMenu.setAttribute("hidden", "true");
  258.  
  259.     var viewSortMenu = document.getElementById('viewSortMenu');
  260.     if(viewSortMenu)
  261.         viewSortMenu.setAttribute("hidden", "true");
  262.  
  263.     var viewThreadedMenu = document.getElementById('menu_showThreads');
  264.     if(viewThreadedMenu)
  265.         viewThreadedMenu.setAttribute("hidden", "true");
  266.  
  267.     var emptryTrashMenu = document.getElementById('menu_emptyTrash');
  268.     if(emptryTrashMenu)
  269.         emptryTrashMenu.setAttribute("hidden", "true");
  270.  
  271.     var menuProperties = document.getElementById('menu_properties');
  272.     if(menuProperties)
  273.         menuProperties.setAttribute("hidden", "true");
  274.  
  275.     var compactFolderMenu = document.getElementById('menu_compactFolder');
  276.     if(compactFolderMenu)
  277.         compactFolderMenu.setAttribute("hidden", "true");
  278.  
  279.     var trashSeparator = document.getElementById('trashMenuSeparator');
  280.     if(trashSeparator)
  281.         trashSeparator.setAttribute("hidden", "true");
  282.  
  283. }
  284.  
  285. function OnUnloadMessageWindow()
  286. {
  287.     OnMailWindowUnload();
  288. }
  289.  
  290. function CreateMessageWindowGlobals()
  291. {
  292.     gCompositeDataSource = Components.classes[compositeDataSourceContractID].createInstance();
  293.     gCompositeDataSource = gCompositeDataSource.QueryInterface(Components.interfaces.nsIRDFCompositeDataSource);
  294. }
  295.  
  296. function InitializeDataSources()
  297. {
  298.   AddDataSources();
  299.   //Now add datasources to composite datasource
  300.   gCompositeDataSource.AddDataSource(accountManagerDataSource);
  301.   gCompositeDataSource.AddDataSource(folderDataSource);
  302. }
  303.  
  304. function GetSelectedMsgFolders()
  305. {
  306.     var folderArray = new Array(1);
  307.     var msgFolder = GetLoadedMsgFolder();
  308.     if(msgFolder)
  309.     {
  310.         folderArray[0] = msgFolder;    
  311.     }
  312.     return folderArray;
  313. }
  314.  
  315. function GetFirstSelectedMessage()
  316. {
  317.     return GetLoadedMessage();
  318. }
  319.  
  320. function GetNumSelectedMessages()
  321. {
  322.     if(gCurrentMessageUri)
  323.         return 1;
  324.     else
  325.         return 0;
  326. }
  327.  
  328. function GetSelectedMessages()
  329. {
  330.     var messageArray = new Array(1);
  331.     var message = GetLoadedMessage();
  332.     if(message) {
  333.         messageArray[0] = message;    
  334.     }
  335.     return messageArray;
  336. }
  337.  
  338. function GetLoadedMsgFolder()
  339. {
  340.     if(gCurrentFolderUri)
  341.     {
  342.         var folderResource = RDF.GetResource(gCurrentFolderUri);
  343.         if(folderResource)
  344.         {
  345.             var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
  346.             return msgFolder;
  347.         }
  348.     }
  349.     return null;
  350. }
  351.  
  352. function GetLoadedMessage()
  353. {
  354.   return gCurrentMessageUri;
  355. }
  356.  
  357. //Clear everything related to the current message. called after load start page.
  358. function ClearMessageSelection()
  359. {
  360.     gCurrentMessageUri = null;
  361.     gCurrentFolderUri = null;
  362.   document.commandDispatcher.updateCommands('mail-toolbar');    
  363. }
  364.  
  365. function GetCompositeDataSource(command)
  366. {
  367.     return gCompositeDataSource;    
  368. }
  369.  
  370. function SetNextMessageAfterDelete()
  371. {
  372.   gNextMessageViewIndexAfterDelete = gDBView.msgToSelectAfterDelete;
  373. }
  374.  
  375. function SelectFolder(folderUri)
  376. {
  377.     gCurrentFolderUri = folderUri;
  378. }
  379.  
  380. function ReloadMessage()
  381. {
  382.   gDBView.reloadMessage();
  383. }
  384.  
  385. function MsgDeleteMessageFromMessageWindow(reallyDelete, fromToolbar)
  386. {
  387.   // if from the toolbar, return right away if this is a news message
  388.   // only allow cancel from the menu:  "Edit | Cancel / Delete Message"
  389.   if (fromToolbar)
  390.   {
  391.     if (isNewsURI(gCurrentFolderUri)) 
  392.     {
  393.         // if news, don't delete
  394.         return;
  395.     }
  396.   }
  397.   
  398.   // before we delete 
  399.   SetNextMessageAfterDelete();
  400.  
  401.   if (reallyDelete)
  402.       gDBView.doCommand(nsMsgViewCommandType.deleteNoTrash);
  403.   else
  404.       gDBView.doCommand(nsMsgViewCommandType.deleteMsg);
  405. }
  406.  
  407. // MessageWindowController object (handles commands when one of the trees does not have focus)
  408. var MessageWindowController =
  409. {
  410.    supportsCommand: function(command)
  411.     {
  412.  
  413.         switch ( command )
  414.         {
  415.             case "cmd_close":
  416.             case "cmd_reply":
  417.             case "button_reply":
  418.             case "cmd_replySender":
  419.             case "cmd_replyGroup":
  420.             case "cmd_replyall":
  421.             case "button_replyall":
  422.             case "cmd_forward":
  423.             case "button_forward":
  424.             case "cmd_forwardInline":
  425.             case "cmd_forwardAttachment":
  426.             case "cmd_editAsNew":
  427.             case "cmd_delete":
  428.       case "cmd_undo":
  429.       case "cmd_redo":
  430.       case "cmd_killThread":
  431.       case "cmd_watchThread":
  432.             case "button_delete":
  433.             case "cmd_shiftDelete":
  434.       case "button_print":
  435.             case "cmd_print":
  436.           case "cmd_printSetup":
  437.             case "cmd_saveAsFile":
  438.             case "cmd_saveAsTemplate":
  439.             case "cmd_viewPageSource":
  440.             case "cmd_reload":
  441.             case "cmd_getNewMessages":
  442.       case "button_getNewMessages":
  443.       case "cmd_getMsgsForAuthAccounts":
  444.             case "cmd_getNextNMessages":
  445.             case "cmd_find":
  446.             case "cmd_findAgain":
  447.       case "button_mark":
  448.             case "cmd_markAsRead":
  449.             case "cmd_markAllRead":
  450.             case "cmd_markThreadAsRead":
  451.             case "cmd_markAsFlagged":
  452.       case "button_file":
  453.             case "cmd_file":
  454.       case "cmd_synchronizeOffline":
  455.             case "cmd_downloadFlagged":
  456.             case "cmd_downloadSelected":
  457.             case "cmd_settingsOffline":
  458.             case "cmd_nextMsg":
  459.       case "button_next":
  460.             case "cmd_nextUnreadMsg":
  461.             case "cmd_nextFlaggedMsg":
  462.             case "cmd_nextUnreadThread":
  463.             case "cmd_previousMsg":
  464.             case "cmd_previousUnreadMsg":
  465.             case "cmd_previousFlaggedMsg":
  466.                 return true;
  467.             default:
  468.                 return false;
  469.         }
  470.     },
  471.  
  472.     isCommandEnabled: function(command)
  473.     {
  474.     var enabled = new Object();
  475.     var checkStatus = new Object();
  476.         switch ( command )
  477.         {
  478.             case "cmd_delete":
  479.                 if (isNewsURI(gCurrentMessageUri))
  480.                 {
  481.                     goSetMenuValue(command, 'valueNewsMessage');
  482.                     goSetAccessKey(command, 'valueNewsMessageAccessKey');
  483.                 }
  484.                 else
  485.                 {
  486.                     goSetMenuValue(command, 'valueMessage');
  487.                     goSetAccessKey(command, 'valueMessageAccessKey');
  488.                 }
  489.  
  490.                 if (gDBView)
  491.                 {
  492.                     gDBView.getCommandStatus(nsMsgViewCommandType.deleteMsg, enabled, checkStatus);
  493.                     return enabled.value;
  494.                 }
  495.             case "cmd_reply":
  496.             case "button_reply":
  497.             case "cmd_replySender":
  498.             case "cmd_replyGroup":
  499.             case "cmd_replyall":
  500.             case "button_replyall":
  501.             case "cmd_forward":
  502.             case "button_forward":
  503.             case "cmd_forwardInline":
  504.             case "cmd_forwardAttachment":
  505.             case "cmd_editAsNew":
  506.             case "button_delete":
  507.             case "cmd_shiftDelete":
  508.             case "cmd_print":
  509.       case "button_print":
  510.             case "cmd_saveAsFile":
  511.             case "cmd_saveAsTemplate":
  512.             case "cmd_viewPageSource":
  513.             case "cmd_reload":
  514.             case "cmd_find":
  515.       case "button_mark":
  516.             case "cmd_markAsRead":
  517.             case "cmd_markAllRead":
  518.             case "cmd_markThreadAsRead":
  519.             case "cmd_markAsFlagged":
  520.       case "button_file":
  521.             case "cmd_file":
  522.                 return ( gCurrentMessageUri != null);
  523.             case "cmd_printSetup":
  524.               return true;
  525.             case "cmd_getNewMessages":
  526.       case "button_getNewMessages":
  527.       case "cmd_getMsgsForAuthAccounts":
  528.                 return IsGetNewMessagesEnabled();
  529.             case "cmd_getNextNMessages":
  530.                 return IsGetNextNMessagesEnabled();        
  531.             case "cmd_downloadFlagged":
  532.             case "cmd_downloadSelected":
  533.                 return true;
  534.             case "cmd_synchronizeOffline":
  535.             case "cmd_settingsOffline":
  536.                 return IsAccountOfflineEnabled();
  537.             case "cmd_close":
  538.             case "cmd_nextMsg":
  539.       case "button_next":
  540.             case "cmd_nextUnreadMsg":
  541.             case "cmd_nextUnreadThread":
  542.             case "cmd_previousMsg":
  543.             case "cmd_previousUnreadMsg":
  544.                 return true;
  545.             case "cmd_findAgain":
  546.                 return MsgCanFindAgain();
  547.       case "cmd_undo":
  548.       case "cmd_redo":
  549.                 return SetupUndoRedoCommand(command);
  550.             default:
  551.                 return false;
  552.         }
  553.     },
  554.  
  555.     doCommand: function(command)
  556.     {
  557.     // if the user invoked a key short cut then it is possible that we got here for a command which is
  558.     // really disabled. kick out if the command should be disabled.
  559.     if (!this.isCommandEnabled(command)) return;
  560.  
  561.     var navigationType = nsMsgNavigationType.nextUnreadMessage;
  562.  
  563.         switch ( command )
  564.         {
  565.             case "cmd_close":
  566.                 CloseMailWindow();
  567.                 break;
  568.             case "cmd_getNewMessages":
  569.                 MsgGetMessage();
  570.                 break;
  571.             case "cmd_undo":
  572.                 messenger.Undo(msgWindow);
  573.                 break;
  574.             case "cmd_redo":
  575.                 messenger.Redo(msgWindow);
  576.                 break;
  577.       case "cmd_getMsgsForAuthAccounts":
  578.         MsgGetMessagesForAllAuthenticatedAccounts();
  579.         break;
  580.             case "cmd_getNextNMessages":
  581.                 MsgGetNextNMessages();
  582.                 break;
  583.             case "cmd_reply":
  584.                 MsgReplyMessage(null);
  585.                 break;
  586.             case "cmd_replySender":
  587.                 MsgReplySender(null);
  588.                 break;
  589.             case "cmd_replyGroup":
  590.                 MsgReplyGroup(null);
  591.                 break;
  592.             case "cmd_replyall":
  593.                 MsgReplyToAllMessage(null);
  594.                 break;
  595.             case "cmd_forward":
  596.                 MsgForwardMessage(null);
  597.                 break;
  598.             case "cmd_forwardInline":
  599.                 MsgForwardAsInline(null);
  600.                 break;
  601.             case "cmd_forwardAttachment":
  602.                 MsgForwardAsAttachment(null);
  603.                 break;
  604.             case "cmd_editAsNew":
  605.                 MsgEditMessageAsNew();
  606.                 break;
  607.             case "cmd_delete":
  608.                 MsgDeleteMessageFromMessageWindow(false, false);
  609.                 break;
  610.             case "cmd_shiftDelete":
  611.                 MsgDeleteMessageFromMessageWindow(true, false);
  612.                 break;
  613.             case "button_delete":
  614.                 MsgDeleteMessageFromMessageWindow(false, true);
  615.                 break;
  616.             case "cmd_printSetup":
  617.                 goPageSetup();
  618.                 break;
  619.             case "cmd_print":
  620.                 PrintEnginePrint();
  621.                 break;
  622.             case "cmd_saveAsFile":
  623.                 MsgSaveAsFile();
  624.                 break;
  625.             case "cmd_saveAsTemplate":
  626.                 MsgSaveAsTemplate();
  627.                 break;
  628.             case "cmd_viewPageSource":
  629.                 MsgViewPageSource();
  630.                 break;
  631.             case "cmd_reload":
  632.                 MsgReload();
  633.                 break;
  634.             case "cmd_find":
  635.                 MsgFind();
  636.                 break;
  637.             case "cmd_findAgain":
  638.                 MsgFindAgain();
  639.                 break;
  640.       case "button_mark":
  641.             case "cmd_markAsRead":
  642.                 MsgMarkMsgAsRead(null);
  643.                 return;
  644.             case "cmd_markThreadAsRead":
  645.                 MsgMarkThreadAsRead();
  646.                 return;
  647.             case "cmd_markAllRead":
  648.                 MsgMarkAllRead();
  649.                 return;
  650.             case "cmd_markAsFlagged":
  651.                 MsgMarkAsFlagged(null);
  652.                 return;
  653.       case "cmd_downloadFlagged":
  654.         MsgDownloadFlagged();
  655.         return;
  656.       case "cmd_downloadSelected":
  657.         MsgDownloadSelected();
  658.         return;
  659.       case "cmd_synchronizeOffline":
  660.         MsgSynchronizeOffline();
  661.         return;
  662.             case "cmd_settingsOffline":
  663.                 MsgSettingsOffline();
  664.                 return;
  665.             case "cmd_nextUnreadMsg":
  666.         performNavigation(nsMsgNavigationType.nextUnreadMessage);
  667.                 break;
  668.             case "cmd_nextUnreadThread":      
  669.         performNavigation(nsMsgNavigationType.nextUnreadThread);
  670.                 break;
  671.             case "cmd_nextMsg":
  672.         performNavigation(nsMsgNavigationType.nextMessage);
  673.                 break;
  674.             case "cmd_nextFlaggedMsg":
  675.         performNavigation(nsMsgNavigationType.nextFlagged);
  676.                 break;
  677.             case "cmd_previousMsg":
  678.         performNavigation(nsMsgNavigationType.previousMessage);
  679.                 break;
  680.             case "cmd_previousUnreadMsg":
  681.         performNavigation(nsMsgNavigationType.previousUnreadMessage);
  682.                 break;
  683.             case "cmd_previousFlaggedMsg":
  684.         performNavigation(nsMsgNavigationType.previousFlagged);
  685.                 break;
  686.         }
  687.     },
  688.     
  689.     onEvent: function(event)
  690.     {
  691.     }
  692. };
  693.  
  694. function performNavigation(type)
  695. {
  696.   var resultId = new Object;
  697.   var resultIndex = new Object;
  698.   var threadIndex = new Object;
  699.  
  700.   gDBView.viewNavigate(type, resultId, resultIndex, threadIndex, true /* wrap */);
  701.   
  702.   // if we found something....display it.
  703.   if ((resultId.value != nsMsgViewIndex_None) && (resultIndex.value != nsMsgViewIndex_None)) 
  704.   {
  705.     // load the message key
  706.     gDBView.loadMessageByMsgKey(resultId.value);
  707.     return;
  708.   }
  709.    
  710.   // we need to span another folder 
  711.   CrossFolderNavigation(type, false);
  712. }
  713.  
  714. function SetupCommandUpdateHandlers()
  715. {
  716.     top.controllers.insertControllerAt(0, MessageWindowController);
  717. }
  718.  
  719. function GetDBView()
  720. {
  721.   return gDBView;
  722. }
  723.  
  724.