home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / mozilla / mozilla-win32-M18-mathml-svg-xslt.exe / chrome / messenger.jar / content / messenger / mail3PaneWindowCommands.js < prev    next >
Text File  |  2000-09-21  |  26KB  |  1,073 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-2000 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  */
  20. // Controller object for folder pane
  21. var FolderPaneController =
  22. {
  23.    supportsCommand: function(command)
  24.     {
  25.         switch ( command )
  26.         {
  27.             case "cmd_delete":
  28.             case "button_delete":
  29.                 return true;
  30.             
  31.             case "cmd_selectAll":
  32.             case "cmd_cut":
  33.             case "cmd_copy":
  34.             case "cmd_paste":
  35.                 return true;
  36.                 
  37.             default:
  38.                 return false;
  39.         }
  40.     },
  41.  
  42.     isCommandEnabled: function(command)
  43.     {
  44.         //        dump("FolderPaneController.IsCommandEnabled(" + command + ")\n");
  45.         switch ( command )
  46.         {
  47.             case "cmd_selectAll":
  48.             case "cmd_cut":
  49.             case "cmd_copy":
  50.             case "cmd_paste":
  51.                 return false;
  52.             case "cmd_delete":
  53.             case "button_delete":
  54.                 if ( command == "cmd_delete" )
  55.                     goSetMenuValue(command, 'valueFolder');
  56.                 var folderTree = GetFolderTree();
  57.                 if ( folderTree && folderTree.selectedItems &&
  58.                      folderTree.selectedItems.length > 0)
  59.                 {
  60.                     var specialFolder = null;
  61.                     var isServer = null;
  62.                     var serverType = null;
  63.                     try {
  64.                         var selectedFolder = folderTree.selectedItems[0];
  65.                         specialFolder = selectedFolder.getAttribute('SpecialFolder');
  66.                         isServer = selectedFolder.getAttribute('IsServer');
  67.                         serverType = selectedFolder.getAttribute('ServerType');
  68.                     }
  69.                     catch (ex) {
  70.                         //dump("specialFolder failure: " + ex + "\n");
  71.                     }
  72.                     if (specialFolder == "Inbox" || specialFolder == "Trash" || isServer == "true")
  73.                        return false;
  74.                     else
  75.                        return true;
  76.                 }
  77.                 else
  78.                     return false;
  79.             
  80.             default:
  81.                 return false;
  82.         }
  83.     },
  84.  
  85.     doCommand: function(command)
  86.     {
  87.         switch ( command )
  88.         {
  89.             case "cmd_delete":
  90.             case "button_delete":
  91.                 MsgDeleteFolder();
  92.                 break;
  93.         }
  94.     },
  95.     
  96.     onEvent: function(event)
  97.     {
  98.         // on blur events set the menu item texts back to the normal values
  99.         if ( event == 'blur' )
  100.         {
  101.             goSetMenuValue('cmd_delete', 'valueDefault');
  102.         }
  103.     }
  104. };
  105.  
  106.  
  107. // Controller object for thread pane
  108. var ThreadPaneController =
  109. {
  110.    supportsCommand: function(command)
  111.     {
  112.         switch ( command )
  113.         {
  114.             case "cmd_selectAll":
  115.                 return true;
  116.  
  117.             case "cmd_cut":
  118.             case "cmd_copy":
  119.             case "cmd_paste":
  120.                 return true;
  121.                 
  122.             default:
  123.                 return false;
  124.         }
  125.     },
  126.  
  127.     isCommandEnabled: function(command)
  128.     {
  129.         switch ( command )
  130.         {
  131.             case "cmd_selectAll":
  132.                 return true;
  133.             
  134.             case "cmd_cut":
  135.             case "cmd_copy":
  136.             case "cmd_paste":
  137.                 return false;
  138.                 
  139.             default:
  140.                 return false;
  141.         }
  142.     },
  143.  
  144.     doCommand: function(command)
  145.     {
  146.         switch ( command )
  147.         {
  148.             case "cmd_selectAll":
  149.                 var threadTree = GetThreadTree();
  150.                 if ( threadTree )
  151.                 {
  152.                     //if we're threaded we need to expand everything before selecting all
  153.                     if(messageView.showThreads)
  154.                         ExpandOrCollapseThreads(true);
  155.                     threadTree.selectAll();
  156.                     if ( threadTree.selectedItems && threadTree.selectedItems.length != 1 )
  157.                         ClearMessagePane();
  158.                 }
  159.                     //setting threadTree on
  160.                     //document.getElementById("threadTree").setAttribute("focusring","true");
  161.                 break;
  162.         }
  163.     },
  164.     
  165.     onEvent: function(event)
  166.     {
  167.         // on blur events set the menu item texts back to the normal values
  168.         if ( event == 'blur' )
  169.         {
  170.               //document.getElementById("threadTree").setAttribute("focusring","false");
  171.  
  172.         }
  173.         
  174.         if ( event == 'focus' )
  175.         {
  176.             //alert("focus")
  177.               //document.getElementById("threadTree").setAttribute("focusring","true");
  178.  
  179.         }        
  180.     }
  181. };
  182.  
  183. // DefaultController object (handles commands when one of the trees does not have focus)
  184. var DefaultController =
  185. {
  186.    supportsCommand: function(command)
  187.     {
  188.  
  189.         switch ( command )
  190.         {
  191.             case "cmd_reply":
  192.             case "button_reply":
  193.             case "cmd_replySender":
  194.             case "cmd_replyGroup":
  195.             case "cmd_replyall":
  196.             case "button_replyall":
  197.             case "cmd_forward":
  198.             case "button_forward":
  199.             case "cmd_forwardInline":
  200.             case "cmd_forwardAttachment":
  201.             case "cmd_editAsNew":
  202.             case "cmd_delete":
  203.             case "button_delete":
  204.             case "cmd_shiftDelete":
  205.             case "cmd_nextMsg":
  206.             case "cmd_nextUnreadMsg":
  207.             case "cmd_nextFlaggedMsg":
  208.             case "cmd_nextUnreadThread":
  209.             case "cmd_previousMsg":
  210.             case "cmd_previousUnreadMsg":
  211.             case "cmd_previousFlaggedMsg":
  212.             case "cmd_viewAllMsgs":
  213.             case "cmd_viewUnreadMsgs":
  214.             case "cmd_undo":
  215.             case "cmd_redo":
  216.             case "cmd_expandAllThreads":
  217.             case "cmd_collapseAllThreads":
  218.             case "cmd_renameFolder":
  219.             case "cmd_openMessage":
  220.             case "cmd_print":
  221.             case "cmd_saveAsFile":
  222.             case "cmd_saveAsTemplate":
  223.             case "cmd_viewPageSource":
  224.             case "cmd_reload":
  225.             case "cmd_getNewMessages":
  226.             case "cmd_getNextNMessages":
  227.             case "cmd_find":
  228.             case "cmd_findAgain":
  229.             case "cmd_markAsRead":
  230.             case "cmd_markAllRead":
  231.             case "cmd_markThreadAsRead":
  232.             case "cmd_markAsFlagged":
  233.             case "cmd_file":
  234.             case "cmd_emptyTrash":
  235.             case "cmd_compactFolder":
  236.             case "cmd_sortByThread":
  237.                 return true;
  238.             default:
  239.                 return false;
  240.         }
  241.     },
  242.  
  243.     isCommandEnabled: function(command)
  244.     {
  245.         switch ( command )
  246.         {
  247.             case "cmd_reply":
  248.             case "button_reply":
  249.             case "cmd_replySender":
  250.             case "cmd_replyGroup":
  251.             case "cmd_replyall":
  252.             case "button_replyall":
  253.             case "cmd_forward":
  254.             case "button_forward":
  255.             case "cmd_forwardInline":
  256.             case "cmd_forwardAttachment":
  257.             case "cmd_editAsNew":
  258.             case "cmd_delete":
  259.             case "button_delete":
  260.             case "cmd_shiftDelete":
  261.             case "cmd_openMessage":
  262.             case "cmd_print":
  263.             case "cmd_saveAsFile":
  264.             case "cmd_saveAsTemplate":
  265.             case "cmd_viewPageSource":
  266.             case "cmd_reload":
  267.             case "cmd_markThreadAsRead":
  268.             case "cmd_markAsFlagged":
  269.             case "cmd_file":
  270.                 var numSelected = GetNumSelectedMessages();
  271.  
  272.                 if ( command == "cmd_delete")
  273.                 {
  274.                     if ( numSelected < 2 )
  275.                         goSetMenuValue(command, 'valueMessage');
  276.                     else
  277.                         goSetMenuValue(command, 'valueMessages');
  278.                 }
  279.                 return ( numSelected > 0 );
  280.             case "cmd_nextMsg":
  281.             case "cmd_nextUnreadMsg":
  282.             case "cmd_nextUnreadThread":
  283.             case "cmd_previousMsg":
  284.             case "cmd_previousUnreadMsg":
  285.                 return MailAreaHasFocus() && IsViewNavigationItemEnabled();
  286.             case "cmd_markAsRead":
  287.                 if(!MailAreaHasFocus())
  288.                     return false;
  289.                 else
  290.                     return(GetNumSelectedMessages() > 0);
  291.             case "cmd_markAllRead":
  292.                 return(MailAreaHasFocus() && IsFolderSelected());
  293.             case "cmd_find":
  294.             case "cmd_findAgain":
  295.                 return IsFindEnabled();
  296.                 break;
  297.             case "cmd_expandAllThreads":
  298.             case "cmd_collapseAllThreads":
  299.                 return messageView.showThreads;
  300.                 break;
  301.             case "cmd_nextFlaggedMsg":
  302.             case "cmd_previousFlaggedMsg":
  303.                 return IsViewNavigationItemEnabled();
  304.             case "cmd_viewAllMsgs":
  305.                 return true;
  306.             case "cmd_sortByThread":
  307.                 return (messageView.viewType != viewShowUnread);
  308.                 break;
  309.               case "cmd_viewUnreadMsgs":
  310.                   return (messageView.showThreads == false);
  311.                   break;
  312.             case "cmd_undo":
  313.             case "cmd_redo":
  314.                 return SetupUndoRedoCommand(command);
  315.             case "cmd_renameFolder":
  316.                 return IsRenameFolderEnabled();
  317.             case "cmd_getNewMessages":
  318.                 return IsGetNewMessagesEnabled();
  319.             case "cmd_getNextNMessages":
  320.                 return IsGetNextNMessagesEnabled();
  321.             case "cmd_emptyTrash":
  322.                 return IsEmptyTrashEnabled();
  323.             case "cmd_compactFolder":
  324.                 return IsCompactFolderEnabled();
  325.             default:
  326.                 return false;
  327.         }
  328.         return false;
  329.     },
  330.  
  331.     doCommand: function(command)
  332.     {
  333.            //dump("ThreadPaneController.doCommand(" + command + ")\n");
  334.            
  335.         document.getElementById("messagepane").setAttribute("focusring","true");
  336.         switch ( command )
  337.         {
  338.             case "cmd_getNewMessages":
  339.                 MsgGetMessage();
  340.                 break;
  341.             case "cmd_getNextNMessages":
  342.                 MsgGetNextNMessages();
  343.                 break;
  344.             case "cmd_reply":
  345.                 MsgReplyMessage(null);
  346.                 break;
  347.             case "cmd_replySender":
  348.                 MsgReplySender(null);
  349.                 break;
  350.             case "cmd_replyGroup":
  351.                 MsgReplyGroup(null);
  352.                 break;
  353.             case "cmd_replyall":
  354.                 MsgReplyToAllMessage(null);
  355.                 break;
  356.             case "cmd_forward":
  357.                 MsgForwardMessage(null);
  358.                 break;
  359.             case "cmd_forwardInline":
  360.                 MsgForwardAsInline(null);
  361.                 break;
  362.             case "cmd_forwardAttachment":
  363.                 MsgForwardAsAttachment(null);
  364.                 break;
  365.             case "cmd_editAsNew":
  366.                 MsgEditMessageAsNew();
  367.                 break;
  368.             case "cmd_delete":
  369.                 MsgDeleteMessage(false, false);
  370.                 break;
  371.             case "cmd_shiftDelete":
  372.                 MsgDeleteMessage(true, false);
  373.                 break;
  374.             case "button_delete":
  375.                 MsgDeleteMessage(false, true);
  376.                 break;
  377.             case "cmd_nextUnreadMsg":
  378.                 MsgNextUnreadMessage();
  379.                 break;
  380.             case "cmd_nextUnreadThread":
  381.                 MsgNextUnreadThread();
  382.                 break;
  383.             case "cmd_nextMsg":
  384.                 MsgNextMessage();
  385.                 break;
  386.             case "cmd_nextFlaggedMsg":
  387.                 MsgNextFlaggedMessage();
  388.                 break;
  389.             case "cmd_previousMsg":
  390.                 MsgPreviousMessage();
  391.                 break;
  392.             case "cmd_previousUnreadMsg":
  393.                 MsgPreviousUnreadMessage();
  394.                 break;
  395.             case "cmd_previousFlaggedMsg":
  396.                 MsgPreviousFlaggedMessage();
  397.                 break;
  398.             case "cmd_sortByThread":
  399.                 MsgSortByThread();
  400.                 break;
  401.             case "cmd_viewAllMsgs":
  402.                 MsgViewAllMsgs();
  403.                 break;
  404.             case "cmd_viewUnreadMsgs":
  405.                 MsgViewUnreadMsg();
  406.                 break;
  407.             case "cmd_undo":
  408.                 messenger.Undo(msgWindow);
  409.                 break;
  410.             case "cmd_redo":
  411.                 messenger.Redo(msgWindow);
  412.                 break;
  413.             case "cmd_expandAllThreads":
  414.                 ExpandOrCollapseThreads(true);
  415.                 break;
  416.             case "cmd_collapseAllThreads":
  417.                 ExpandOrCollapseThreads(false);
  418.                 break;
  419.             case "cmd_renameFolder":
  420.                 MsgRenameFolder();
  421.                 return;
  422.             case "cmd_openMessage":
  423.                 MsgOpenNewWindowForMessage(null, null);
  424.                 return;
  425.             case "cmd_print":
  426.                 PrintEnginePrint();
  427.                 return;
  428.             case "cmd_saveAsFile":
  429.                 MsgSaveAsFile();
  430.                 return;
  431.             case "cmd_saveAsTemplate":
  432.                 MsgSaveAsTemplate();
  433.                 return;
  434.             case "cmd_viewPageSource":
  435.                 MsgViewPageSource();
  436.                 return;
  437.             case "cmd_reload":
  438.                 MsgReload();
  439.                 return;
  440.             case "cmd_find":
  441.                 MsgFind();
  442.                 return;
  443.             case "cmd_findAgain":
  444.                 MsgFindAgain();
  445.                 return;
  446.             case "cmd_markAsRead":
  447.                 MsgMarkMsgAsRead(null);
  448.                 return;
  449.             case "cmd_markThreadAsRead":
  450.                 MsgMarkThreadAsRead();
  451.                 return;
  452.             case "cmd_markAllRead":
  453.                 MsgMarkAllRead();
  454.                 return;
  455.             case "cmd_markAsFlagged":
  456.                 MsgMarkAsFlagged(null);
  457.                 return;
  458.             case "cmd_emptyTrash":
  459.                 MsgEmptyTrash();
  460.                 return;
  461.             case "cmd_compactFolder":
  462.                 MsgCompactFolder();
  463.                 return;
  464.         }
  465.     },
  466.     
  467.     onEvent: function(event)
  468.     {
  469.         // on blur events set the menu item texts back to the normal values
  470.         if ( event == 'blur' )
  471.         {
  472.             goSetMenuValue('cmd_delete', 'valueDefault');
  473.             goSetMenuValue('cmd_undo', 'valueDefault');
  474.             goSetMenuValue('cmd_redo', 'valueDefault');
  475.         }
  476.     }
  477. };
  478.  
  479. function MailAreaHasFocus()
  480. {
  481.     //Input and TextAreas should get access to the keys that cause these commands.
  482.     //Currently if we don't do this then we will steal the key away and you can't type them
  483.     //in these controls. This is a bug that should be fixed and when it is we can get rid of
  484.     //this.
  485.     var focusedElement = top.document.commandDispatcher.focusedElement;
  486.     if(focusedElement)
  487.     {
  488.         var name = focusedElement.localName;
  489.         return ((name != "INPUT") && (name != "TEXTAREA"));
  490.     }
  491.     return true;
  492. }
  493.  
  494. function GetNumSelectedMessages()
  495. {
  496.     var threadTree = GetThreadTree();
  497.     var numSelected = 0;
  498.     if ( threadTree && threadTree.selectedItems )
  499.         numSelected = threadTree.selectedItems.length;
  500.     return numSelected;
  501. }
  502.  
  503. function CommandUpdate_Mail()
  504. {
  505.  
  506.     goUpdateCommand('button_delete');
  507.     goUpdateCommand('cmd_delete');
  508.     goUpdateCommand('cmd_nextMsg');
  509.     goUpdateCommand('cmd_nextUnreadMsg');
  510.     goUpdateCommand('cmd_nextUnreadThread');
  511.     goUpdateCommand('cmd_nextFlaggedMsg');
  512.     goUpdateCommand('cmd_previousMsg');
  513.     goUpdateCommand('cmd_previousUnreadMsg');
  514.     goUpdateCommand('cmd_previousFlaggedMsg');
  515.     goUpdateCommand('cmd_sortByThread');
  516.     goUpdateCommand('cmd_viewAllMsgs');
  517.     goUpdateCommand('cmd_viewUnreadMsgs');
  518.     goUpdateCommand('cmd_expandAllThreads');
  519.     goUpdateCommand('cmd_collapseAllThreads');
  520.     goUpdateCommand('cmd_renameFolder');
  521.     goUpdateCommand('cmd_getNewMessages');
  522.     goUpdateCommand('cmd_getNextNMessages');
  523.     goUpdateCommand('cmd_find');
  524.     goUpdateCommand('cmd_findAgain');
  525.     goUpdateCommand('cmd_markAllRead');
  526.     goUpdateCommand('cmd_emptyTrash');
  527.     goUpdateCommand('cmd_compactFolder');
  528. }
  529.  
  530.  
  531. var lastFocusedElement=null;
  532.  
  533. function FocusRingUpdate_Mail(){
  534.     var currentFocusedElement = null;
  535.     
  536.     if(MessagePaneHasFocus()){
  537.         currentFocusedElement="messagepanebox"
  538.     }
  539.     else{
  540.         currentFocusedElement= WhichPaneHasFocus()    
  541.     }
  542.     
  543.     if(currentFocusedElement != lastFocusedElement){
  544.             if( currentFocusedElement == "threadTree"){
  545.                 document.getElementById("threadTree").setAttribute("focusring","true")
  546.                 //document.getElementById("folderTree").setAttribute("focusring","false")
  547.                 document.getElementById("messagepanebox").setAttribute("focusring","false")
  548.  
  549.             }
  550.  
  551.             else{
  552.                 if(currentFocusedElement=="folderTree"){
  553.                         document.getElementById("threadTree").setAttribute("focusring","false")
  554.                         //document.getElementById("folderTree").setAttribute("focusring","true")
  555.                         document.getElementById("messagepanebox").setAttribute("focusring","false")
  556.                 }
  557.                 else{
  558.                     if(currentFocusedElement=="messagepanebox"){
  559.                         document.getElementById("threadTree").setAttribute("focusring","false")
  560.                         //document.getElementById("folderTree").setAttribute("focusring","false")
  561.                         document.getElementById("messagepanebox").setAttribute("focusring","true")
  562.                     }
  563.                     else{
  564.                         document.getElementById("threadTree").setAttribute("focusring","false")
  565.                         //document.getElementById("folderTree").setAttribute("focusring","false")
  566.                         document.getElementById("messagepanebox").setAttribute("focusring","false")
  567.                         }
  568.  
  569.                     }
  570.             }    
  571.         lastFocusedElement=currentFocusedElement;
  572.         }
  573.     }
  574.     
  575.  
  576. function ThreadTreeUpdate_Mail(command)
  577. {
  578.     goUpdateCommand('button_reply');
  579.     goUpdateCommand('button_replyall');
  580.     goUpdateCommand('button_forward');
  581.     goUpdateCommand('cmd_shiftDelete');
  582.     goUpdateCommand('cmd_reply');
  583.     goUpdateCommand('cmd_replySender');
  584.     goUpdateCommand('cmd_replyGroup');
  585.     goUpdateCommand('cmd_replyall');
  586.     goUpdateCommand('cmd_forward');
  587.     goUpdateCommand('cmd_forwardInline');
  588.     goUpdateCommand('cmd_forwardAttachment');
  589.     goUpdateCommand('cmd_editAsNew');
  590.     goUpdateCommand('cmd_openMessage');
  591.     goUpdateCommand('cmd_print');
  592.     goUpdateCommand('cmd_saveAsFile');
  593.     goUpdateCommand('cmd_saveAsTemplate');
  594.     goUpdateCommand('cmd_viewPageSource');
  595.     goUpdateCommand('cmd_reload');
  596.     goUpdateCommand('cmd_markAsRead');
  597.     goUpdateCommand('cmd_markThreadAsRead');
  598.     goUpdateCommand('cmd_markAsFlagged');
  599.     goUpdateCommand('cmd_file');
  600. }
  601.  
  602. function SetupUndoRedoCommand(command)
  603. {
  604.     // dump ("--- SetupUndoRedoCommand: " + command + "\n");
  605.     var canUndoOrRedo = false;
  606.     var txnType = 0;
  607.  
  608.     if (command == "cmd_undo")
  609.     {
  610.         canUndoOrRedo = messenger.CanUndo();
  611.         txnType = messenger.GetUndoTransactionType();
  612.     }
  613.     else
  614.     {
  615.         canUndoOrRedo = messenger.CanRedo();
  616.         txnType = messenger.GetRedoTransactionType();
  617.     }
  618.  
  619.     if (canUndoOrRedo)
  620.     {
  621.         switch (txnType)
  622.         {
  623.         default:
  624.         case 0:
  625.             goSetMenuValue(command, 'valueDefault');
  626.             break;
  627.         case 1:
  628.             goSetMenuValue(command, 'valueDeleteMsg');
  629.             break;
  630.         case 2:
  631.             goSetMenuValue(command, 'valueMoveMsg');
  632.             break;
  633.         case 3:
  634.             goSetMenuValue(command, 'valueCopyMsg');
  635.             break;
  636.         }
  637.     }
  638.     else
  639.     {
  640.         goSetMenuValue(command, 'valueDefault');
  641.     }
  642.     return canUndoOrRedo;
  643. }
  644.  
  645.  
  646. function CommandUpdate_UndoRedo()
  647. {
  648.     ShowMenuItem("menu_undo", true);
  649.     EnableMenuItem("menu_undo", SetupUndoRedoCommand("cmd_undo"));
  650.     ShowMenuItem("menu_redo", true);
  651.     EnableMenuItem("menu_redo", SetupUndoRedoCommand("cmd_redo"));
  652. }
  653.  
  654.  
  655. function MessagePaneHasFocus()
  656.  
  657. {
  658.     var focusedWindow = top.document.commandDispatcher.focusedWindow;
  659.     var messagePaneWindow = top.frames['messagepane'];
  660.     
  661.     if ( focusedWindow && messagePaneWindow && (focusedWindow != top) )
  662.     {
  663.         var hasFocus = IsSubWindowOf(focusedWindow, messagePaneWindow, false);
  664.  
  665.         return hasFocus;
  666.     }
  667.     
  668.     return false;
  669. }
  670.  
  671. function IsSubWindowOf(search, wind, found)
  672. {
  673.     //dump("IsSubWindowOf(" + search + ", " + wind + ", " + found + ")\n");
  674.     if ( found || (search == wind) )
  675.         return true;
  676.     
  677.     for ( index = 0; index < wind.frames.length; index++ )
  678.     {
  679.         if ( IsSubWindowOf(search, wind.frames[index], false) )
  680.             return true;
  681.     }
  682.     return false;
  683. }
  684.  
  685.  
  686. function WhichPaneHasFocus(){
  687.     var whichPane= "none";
  688.     currentNode = top.document.commandDispatcher.focusedElement;    
  689.  
  690.     
  691.     if(currentNode){
  692.         while(currentNode.parentNode!=null){
  693.             if(currentNode.getAttribute("id") == "threadTree" ){ whichPane="threadTree" }
  694.             
  695.             if(currentNode.getAttribute("id") == "folderTree"){  whichPane="folderTree" } 
  696.     
  697.             if(currentNode.getAttribute("id") == "messagepanebox"){  whichPane="messagepanebox" }
  698.                     
  699.             currentNode = currentNode.parentNode;
  700.         }
  701.     
  702.     }
  703.     
  704.     
  705.     
  706.     return whichPane
  707.  
  708. }
  709.  
  710.  
  711.  
  712.  
  713.  
  714. function SetupCommandUpdateHandlers()
  715. {
  716.     dump("SetupCommandUpdateHandlers\n");
  717.  
  718.     var widget;
  719.     
  720.     // folder pane
  721.     widget = GetFolderTree();
  722.     if ( widget )
  723.         widget.controllers.appendController(FolderPaneController);
  724.     
  725.     // thread pane
  726.     widget = GetThreadTree();
  727.     if ( widget )
  728.         widget.controllers.appendController(ThreadPaneController);
  729.         
  730.     top.controllers.insertControllerAt(0, DefaultController);
  731. }
  732.  
  733. function IsRenameFolderEnabled()
  734. {
  735.     var tree = GetFolderTree();
  736.     var folderList = tree.selectedItems;
  737.  
  738.     if(folderList.length == 1)
  739.     {
  740.         var folderNode = folderList[0];
  741.         return(folderNode.getAttribute("CanRename") == "true");
  742.     }
  743.     else
  744.         return false;
  745.  
  746. }
  747.  
  748. function IsViewNavigationItemEnabled()
  749. {
  750.     return IsFolderSelected();
  751. }
  752.  
  753. function IsFolderSelected()
  754. {
  755.     var tree = GetFolderTree();
  756.     var folderList = tree.selectedItems;
  757.  
  758.     if(folderList.length == 1)
  759.     {
  760.         var folderNode = folderList[0];
  761.         return(folderNode.getAttribute("IsServer") != "true");
  762.     }
  763.     else
  764.         return false;
  765. }
  766.  
  767. function IsFindEnabled()
  768. {
  769.     return (!IsThreadAndMessagePaneSplitterCollapsed() && (gCurrentDisplayedMessage != null));
  770.  
  771. }
  772.  
  773. function MsgDeleteFolder()
  774. {
  775.     //get the selected elements
  776.     var tree = GetFolderTree();
  777.     var folderList = tree.selectedItems;
  778.     var i;
  779.     var folder, parent;
  780.     var specialFolder;
  781.     for(i = 0; i < folderList.length; i++)
  782.     {
  783.         folder = folderList[i];
  784.         folderuri = folder.getAttribute('id');
  785.         specialFolder = folder.getAttribute('SpecialFolder');
  786.         if (specialFolder != "Inbox" && specialFolder != "Trash")
  787.         {
  788.             dump(folderuri);
  789.             parent = folder.parentNode.parentNode;    
  790.             var parenturi = parent.getAttribute('id');
  791.             if(parenturi)
  792.                 dump(parenturi);
  793.             else
  794.                 dump("No parenturi");
  795.             dump("folder = " + folder.localName + "\n"); 
  796.             dump("parent = " + parent.localName + "\n"); 
  797.             messenger.DeleteFolders(tree.database,
  798.                                     parent.resource, folder.resource);
  799.         }
  800.     }
  801.  
  802.  
  803. }
  804.  
  805.  //3pane related commands.  Need to go in own file.  Putting here for the moment.
  806.  
  807. function MsgNextMessage()
  808. {
  809.     GoNextMessage(navigateAny, false );
  810. }
  811.  
  812. function MsgNextUnreadMessage()
  813. {
  814.     GoNextMessage(navigateUnread, true);
  815. }
  816. function MsgNextFlaggedMessage()
  817. {
  818.     GoNextMessage(navigateFlagged, true);
  819. }
  820.  
  821. function MsgNextUnreadThread()
  822. {
  823.     //First mark the current thread as read.  Then go to the next one.
  824.     MsgMarkThreadAsRead();
  825.     GoNextThread(navigateUnread, true, true);
  826. }
  827.  
  828. function MsgPreviousMessage()
  829. {
  830.     GoPreviousMessage(navigateAny, false);
  831. }
  832.  
  833. function MsgPreviousUnreadMessage()
  834. {
  835.     GoPreviousMessage(navigateUnread, true);
  836. }
  837.  
  838. function MsgPreviousFlaggedMessage()
  839. {
  840.     GoPreviousMessage(navigateFlagged, true);
  841. }
  842.  
  843. var viewShowAll =0;
  844. var viewShowRead = 1;
  845. var viewShowUnread =2;
  846. var viewShowWatched = 3;
  847.  
  848. function MsgViewAllMsgs() 
  849. {
  850.     dump("MsgViewAllMsgs");
  851.  
  852.     if(messageView)
  853.     {
  854.         messageView.viewType = viewShowAll;
  855.         messageView.showThreads = false;
  856.     }
  857.     RefreshThreadTreeView();
  858. }
  859.  
  860. function MsgViewUnreadMsg()
  861. {
  862.     dump("MsgViewUnreadMsgs");
  863.  
  864.     if(messageView)
  865.     {
  866.         messageView.viewType = viewShowUnread;
  867.         messageView.showThreads = false;
  868.     }
  869.  
  870.     RefreshThreadTreeView();
  871. }
  872.  
  873.  
  874. function FillInFolderTooltip(cellNode)
  875. {
  876.     var folderNode = cellNode.parentNode.parentNode;
  877.     var uri = folderNode.getAttribute('id');
  878.     var folderTree = GetFolderTree();
  879.  
  880.     var name = GetFolderNameFromUri(uri, folderTree);
  881.  
  882.     var folderResource = RDF.GetResource(uri);
  883.     var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
  884.     var unreadCount = msgFolder.getNumUnread(false);
  885.     if(unreadCount < 0)
  886.         unreadCount = 0;
  887.  
  888.     var totalCount = msgFolder.getTotalMessages(false);
  889.     if(totalCount < 0)
  890.         totalCount = 0;
  891.  
  892.     var textNode = document.getElementById("foldertooltipText");
  893.     var folderTooltip = name;
  894.     if(!msgFolder.isServer)
  895.         folderTooltip += " ("  + unreadCount + "/" + totalCount +")";
  896.     textNode.setAttribute('value', folderTooltip);
  897.     return true;
  898.     
  899.  
  900. }
  901.  
  902. function GetFolderNameFromUri(uri, tree)
  903. {
  904.     var folderResource = RDF.GetResource(uri);
  905.  
  906.     var db = tree.database;
  907.  
  908.     var nameProperty = RDF.GetResource('http://home.netscape.com/NC-rdf#Name');
  909.  
  910.     var nameResult;
  911.     try {
  912.         nameResult = db.GetTarget(folderResource, nameProperty , true);
  913.     }
  914.     catch (ex) {
  915.         return "";
  916.     }
  917.  
  918.     nameResult = nameResult.QueryInterface(Components.interfaces.nsIRDFLiteral);
  919.     return nameResult.Value;
  920. }
  921.  
  922.  
  923. //Sets the thread tree's template's treeitem to be open so that all threads are expanded.
  924. function ExpandOrCollapseThreads(expand)
  925. {
  926.     SetTemplateTreeItemOpen(expand);
  927.     RefreshThreadTreeView();
  928. }
  929.  
  930. function SetTemplateTreeItemOpen(open)
  931. {
  932.     var templateTreeItem = document.getElementById("threadTreeTemplateTreeItem");
  933.     if(templateTreeItem)
  934.     {
  935.         if(open)
  936.             templateTreeItem.setAttribute("open", "true");
  937.         else
  938.             templateTreeItem.removeAttribute("open");
  939.     }
  940. }
  941.  
  942. // global variable for the gray_vertical_splitter
  943.     var gray_vertical_splitter_exists = false;
  944.  
  945. function SwitchPaneFocus(event)
  946. {
  947.     gray_vertical_splitter_exists = document.getElementById("gray_vertical_splitter");
  948.     var focusedElement;
  949.     var focusedElementId;
  950. //The first if statement is a check for the Shift+Tab -the else statement is for Tab
  951.     if (event && (event.shiftKey))
  952.     {
  953.         focusedElement = document.commandDispatcher.focusedElement;
  954.         focusedElementId="";
  955.  
  956.         if ( MessagePaneHasFocus() )
  957.             SetFocusThreadPane();
  958.         else 
  959.         {
  960.             try 
  961.             { 
  962.                 focusedElementId = focusedElement.getAttribute('id');
  963.                 if(focusedElementId == "threadTree")
  964.                 {
  965.                     if (gray_vertical_splitter_exists)
  966.                     {
  967.                         if (!(is_folderpane_collapsed()))
  968.                         SetFocusFolderPane();
  969.                         else if(!(IsThreadAndMessagePaneSplitterCollapsed()))
  970.                         SetFocusMessagePane();
  971.                     }
  972.                     else 
  973.                     {
  974.                         if (!(sidebar_is_collapsed()))
  975.                         SetFocusFolderPane();
  976.                         else if(!(IsThreadAndMessagePaneSplitterCollapsed()))
  977.                         SetFocusMessagePane();
  978.                     }
  979.                 }
  980.                 else if(focusedElementId == "folderTree")
  981.                 {
  982.                     if (!(IsThreadAndMessagePaneSplitterCollapsed()))
  983.                         SetFocusMessagePane();
  984.                     else
  985.                         SetFocusThreadPane();
  986.                 }
  987.             }
  988.             catch(e) 
  989.             {
  990.                 SetFocusMessagePane();
  991.             }
  992.         }
  993.     }
  994.     else
  995.     {
  996.         focusedElement = document.commandDispatcher.focusedElement;
  997.         focusedElementId="";
  998.  
  999.         if ( MessagePaneHasFocus() )
  1000.         {
  1001.             if (gray_vertical_splitter_exists)
  1002.             {
  1003.                 if (!(is_folderpane_collapsed()))
  1004.                     SetFocusFolderPane();
  1005.                 else
  1006.                     SetFocusThreadPane();
  1007.             }
  1008.             else 
  1009.             {
  1010.                 if (!(sidebar_is_collapsed()))
  1011.                 SetFocusFolderPane();
  1012.                 else
  1013.                 SetFocusThreadPane();
  1014.             }
  1015.         }
  1016.         else 
  1017.         {
  1018.             try 
  1019.             { 
  1020.                 focusedElementId = focusedElement.getAttribute('id');
  1021.                 if(focusedElementId == "threadTree")
  1022.                 {
  1023.                     if (!(IsThreadAndMessagePaneSplitterCollapsed()))
  1024.                         SetFocusMessagePane();
  1025.                     else if (gray_vertical_splitter_exists)
  1026.                     {
  1027.                         if (!(is_folderpane_collapsed()))
  1028.                         SetFocusFolderPane();
  1029.                     }
  1030.                     else if (!(sidebar_is_collapsed()))
  1031.                         SetFocusFolderPane();
  1032.  
  1033.                 }
  1034.                 else if(focusedElementId == "folderTree")
  1035.                     SetFocusThreadPane();
  1036.             }
  1037.             catch(e) 
  1038.             {
  1039.                 SetFocusMessagePane();
  1040.             }
  1041.         }
  1042.     }
  1043.  
  1044. }
  1045.  
  1046. function SetFocusFolderPane()
  1047. {
  1048.     document.getElementById("folderTree").focus();
  1049.     return;
  1050. }
  1051.  
  1052. function SetFocusThreadPane()
  1053. {
  1054.     document.getElementById("threadTree").focus();
  1055.     return;
  1056. }
  1057.  
  1058. function SetFocusMessagePane()
  1059. {
  1060.     top.frames['messagepane'].focus();
  1061.     return;
  1062. }
  1063.  
  1064. function is_folderpane_collapsed() 
  1065. {
  1066.     if (gray_vertical_splitter_exists)
  1067.     { 
  1068.         return (gray_vertical_splitter_exists.getAttribute('state') == 'collapsed');
  1069.     }
  1070.     return false;
  1071. }
  1072.  
  1073.