home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2005 October / Gamestar_77_2005-10_dvd.iso / Programy / nsb-install-8-0.exe / chrome / toolkit.jar / content / mozapps / autofill / passcard.js < prev    next >
Text File  |  2005-07-29  |  33KB  |  1,247 lines

  1. /*** Passcard Manager **********************************************/
  2. // NOTE: The following array stores Form Fill and Passcards XUL ids
  3. var _elementIDs = [ "FirstName", "LastName", "EmailAddr", "PhoneNum", "shippingAddresses", 
  4. "StrAddr", "StrAddr2", "City", "State", "countryList", "ZipCode",
  5. "askEveryTimeHidden", "passwordAskTimes", "passwordTimeout",
  6. "pcAutologin", "pcAutosave", "pcHighlight", "pcFillAndSubmit",
  7. "pcPasswordProtect", "afillRadio",
  8. "dcAutosave", "dcFillAndSubmit", "dcMessageBar", "dcPasswordProtect", "dcPasswordPrompt"];
  9. // no longer needed? "pcAutofill", "pcAutofillPrompt", "pcAutosave", "pcAutosavePrompt", "pcHighlight", "pcFillAndSubmit",
  10. // no longer needed? "pcUserID", "pcPassword", "pcPasswordProtect", "pcPasswordPrompt", "pcPasswordExpire", "afillRadio",
  11.  
  12. // const variables
  13. var kPasscardPreferences = "passcard.preferences.tab";
  14. var kPasscardDetails = "passcard.details.tab";
  15. var kCheckboxStateChange = "CheckboxStateChange";
  16. var kSelectedTab = "passcard-tabs";
  17. var kSignonsTree = "signonsTree";
  18. var kRejectsTree = "rejectsTree";
  19. var kDefaultPasscard = "DefaultPasscard";
  20.  
  21. // global variables
  22. var gDebug = false;
  23. var gPrefTabSelectInit = false;
  24. var gSelectedTree = null;
  25. var gSignons = null;
  26. var gTreeMutex = 0;
  27. var gPrefService = null;
  28. var gLastSelectedSignon = null;
  29.  
  30. function PasscardOnLoad()
  31. {
  32.     // password manager startup
  33.     pmStartup();
  34.  
  35.     // passcard startup
  36.     pcStartup();
  37.  
  38.     if (!IsOpenInDialog())
  39.     {
  40.         // master password startup
  41.         mpStartup();
  42.     }
  43. }
  44.  
  45. /**
  46.  * Startup
  47.  **/
  48. function pcStartup()
  49. {
  50.     debug("Passcard Startup()");
  51.     
  52.     // setup event handlers
  53.     if (!IsInitialized())
  54.         window.top.hPrefWindow.registerOKCallbackFunc(OnPasscardOK);
  55.  
  56.     if (!IsOpenInDialog())
  57.     {
  58.         // get the preferences from the file and
  59.         // ensure dependent xul are disabled appropriately
  60.         pcGetPreferences();
  61.     }
  62.  
  63.     // need to setup this event handler after pcGetPreferences()
  64. /* TODO JVL : Remove if no longer necessary
  65.     document.getElementById("pcPasswordProtect").addEventListener(kCheckboxStateChange, SetPasswordIfBlank, false);
  66.     document.getElementById("pcPasswordPrompt").addEventListener(kCheckboxStateChange, SetPasswordIfBlank, false);
  67. */
  68.  
  69.     gSelectedTree = document.getElementById('signonsTree');
  70.     gPrefTabSelectInit = true;
  71.     SetPasscardTab(kPasscardPreferences, "passcard-tabbox");
  72.     SetPasscardTab(kPasscardDetails, "detail-tabbox");
  73. // MERC JVL : Removed (4/14/05)    SetNoLoginPasscardMsg();
  74.     gPrefService = Components.classes["@mozilla.org/preferences-service;1"]
  75.                                                     .getService(Components.interfaces.nsIPrefBranch);
  76.     
  77.     if (gPrefService.getPrefType('browser.passcard.selectedcard') &&
  78.             gPrefService.getCharPref('browser.passcard.selectedcard'))
  79.     {
  80.         selectTreeByPasscardName(gPrefService.getCharPref('browser.passcard.selectedcard'));
  81.     }
  82.     else if (signonsTree.view.rowCount > 0 && signonsTree.treeBoxObject.selection.currentIndex < 0)
  83.     {
  84.         signonsTree.treeBoxObject.selection.select(0);
  85.     }
  86.  
  87.     if (signonsTree.view.rowCount > 0 && signonsTree.treeBoxObject.selection.currentIndex < 0)
  88.     {
  89.         signonsTree.treeBoxObject.selection.select(0);
  90.     }
  91. }
  92.  
  93. function selectTreeByPasscardName(passcardName)
  94. {
  95.     var idx = 0;
  96.     var signonList = parent.passcardFinalize.signons;
  97.     if (signonList == null)
  98.         return;
  99.     if (signonList.length < 1)
  100.         return;
  101.  
  102.     while (idx < signonList.length)
  103.     {
  104.         if (signonList[idx].passcard == passcardName)
  105.             break;
  106.  
  107.         idx++;
  108.     }
  109.  
  110.     if (idx >= signonList.length)
  111.         idx = 0;
  112.  
  113.     signonsTree.treeBoxObject.selection.select(idx);
  114. }
  115.  
  116. /**
  117.  * Set the passcard tab
  118.  **/
  119. function SetPasscardTab(charPref, strTabBox)
  120. {
  121.     var prefs = GetPreferencesInterface();
  122.     if (prefs == null)
  123.         return;
  124.  
  125.     var selectedTabId = prefs.getCharPref(charPref);
  126.     debug("The selected passcard tab is", selectedTabId);
  127.  
  128.     var theTabBox = document.getElementById(strTabBox);
  129.     
  130.     // only allow this tab selection if in the Forms Option panel
  131.     if (theTabBox != null || !IsOpenInDialog())
  132.     {
  133.         var theTab = document.getElementById(selectedTabId);
  134.         theTabBox.selectedTab = theTab;
  135.     }
  136. }
  137.  
  138. /**
  139.  * Get the passcard (general) preferences
  140.  **/
  141. function pcGetPreferences()
  142. {
  143. // TODO JVL : Should store in browser prefs
  144.     // only get the preferences if we're opening the Options
  145.     // dialog and not just switching tabs within the dialog
  146.     if (IsInitialized())
  147.         return;
  148.         
  149.     var pm = GetPMInterface();
  150.     if (pm == null)
  151.         return;    
  152.  
  153.     debug("GetPreferences()");
  154.     var prefAutologin = new Object();
  155.     var prefAutologinPrompt = new Object();
  156.     var prefAutosave = new Object();
  157.     var prefAutosavePrompt = new Object();
  158.     var prefHighlight = new Object();
  159.     var prefFillAndSubmit = new Object();
  160.     var prefDefaultPrompt = new Object();
  161.     var prefUserID = new Object();
  162.     var prefPassword = new Object();
  163.     var prefPasswordProtect = new Object();
  164.     var prefPasswordPrompt = new Object();
  165.     var prefExpire = new Object();
  166.     
  167.     pm.getPreferences(prefAutologin, prefAutologinPrompt, prefAutosave, prefAutosavePrompt, prefHighlight, prefFillAndSubmit,
  168.             prefDefaultPrompt, prefUserID, prefPassword, prefPasswordProtect, prefPasswordPrompt, prefExpire);
  169.     
  170.     prefDump(prefAutologin, prefAutologinPrompt, prefAutosave, prefAutosavePrompt, prefHighlight, prefFillAndSubmit,
  171.             prefDefaultPrompt, prefUserID, prefPassword, prefPasswordProtect, prefPasswordPrompt, prefExpire);
  172.  
  173.     document.getElementById("pcAutologin").selectedIndex = AsInteger(prefAutologin.value);
  174.     document.getElementById("pcAutosave").selectedIndex = AsInteger(prefAutosave.value);
  175.     document.getElementById("pcHighlight").checked = AsBoolean(prefHighlight.value);
  176.     document.getElementById("pcFillAndSubmit").checked = AsBoolean(prefFillAndSubmit.value);
  177.     document.getElementById("pcDefaultPrompt").checked = AsBoolean(prefDefaultPrompt.value);
  178. //    document.getElementById("pcUserID").value = prefUserID.value;
  179. //    document.getElementById("pcPassword").value = prefPassword.value;
  180.     document.getElementById("pcPasswordProtect").checked = AsBoolean(prefPasswordProtect.value);
  181. //    document.getElementById("pcPasswordPrompt").checked = AsBoolean(prefPasswordPrompt.value);
  182. //    document.getElementById("pcPasswordExpire").value = IsValidExpireValue(prefExpire.value);
  183. }
  184.  
  185. /**
  186.  * Select the tree, activate/deactivate buttons and update details
  187.  **/
  188. function SelectTree(thisTree)
  189. {
  190.     // respect mutex
  191.     if (gTreeMutex != 0)
  192.         return;
  193.  
  194.     // establish mutex
  195.     gTreeMutex++;
  196.  
  197.     CommitLastSelectedSignon();
  198.  
  199.     // update tree selection
  200.     gSelectedTree = thisTree;
  201.     var treeID = gSelectedTree.id;
  202.  
  203.     // clear all selections in the other tree
  204.     document.getElementById(gSelectedTree.id == kRejectsTree ? kSignonsTree : kRejectsTree).
  205.                 view.selection.clearSelection();
  206.  
  207.     // show/hide the additional message about Password protected Passcards (hide for blacklisted sites)
  208. // MERC JVL : Removed (4/14/05)    SetNoLoginPasscardMsg();
  209.     
  210.     // show/hide the data fields using a deck depending which list we are viewing
  211.     document.getElementById("detail-deck").selectedIndex = gSelectedTree.id == kRejectsTree ? 0 : 1;
  212.  
  213.     // enable/disable the Remove/RemoveAll buttons
  214.     var selections = GetTreeSelections(gSelectedTree);
  215.     if (selections != null && selections.length > 0)        // MERC JVL: why is 'selections.length' == 1 in this instance?
  216.     {
  217.         if (!IsDefaultPasscard())
  218.             document.getElementById("removeSignon").removeAttribute("disabled");
  219.         else
  220.             document.getElementById("removeSignon").setAttribute("disabled", "true");
  221.  
  222.         document.getElementById("removeAllSignons").removeAttribute("disabled");
  223.     }
  224.     else
  225.     {
  226.         document.getElementById("removeSignon").setAttribute("disabled", "true");
  227.         document.getElementById("removeAllSignons").setAttribute("disabled", "true");
  228.     }
  229.  
  230.     // update the fields
  231.     var signon = GetSelectedSignon();
  232.     if (signon)
  233.     {
  234.         document.getElementById("passcard-site-description").value = signon.host;
  235.         document.getElementById("passcard-userID-edit").value = signon.user;
  236.         document.getElementById("passcard-password-edit").value = signon.password;
  237.         document.getElementById("passcard-autologin-menulist").selectedIndex = AutologinAsInt(signon.autologin);
  238.         document.getElementById("passcard-protect-checkbox").checked = signon.protect == 0 ? false : true;
  239.         document.getElementById("passcard-setAsDefault-button").disabled = signon.lastUsed == 0 ? null : true;
  240.         //dump('********** SelectTree():Advanced Fields: ' + signon.advancedFields + '\n');
  241.         FillAdvancedFields(signon.advancedFields);
  242.         EnableProtect();
  243.         gLastSelectedSignon = signon;
  244.     }
  245.  
  246.     // release mutex
  247.     gTreeMutex--;
  248. }
  249.  
  250. /**
  251.  * Delete the item from the selected list
  252.  **/
  253. function DeleteItem()
  254. {
  255.     // sanity check
  256.     if (IsDefaultPasscard())
  257.         return;
  258.  
  259.     if (gSelectedTree == signonsTree)
  260.     {
  261.         // check if the lastUsed signon is being deleted
  262.         var bLastUsed = false;
  263.         var host;
  264.         var signon = GetSelectedSignon();
  265.         if (signon)
  266.         {
  267.             bLastUsed = (signon.lastUsed != 0);
  268.             host = signon.host;
  269.         }
  270.         
  271.         // delete the selected item
  272.         DeleteSelectedItemFromTree(signonsTree, signonsTreeView, gSignons,
  273.                                 parent.passcardFinalize.deletedSignons,
  274.                                 "removeSignon", "removeAllSignons");
  275.  
  276.         // if the lastUsed signon was deleted, set the zeroth signon as the lastUsed
  277.         if (bLastUsed && gSignons.length > 0)
  278.         {
  279.             var i = 0;
  280.             var maxlen = gSignons.length;
  281.             while (i < maxlen)
  282.             {
  283.                 if (host == gSignons[i].host)
  284.                 {
  285.                     gSignons[i].lastUsed = 1;
  286.                     i = maxlen;
  287.                 }
  288.                 i++;
  289.             }
  290.         }
  291.  
  292.         // hide the data fields if the tree is empty
  293.         if (gSignons.length < 1)
  294.             document.getElementById("detail-deck").selectedIndex = 0;
  295.     }
  296.     else if (gSelectedTree == rejectsTree)
  297.     {
  298.         DeleteSelectedItemFromTree(rejectsTree, rejectsTreeView,
  299.                                 parent.passcardFinalize.rejects,
  300.                                 parent.passcardFinalize.deletedRejects,
  301.                                 "removeSignon", "removeAllSignons");
  302.     }
  303. }
  304.  
  305. /**
  306.  * Delete all items from the selected list
  307.  **/
  308. function DeleteAllItems()
  309. {
  310.     if (gSelectedTree == signonsTree)
  311.     {
  312.         DeleteAllFromTree(signonsTree, signonsTreeView, gSignons,
  313.                         parent.passcardFinalize.deletedSignons,
  314.                         "removeSignon", "removeAllSignons");
  315.  
  316.         // hide the data fields if the tree is empty
  317.         if (gSignons.length < 1)
  318.             document.getElementById("detail-deck").selectedIndex = 0;
  319.     }
  320.     else if (gSelectedTree == rejectsTree)
  321.     {
  322.         DeleteAllFromTree(rejectsTree, rejectsTreeView,
  323.                         parent.passcardFinalize.rejects,
  324.                         parent.passcardFinalize.deletedRejects,
  325.                         "removeSignon", "removeAllSignons");
  326.     }
  327. }
  328.  
  329. /**
  330.  * Return the autologin string as a number
  331.  **/
  332. function AutologinAsInt(str)
  333. {
  334.     var val = str;
  335.     
  336.     try
  337.     {
  338.         val = parseInt(str);
  339.     }
  340.     catch(e)
  341.     {
  342.         val = 1;
  343.     }
  344.  
  345.     // four options in autologin dropdown menulist
  346.     return (val > -1 && val < 4) ? val : 0;
  347. }
  348.  
  349. /**
  350.  * Change the userID for the selected passcard
  351.  **/
  352. function SetUserID(obj)
  353. {
  354.     var signon = GetSelectedSignon();
  355.     if (signon && obj)
  356.         signon.user = obj.value;
  357. }
  358.  
  359. /**
  360.  * Change the password for the selected passcard
  361.  **/
  362. function SetPassword(obj)
  363. {
  364.     var signon = GetSelectedSignon();
  365.     if (signon && obj)
  366.         signon.password = obj.value;
  367. }
  368.  
  369. /**
  370.  * Set the autologin preference for the selected passcard
  371.  **/
  372. function SetAutologin(obj)
  373. {
  374.     var signon = GetSelectedSignon();
  375.     if (signon && obj)
  376.         signon.autologin = obj.selectedIndex;
  377. }
  378.  
  379. /**
  380.  * Set the protection preference for the selected passcard
  381.  **/
  382. function SetProtect(obj)
  383. {
  384.     var signon = GetSelectedSignon();
  385.     if (signon && obj)
  386.     {
  387.         if (obj.checked && !IsMasterPasswordSet())
  388.         {
  389.             if (!OnChangePassword())
  390.             {
  391.                 obj.checked = !obj.checked;
  392.             }
  393.         }
  394.  
  395.         signon.protect = obj.checked ? 1 : 0;
  396.     }
  397. }
  398.  
  399. /**
  400.  * Set the currently selected passcard as the default passcard for this site
  401.  **/
  402. function SetAsDefault(obj)
  403. {
  404.     // get the current signon from the list
  405.     var signon = GetSelectedSignon();
  406.     if (signon && obj)
  407.     {
  408.         // reset lastUsed for each signon
  409.         for (var i = 0; i < gSignons.length; i++)
  410.         {
  411.             if (signon.host == gSignons[i].host)
  412.                 gSignons[i].lastUsed = 0;
  413.         }
  414.         
  415.         // set lastUsed for the current signon and disable the button
  416.         signon.lastUsed = 1;
  417.         obj.disabled = true;
  418.     }
  419. }
  420.  
  421. /**
  422.  * Get the currently selected passcard from the signon list
  423.  **/
  424. function GetSelectedSignon()
  425. {
  426.     if (gSelectedTree == signonsTree)
  427.     {
  428.         if (!gSignons)
  429.             gSignons = parent.passcardFinalize.signons;
  430.         
  431.         if (gSignons)
  432.         {
  433.             var idx = signonsTree.treeBoxObject.selection.currentIndex;
  434.             if (idx > -1 && idx < gSignons.length)
  435.                 return gSignons[idx];
  436.         }
  437.         else
  438.         {
  439.             // should never get here
  440.             alert('Could not retrieve the passcard database');
  441.         }
  442.     }
  443.     return null;
  444. }
  445.  
  446. /**
  447.  * Handle Ok event
  448.  **/
  449. function OnPasscardOK()
  450. {
  451.     var pcFinalize = parent.passcardFinalize;
  452.     if (!pcFinalize)
  453.         return;
  454.     
  455.     if (!pcFinalize.IsOpenInDialog2())
  456.     {
  457.         // save passcard preferences
  458.         pcFinalize.pcSetPreferences();
  459.     }
  460.  
  461.     if (pcFinalize.IsOpenFormFillPanel())
  462.         CommitLastSelectedSignon();
  463.  
  464.     // serialize the passcard changes
  465.     pcFinalize.Serialize();
  466. }
  467.  
  468. /**
  469.  * Enable the protect checkbox if both username and password fields are not blank
  470.  **/
  471. function EnableProtect()
  472. {
  473.     if (document.getElementById("passcard-userID-edit").value.length > 0 &&
  474.             document.getElementById("passcard-password-edit").value.length > 0)
  475.     {
  476.         document.getElementById("passcard-protect-checkbox").removeAttribute('disabled');
  477.     }
  478.     else
  479.     {
  480.         document.getElementById("passcard-protect-checkbox").setAttribute('disabled', 'true');
  481.     }
  482. }
  483.  
  484. /* TODO JVL: Remove if no longer necessary
  485. / **
  486.  * Ensure expire time is valid
  487.  ** /
  488. function OnExpireTextChange()
  489. {
  490.     document.getElementById("pcPasswordExpire").value
  491.             = IsValidExpireValue(document.getElementById("pcPasswordExpire").value);
  492. }
  493. */
  494.  
  495. /**
  496.  * Select and save the passcard tab state for the next time it is open
  497.  **/
  498. function OnSelectPasscardTab(theTabs)
  499. {
  500.     var theTab = theTabs.selectedItem;
  501.     if (!theTab)
  502.         return;
  503.  
  504.     // HACK: don't save the preference until the page has been fully initialized
  505.     //         because OnSelectPasscardTab() will be called before Startup()
  506.     if (gPrefTabSelectInit)
  507.     {
  508.         // set as the last visted tab
  509.         var prefs = GetPreferencesInterface();
  510.         if (prefs)
  511.             prefs.setCharPref(theTabs.id == kSelectedTab ? kPasscardPreferences : kPasscardDetails, theTab.id);
  512.     }
  513. }
  514.  
  515. /**
  516.  * Check if the dialog has already been initialized
  517.  **/
  518. function IsInitialized()
  519. {
  520.     var prefWindow = window.top.hPrefWindow;
  521.     if (prefWindow)
  522.     {
  523.         var pageData = prefWindow.wsm.dataManager.getPageData('chrome://mozapps/content/autofill/autofill.xul');
  524.         if (pageData && ('initialized' in pageData))
  525.             return true;
  526.     }
  527.     
  528.     if (IsOpenInDialog())
  529.         return true;
  530.         
  531.     return false;
  532. }
  533.  
  534. /**
  535.  * Check if the Default Passcard has been selected in the list
  536.  **/
  537. function IsDefaultPasscard()
  538. {
  539.     var bIsDefault = false;
  540.     if (gSelectedTree.id == kSignonsTree)
  541.     {
  542.         var signon = GetSelectedSignon();
  543.         bIsDefault = (signon && signon.host == kDefaultPasscard);
  544.     }
  545.  
  546.     return bIsDefault;
  547. }
  548.  
  549. /** MERC JVL : Removed (4/14/05)
  550.  * Set the no login passcard message
  551. function SetNoLoginPasscardMsg()
  552. {
  553.     if (IsMasterPasswordSet() || gSelectedTree.id == kRejectsTree)
  554.     {
  555.         document.getElementById('noLoginPasscardMsg').setAttribute('hidden', 'true');
  556.     }
  557.     else
  558.     {
  559.         document.getElementById('noLoginPasscardMsg').removeAttribute('hidden');
  560.     }
  561. }
  562.  **/
  563.  
  564. /**
  565.  * Prompt user to enter a Master Password if password protecting
  566.  * a Passcard and no Master Password has been set yet.
  567.  **/
  568. function CheckForMasterPassword(event)
  569. {
  570.     if (!IsMasterPasswordSet())
  571.     {
  572.         OnChangePassword();
  573.     }
  574. }
  575.  
  576. /**
  577.  * Unprotect all Passcards
  578.  **/
  579. function UnprotectAllPasscards()
  580. {
  581.     for (var i = 0; i < gSignons.length; i++)
  582.     {
  583.         gSignons[i].protect = 0;
  584.     }
  585.  
  586.     // also ensure that the currently selected passcard's protect checkbox is unchecked
  587.     document.getElementById("passcard-protect-checkbox").checked = false;
  588. }
  589.  
  590. // check if we're viewing from a dialog in the Privacy Options panel
  591. // instead of the Forms Option panel
  592. function IsOpenInDialog()
  593. {
  594.     return document.getElementById('pref-passcards') != null;
  595. }        
  596.  
  597. /**
  598.  * Fill the advanced view with the signon's advanced fields
  599.  **/
  600. function FillAdvancedFields(advancedFields)
  601. {
  602.     if (advancedFields == null)
  603.     {
  604.         document.getElementById('advancedFieldsDeck').selectedIndex = 0;
  605.         return;
  606.     }
  607.  
  608.     //dump('passcard.js: FillAdvancedFields('+advancedFields+')\n');
  609.  
  610.     // Clear the tree
  611.     var treeChildren = document.getElementById('advancedFieldsTreeChildren');
  612.     while (treeChildren.childNodes.length)
  613.     {
  614.         treeChildren.removeChild(treeChildren.childNodes[treeChildren.childNodes.length-1]);
  615.     }
  616.  
  617.     if (advancedFields.length > 0)
  618.     {
  619.         document.getElementById('advancedFieldsDeck').selectedIndex = 1;
  620.         var pairs = advancedFields.split('|');
  621.         for (var i = 0; i < pairs.length; i++)
  622.         {
  623.             var delim = pairs[i].indexOf('=');
  624.             var fieldName = pairs[i].substring(0,delim);
  625.             var value = pairs[i].substring(delim+1);
  626.             var keyCell = document.createElement('treecell');
  627.             keyCell.setAttribute('label', fieldName);
  628.             var valCell = document.createElement('treecell');
  629.             valCell.setAttribute('label', value);
  630.             var row = document.createElement('treerow');
  631.             row.appendChild(keyCell);
  632.             row.appendChild(valCell);
  633.             var item = document.createElement('treeitem');
  634.             item.appendChild(row);
  635.             treeChildren.appendChild(item);
  636.         }
  637.     }
  638.     else
  639.     {
  640.         document.getElementById('advancedFieldsDeck').selectedIndex = 0;
  641.     }
  642. }
  643.  
  644. /**
  645.  * Extract the current advanced fields to store them in the signon
  646.  **/
  647. function ExtractAdvancedFields()
  648. {
  649.     var treeChildren = document.getElementById('advancedFieldsTreeChildren');
  650.     if (treeChildren == null)
  651.         return "";
  652.  
  653.     var pairs = new Array();
  654.     for (var i = 0; i < treeChildren.childNodes.length; i++)
  655.     {
  656.         var row = treeChildren.childNodes[i].firstChild;
  657.         var fieldName = row.firstChild.getAttribute('label');
  658.         var value = row.lastChild.getAttribute('label');
  659.         pairs[pairs.length] = fieldName + '=' + value;
  660.     }
  661.     var str = pairs.join('|');
  662.     //dump('passcard.js: ExtractAdvancedFields():\n ['+str+']\n');
  663.     return str;
  664. }
  665.  
  666. function CommitLastSelectedSignon()
  667. {
  668.     if (gLastSelectedSignon)
  669.     {
  670. /* TODO JVL: an attempt to fix the bug where you make a change and select a different passcard before the change is committed
  671.         var advTree = document.getElementById("advancedFieldsTree");
  672.         var txtBox = document.getAnonymousElementByAttribute(advTree, "ileattr", "text");
  673. //        txtBox.blur();
  674. //        txtBox._assignValueToCell(txtBox.value, true);
  675. */
  676.         gLastSelectedSignon.advancedFields = ExtractAdvancedFields();
  677.         gLastSelectedSignon = null;
  678.     }
  679. }
  680.  
  681. /* TODO JVL - remove if no longer used
  682. / **
  683.  * Edit selected passcard in list
  684.  ** /
  685. function EditPasscard()
  686. {
  687.     var signon = GetSelectedSignon();
  688.     if (signon == null)
  689.         return;
  690.     
  691.     // check to see if the passcard is password protected or not
  692.     if (!CanEditPasscard(signon.protect))
  693.         return;
  694.     
  695.     passcardDump(signon);
  696.     
  697.     var newPass = new Object();
  698.     newPass.passcard = signon;
  699.     newPass.result = "";
  700.     window.openDialog("chrome://mozapps/content/autofill/EditPasscardDialog.xul",
  701.                       "_blank", "chrome,dialog,modal", newPass);
  702.                         
  703.     if (newPass.result != "" && passwordmanager != null)
  704.     {
  705.         var pm = GetPMInterface();
  706.         if (pm != null)
  707.         {
  708.             var newPasscard = newPass.passcard;
  709.             pm.updateSignon(newPasscard.host, newPasscard.uniqueID, newPasscard.passcard, newPasscard.user,
  710.                     newPasscard.password, newPasscard.autologin, newPasscard.protect);
  711.         }
  712.     }
  713. }
  714.  
  715. / **
  716.  * Check if the passcard is password protected (non-zero)
  717.  ** /
  718. function CanEditPasscard(protect)
  719. {
  720.     if (protect == 0 || !HasMasterPassword())
  721.         return true;
  722.         
  723.     var dialogTitle = GetStringLocale("masterPasswordTitle");
  724.     var dialogPrompt = GetStringLocale("masterPasswordPrompt");
  725.     var proceed = new Object();
  726.     proceed.errorMessage = "";
  727.     proceed.result = "PROMPT";
  728.     
  729.     while (proceed.result == "PROMPT")
  730.     {
  731.         window.openDialog("chrome://mozapps/content/autofill/SimplePasswordPrompt.xul",
  732.                           "_blank", "chrome,dialog,modal", dialogTitle, dialogPrompt, proceed);
  733.     }
  734.  
  735.     return proceed.result == "OK";
  736. }
  737.  
  738. / **
  739.  * Checkbox event handler
  740.  ** /
  741. function SetPasswordIfBlank(event)
  742. {
  743.     var pm = GetPMInterface();
  744.     if (pm == null)
  745.         return;
  746.         
  747.     var prefProtect = new Object();
  748.     var prefPagePassword = new Object();
  749.     pm.getPreferencePassword(prefProtect, prefPagePassword);
  750.  
  751.     if (prefPagePassword.value.length <= 0 &&
  752.             (document.getElementById("pcPasswordProtect").checked ||
  753.              document.getElementById("pcPasswordPrompt").checked))
  754.     {
  755.         OnConfirmPassword();
  756.     }
  757. }
  758.  
  759. / **
  760.  * Display confirm password dialog
  761.  ** /
  762. function OnConfirmPassword()
  763. {
  764.     var pm = GetPMInterface();
  765.     if (pm == null)
  766.         return;
  767.  
  768.     var prefProtect = new Object();    
  769.     var prefPagePassword = new Object();
  770.     pm.getPreferencePassword(prefProtect, prefPagePassword);
  771.     
  772.     var proceed = new Object();
  773.     proceed.password = prefPagePassword.value;
  774.     proceed.errorMessage = "";
  775.     proceed.result = "PROMPT";
  776.     debug ("The old password assigned is", proceed.password);
  777.             
  778.     while (proceed.result == "PROMPT")
  779.     {
  780.         window.openDialog("chrome://mozapps/content/autofill/ConfirmPassword.xul",
  781.                           "_blank", "chrome,dialog,modal", proceed);
  782.     }
  783.     
  784.     if (proceed.result == "OK")
  785.     {
  786.         debug ("The new password assigned is", proceed.password);
  787.         pm.setPreferencePassword(prefProtect, proceed.password);
  788.     }
  789.  
  790.     // uncheck the appropriate checkboxes if the user doesn't save a password
  791.     if (proceed.password.length < 1)
  792.     {
  793.         BypassCheckboxEventListener("pcPasswordProtect", false);
  794.         BypassCheckboxEventListener("pcPasswordPrompt", false);
  795.     }
  796. }
  797.  
  798. / **
  799.  * Check if user can access the passcard panel (password protected)
  800.  * Returns true if user enters a matching password
  801.  ** /
  802. function SelectPasscardPanel(currentTab)
  803. {
  804.     // sanity check
  805.     if (!currentTab || currentTab.id != "passcardtab")
  806.         return false;
  807.         
  808.     ShowPasscardManagerContents(0);
  809.     var pm = GetPMInterface();
  810.     if (pm == null)
  811.         return false;
  812.         
  813.     var prefProtect = new Object();
  814.     var prefPagePassword = new Object();
  815.     pm.getPreferencePassword(prefProtect, prefPagePassword);
  816.     
  817.     // only need to continue checking if...
  818.     // this is the first time viewing the passcard manager for this session and
  819.     // the panel is password protected and
  820.     // the password is not blank,
  821.     // otherwise just return true now
  822.     if (!parent.passcardFinalize.gbPasscardManagerEntered &&
  823.         prefProtect && parseInt(prefProtect.value) != 0 &&
  824.         prefPagePassword && prefPagePassword.value.length > 0)
  825.     {
  826.         var dialogTitle = GetStringLocale("passcardManagerTitle");
  827.         var passwordLabel = GetStringLocale("passcardManagerPrompt");
  828.         var proceed = new Object();
  829.         proceed.password = prefPagePassword.value;
  830.         proceed.errorMessage = "";
  831.         proceed.result = "PROMPT";
  832.         debug ("The old password assigned is", proceed.password);
  833.         
  834.         while (proceed.result == "PROMPT")
  835.         {
  836.             window.openDialog("chrome://mozapps/content/autofill/SimplePasswordPrompt.xul",
  837.                               "_blank", "chrome,dialog,modal", dialogTitle, passwordLabel, proceed);
  838.         }
  839.         debug ("The new password assigned is", proceed.password);
  840.         
  841.         // only reset the tab to passcard if user correctly enters password for passcard manager
  842.         if (proceed.result != "OK")
  843.             return false;
  844.     }
  845.     
  846.     ShowPasscardManagerContents(1);
  847.     parent.passcardFinalize.gbPasscardManagerEntered = true;
  848.     return true;
  849. }
  850.  
  851. / **
  852.  * Get the localized string
  853.  ** /
  854. function GetStringLocale(val)
  855. {
  856.     if (val.length > 0)
  857.     {
  858.         var bundle = document.getElementById("formfillpasscardBundle");
  859.         if (bundle)
  860.             return bundle.getString(val);
  861.     }
  862.     return "";
  863. }
  864.  
  865. / **
  866.  * Shows the Passcard Manager contents
  867.  ** /
  868. function ShowPasscardManagerContents(nVal)
  869. {
  870.     if (nVal >= 0 && nVal <= 1)
  871.         document.getElementById("passcard-deck").selectedIndex = nVal;
  872. }
  873.  
  874. / **
  875.  * Bypass the checkbox event listener so that the checkbox can change state without firing
  876.  ** /
  877. function BypassCheckboxEventListener(checkboxID, state)
  878. {
  879.     document.getElementById(checkboxID).removeEventListener(kCheckboxStateChange, SetPasswordIfBlank, false);
  880.     document.getElementById(checkboxID).checked = state;
  881.     document.getElementById(checkboxID).addEventListener(kCheckboxStateChange, SetPasswordIfBlank, false);
  882. }
  883.  
  884. / **
  885.  * Autosave checkbox event handler
  886.  ** /
  887. function DisableAutosave(event)
  888. {
  889.     DisableCheckbox(event, "pcAutosave", "pcAutosavePrompt");
  890. }
  891.  
  892. / **
  893.  * Generic checkbox event handler
  894.  ** /
  895. function DisableCheckbox(event, dependee, dependent)
  896. {
  897.     var dependentObj = document.getElementById(dependent);
  898.  
  899.     // ensure dependent checkbox is disabled appropriately
  900.     if (document.getElementById(dependee).checked)
  901.     {
  902.         dependentObj.disabled = null;
  903.     }
  904.     else
  905.     {
  906.         // ensure dependent checkbox is unchecked when disabled
  907.         dependentObj.checked = false;
  908.         dependentObj.disabled = true;
  909.     }
  910. }
  911. */
  912.  
  913. /*** Interface functions *******************************************/
  914. /**
  915.  * Get the password manager internal interface
  916.  **/
  917. function GetPMInterface()
  918. {
  919.     return Components.classes["@mozilla.org/passwordmanager;1"].getService(Components.interfaces.nsIPasswordManager);
  920. }
  921.  
  922. /**
  923.  * Get the preferences interface
  924.  **/
  925. function GetPreferencesInterface()
  926. {
  927.     return Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  928. }
  929.  
  930. /*** Helper functions **********************************************/
  931. /**
  932.  * Only allow a value between 0-999
  933.  **/
  934. /* TODO JVL: Remove
  935. function IsValidExpireValue(str)
  936. {
  937.     var val = parseInt(str);
  938.     if (!val || !(val >= 0 && val < parent.passcardFinalize.kMaxExpireMinutes))
  939.         return 0;
  940.     return val;
  941. }
  942. */
  943.  
  944. /**
  945.  * Return the string as a boolean value
  946.  **/
  947. function AsBoolean(str)
  948. {
  949.     var val = parseInt(str);
  950.     if (!val || val == 0)
  951.         return false;
  952.     return true;
  953. }
  954.  
  955. /**
  956.  * Return the string as an integer value
  957.  **/
  958. function AsInteger(str)
  959. {
  960.     if (str == null || str == "")
  961.         str = 0;
  962.  
  963.     var val = str;
  964.     
  965.     try
  966.     {
  967.         val = parseInt(str);
  968.     }
  969.     catch(e)
  970.     {
  971.         val = 0;
  972.     }
  973.  
  974.     return (val < 0) ? 0 : val;
  975. }
  976.  
  977. /*** Test and debugging functions **********************************/
  978. /**
  979.  * File specific debug messages
  980.  **/
  981. function debug(val)
  982. {
  983.     debug(val, "");
  984. }
  985.  
  986. /**
  987.  * File specific debug messages
  988.  **/
  989. function debug(fld, val)
  990. {
  991.     if (!gDebug)
  992.         return;
  993.  
  994.     var msg = "***** Passcard: " + fld;
  995.     if (val != null && val != "")
  996.         msg += ": " + val;
  997.     msg += "\n";
  998.     dump(msg);
  999. }
  1000.  
  1001. /**
  1002.  * Test function to see the passcards being saved.
  1003.  **/
  1004. function passcardDump(pass)
  1005. {
  1006.     if (!gDebug)
  1007.         return;
  1008.  
  1009.     var msg = "******************** Signons Dump BEGIN\n";
  1010.     msg += "Host: " + pass.host + "\n";
  1011.     msg += "Passcard: " + pass.passcard + "\n";
  1012.     msg += "User: " + pass.user + "\n";
  1013.     msg += "Password: " + pass.password + "\n";
  1014.     msg += "AutoLogin: " + pass.autologin + "\n";
  1015.     msg += "Protect: " + pass.protect + "\n";
  1016.     msg += "LastUsed: " + pass.lastUsed + "\n";
  1017.     msg += "UniqueID: " + pass.uniqueID + "\n";
  1018.     msg += "******************** Signons Dump END\n";
  1019.     dump(msg);
  1020. }
  1021.  
  1022. /**
  1023.  * Test function to see the preferences being saved.
  1024.  **/
  1025. function prefDump(prefAutologin, prefAutologinPrompt, prefAutosave, prefAutosavePrompt, prefHighlight,
  1026.             prefFillAndSubmit, prefDefaultPrompt, prefUserID, prefPassword, prefProtect, prefPrompt, prefExpire)
  1027. {
  1028.     if (!gDebug)
  1029.         return;
  1030.  
  1031.     var msg = "******************** Preferences Dump BEGIN\n";
  1032.     msg += "Auto login: " + prefAutologin.value + "\n";
  1033.     msg += "Auto login prompt: " + prefAutologinPrompt.value + "\n";
  1034.     msg += "Auto save: " + prefAutosave.value + "\n";
  1035.     msg += "Auto save prompt: " + prefAutosavePrompt.value + "\n";
  1036.     msg += "Highlight: " + prefHighlight.value + "\n";
  1037.     msg += "Fill and Submit: " + prefFillAndSubmit.value + "\n";
  1038.     msg += "Default Prompt: " + prefDefaultPrompt.value + "\n";
  1039.     msg += "UserID: " + prefUserID.value + "\n";
  1040.     msg += "Password: " + prefPassword.value + "\n";
  1041.     msg += "Password protect: " + prefProtect.value + "\n";
  1042.     msg += "Password prompt: " + prefPrompt.value + "\n";
  1043.     msg += "Password expire: " + prefExpire.value + "\n";
  1044.     msg += "******************** Preferences Dump END\n";
  1045.     dump(msg);
  1046. }
  1047.  
  1048. /**
  1049.  * Test function to see the passcards being saved.
  1050.  **/
  1051. function pcDump(view, val)
  1052. {
  1053.     if (!gDebug)
  1054.         return;
  1055.  
  1056.     if (val != "")
  1057.         alert(val);
  1058.         
  1059.     for (i = 0; i < passcards.length; i++)
  1060.     {
  1061.         var msg = view.getCellText(i, "passcardCol");
  1062.         msg += "\n";
  1063.         msg += view.getCellText(i, "siteCol");
  1064.         msg += "\n";
  1065.         msg += view.getCellText(i, "userCol");
  1066.         alert(msg);
  1067.     }
  1068. }
  1069.  
  1070. /* TODO JVL - TEST CODE - REMOVE WHEN PASSCARD DEVELOPMENT FINISHED */
  1071. // viewSignons is copied from pref-privacy.js
  1072. function viewSignons() 
  1073. {
  1074.     window.openDialog("chrome://passwordmgr/content/passwordManager.xul",
  1075.                       "_blank", "chrome,resizable=yes", "8");
  1076. }
  1077.  
  1078. // This class is referenced (at a higher level) in pref.xul so that
  1079. // we don't go out of scope when the user clicks the OK button
  1080. if (!parent.passcardFinalize) parent.passcardFinalize =
  1081. {
  1082.     kPageTag : "chrome://mozapps/content/autofill/autofill.xul",
  1083.     kMaxExpireMinutes : 1000,
  1084.     gbPasscardManagerEntered : false,
  1085.     signons : new Array(),
  1086.     rejects : new Array(),
  1087.     deletedSignons : new Array(),
  1088.     deletedRejects : new Array(),
  1089.  
  1090.     
  1091.     /**
  1092.      * Serialize the passcard changes
  1093.      **/
  1094.     Serialize : function()
  1095.     {
  1096.         var pm = this.GetInterface();
  1097.         if (pm)
  1098.         {
  1099.             // save the changes made to the signons
  1100.             var changes = this.signons;
  1101.             for (var i = 0; i < changes.length; i++)
  1102.             {
  1103.                 pm.updateSignon(changes[i].host, changes[i].passcard, changes[i].user,
  1104.                                 changes[i].password, changes[i].autologin, changes[i].protect,
  1105.                                 changes[i].lastUsed, changes[i].uniqueID, changes[i].advancedFields);
  1106.             }
  1107.  
  1108.             // permanently remove the deleted signons
  1109.             var pass = this.deletedSignons;
  1110.             for (var s = 0; s < pass.length; s++)
  1111.                 pm.removeUser(pass[s].host, pass[s].rawuser);
  1112.  
  1113.             pass.length = 0;
  1114.  
  1115.             // permanently remove the deleted rejects
  1116.             var sites = this.deletedRejects;
  1117.             for (var r = 0; r < sites.length; r++)
  1118.                 pm.removeReject(sites[r].host);
  1119.  
  1120.             sites.length = 0;
  1121.         }
  1122.     },
  1123.  
  1124.     // copy from IsOpenInDialog() defined above
  1125.     IsOpenInDialog2 : function()
  1126.     {
  1127.         return document.getElementById('pref-passcards') != null;
  1128.     },
  1129.     
  1130.     // check if we're viewing from the Form Fill Option panel
  1131.     IsOpenFormFillPanel : function()
  1132.     {
  1133.         return document.getElementById('autofillManager') != null;
  1134.     },
  1135.  
  1136.     /**
  1137.      * Set the passcard (general) preferences
  1138.      **/
  1139.     pcSetPreferences : function()
  1140.     {
  1141.         var pm = this.GetInterface();
  1142.         if (pm == null)
  1143.             return;
  1144.         
  1145.         dump("***** Passcard: SetPreferences()\n");
  1146.         var prefAutologin = this.MenuAsString("pcAutologin");
  1147.         var prefAutologinPrompt = "0";
  1148.         var prefAutosave = this.MenuAsString("pcAutosave");
  1149.         var prefAutosavePrompt = "0";
  1150.         var prefHighlight = this.CheckedAsString("pcHighlight");
  1151.         var prefFillAndSubmit = this.CheckedAsString("pcFillAndSubmit");
  1152.         var prefDefaultPrompt = this.CheckedAsString("pcDefaultPrompt");
  1153.         var prefUserID = "";        //this.ValueAsString("pcUserID");
  1154.         var prefPassword = "";    //this.ValueAsString("pcPassword");
  1155.         var prefProtect = this.CheckedAsString("pcPasswordProtect");
  1156.         var prefPrompt = "";        //this.CheckedAsString("pcPasswordPrompt");
  1157.         var prefExpire = 0;            //parseInt(this.ValueAsString("pcPasswordExpire"));
  1158.         /* TODO JVL: Remove if no longer necessary
  1159.         if (!prefExpire || !(prefExpire >= 0 && prefExpire < this.kMaxExpireMinutes))
  1160.             prefExpire = 0;
  1161.         */
  1162.  
  1163.         pm.setPreferences(prefAutologin, prefAutologinPrompt, prefAutosave, prefAutosavePrompt, prefHighlight, prefFillAndSubmit,
  1164.                 prefDefaultPrompt, prefUserID, prefPassword, prefProtect, prefPrompt, prefExpire);
  1165.     },
  1166.     
  1167.     /**
  1168.      * Get the password manager internal interface
  1169.      **/
  1170.     GetInterface : function()
  1171.     {
  1172.         return Components.classes["@mozilla.org/passwordmanager;1"].getService(Components.interfaces.nsIPasswordManager);
  1173.     },
  1174.  
  1175.     /**
  1176.      * Return the boolean as a string value ("1" or "0")
  1177.      **/
  1178.     CheckedAsString : function(str)
  1179.     {
  1180.         var thePage = document.getElementById("autofilltabbox");
  1181.         if (thePage)
  1182.         {
  1183.             return document.getElementById(str).checked ? "1" : "0";
  1184.         }
  1185.         else
  1186.         {
  1187.             dump("***** Passcard: Retrieving from WSM Data Manager\n");
  1188.             var pageData = parent.wsm.dataManager.getPageData(this.kPageTag);
  1189.             if (pageData && "initialized" in pageData && pageData.initialized && "elementIDs" in pageData)
  1190.             {
  1191.                 var itemObject = pageData.elementIDs[str];
  1192.                 if (itemObject)
  1193.                     return itemObject.checked ? "1" : "0";
  1194.             }
  1195.             return "0";
  1196.         }
  1197.     },
  1198.         
  1199.     /**
  1200.      * Return the Value as a string value
  1201.      **/
  1202.     ValueAsString : function(str)
  1203.     {
  1204.         var thePage = document.getElementById("autofilltabbox");
  1205.         if (thePage)
  1206.         {
  1207.             return document.getElementById(str).value;
  1208.         }
  1209.         else
  1210.         {
  1211.             dump("***** Passcard: Retrieving from WSM Data Manager\n");
  1212.             var pageData = parent.wsm.dataManager.getPageData(this.kPageTag);
  1213.             if (pageData && "initialized" in pageData && pageData.initialized && "elementIDs" in pageData)
  1214.             {
  1215.                 var itemObject = pageData.elementIDs[str];
  1216.                 if (itemObject)
  1217.                     return itemObject.value;
  1218.             }
  1219.             return "";
  1220.         }
  1221.     },
  1222.         
  1223.     /**
  1224.      * Return the menu as a string value
  1225.      **/
  1226.     MenuAsString : function(str)
  1227.     {
  1228.         var thePage = document.getElementById("autofilltabbox");
  1229.         if (thePage)
  1230.         {
  1231.             return document.getElementById(str).selectedIndex;
  1232.         }
  1233.         else
  1234.         {
  1235.             dump("***** Passcard: Retrieving from WSM Data Manager\n");
  1236.             var pageData = parent.wsm.dataManager.getPageData(this.kPageTag);
  1237.             if (pageData && "initialized" in pageData && pageData.initialized && "elementIDs" in pageData)
  1238.             {
  1239.                 var itemObject = pageData.elementIDs[str];
  1240.                 if (itemObject)
  1241.                     return itemObject.selectedIndex;
  1242.             }
  1243.             return "0";
  1244.         }
  1245.     }
  1246. }
  1247.