home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 January / 01_02.iso / software / netscape62win / mail.xpi / bin / chrome / messenger.jar / content / messenger / addressbook / abCommon.js < prev    next >
Text File  |  2001-08-11  |  14KB  |  507 lines

  1. var dirTree = 0;
  2. var resultsTree = 0;
  3.  
  4. // functions needed from abMainWindow and abSelectAddresses
  5.  
  6. // Controller object for Results Pane
  7. var ResultsPaneController =
  8. {
  9.   supportsCommand: function(command)
  10.   {
  11.     switch (command) {
  12.       case "cmd_selectAll":
  13.       case "cmd_delete":
  14.       case "button_delete":
  15.         return true;
  16.       default:
  17.         return false;
  18.     }
  19.   },
  20.  
  21.   isCommandEnabled: function(command)
  22.   {
  23.     switch (command) {
  24.       case "cmd_selectAll":
  25.         return true;
  26.  
  27.       case "cmd_delete":
  28.       case "button_delete":
  29.         var numSelected = 0;
  30.         if (resultsTree && resultsTree.selectedItems)
  31.           numSelected = resultsTree.selectedItems.length;
  32.         if (command == "cmd_delete") {
  33.           if (numSelected < 2)
  34.             goSetMenuValue(command, "valueCard");
  35.           else
  36.             goSetMenuValue(command, "valueCards");
  37.         }
  38.         return (numSelected > 0);
  39.  
  40.       default:
  41.         return false;
  42.     }
  43.   },
  44.  
  45.   doCommand: function(command)
  46.   {
  47.     switch (command) {
  48.       case "cmd_selectAll":
  49.         if (resultsTree)
  50.           resultsTree.selectAll();
  51.         break;
  52.       case "cmd_delete":
  53.       case "button_delete":
  54.         if (resultsTree) {
  55.           var cardList = resultsTree.selectedItems;
  56.           top.addressbook.deleteCards(resultsTree, resultsTree, cardList);
  57.         }
  58.         break;
  59.     }
  60.   },
  61.  
  62.   onEvent: function(event)
  63.   {
  64.     // on blur events set the menu item texts back to the normal values
  65.     if (event == "blur")
  66.       goSetMenuValue("cmd_delete", "valueDefault");
  67.   }
  68. };
  69.  
  70.  
  71. // Controller object for Dir Pane
  72. var DirPaneController =
  73. {
  74.   supportsCommand: function(command)
  75.   {
  76.     switch (command) {
  77.       case "cmd_selectAll":
  78.       case "cmd_delete":
  79.       case "button_delete":
  80.         return true;
  81.       default:
  82.         return false;
  83.     }
  84.   },
  85.  
  86.   isCommandEnabled: function(command)
  87.   {
  88.     switch (command) {
  89.       case "cmd_selectAll":
  90.         return true;
  91.       case "cmd_delete":
  92.       case "button_delete":
  93.         if (command == "cmd_delete")
  94.           goSetMenuValue(command, "valueAddressBook");
  95.         if (dirTree && dirTree.selectedItems)
  96.           return true;
  97.         else
  98.           return false;
  99.  
  100.       default:
  101.         return false;
  102.     }
  103.   },
  104.  
  105.   doCommand: function(command)
  106.   {
  107.     switch (command) {
  108.       case "cmd_selectAll":
  109.         if (dirTree)
  110.           dirTree.selectAll();
  111.         break;
  112.  
  113.       case "cmd_delete":
  114.       case "button_delete":
  115.         if (dirTree)
  116.           AbDeleteDirectory();
  117. //        top.addressbook.deleteAddressBooks(dirTree.database, dirTree, dirTree.selectedItems);
  118.         break;
  119.     }
  120.   },
  121.  
  122.   onEvent: function(event)
  123.   {
  124.     // on blur events set the menu item texts back to the normal values
  125.     if (event == "blur")
  126.       goSetMenuValue("cmd_delete", "valueDefault");
  127.   }
  128. };
  129.  
  130. function InitCommonJS()
  131. {
  132.   dirTree = document.getElementById("dirTree");
  133.   resultsTree = document.getElementById("resultsTree");
  134. }
  135.  
  136. function SetupCommandUpdateHandlers()
  137. {
  138.   // dir pane
  139.   if (dirTree)
  140.     dirTree.controllers.appendController(DirPaneController);
  141.  
  142.   // results pane
  143.   if (resultsTree)
  144.     resultsTree.controllers.appendController(ResultsPaneController);
  145. }
  146.  
  147.  
  148. function AbNewCard()
  149. {
  150.   var selectedAB = 0;
  151.   if (dirTree && dirTree.selectedItems && (dirTree.selectedItems.length == 1))
  152.     selectedAB = dirTree.selectedItems[0].getAttribute("id");
  153.  
  154.   goNewCardDialog(selectedAB);
  155. }
  156.  
  157. function AbEditCard()
  158. {
  159.   var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  160.   rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
  161.  
  162.   if (resultsTree.selectedItems && resultsTree.selectedItems.length == 1) {
  163.     var uri = resultsTree.selectedItems[0].getAttribute("id");
  164.     var card = rdf.GetResource(uri);
  165.     card = card.QueryInterface(Components.interfaces.nsIAbCard);
  166.     if (card.isMailList) {
  167.       listUri = card.mailListURI;
  168.       goEditListDialog(resultsTree.getAttribute("ref"), listUri);
  169.     }
  170.     else {
  171.       var updateFunc = ("gUpdateCardView" in top) ? top.gUpdateCardView : null;
  172.       goEditCardDialog(resultsTree.getAttribute("ref"), card, updateFunc, uri);
  173.     }
  174.   }
  175. }
  176.  
  177. function AbNewMessage()
  178. {
  179.   var msgComposeType = Components.interfaces.nsIMsgCompType;
  180.   var msgComposFormat = Components.interfaces.nsIMsgCompFormat;
  181.   var msgComposeService = Components.classes["@mozilla.org/messengercompose;1"].getService();
  182.   msgComposeService = msgComposeService.QueryInterface(Components.interfaces.nsIMsgComposeService);
  183.   msgComposeService.OpenComposeWindowWithValues(null, msgComposeType.New, msgComposFormat.Default,
  184.                                                 GetSelectedAddresses(), null, null,
  185.                                                 null, null, null, null, null);
  186. }
  187.  
  188. function GetSelectedAddresses()
  189. {
  190.   var item, uri, rdf, cardResource, card;
  191.   var selectedAddresses = "";
  192.  
  193.   rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  194.   rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
  195.  
  196.   if (resultsTree.selectedItems && resultsTree.selectedItems.length) {
  197.     for (item = 0; item < resultsTree.selectedItems.length; item++) {
  198.       uri = resultsTree.selectedItems[item].getAttribute("id");
  199.       cardResource = rdf.GetResource(uri);
  200.       card = cardResource.QueryInterface(Components.interfaces.nsIAbCard);
  201.       if (selectedAddresses)
  202.         selectedAddresses += ",";
  203.       selectedAddresses += "\"" + card.displayName + "\" <" + card.primaryEmail + ">";
  204.     }
  205.   }
  206.   return selectedAddresses;
  207. }
  208.  
  209.  
  210. function SelectFirstAddressBook()
  211. {
  212.   var body = document.getElementById("dirTreeBody");
  213.   if (dirTree && body) {
  214.     var treeitems = body.getElementsByTagName("treeitem");
  215.     if (treeitems && treeitems.length > 0) {
  216.       dirTree.selectItem(treeitems[0]);
  217.       ChangeDirectoryByDOMNode(treeitems[0]);
  218.     }
  219.   }
  220. }
  221.  
  222. function SelectFirstCard()
  223. {
  224.   var body = GetResultsTreeChildren();
  225.   if (resultsTree && body) {
  226.     var treeitems = body.getElementsByTagName("treeitem");
  227.     if (treeitems && treeitems.length > 0) {
  228.       resultsTree.selectItem(treeitems[0]);
  229.       ResultsPaneSelectionChange();
  230.     }
  231.   }
  232. }
  233.  
  234. function DirPaneSelectionChange()
  235. {
  236.   if (dirTree && dirTree.selectedItems && (dirTree.selectedItems.length == 1))
  237.     ChangeDirectoryByDOMNode(dirTree.selectedItems[0]);
  238.   else {
  239.     if (resultsTree) {
  240.       ClearResultsTreeSelection();
  241.       resultsTree.setAttribute("ref", null);
  242.     }
  243.   }
  244. }
  245.  
  246. function ChangeDirectoryByDOMNode(dirNode)
  247. {
  248.   var uri = dirNode.getAttribute("id");
  249.   if (resultsTree) {
  250.     if (uri != resultsTree.getAttribute("ref")) {
  251.       ClearResultsTreeSelection();
  252.       resultsTree.setAttribute("ref", uri);
  253.       WaitUntilDocumentIsLoaded();
  254.       SortToPreviousSettings();
  255.       SelectFirstCard();
  256.       UpdateStatusCardCounts(uri);
  257.     }
  258.   }
  259. }
  260.  
  261. function ResultsPaneSelectionChange()
  262. {
  263.   if ("gUpdateCardView" in top)
  264.     top.gUpdateCardView();
  265.  
  266.   if ("gDialogResultsPaneSelectionChanged" in top)
  267.     top.gDialogResultsPaneSelectionChanged();
  268. }
  269.  
  270. function ClearResultsTreeSelection()
  271. {
  272.   if (resultsTree)
  273.     resultsTree.clearItemSelection();
  274. }
  275.  
  276. function RedrawResultsTree()
  277. {
  278.   if (resultsTree) {
  279.     var ref = resultsTree.getAttribute("ref");
  280.     resultsTree.setAttribute("ref", ref);
  281.   }
  282. }
  283.  
  284. function RememberResultsTreeSelection()
  285. {
  286.   var selectionArray = 0;
  287.  
  288.   if (resultsTree) {
  289.     var selectedItems = resultsTree.selectedItems;
  290.     var numSelected = selectedItems.length;
  291.  
  292.     selectionArray = new Array(numSelected);
  293.  
  294.     for (var i = 0; i < numSelected; i++) {
  295.       selectionArray[i] = selectedItems[i].getAttribute("id");
  296.       dump("selectionArray["+i+"] = " + selectionArray[i] + "\n");
  297.     }
  298.   }
  299.   return selectionArray;
  300. }
  301.  
  302. function RestoreResultsTreeSelection(selectionArray)
  303. {
  304.   if (resultsTree && selectionArray) {
  305.     var numSelected = selectionArray.length;
  306.  
  307.     WaitUntilDocumentIsLoaded();
  308.  
  309.     var rowElement;
  310.     for (var i = 0 ; i < numSelected; i++) {
  311.       rowElement = document.getElementById(selectionArray[i]);
  312.       resultsTree.addItemToSelection(rowElement);
  313.       if (rowElement && (i==0))
  314.         resultsTree.ensureElementIsVisible(rowElement);
  315.     }
  316.     ResultsPaneSelectionChange();
  317.   }
  318. }
  319.  
  320. var addrbooksession =Components.classes["@mozilla.org/addressbook/services/session;1"].getService().QueryInterface(Components.interfaces.nsIAddrBookSession);
  321.  
  322. function WaitUntilDocumentIsLoaded()
  323. {
  324.   try {
  325.     addrbooksession.ensureDocumentIsLoaded(document);
  326.   }
  327.   catch (ex) {
  328.     dump("failed to flush pending notifications: " + ex + "\n");
  329.   }
  330. }
  331.  
  332. function GetResultsTreeChildren()
  333. {
  334.   if (resultsTree && resultsTree.childNodes) {
  335.     for (var index = resultsTree.childNodes.length - 1; index >= 0; index--) {
  336.       if (resultsTree.childNodes[index].localName == "treechildren")
  337.         return(resultsTree.childNodes[index]);
  338.     }
  339.   }
  340.   return null;
  341. }
  342.  
  343. function GetResultsTreeItem(row)
  344. {
  345.   var treechildren = GetResultsTreeChildren();
  346.  
  347.   if (treechildren && row > 0) {
  348.     var treeitems = treechildren.getElementsByTagName("treeitem");
  349.     if (treeitems && treeitems.length >= row)
  350.       return treeitems[row-1];
  351.   }
  352.   return null;
  353. }
  354.  
  355. function SortResultPane(column, sortKey)
  356. {
  357.   var node = document.getElementById(column);
  358.   if (!node)
  359.     return false;
  360.  
  361.   var sortDirection = "ascending";
  362.   var currentDirection = node.getAttribute("sortDirection");
  363.  
  364.   if (currentDirection == "ascending")
  365.     sortDirection = "descending";
  366.   else
  367.     sortDirection = "ascending";
  368.  
  369.   UpdateSortIndicator(column, sortDirection);
  370.  
  371.   DoSort(column, sortKey, sortDirection);
  372.  
  373.   SaveSortSetting(column, sortKey, sortDirection);
  374.  
  375.   return true;
  376. }
  377.  
  378. function DoSort(column, key, direction)
  379. {
  380.   var isupports = Components.classes["@mozilla.org/xul/xul-sort-service;1"].getService();
  381.   if (!isupports)
  382.     return false;
  383.  
  384.   var xulSortService = isupports.QueryInterface(Components.interfaces.nsIXULSortService);
  385.   if (!xulSortService)
  386.     return false;
  387.  
  388.   var node = document.getElementById(column);
  389.  
  390.   if (node) {
  391.     var selectionArray = RememberResultsTreeSelection();
  392.     if (selectionArray.length) {
  393.       xulSortService.Sort(node, key, direction);
  394.       ClearResultsTreeSelection();
  395.       WaitUntilDocumentIsLoaded();
  396.       RestoreResultsTreeSelection(selectionArray);
  397.     }
  398.     else {
  399.       try {
  400.         xulSortService.Sort(node, key, direction);
  401.         WaitUntilDocumentIsLoaded();
  402.       }
  403.       catch(ex) {
  404.         dump("failed to do sort\n");
  405.       }
  406.     }
  407.   }
  408.   return true;
  409. }
  410. function SortToPreviousSettings()
  411. {
  412.   if (dirTree && resultsTree) {
  413.     var ref = resultsTree.getAttribute("ref");
  414.     var folder = document.getElementById(ref);
  415.     if (folder) {
  416.       var column = folder.getAttribute("sortColumn");
  417.       var key = folder.getAttribute("sortKey");
  418.       var direction = folder.getAttribute("sortDirection");
  419.  
  420.       if (!column || !key) {
  421.         column = "NameColumn";
  422.         key = "http://home.netscape.com/NC-rdf#Name";
  423.       }
  424.       if (!direction)
  425.         direction = "ascending";
  426.  
  427.       UpdateSortIndicator(column,direction);
  428.  
  429.       DoSort(column, key, direction);
  430.     }
  431.   }
  432. }
  433.  
  434. function SaveSortSetting(column, key, direction)
  435. {
  436.   if (dirTree && resultsTree) {
  437.     var ref = resultsTree.getAttribute("ref");
  438.     var folder = document.getElementById(ref);
  439.     if (folder) {
  440.       folder.setAttribute("sortColumn", column);
  441.       folder.setAttribute("sortKey", key);
  442.       folder.setAttribute("sortDirection", direction);
  443.     }
  444.   }
  445. }
  446.  
  447. //------------------------------------------------------------
  448. // Sets the column header sort icon based on the requested
  449. // column and direction.
  450. //
  451. // Notes:
  452. // (1) This function relies on the first part of the
  453. //     <treecell id> matching the <treecol id>.  The treecell
  454. //     id must have a "Header" suffix.
  455. // (2) By changing the "sortDirection" attribute, a different
  456. //     CSS style will be used, thus changing the icon based on
  457. //     the "sortDirection" parameter.
  458. //------------------------------------------------------------
  459. function UpdateSortIndicator(column,sortDirection)
  460. {
  461.   // Find the <treerow> element
  462.   var treerow = document.getElementById("headRow");
  463.   var id = column + "Header";
  464.  
  465.   if (treerow) {
  466.     // Grab all of the <treecell> elements
  467.     var treecell = treerow.getElementsByTagName("treecell");
  468.     if (treecell) {
  469.       // Loop through each treecell...
  470.       var node_count = treecell.length;
  471.       for (var i=0; i < node_count; i++) {
  472.         // Is this the requested column ?
  473.         if (id == treecell[i].getAttribute("id")) {
  474.           // Set the sortDirection so the class (CSS) will add the
  475.           // appropriate icon to the header cell
  476.           treecell[i].setAttribute("sortDirection", sortDirection);
  477.         }
  478.         else {
  479.           // This is not the sorted row
  480.           treecell[i].removeAttribute("sortDirection");
  481.         }
  482.       }
  483.     }
  484.   }
  485. }
  486.  
  487. function AbNewList()
  488. {
  489.   var selectedAB = 0;
  490.   if (dirTree && dirTree.selectedItems && (dirTree.selectedItems.length == 1))
  491.     selectedAB = dirTree.selectedItems[0].getAttribute("id");
  492.  
  493.   window.openDialog("chrome://messenger/content/addressbook/abMailListDialog.xul",
  494.                     "",
  495.                     "chrome,titlebar,resizeable=no",
  496.                     {selectedAB:selectedAB});
  497. }
  498.  
  499.  
  500. function goEditListDialog(abURI, listURI)
  501. {
  502.   window.openDialog("chrome://messenger/content/addressbook/abEditListDialog.xul",
  503.                     "",
  504.                     "chrome,titlebar,resizeable=no",
  505.                     {abURI:abURI, listURI:listURI});
  506. }
  507.