home *** CD-ROM | disk | FTP | other *** search
/ Clickx 65 / Clickx 65.iso / software / internet / xmarks / xmarks-3.1.1.xpi / chrome / content / foxmarks-dialog.js < prev    next >
Encoding:
JavaScript  |  2009-05-05  |  29.9 KB  |  760 lines

  1. /*
  2.  Copyright 2005-2009 Foxmarks Inc.
  3.  
  4.  foxmarks-dialog.js: Implements the main foxmarks options dialog.
  5.  
  6.  */
  7.  
  8. // TO DO:
  9. // * Use synchronize method for preferences
  10.  
  11. var dialogMgr = {
  12.     panes: {
  13.         // Status Tab
  14.         status: {
  15.             onSetup: function(mgr){
  16.                 var os = Cc["@mozilla.org/observer-service;1"].
  17.                     getService(Ci.nsIObserverService);
  18.                 os.addObserver(this, "foxmarks-service", false);
  19.                 os.addObserver(this, "foxmarks-statechange", false);
  20.                 this.doc = document;
  21.                 this.window = window;
  22.                 this.updateStatus();
  23.  
  24.                 if (!gSettings.haveSynced && !gSettings.username) {
  25.                     var uo = document.getElementById("useown").checked;
  26.                     document.getElementById("foxmarks-statusdeck").selectedIndex = uo ? 0 :1;
  27.                 }
  28.             },
  29.             onUnload: function(){
  30.                 var os = Cc["@mozilla.org/observer-service;1"].
  31.                     getService(Ci.nsIObserverService);
  32.                 try {
  33.                     os.removeObserver(this, "foxmarks-service");
  34.                     os.removeObserver(this, "foxmarks-statechange");
  35.                 } catch (e) {
  36.                     LogWrite("Warning: removeObserver failed.");
  37.                 }
  38.             },
  39.             onOK: function(){},
  40.             onCancel: function(){},
  41.             setErrorMessaging: function(addThem,err){
  42.                 if(addThem){
  43.                     var box = this.doc.getElementById('errorbox');
  44.                     if(box){
  45.                         box.parentNode.removeChild(box);
  46.                     }
  47.                     box = this.doc.createElement('groupbox');
  48.                     box.setAttribute('width', '50');
  49.                     box.setAttribute('style', 'padding-left: 42px;');
  50.                     
  51.                     var label = this.doc.createElement('label');
  52.                     label.setAttribute('value',
  53.                         MapError(err) +"\n"
  54.                     );
  55.                     label.setAttribute('style',
  56.                         'font-weight: bold; margin-left: -2px;'
  57.  
  58.                     );
  59.                     box.appendChild(label);
  60.                     var errMessage = MapErrorMessage(err);
  61.                     var errUrl = MapErrorUrl(err);
  62.                     if(errMessage.length > 0){
  63.                         var desc = this.doc.createElement('description');
  64.                         var textNode = this.doc.createTextNode(
  65.                             MapErrorMessage(err)
  66.                         );
  67.                         desc.appendChild(textNode);
  68.                         box.appendChild(desc);
  69.                     }
  70.  
  71.                     
  72.                     if(errUrl.length > 0){
  73.                         var box2 = this.doc.createElement('vbox');
  74.                         box2.setAttribute('flex', '1');
  75.                         box2.setAttribute('align', 'end');
  76.  
  77.                         var button = this.doc.createElement('button');
  78.                         button.setAttribute('label',
  79.                         Bundle().GetStringFromName("dialog.status.button")
  80.                         );
  81.                         button.setAttribute('oncommand', 
  82.                             'dialogMgr.panes.status.moreInfo("' + errUrl + '");'
  83.                         );
  84.                         box2.appendChild(button);
  85.                         box.appendChild(box2);
  86.                     }
  87.                     box.setAttribute('id', 'errorbox');
  88.                     this.doc.getElementById('statusbox').appendChild(box);
  89.                    // this.window.sizeToContent();
  90.                 } else {
  91.                     var box = this.doc.getElementById('errorbox');
  92.                     if(box){
  93.                         box.parentNode.removeChild(box);
  94.                     }
  95.                     // this.window.sizeToContent();
  96.                 }
  97.             },
  98.  
  99.             observe: function(subject, topic, data) {
  100.                 if(topic == "foxmarks-service"){
  101.                     var result = eval(data);
  102.                     switch(result.status){
  103.                         case 1:
  104.                         case 3:
  105.                             this.updateStatus('working');
  106.                             break;
  107.                         case 0:
  108.                             this.updateStatus('ready');
  109.                             break;
  110.                         case 2:
  111.                             this.updateStatus('dirty');
  112.                             break;
  113.                         default:
  114.                             this.updateStatus('error', result.status);
  115.                             break;
  116.                     }
  117.                } else if(topic == "foxmarks-statechange"){
  118.                     switch(data){
  119.                         case 'ready':
  120.                         case 'dirty':
  121.                         case 'working':
  122.                         case 'error':
  123.                             this.updateStatus(data);
  124.                             break;
  125.                     }
  126.                }
  127.             },
  128.             moreInfo: function(err){
  129.                 FoxmarksOpenInNewWindow(err);
  130.             },
  131.             updateStatus: function(state, errorStatus){
  132.                 if(state === undefined){
  133.                     var foxmarks = Cc["@foxcloud.com/extensions/foxmarks;1"]
  134.                         .getService(Ci.nsIFoxmarksService);
  135.                     state = foxmarks.getState();
  136.                 }
  137.                 var image = this.doc.getElementById('status-image');
  138.                 var text = this.doc.getElementById('status-text');
  139.                 if(errorStatus === undefined){
  140.                     errorStatus = gSettings.lastError;
  141.                 }
  142.                 switch(state){
  143.                     case 'ready':
  144.                         this.setErrorMessaging(false);
  145.                         image.setAttribute('src',
  146.                             "chrome://foxmarks/skin/images/status-good.png");
  147.                         text.setAttribute('value',
  148.                             Bundle().GetStringFromName("dialog.status.good")
  149.                             );
  150.                         break;
  151.                     case 'dirty':
  152.                         this.setErrorMessaging(false);
  153.                         image.setAttribute('src',
  154.                             "chrome://foxmarks/skin/images/status-dirty.png");
  155.                         text.setAttribute('value',
  156.                             Bundle().GetStringFromName("dialog.status.dirty")
  157.                             );
  158.                         break;
  159.                     case 'working':
  160.                         this.setErrorMessaging(false);
  161.                         image.setAttribute('src',
  162.                             "chrome://foxmarks/skin/images/wheel36x28.gif");
  163.                         text.setAttribute('value',
  164.                             Bundle().GetStringFromName("dialog.status.working")
  165.                             );
  166.                         break;
  167.                     case 'error':
  168.                         image.setAttribute('src',
  169.                             "chrome://foxmarks/skin/images/status-bad.png");
  170.                         text.setAttribute('value',
  171.                             Bundle().GetStringFromName("dialog.status.bad")
  172.                             );
  173.                         this.setErrorMessaging(true, errorStatus);
  174.                         break;
  175.                 }
  176.             }
  177.         },
  178.         // General Tab
  179.         general: { 
  180.            onSetup: function(mgr){
  181.                 this.data = {
  182.                     username: gSettings.username,
  183.                     password: gSettings.passwordNoPrompt,
  184.                     rememberPassword: gSettings.rememberPassword,
  185.                     synchOnTimer: gSettings.synchOnTimer,
  186.                     syncOnShutdown: gSettings.syncOnShutdown,
  187.                     syncOnShutdownAsk: gSettings.syncOnShutdownAsk,
  188.                 };
  189.                 // Settings that are too complex to handle via prefwindow
  190.                 document.getElementById("password").value =
  191.                     gSettings.passwordNoPrompt;
  192.                 document.getElementById("synconshutdown").checked =
  193.                     gSettings.syncOnShutdown;
  194.                 document.getElementById("askfirst").checked =
  195.                     gSettings.syncOnShutdownAsk;
  196.                 this.syncOnShutdownChanged();
  197.            },
  198.            resetNameAndPassword: function(){
  199.                 document.getElementById("username").value =
  200.                     gSettings.username;
  201.                 document.getElementById("password").value =
  202.                     gSettings.passwordNoPrompt;
  203.  
  204.            },
  205.            onOK: function(){
  206.                 gSettings.username = 
  207.                     document.getElementById("username").value;
  208.            },
  209.  
  210.            onCancel: function(){
  211.                 var name;
  212.                 for(name in this.data){
  213.                     if(this.data.hasOwnProperty(name)){
  214.                         gSettings[name] = this.data[name];
  215.                     }
  216.                 }
  217.            },
  218.            forgotPassword: function(){
  219.                 FoxmarksOpenInNewWindow("http://" + gSettings.acctMgrHost + 
  220.                         "/login/forgot_password");
  221.            },
  222.            syncOnShutdownChanged: function() {
  223.                 document.getElementById("askfirst").disabled =
  224.                     !document.getElementById("synconshutdown").checked;
  225.            },
  226.            syncOnShutdownToPreference: function() {
  227.                 if (document.getElementById("synconshutdown").checked) {
  228.                     return 1;
  229.                 }
  230.                 return 0;
  231.            }
  232.         },
  233.         sync: { // sync tab
  234.            onSetup: function(mgr){
  235.             this.mgr = mgr;
  236.  
  237.             this.resetSyncTypes();
  238.            },
  239.            
  240.            resetSyncTypes: function(){
  241.             this.data = {
  242.                bookmarks: gSettings.isSyncEnabled("bookmarks"),
  243.                passwords: gSettings.isSyncEnabled("passwords")
  244.             };
  245.             // Settings for passwords
  246.             var passwordSyncEnabled = gSettings.isSyncEnabled("passwords");
  247.  
  248.             document.getElementById("sync-passwords").checked =
  249.                 passwordSyncEnabled;
  250.             document.getElementById("sync-resetpin").disabled =
  251.                 !passwordSyncEnabled; 
  252.             document.getElementById("sync-deletepasswords").disabled =
  253.                 !passwordSyncEnabled;
  254.             if(gSettings.useOwnServer){
  255.                 document.getElementById("sync-deletepasswords").disabled = true;
  256.             }
  257.                 
  258.             document.getElementById("sync-bookmarks").checked =
  259.                 gSettings.isSyncEnabled("bookmarks");
  260.  
  261.             if ("@mozilla.org/login-manager;1" in Cc) {
  262.                 document.getElementById("onlyFF3").hidden = true;
  263.             }
  264.             else {
  265.                 document.getElementById("sync-resetpin").disabled = true;
  266.                 document.getElementById("sync-deletepasswords").disabled = true;
  267.                 document.getElementById("sync-passwords").disabled = true;
  268.             }
  269.  
  270.            },
  271.            onOK: function(){
  272.  
  273.            },
  274.            onCancel: function(){
  275.                 gSettings.setSyncEnabled("passwords",this.data.passwords); 
  276.                 gSettings.setSyncEnabled("bookmarks",this.data.bookmarks); 
  277.            },
  278.            handlePasswordSync: function(){
  279.                 var d = document;
  280.                 var passwordSyncEnabled =
  281.                     d.getElementById("sync-passwords").checked; 
  282.                 var result = {
  283.                     doSync: false
  284.                 };
  285.                 if(passwordSyncEnabled){
  286.                         window.openDialog(
  287.                             "chrome://foxmarks/content/foxmarks-setup.xul",
  288.                             "Xmarks", "chrome,dialog,modal,centerscreen",
  289.                             true,
  290.                             "askforPIN",
  291.                             result
  292.                         );
  293.                         passwordSyncEnabled = gSettings.pinNoPrompt != null;
  294.                         if(!passwordSyncEnabled){
  295.                             d.getElementById("sync-passwords").checked = false; 
  296.                         }
  297.                         if(result.doSync){
  298.                             gSettings.setSyncEnabled("passwords",
  299.                                 passwordSyncEnabled);
  300.                             if(gSettings.securityLevel == -1){
  301.                                 FoxmarksAlert(Bundle().GetStringFromName
  302.                                     ("msg.resetpin.securitylevelchange"));
  303.                             }
  304.                             gSettings.securityLevel = 1;
  305.                             d.getElementById("encrypt").setAttribute(
  306.                                 "value", "1");
  307.                             if(this.mgr.synchronizeNow()){
  308.                                 var prefwindow = 
  309.                                     document.getElementById("foxmarks-settings");
  310.                                 prefwindow.showPane(
  311.                                     document.getElementById("foxmarks-mainpane")
  312.                                 );
  313.                             }
  314.                         }
  315.                 }
  316.                 else if(!passwordSyncEnabled){
  317.                     gSettings.removePIN();
  318.                 }
  319.  
  320.                 gSettings.setSyncEnabled("passwords",passwordSyncEnabled); 
  321.                 d.getElementById("sync-deletepasswords").disabled =
  322.                     !passwordSyncEnabled; 
  323.                 d.getElementById("sync-resetpin").disabled =
  324.                     !passwordSyncEnabled; 
  325.            },
  326.            handleBookmarkSync: function(){
  327.                 var d = document;
  328.                 var enabled =d.getElementById("sync-bookmarks").checked; 
  329.  
  330.                 gSettings.setSyncEnabled("bookmarks",enabled); 
  331.            },
  332.            doDeletePasswords: function(){
  333.                 var ps = Components.classes
  334.                     ["@mozilla.org/embedcomp/prompt-service;1"]
  335.                     .getService(Components.interfaces.nsIPromptService);
  336.                if(ps.confirm(null,"Xmarks", Bundle().
  337.                     GetStringFromName("msg.deletepasswords.confirm"))
  338.                ){
  339.                     this.mgr.onOK();
  340.                     if(!PerformAction("deletepasswords", null)){
  341.                         gSettings.setSyncEnabled("passwords", false);
  342.                         document.getElementById("sync-passwords").checked = 
  343.                             false; 
  344.                         document.getElementById("sync-resetpin").disabled =
  345.                             true;
  346.                         document.getElementById("sync-deletepasswords").
  347.                             disabled = true;
  348.                         gSettings.removePIN();
  349.                         ps.alert(null, "Xmarks", Bundle().
  350.                                 GetStringFromName("msg.deletepasswords.success")
  351.                         );
  352.                     }
  353.                     else {
  354.                         var prefwindow = 
  355.                             document.getElementById("foxmarks-settings");
  356.                         prefwindow.showPane(
  357.                                 document.getElementById("foxmarks-mainpane")
  358.                         );
  359.                     }
  360.                }
  361.  
  362.            },
  363.            doResetPIN: function(){
  364.                 var result = {
  365.                     doSync: false
  366.                 };
  367.                 window.openDialog(
  368.                     "chrome://foxmarks/content/foxmarks-resetpin.xul",
  369.                     "_blank",
  370.                     "chrome,dialog,modal,centerscreen", result);
  371.                 if(result.doSync){
  372.                     gSettings.setSyncEnabled("passwords",true); 
  373.                    gSettings.setMustUpload("passwords", true);
  374.                    if(!this.mgr.synchronizeNow()){
  375.                         FoxmarksAlert(Bundle().
  376.                             GetStringFromName("msg.resetpin.success"));
  377.                    }
  378.                     else {
  379.                         var prefwindow = 
  380.                             document.getElementById("foxmarks-settings");
  381.                         prefwindow.showPane(
  382.                                 document.getElementById("foxmarks-mainpane")
  383.                         );
  384.                     }
  385.                 }
  386.             },
  387.             moreSyncSoon: function(){
  388.                 FoxmarksOpenInNewWindow("http://wiki.xmarks.com/wiki/Foxmarks:_More_Syncing_Coming_Soon"); 
  389.             }
  390.         },
  391.         profile: { // profiles tab
  392.            onSetup: function(mgr){
  393.                 this.mgr = mgr;
  394.                 this.settingChanged();
  395.            },
  396.            onOK: function(){
  397.  
  398.            },
  399.  
  400.            onCancel: function(){
  401.  
  402.            },
  403.            myFoxmarks: function(){
  404.                 if(gSettings.securityLevel == 1){
  405.                     FoxmarksOpenInNewTab("https://my.xmarks.com/?mode=profiles", true);
  406.                 } else { 
  407.                     FoxmarksOpenInNewTab("http://my.xmarks.com/?mode=profiles", true);
  408.                 }
  409.            },
  410.            changeProfile: function() {
  411.                 var retval = {};
  412.                 window.openDialog(
  413.                     "chrome://foxmarks/content/foxmarks-changeprofile.xul",
  414.                     "Xmarks", "modal,centerscreen", retval
  415.                 );
  416.  
  417.                 if (retval.newProfileId &&
  418.                     retval.newProfileId != gSettings.viewId) {
  419.                     var ps = Components.
  420.                         classes["@mozilla.org/embedcomp/prompt-service;1"]
  421.                         .getService(Components.interfaces.nsIPromptService);
  422.                     if (ps.confirm(null, "Xmarks",
  423.                         Bundle().GetStringFromName("msg.profilechanged"))) {
  424.                         if (this.mgr.synchronizeNow()) {
  425.                             var prefwindow = 
  426.                                 document.getElementById("foxmarks-settings");
  427.                             prefwindow.showPane(
  428.                                 document.getElementById("foxmarks-mainpane")
  429.                             );
  430.                             return;
  431.                         }
  432.                         gSettings.viewId = retval.newProfileId;
  433.                         gSettings.viewName = retval.newProfileName;
  434.                         this.mgr.downloadNow(true);
  435.                         this.settingChanged();
  436.                     }
  437.                 }
  438.             },
  439.             settingChanged: function() {
  440.                 document.getElementById("profileName").value =
  441.                     gSettings.viewName;
  442.             }
  443.         },
  444.         // Advanced tab
  445.         discover: { 
  446.            onSearchBoostChanged: function(){
  447.                 var sb = document.getElementById("searchboost").checked;
  448.                 document.getElementById("serp.all").disabled = !sb;
  449.                 document.getElementById("serp.top3").disabled = !sb;
  450.                 this.onOK();
  451.            },
  452.            onSetup: function(mgr){
  453.                 document.getElementById("tagsuggest").checked =
  454.                     gSettings.tagSuggestionsEnabled;
  455.                 document.getElementById("siteboost").checked =
  456.                     gSettings.simsiteEnabled;
  457.                 document.getElementById("serp.countgroup").selectedIndex =
  458.                     gSettings.serpMaxItems != 3 ? 1 : 0;
  459.                 if(gSettings.serpEnabled){
  460.                     document.getElementById("searchboost").checked = true;
  461.                 } else {
  462.                     document.getElementById("searchboost").checked = false;
  463.                     document.getElementById("serp.all").disabled = true;
  464.                     document.getElementById("serp.top3").disabled = true;
  465.                 }
  466.                 this.data = {
  467.                     tagSuggestionsEnabled: gSettings.tagSuggestionsEnabled,
  468.                     serpEnabled: gSettings.serpEnabled,
  469.                     simsiteEnabled: gSettings.simsiteEnabled,
  470.                     serpMaxItems: gSettings.serpMaxItems
  471.                 };
  472.            },
  473.            onOK: function(){
  474.                 gSettings.tagSuggestionsEnabled = 
  475.                     document.getElementById("tagsuggest").checked;
  476.                 if(document.getElementById("searchboost").checked){
  477.                     gSettings.serpEnabled = true;
  478.                     gSettings.serpMaxItems = 
  479.                         document.getElementById("serp.top3").selected ?
  480.                         3 : 10;
  481.                 } else {
  482.                     gSettings.serpEnabled = false;
  483.                 }
  484.                 gSettings.simsiteEnabled = 
  485.                     document.getElementById("siteboost").checked;
  486.                 gSettings.tagSuggestionsEnabled = 
  487.                     document.getElementById("tagsuggest").checked;
  488.            },
  489.            onCancel: function(){
  490.                 var name;
  491.                 for(name in this.data){
  492.                     if(this.data.hasOwnProperty(name)){
  493.                         gSettings[name] = this.data[name];
  494.                     }
  495.                 }
  496.            }
  497.         },
  498.         // Advanced tab
  499.         advanced: { 
  500.            onSetup: function(mgr){
  501.                 this.data = {
  502.                     enableLogging: gSettings.enableLogging,
  503.                     securityLevel: gSettings.securityLevel,
  504.                     url: gSettings.url,
  505.                     passwordurl: gSettings.passwordurl
  506.                 };
  507.                 this.useOwnServerChanged();
  508.            },
  509.            verifyOK: function(){
  510.                 var uo = document.getElementById("useown").checked;
  511.  
  512.                 if(uo){
  513.                     var s = document.getElementById("url").value;
  514.                     if(s.length == 0){
  515.                         FoxmarksAlert(Bundle().
  516.                             GetStringFromName("error.nourlownserver"));
  517.                         return false;
  518.                     }
  519.                     var exp = /(.*):\/\/([^\/]*)/;
  520.                     var result = s.match(exp);
  521.                     if (!result || result.length < 2) {
  522.                         FoxmarksAlert(Bundle().
  523.                             GetStringFromName("error.nourlownserver"));
  524.                         return false;
  525.                     }
  526.                     gSettings.useOwnServer = uo;
  527.                 }
  528.  
  529.                 return true;
  530.            },
  531.            onOK: function(){
  532.                 var uo = document.getElementById("useown").checked;
  533.                 gSettings.useOwnServer = uo;
  534.                 if(uo){
  535.                     gSettings.url = document.getElementById("url").value;
  536.                     gSettings.passwordurl =
  537.                         document.getElementById("passwordurl").value;
  538.                 }
  539.            },
  540.            onCancel: function(){
  541.                 var name;
  542.                 for(name in this.data){
  543.                     if(this.data.hasOwnProperty(name)){
  544.                         gSettings[name] = this.data[name];
  545.                     }
  546.                 }
  547.            },
  548.            displayLogFile: function() {
  549.                 var ios = Cc["@mozilla.org/network/io-service;1"].
  550.                     getService(Ci.nsIIOService);
  551.                 var file = Cc['@mozilla.org/file/directory_service;1']
  552.                     .getService(Ci.nsIProperties) .get('ProfD', Ci.nsIFile);
  553.  
  554.                 file.append("xmarks.log");
  555.                 var uri = ios.newFileURI(file);
  556.                 FoxmarksOpenInNewWindow(uri.spec);
  557.            },
  558.           useOwnServerChanged: function() {
  559.                 var uo = document.getElementById("useown").checked;
  560.                 document.getElementById("url").disabled = !uo;
  561.                 document.getElementById("useown-url-label").disabled = !uo;
  562.                 document.getElementById("passwordurl").disabled = !uo;
  563.                 document.getElementById("useown-passwordurl-label").disabled =
  564.                     !uo;
  565.                 document.getElementById("encrypt").disabled = uo;
  566.                 document.getElementById("profileChangeButton").disabled = uo;
  567.                 if (!gSettings.haveSynced && !gSettings.username) {
  568.                     document.getElementById("foxmarks-statusdeck")
  569.                         .selectedIndex = uo ? 0 :1;
  570.                 }
  571.             },
  572.            useOwnServer: function(){
  573.                 var uo = document.getElementById("useown").checked;
  574.                 if(!uo){
  575.                     return true;
  576.                 }
  577.                     
  578.                 var params = {
  579.                     url: document.getElementById("url").value,
  580.                     purl: document.getElementById("passwordurl").value,
  581.                     psync: document.getElementById("sync-passwords").checked,
  582.                     result: false
  583.                 };
  584.                 window.openDialog(
  585.                     "chrome://foxmarks/content/foxmarks-ownserverdlg.xul",
  586.                     "_blank",
  587.                     "chrome,dialog,modal,centerscreen", params);
  588.                 if(params.result){
  589.                     document.getElementById("url").value = params.url;
  590.                     document.getElementById("passwordurl").value = params.purl;
  591.                 } else {
  592.                     document.getElementById("useown").checked = false;
  593.                 }
  594.                 this.useOwnServerChanged();
  595.                 return true;
  596.            },
  597.            moreOwnServer: function(){
  598.                 FoxmarksOpenInNewWindow("http://wiki.xmarks.com/wiki/Foxmarks:_Frequently_Asked_Questions#Using_Other_Servers"); 
  599.            }
  600.         }
  601.     },
  602.  
  603.     _forEachPane: function(method, args){
  604.         var name;
  605.         for(name in this.panes){
  606.             if(this.panes.hasOwnProperty(name)){
  607.                 var pane = this.panes[name];
  608.                 if(typeof(method) == "string"){
  609.                     pane[method].apply(pane, args);
  610.                 }
  611.                 else {
  612.                     if(args === undefined){
  613.                         args = [];
  614.  
  615.                     }
  616.                     args.splice(0,0,this.panes[name]);
  617.                     method.apply(pane, args);
  618.                 }
  619.             }
  620.         }
  621.     },
  622.  
  623.     onSetup: function(){
  624.         this._forEachPane("onSetup", [this]);
  625.  
  626.         // Set styles for Mac OS X
  627.         if (navigator.platform.toLowerCase().indexOf('mac') > -1 ||
  628.             navigator.platform.toLowerCase().indexOf('linux') > -1) {
  629.             document.getElementById("foxmarks-settings").className = "macosx";
  630.         }
  631.         // Set server ping
  632.         if (!gSettings.useOwnServer) {
  633.             var attrs = [];
  634.             attrs.push("app="       + "jezebel");
  635.             attrs.push("mid="       + gSettings.machineId);
  636.             attrs.push("page="      + "settings");
  637.             attrs.push("username="  + gSettings.username);
  638.             attrs.push("no_cache="  + Date.now().toString(36));
  639.             var query = attrs.join("&");
  640.  
  641.             document.getElementById("ping").src = 
  642.                 "http://tr.xmarks.com/tracking/impressions.gif?" + query; 
  643.         }
  644.  
  645.         // Info that is read-only
  646.         this._lastSyncDateChanged();
  647.         document.getElementById("version").value = 
  648.             "v"
  649.             + FoxmarksVersion();
  650.         try {
  651.             window.sizeToContent();
  652.         } catch(e) {}
  653.  
  654.         var prefwindow = document.getElementById("foxmarks-settings");
  655.         prefwindow.showPane(
  656.             document.getElementById(window.arguments[0] || "foxmarks-mainpane")
  657.         );
  658.  
  659.     },
  660.     onOK: function(){
  661.         if(!this.panes.advanced.verifyOK()){
  662.            return false;
  663.         }
  664.         this._forEachPane("onOK");
  665.         gSettings.password = 
  666.             document.getElementById("password").value;
  667.         return true;
  668.     },
  669.     onCancel: function(){
  670.         if (navigator.platform.toLowerCase().indexOf('mac') > -1 ||
  671.             navigator.platform.toLowerCase().indexOf('linux') > -1) {
  672.             if(!this.panes.advanced.verifyOK()){
  673.                 return false;
  674.             }
  675.             this._forEachPane("onOK");
  676.         }
  677.         else {
  678.             this._forEachPane("onCancel");
  679.         }
  680.         return true;
  681.     },
  682.     onHelp: function(){
  683.         FoxmarksOpenInNewWindow("http://wiki.xmarks.com/wiki/Foxmarks:_Help");
  684.     },
  685.     runSetupWizard: function(){
  686.         this.onOK();
  687.         if(gSettings.useOwnServer){
  688.             FoxmarksAlert(Bundle().
  689.                 GetStringFromName("error.nowizforownserver"));
  690.         } else {
  691.             FoxmarksOpenWizard(true);
  692.             window.close();
  693.         }
  694.     },
  695.     synchronizeNow: function() {
  696.         var retval = 0;
  697.         this.onOK();
  698.         var retval = PerformAction("synch", null);
  699.         this._lastSyncDateChanged();
  700.         this.panes.general.resetNameAndPassword();
  701.         this.panes.sync.resetSyncTypes();
  702.         return retval;
  703.     },
  704.     _lastSyncDateChanged: function() {
  705.         document.getElementById("lastSynchDate").value = 
  706.             gSettings.lastSynchDisplayDate;
  707.     },
  708.     uploadNow: function(){
  709.         var retval = 0;
  710.         var ps = Components.classes
  711.             ["@mozilla.org/embedcomp/prompt-service;1"]
  712.             .getService(Components.interfaces.nsIPromptService);
  713.         if (ps.confirm(null, "Xmarks",
  714.             Bundle().GetStringFromName("msg.overwriteremote"))) {
  715.             this.onOK();
  716.             retval = PerformAction("upload", null);
  717.             if(retval){
  718.                var prefwindow = document.getElementById("foxmarks-settings");
  719.                prefwindow.showPane(
  720.                     document.getElementById("foxmarks-mainpane")
  721.                );
  722.             }
  723.             this._lastSyncDateChanged();
  724.         }
  725.         return retval;
  726.     },
  727.     downloadNow: function(silent){
  728.         var retval = 0;
  729.         var ps = Components.classes
  730.             ["@mozilla.org/embedcomp/prompt-service;1"]
  731.             .getService(Components.interfaces.nsIPromptService);
  732.         if (silent
  733.             || ps.confirm(null, "Xmarks",
  734.                 Bundle().GetStringFromName("msg.overwritelocal"))) {
  735.             this.onOK();
  736.             retval = PerformAction("download", null);
  737.             if(retval){
  738.                var prefwindow = document.getElementById("foxmarks-settings");
  739.                prefwindow.showPane(
  740.                     document.getElementById("foxmarks-mainpane")
  741.                );
  742.             }
  743.             this._lastSyncDateChanged();
  744.         }
  745.         return retval;
  746.  
  747.     },
  748.     onUnload: function(){
  749.         this.panes.status.onUnload();
  750.     }
  751. };
  752.  
  753.  
  754.  
  755. function SynchronizeForever() {
  756.     while (!SynchronizeNow()) { };
  757. }
  758.  
  759.  
  760.