home *** CD-ROM | disk | FTP | other *** search
/ ftp.swcp.com / ftp.swcp.com.zip / ftp.swcp.com / mac / mozilla-macos9-1.3.1.sea.bin / Mozilla1.3.1 / Chrome / comm.jar / content / communicator / wallet / WalletViewer.js < prev    next >
Text File  |  2003-06-08  |  16KB  |  451 lines

  1. /* -*- Mode: Java; tab-width: 4; c-basic-offset: 4; -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  *
  18.  * Contributor(s):
  19.  */
  20.  
  21. function initPanel() {
  22.   var tag = document.getElementById("panelFrame").getAttribute("tag");
  23.   if (hWalletViewer) {
  24.     hWalletViewer.onpageload(tag)
  25.   } else {
  26.     window.queuedTag = tag;
  27.     window.queuedTagPending = true;
  28.   }
  29. }
  30.  
  31. window.doneLoading = false;
  32. var walletViewerInterface = null;
  33. var walletServiceInterface = null;
  34. var bundle = null; // string bundle
  35. var JS_STRINGS_FILE = "chrome://communicator/locale/wallet/WalletEditor.properties";
  36. var schemaToValue = [];
  37. var BREAK = "|";
  38.  
  39. function nsWalletViewer(frame_id)
  40. {
  41.   if (!frame_id) {
  42.     throw "Error: frame_id not supplied!";
  43.   }
  44.   this.contentFrame = frame_id
  45.   this.cancelHandlers = [];
  46.   this.okHandlers = [];
  47.  
  48.   // set up window
  49.   this.onload();
  50. }
  51.  
  52. nsWalletViewer.prototype =
  53.   {
  54.     onload:
  55.       function() {
  56.         walletViewerInterface = Components.classes["@mozilla.org/walleteditor/walleteditor-world;1"].createInstance();
  57.         walletViewerInterface = walletViewerInterface.QueryInterface(Components.interfaces.nsIWalletEditor);
  58.  
  59.         walletServiceInterface = Components.classes['@mozilla.org/wallet/wallet-service;1'];
  60.         walletServiceInterface = walletServiceInterface.getService();
  61.         walletServiceInterface = walletServiceInterface.QueryInterface(Components.interfaces.nsIWalletService);
  62.  
  63.         bundle = srGetStrBundle(JS_STRINGS_FILE); /* initialize string bundle */
  64.  
  65.         if (!EncryptionTest()) {
  66.           dump("*** user failed to unlock the database\n");
  67.           return;
  68.         }
  69.         if (!FetchInput()) {
  70.           dump("*** user failed to unlock the database\n");
  71.           return;
  72.         }
  73.         doSetOKCancel(this.onOK, this.onCancel);
  74.  
  75.         // allow l10n to hide certain panels
  76.         var pref = Components.classes["@mozilla.org/preferences-service;1"]
  77.                              .getService(Components.interfaces.nsIPrefBranch);
  78.         var panel;
  79.         try {
  80.           if (pref.getBoolPref("wallet.namePanel.hide")) {
  81.             panel = document.getElementById("pnameID");
  82.             panel.setAttribute("hidden", "true");
  83.             panel = document.getElementById("snameID");
  84.             panel.setAttribute("hidden", "true");
  85.             panel = document.getElementById("bnameID");
  86.             panel.setAttribute("hidden", "true");
  87.           }
  88.           if (pref.getBoolPref("wallet.addressPanel.hide")) {
  89.             panel = document.getElementById("paddressID");
  90.             panel.setAttribute("hidden", "true");
  91.             panel = document.getElementById("saddressID");
  92.             panel.setAttribute("hidden", "true");
  93.             panel = document.getElementById("baddressID");
  94.             panel.setAttribute("hidden", "true");
  95.           }
  96.           if (pref.getBoolPref("wallet.phonePanel.hide")) {
  97.             panel = document.getElementById("pphoneID");
  98.             panel.setAttribute("hidden", "true");
  99.             panel = document.getElementById("sphoneID");
  100.             panel.setAttribute("hidden", "true");
  101.             panel = document.getElementById("bphoneID");
  102.             panel.setAttribute("hidden", "true");
  103.           }
  104.           if (pref.getBoolPref("wallet.creditPanel.hide")) {
  105.             panel = document.getElementById("pcreditID");
  106.             panel.setAttribute("hidden", "true");
  107.           }
  108.           if (pref.getBoolPref("wallet.employPanel.hide")) {
  109.             panel = document.getElementById("pemployID");
  110.             panel.setAttribute("hidden", "true");
  111.           }
  112.           if (pref.getBoolPref("wallet.miscPanel.hide")) {
  113.             panel = document.getElementById("pmiscID");
  114.             panel.setAttribute("hidden", "true");
  115.           }
  116.         } catch(e) {
  117.           // error -- stop hiding if prefs are missing
  118.         }
  119.       },
  120.  
  121.       init:
  122.         function() {
  123.           if (window.queuedTagPending) {
  124.             this.onpageload(window.queuedTag);
  125.           }
  126.           this.closeBranches("pnameID");
  127.         },
  128.  
  129.       onOK:
  130.         function() {
  131.           for(var i = 0; i < hWalletViewer.okHandlers.length; i++) {
  132.             hWalletViewer.okHandlers[i]();
  133.           }
  134.  
  135.           var tag = document.getElementById(hWalletViewer.contentFrame).getAttribute("tag");
  136.           hWalletViewer.savePageData(tag);
  137.           hWalletViewer.saveAllData();
  138.           close();
  139.         },
  140.  
  141.       onCancel:
  142.         function() {
  143.           for(var i = 0; i < hWalletViewer.cancelHandlers.length; i++) {
  144.             hWalletViewer.cancelHandlers[i]();
  145.           }
  146.           close();
  147.         },
  148.  
  149.       registerOKCallbackFunc:
  150.         function(aFunctionReference) {
  151.           this.okHandlers[this.okHandlers.length] = aFunctionReference;
  152.         },
  153.  
  154.       registerCancelCallbackFunc:
  155.         function(aFunctionReference) {
  156.           this.cancelHandlers[this.cancelHandlers.length] = aFunctionReference;
  157.         },
  158.  
  159.       saveAllData:
  160.         function() {
  161.           ReturnOutput();
  162.         },
  163.  
  164.       savePageData:
  165.         function(tag) {
  166.           /* collect the list of menuItem labels */
  167.           var elementIDs;
  168.           var contentFrame = window.frames[this.contentFrame];
  169.           if ("_elementIDs" in contentFrame) { // make sure page finished loading
  170.             elementIDs = contentFrame._elementIDs;
  171.           }
  172.           for(var i = 0; i < elementIDs.length; i++) {
  173.             var values = "";
  174.             var menuList = contentFrame.document.getElementById(elementIDs[i]);
  175.             if (menuList.parentNode.getAttribute("hidden") == "true") {
  176.               continue; /* needed for concatenations only */
  177.             }
  178.             Append(menuList); /* in case current editing has not been stored away */
  179.             var menuPopup = menuList.firstChild;
  180.  
  181.             /* visit each menuItem */
  182.             for (var menuItem = menuPopup.firstChild;
  183.                  menuItem != menuPopup.lastChild; /* skip empty item at end of list */
  184.                  menuItem = menuItem.nextSibling) {
  185.               values += (menuItem.getAttribute("label") + BREAK);
  186.             }
  187.             schemaToValue[tag+elementIDs[i]] = values;
  188.           }
  189.         },
  190.  
  191.       switchPage:
  192.         function() {
  193.           var PanelTree = document.getElementById("panelTree");
  194.           if (PanelTree.view.selection.count == 0) return;
  195.           var selectedItem = PanelTree.contentView.getItemAtIndex(PanelTree.currentIndex);
  196.  
  197.           var oldURL = document.getElementById(this.contentFrame).getAttribute("src");
  198.           var oldTag = document.getElementById(this.contentFrame).getAttribute("tag");
  199.  
  200.           this.savePageData(oldTag);      // save data from the current page.
  201.  
  202.           var newURL = selectedItem.firstChild.firstChild.getAttribute("url");
  203.           var newTag = selectedItem.firstChild.firstChild.getAttribute("tag");
  204.           if (newURL != oldURL || newTag != oldTag) {
  205.             document.getElementById(this.contentFrame).setAttribute("src", newURL);
  206.             document.getElementById(this.contentFrame).setAttribute("tag", newTag);
  207.           }
  208.         },
  209.  
  210.       onpageload:
  211.         function(aPageTag) {
  212.           if ('Startup' in window.frames[ this.contentFrame ]) {
  213.             window.frames[ this.contentFrame ].Startup();
  214.           }
  215.  
  216.           /* restore the list of menuItem labels */
  217.           var elementIDs = window.frames[this.contentFrame]._elementIDs;
  218.           for(var i = 0; i < elementIDs.length; i++) {
  219.             var menuList = window.frames[this.contentFrame].document.getElementById(elementIDs[i]);
  220.             if (!menuList) {
  221.               dump("*** FIX ME: '_elementIDs' in '" + aPageTag +
  222.                    "' contains a reference to a non-existent element ID '" +
  223.                    elementIDs[i] + "'.\n");
  224.               return;
  225.             }
  226.             var menuPopup = menuList.firstChild;
  227.             if ((aPageTag+elementIDs[i]) in schemaToValue) {
  228.  
  229.               /* following unhiding is needed for concatenations only */
  230.               var row = menuList.parentNode;
  231.               var rows = row.parentNode;
  232.               var grid = rows.parentNode;
  233.               var groupBox = grid.parentNode;
  234.               groupBox.setAttribute("hidden", "false");
  235.               row.setAttribute("hidden", "false");
  236.  
  237.               var strings = schemaToValue[aPageTag+elementIDs[i]].split(BREAK);
  238.               for (var j = 0; j<strings.length-1; j++) {
  239.                 var menuItem = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem");
  240.                 if (menuItem) {
  241.                   menuItem.setAttribute("label", strings[j]);
  242.                   menuItem.setAttribute("len", strings[j].length);
  243.                   menuPopup.insertBefore(menuItem, menuPopup.lastChild);
  244.                 }
  245.               }
  246.             };
  247.             menuList.selectedItem = menuPopup.firstChild; // ????? is this temporary ?????
  248.           }
  249.         },
  250.  
  251.     closeBranches:
  252.       function(aComponentName) {
  253.         var panelChildren = document.getElementById("panelChildren");
  254.         var panelTree = document.getElementById("panelTree");
  255.         for(var i = 0; i < panelChildren.childNodes.length; i++) {
  256.           var currentItem = panelChildren.childNodes[i];
  257.           if (currentItem.id != aComponentName && currentItem.id != "primary") {
  258.             currentItem.removeAttribute("open");
  259.           }
  260.         }
  261.         var openItem = document.getElementById(aComponentName);
  262.         var index = panelTree.contentView.getIndexOfItem(openItem);
  263.         panelTree.view.selection.select(index);
  264.       }
  265.  
  266.   };
  267.  
  268.   function Append(thisMenuList) {
  269.  
  270.     /* Note: we always want a zero-length textbox so the user
  271.      * can start typing in a new value.  So we need to determine
  272.      * if user has started typing into the zero-length textbox
  273.      * in which case it's time to create yet another zero-length
  274.      * one.  We also need to determine if user has removed all
  275.      * text in a textbox in which case that textbox needs to
  276.      * be removed
  277.      */
  278.  
  279.     /* transfer value from menu list to the selected menu item */
  280.     var thisMenuItem = thisMenuList.selectedItem;
  281.     if (!thisMenuItem) {
  282.       return;
  283.     }
  284.     thisMenuItem.setAttribute('label', thisMenuList.value);
  285.  
  286.     /* determine previous size of textbox */
  287.     var len = Number(thisMenuItem.getAttribute("len"));
  288.  
  289.     /* update previous size */
  290.     var newLen = thisMenuItem.getAttribute("label").length;
  291.     thisMenuItem.setAttribute("len", newLen);
  292.  
  293.     /* obtain parent element */
  294.     var thisMenuPopup = thisMenuItem.parentNode;
  295.     if (!thisMenuPopup) {
  296.       return;
  297.     }
  298.  
  299.     /* determine if it's time to remove menuItem */
  300.     if (newLen == 0) {
  301.       /* no characters left in text field */
  302.       if (len) {
  303.         /* previously there were some characters, time to remove */
  304.         thisMenuPopup.parentNode.selectedItem = thisMenuPopup.lastChild;
  305.         thisMenuPopup.removeChild(thisMenuItem);
  306.       }
  307.       return;
  308.     }
  309.  
  310.     /* currently modified entry is not null so put it at head of list */
  311.     if (thisMenuPopup.childNodes.length > 1) {
  312.       thisMenuPopup.removeChild(thisMenuItem);
  313.       thisMenuPopup.insertBefore(thisMenuItem, thisMenuPopup.firstChild);
  314.     }
  315.  
  316.     /* determine if it's time to add menuItem */
  317.     if (len) {
  318.       /* previously there were some characters and there still are so it's not time to add */
  319.       return;
  320.     }
  321.  
  322.     /* add menu item */
  323.     var menuItem = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem");
  324.     if (!menuItem) {
  325.       return;
  326.     }
  327.     menuItem.setAttribute("label", "");
  328.     menuItem.setAttribute("len", "0");
  329.     thisMenuPopup.appendChild(menuItem);
  330.  
  331.     return;
  332.   }
  333.  
  334.   /* return the wallet output data */
  335.   function ReturnOutput() {
  336.     var schema;
  337.     var output = "OK" + BREAK;
  338.     var value;
  339.     for (schema in schemaToValue) {
  340.       if (schemaToValue[schema] != "") {
  341.         value = schemaToValue[schema].split(BREAK);
  342.         for (var i=0; i<value.length-1; i++) { /* skip empty value at end */
  343.           output += (schema + BREAK + Encrypt(value[i]) + BREAK + BREAK);
  344.         }
  345.       }
  346.     }
  347.     walletViewerInterface.SetValue(output, window);
  348.   }
  349.  
  350.   /* clear all data */
  351.   function ClearAll() {
  352.  
  353.     // clear out all values from database
  354.     schemaToValue = [];
  355.  
  356.     // clear out values on current page
  357.     var elementIDs = window.frames[hWalletViewer.contentFrame]._elementIDs;
  358.     for(var i = 0; i < elementIDs.length; i++) {
  359.       var menuList = window.frames[hWalletViewer.contentFrame].document.getElementById(elementIDs[i]);
  360.       var menuPopup = menuList.firstChild;
  361.  
  362.       // remove all menuItems except for last one
  363.       while (menuPopup.childNodes.length > 1) {
  364.         menuPopup.removeChild(menuPopup.firstChild);
  365.       }
  366.       menuList.removeAttribute("label");
  367.       menuList.selectedItem = menuPopup.firstChild;
  368.     }
  369.   }
  370.  
  371.   /* get the wallet input data */
  372.   function FetchInput() {
  373.     /*  get wallet data into a list */
  374.     var list = walletViewerInterface.GetValue();
  375.  
  376.     /* format of this list is as follows:
  377.      *
  378.      *    BREAK-CHARACTER
  379.      *    schema-name BREAK-CHARACTER
  380.      *    value BREAK-CHARACTER
  381.      *    synonymous-value-1 BREAK-CHARACTER
  382.      *    ...
  383.      *    synonymous-value-n BREAK-CHARACTER
  384.      *
  385.      * and repeat above pattern for each schema name.  Note that if there are more than
  386.      * one distinct values for a particular schema name, the above pattern is repeated
  387.      * for each such distinct value
  388.      */
  389.  
  390.     /* check for database being unlocked */
  391.     if (list.length == 0) {
  392.       /* user supplied invalid database key */
  393.       window.close(); // ?????
  394.       return false;
  395.     }
  396.  
  397.     /* parse the list into the schemas and their corresponding values */
  398.     BREAK = list[0];
  399.     var strings = list.split(BREAK);
  400.     var stringsLength = strings.length;
  401.     var schema, value;
  402.     for (var i=1; i<stringsLength; i++) {
  403.       if (strings[i] != "" && strings[i-1] == "") {
  404.         schema = strings[i++];
  405.         value = Decrypt(strings[i]);
  406.         if (!(schema in schemaToValue)) {
  407.           schemaToValue[schema] = [];
  408.         }
  409.         schemaToValue[schema] += (value + BREAK);
  410.       }
  411.     }
  412.  
  413.     return true;
  414.   }
  415.  
  416.   /* decrypt a value */
  417.   function Decrypt(crypt) {
  418.     try {
  419.       return walletServiceInterface.WALLET_Decrypt(crypt);
  420.     } catch (ex) {
  421.       return bundle.GetStringFromName("EncryptionFailure");
  422.     }
  423.   }
  424.  
  425.   /* encrypt a value */
  426.   function Encrypt(text) {
  427.     try {
  428.       return walletServiceInterface.WALLET_Encrypt(text);
  429.     } catch (ex) {
  430.       alert(bundle.GetStringFromName("UnableToUnlockDatabase"));
  431.       return "";
  432.     }
  433.   }
  434.  
  435.   /* see if user was able to unlock the database */
  436.   function EncryptionTest() {
  437.     try {
  438.       walletServiceInterface.WALLET_Encrypt("dummy");
  439.     } catch (ex) {
  440.       alert(bundle.GetStringFromName("UnableToUnlockDatabase"));
  441.       window.close(); // ?????
  442.       return false;
  443.     }
  444.     return true;
  445.   }
  446.  
  447.   // called by the help button overlaid from platformDialogOverlay
  448.   function doHelpButton() {
  449.     openHelp("forms_data");
  450.   }
  451.