home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2005 October / Gamestar_77_2005-10_dvd.iso / Programy / nsb-install-8-0.exe / chrome / browser.jar / content / browser / pref / pref-fonts.js < prev    next >
Encoding:
Text File  |  2005-07-29  |  23.7 KB  |  637 lines

  1.  
  2. try
  3.   {
  4.     var pref = Components.classes["@mozilla.org/preferences;1"].getService( Components.interfaces.nsIPref );
  5.   }
  6. catch(e)
  7.   {
  8.     dump("failed to get font list or pref object: "+e+" in pref-fonts.js\n");
  9.   }
  10.  
  11. var fontEnumerator = null;
  12. var globalFonts = null;
  13. var fontTypes   = ["serif", "sans-serif", "monospace"];
  14. var variableSize, fixedSize, minSize, languageList;
  15. var languageData = [];
  16. var currentLanguage;
  17. var gPrefutilitiesBundle;
  18. var gPrefWindow = window.opener.parent.hPrefWindow;
  19.  
  20. // manual data retrieval function for PrefWindow
  21. function GetFields()
  22.   {
  23.     var dataObject = { };
  24.     
  25.     // store data for language independent widgets
  26.     var lists = ["selectLangs", "proportionalFont"];
  27.     for( var i = 0; i < lists.length; i++ )
  28.       {
  29.         if( !( "dataEls" in dataObject ) )
  30.           dataObject.dataEls = new Object;
  31.         dataObject.dataEls[ lists[i] ] = new Object;
  32.         dataObject.dataEls[ lists[i] ].value = document.getElementById( lists[i] ).value;
  33.       }
  34.  
  35.    dataObject.defaultFont = document.getElementById( "proportionalFont" ).value;
  36.    dataObject.fontDPI = document.getElementById( "screenResolution" ).value;
  37.    dataObject.useMyFonts = document.getElementById( "useMyFonts" ).checked ? 1 : 0;
  38.    
  39.    var items = ["foregroundText", "background", "unvisitedLinks", "visitedLinks", "browserUseSystemColors", "browserUnderlineAnchors", "useMyColors", "useMyFonts"];
  40.    for (i = 0; i < items.length; ++i)
  41.      dataObject.dataEls[items[i]] = new Object;
  42.    dataObject.dataEls["foregroundText"].value = document.getElementById("foregroundtextmenu").color;
  43.    dataObject.dataEls["background"].value = document.getElementById("backgroundmenu").color;
  44.    dataObject.dataEls["unvisitedLinks"].value = document.getElementById("unvisitedlinkmenu").color;
  45.    dataObject.dataEls["visitedLinks"].value = document.getElementById("visitedlinkmenu").color;
  46.  
  47.    dataObject.dataEls["browserUseSystemColors"].checked = document.getElementById("browserUseSystemColors").checked;
  48.    dataObject.dataEls["browserUnderlineAnchors"].checked = document.getElementById("browserUnderlineAnchors").checked;
  49.    dataObject.dataEls["useMyColors"].checked = document.getElementById("useMyColors").checked;
  50.    dataObject.dataEls["useMyFonts"].checked = document.getElementById("useMyFonts").checked;
  51.  
  52.     // save current state for language dependent fields and store
  53.     saveState();
  54.     dataObject.languageData = languageData;
  55.  
  56.     return dataObject;
  57.   }
  58.  
  59. // manual data setting function for PrefWindow
  60. function SetFields(aDataObject)
  61.   {
  62.     languageData = "languageData" in aDataObject ? aDataObject.languageData : languageData ;
  63.     currentLanguage = "currentLanguage" in aDataObject ? aDataObject.currentLanguage : null ;
  64.  
  65.     var lists = ["selectLangs", "proportionalFont"];
  66.     var prefvalue;
  67.     
  68.     for( var i = 0; i < lists.length; i++ )
  69.       {
  70.         var element = document.getElementById( lists[i] );
  71.         if( "dataEls" in aDataObject )
  72.           {
  73.             element.selectedItem = element.getElementsByAttribute( "value", aDataObject.dataEls[ lists[i] ].value )[0];
  74.           }
  75.         else
  76.           {
  77.             var prefstring = element.getAttribute( "prefstring" );
  78.             var preftype = element.getAttribute( "preftype" );
  79.             if( prefstring && preftype )
  80.               {
  81.                 prefvalue = gPrefWindow.getPref( preftype, prefstring );
  82.                 element.selectedItem = element.getElementsByAttribute( "value", prefvalue )[0];
  83.               }
  84.           }
  85.       }
  86.  
  87.     var screenResolution = document.getElementById( "screenResolution" );
  88.     var resolution;
  89.     if( "fontDPI" in aDataObject )
  90.       {
  91.         resolution = aDataObject.fontDPI;
  92.       }
  93.     else
  94.       {
  95.         prefvalue = gPrefWindow.getPref( "int", "browser.display.screen_resolution" );
  96.         if( prefvalue != "!/!ERROR_UNDEFINED_PREF!/!" )
  97.             resolution = prefvalue;
  98.         else
  99.             resolution = 96; // If it all goes horribly wrong, fall back on 96.
  100.       }
  101.     
  102.     setResolution( resolution );
  103.     
  104.     if ( gPrefWindow.getPrefIsLocked( "browser.display.screen_resolution" ) ) {
  105.         screenResolution.disabled = true;
  106.     }
  107.  
  108.     if ( gPrefWindow.getPrefIsLocked( "browser.display.use_document_fonts" ) ) {
  109.         useMyFontsCheckbox.disabled = true;
  110.     }
  111.    if ("dataEls" in aDataObject) {
  112.      document.getElementById("foregroundtextmenu").color = aDataObject.dataEls["foregroundText"].value
  113.      document.getElementById("backgroundmenu").color = aDataObject.dataEls["background"].value;
  114.      document.getElementById("unvisitedlinkmenu").color = aDataObject.dataEls["unvisitedLinks"].value;
  115.      document.getElementById("visitedlinkmenu").color = aDataObject.dataEls["visitedLinks"].value;
  116.  
  117.      document.getElementById("browserUseSystemColors").checked = aDataObject.dataEls["browserUseSystemColors"].checked;
  118.      document.getElementById("browserUnderlineAnchors").checked = aDataObject.dataEls["browserUnderlineAnchors"].checked;
  119.      document.getElementById("useMyColors").checked = aDataObject.dataEls["useMyColors"].checked;
  120.      document.getElementById("useMyFonts").checked = aDataObject.dataEls["useMyFonts"].checked;
  121.    }
  122.    else {
  123.      var elt, prefstring;
  124.      var checkboxes = ["browserUseSystemColors", "browserUnderlineAnchors"];
  125.      for (i = 0; i < checkboxes.length; ++i) {
  126.        elt = document.getElementById(checkboxes[i]);
  127.        prefstring = elt.getAttribute( "prefstring" );
  128.        if( prefstring  ) {
  129.          prefvalue = gPrefWindow.getPref( "bool", prefstring );
  130.          elt.checked = prefvalue;
  131.        }
  132.      }
  133.      var colors = ["foregroundtextmenu", "backgroundmenu", "unvisitedlinkmenu", "visitedlinkmenu"];
  134.      for (i = 0; i < colors.length; ++i) {
  135.        elt = document.getElementById(colors[i]);
  136.        prefstring = elt.nextSibling.getAttribute("prefstring");
  137.        if (prefstring) {
  138.          prefvalue = gPrefWindow.getPref("color", prefstring);
  139.          elt.color = prefvalue;
  140.        }
  141.      }
  142.      var useDocColors = gPrefWindow.getPref("bool", "browser.display.use_document_colors");
  143.      document.getElementById("useMyColors").checked = !useDocColors;
  144.      var useDocFonts = gPrefWindow.getPref("int", "browser.display.use_document_fonts");
  145.      document.getElementById("useMyFonts").checked = !useDocFonts;
  146.  
  147.    }
  148. }
  149.  
  150. function Startup()
  151.   {
  152.     // Initialize the sub-dialog  
  153.     variableSize = document.getElementById( "sizeVar" );
  154.     fixedSize    = document.getElementById( "sizeMono" );
  155.     minSize      = document.getElementById( "minSize" );
  156.     languageList = document.getElementById( "selectLangs" );
  157.  
  158.     gPrefutilitiesBundle = document.getElementById("bundle_prefutilities");
  159.  
  160.     // eventually we should detect the default language and select it by default
  161.     selectLanguage();
  162.     
  163.     // Allow user to ask the OS for a DPI if we are under X or OS/2
  164.     if ((navigator.appVersion.indexOf("X11") != -1) || (navigator.appVersion.indexOf("OS/2") != -1))
  165.       {
  166.          document.getElementById( "systemResolution" ).removeAttribute( "hidden" ); 
  167.       }
  168.     
  169.     // Set up the labels for the standard issue resolutions
  170.     var resolution = document.getElementById( "screenResolution" );
  171.  
  172.     // Set an attribute on the selected resolution item so we can fall back on
  173.     // it if an invalid selection is made (select "Other...", hit Cancel)
  174.     resolution.selectedItem.setAttribute("current", "true");
  175.  
  176.     var defaultResolution;
  177.     var otherResolution;
  178.  
  179.     // On OS/2, 120 is the default system resolution.
  180.     // 96 is valid, but used only for for 640x480.
  181.     if (navigator.appVersion.indexOf("OS/2") != -1)
  182.       {
  183.         defaultResolution = "120";
  184.         otherResolution = "96";
  185.         document.getElementById( "arbitraryResolution" ).setAttribute( "hidden", "true" ); 
  186.         document.getElementById( "resolutionSeparator" ).setAttribute( "hidden", "true" ); 
  187.       } else {
  188.         defaultResolution = "96";
  189.         otherResolution = "72";
  190.       }
  191.  
  192.     var dpi = resolution.getAttribute( "dpi" );
  193.     resolution = document.getElementById( "defaultResolution" );
  194.     resolution.setAttribute( "value", defaultResolution );
  195.     resolution.setAttribute( "label", dpi.replace(/\$val/, defaultResolution ) );
  196.     resolution = document.getElementById( "otherResolution" );
  197.     resolution.setAttribute( "value", otherResolution );
  198.     resolution.setAttribute( "label", dpi.replace(/\$val/, otherResolution ) );
  199.  
  200.     // Get the pref and set up the dialog appropriately. Startup is called
  201.     // after SetFields so we can't rely on that call to do the business.
  202.     var prefvalue = gPrefWindow.getPref( "int", "browser.display.screen_resolution" );
  203.     if( prefvalue != "!/!ERROR_UNDEFINED_PREF!/!" )
  204.         resolution = prefvalue;
  205.     else
  206.         resolution = 96; // If it all goes horribly wrong, fall back on 96.
  207.     
  208.     setResolution( resolution );
  209.  
  210.     // This prefstring is a contrived pref whose sole purpose is to lock some
  211.     // elements in this panel.  The value of the pref is not used and does not matter.
  212.     if ( gPrefWindow.getPrefIsLocked( "browser.display.languageList" ) ) {
  213.       disableAllFontElements();
  214.     }
  215.   }
  216.   
  217. function onFontsDialogOK()
  218.   {
  219.     gPrefWindow.registerOKCallbackFunc(window.opener.saveFontPrefs);
  220.     gPrefWindow.wsm.savePageData(window.location.href, window);
  221.     return true;
  222.   }   
  223.  
  224. function getFontEnumerator()
  225.   {
  226.     if (!fontEnumerator)
  227.       {
  228.         fontEnumerator = Components.classes["@mozilla.org/gfx/fontenumerator;1"]
  229.                         .createInstance()
  230.                         .QueryInterface(Components.interfaces.nsIFontEnumerator);
  231.       }
  232.     return fontEnumerator;
  233.   }
  234.  
  235. function listElement( aListID )
  236.   {
  237.     this.listElement = document.getElementById( aListID );
  238.   }
  239.  
  240. listElement.prototype =
  241.   {
  242.     clearList:
  243.       function ()
  244.         {
  245.           // remove the menupopup node child of the menulist.
  246.           this.listElement.removeChild( this.listElement.firstChild );
  247.         },
  248.  
  249.     appendFontNames: 
  250.       function ( aLanguage, aFontType )
  251.         {
  252.           var i;
  253.           var defaultFont = null;
  254.           var count = { value: 0 };
  255.           var fonts = getFontEnumerator().EnumerateFonts( aLanguage, aFontType, count );
  256.           if (fonts.length > 0)
  257.             {
  258.               defaultFont = getFontEnumerator().getDefaultFont( aLanguage, aFontType );
  259.             }
  260.           else
  261.             {
  262.               // if no specific fonts, relax 'aFontType' and try to get other
  263.               // fonts for this language so that we can group them on top
  264.               fonts = getFontEnumerator().EnumerateFonts( aLanguage, "", count );
  265.               if (fonts.length > 0)
  266.                 {
  267.                   defaultFont = getFontEnumerator().getDefaultFont( aLanguage, "" );
  268.                 }
  269.             }
  270.  
  271.           var itemNode = null;
  272.           var separatorNode = null;
  273.           var popupNode = document.createElement( "menupopup" ); 
  274.           if (fonts.length > 0)
  275.             {
  276.               // always put the default font at the front of the list
  277.               if (defaultFont)
  278.                 {
  279.                   var label = gPrefutilitiesBundle
  280.                     .formatStringFromName("labelDefaultFont", defaultFont, 1);
  281.                   itemNode = document.createElement( "menuitem" );
  282.                   itemNode.setAttribute( "label", label );
  283.                   itemNode.setAttribute( "value", "" ); // special blank value
  284.                   popupNode.appendChild( itemNode );
  285.  
  286.                   separatorNode = document.createElement( "menuseparator" );
  287.                   popupNode.appendChild( separatorNode );
  288.                 }
  289.  
  290.               for (i = 0; i < fonts.length; i++)
  291.                 {
  292.                   itemNode = document.createElement( "menuitem" );
  293.                   itemNode.setAttribute( "value", fonts[i] );
  294.                   itemNode.setAttribute( "label", fonts[i] );
  295.                   popupNode.appendChild( itemNode );
  296.                 }
  297.             }
  298.  
  299.             // get all the fonts to complete the font lists
  300.             if (!globalFonts)
  301.               {
  302.                 globalFonts = getFontEnumerator().EnumerateAllFonts( count );
  303.               }
  304.  
  305.           // since the lists are sorted, we can get unique entries by just walking
  306.           // both lists linearly side-by-side, skipping those values already in
  307.           // the popup list
  308.           if (globalFonts.length > fonts.length)
  309.             {
  310.               var menuItem = separatorNode ? separatorNode.nextSibling : popupNode.firstChild; 
  311.               var menuValue = menuItem ? menuItem.getAttribute( "value" ) : null;
  312.  
  313.               separatorNode = document.createElement( "menuseparator" );
  314.               popupNode.appendChild( separatorNode );
  315.               for (i = 0; i < globalFonts.length; i++)
  316.                 {
  317.                   if (globalFonts[i] != menuValue)
  318.                     {
  319.                       itemNode = document.createElement( "menuitem" );
  320.                       itemNode.setAttribute( "value", globalFonts[i] );
  321.                       itemNode.setAttribute( "label", globalFonts[i] );
  322.                       popupNode.appendChild( itemNode );
  323.                     }
  324.                   else
  325.                     {
  326.                       menuItem = menuItem.nextSibling;
  327.                       menuValue = menuItem ? menuItem.getAttribute( "value" ) : null;
  328.                     }
  329.                 }
  330.             }
  331.  
  332.           this.listElement.appendChild( popupNode ); 
  333.  
  334.           return popupNode.firstChild;
  335.         } 
  336.   };
  337.  
  338. function lazyAppendFontNames( i )
  339.   {
  340.      // schedule the build of the next font list
  341.      if (i+1 < fontTypes.length)
  342.        {
  343.          window.setTimeout(lazyAppendFontNames, 100, i+1);
  344.        }
  345.  
  346.      // now build and populate the fonts for the requested font type
  347.      var defaultItem = null;
  348.      var selectElement = new listElement( fontTypes[i] );
  349.      selectElement.clearList();
  350.      try
  351.        {
  352.          defaultItem = selectElement.appendFontNames( languageList.value, fontTypes[i] );
  353.        }
  354.      catch(e) {
  355.          dump("pref-fonts.js: " + e + "\nFailed to build the font list for " + fontTypes[i] + "\n");
  356.          return;
  357.        }
  358.  
  359.      // now set the selected font item for the drop down list
  360.  
  361.      if (!defaultItem)
  362.        return; // nothing to select, so no need to bother
  363.  
  364.      // the item returned by default is our last resort fall-back
  365.      var selectedItem = defaultItem;
  366.      if( languageList.value in languageData )
  367.        {
  368.          // data exists for this language, pre-select items based on this information
  369.          var dataVal = languageData[languageList.value].types[fontTypes[i]];
  370.          if (!dataVal.length) // special blank means the default
  371.            {
  372.              selectedItem = defaultItem;
  373.            }
  374.          else
  375.            {
  376.              var dataEls = selectElement.listElement.getElementsByAttribute( "value", dataVal );
  377.              selectedItem = dataEls.length ? dataEls[0] : defaultItem;
  378.            }
  379.        }
  380.      else
  381.        {
  382.          try
  383.            {
  384.              var fontPrefString = "font.name." + fontTypes[i] + "." + languageList.value;
  385.              var selectVal = gPrefWindow.pref.CopyUnicharPref( fontPrefString );
  386.              var dataEls = selectElement.listElement.getElementsByAttribute( "value", selectVal );
  387.  
  388.              // we need to honor name-list in case name is unavailable 
  389.              if (!dataEls.length) {
  390.                  var fontListPrefString = "font.name-list." + fontTypes[i] + "." + languageList.value;
  391.                  var nameList = gPrefWindow.pref.CopyUnicharPref( fontListPrefString );
  392.                  var fontNames = nameList.split(",");
  393.                  var stripWhitespace = /^\s*(.*)\s*$/;
  394.  
  395.                  for (j = 0; j < fontNames.length; j++) {
  396.                    selectVal = fontNames[j].replace(stripWhitespace, "$1");
  397.                    dataEls = selectElement.listElement.getElementsByAttribute("value", selectVal);
  398.                    if (dataEls.length)  
  399.                      break;  // exit loop if we find one
  400.                  }
  401.              }
  402.              selectedItem = dataEls.length ? dataEls[0] : defaultItem;
  403.            }
  404.          catch(e) {
  405.              selectedItem = defaultItem;
  406.            }
  407.        }
  408.  
  409.      selectElement.listElement.selectedItem = selectedItem;
  410.      selectElement.listElement.removeAttribute( "disabled" );
  411.   }
  412.  
  413. function saveState()
  414.   {
  415.     for( var i = 0; i < fontTypes.length; i++ )
  416.       {
  417.         // preliminary initialisation
  418.         if( currentLanguage && !( currentLanguage in languageData ) )
  419.           languageData[currentLanguage] = [];
  420.         if( currentLanguage && !( "types" in languageData[currentLanguage] ) )
  421.           languageData[currentLanguage].types = [];
  422.         // save data for the previous language
  423.         if( currentLanguage && currentLanguage in languageData &&
  424.             "types" in languageData[currentLanguage] )
  425.           languageData[currentLanguage].types[fontTypes[i]] = document.getElementById( fontTypes[i] ).value;
  426.       }
  427.  
  428.     if( currentLanguage && currentLanguage in languageData &&
  429.         "types" in languageData[currentLanguage] )
  430.       {
  431.         languageData[currentLanguage].variableSize = parseInt( variableSize.value );
  432.         languageData[currentLanguage].fixedSize = parseInt( fixedSize.value );
  433.         languageData[currentLanguage].minSize = parseInt( minSize.value );
  434.       }
  435.   }
  436.  
  437. // Selects size (or the nearest entry that exists in the list)
  438. // in the menulist minSize
  439. function minSizeSelect(size)
  440.   {
  441.     var items = minSize.getElementsByAttribute( "value", size );
  442.     if (items.length > 0)
  443.       minSize.selectedItem = items[0];
  444.     else if (size < 6)
  445.       minSizeSelect(6);
  446.     else if (size > 24)
  447.       minSizeSelect(24);
  448.     else
  449.       minSizeSelect(size - 1);
  450.   }
  451.  
  452. function selectLanguage()
  453.   {
  454.     // save current state
  455.     saveState();
  456.  
  457.     if( currentLanguage == languageList.value )
  458.       return; // same as before, nothing changed
  459.     
  460.     currentLanguage = languageList.value;
  461.  
  462.     // lazily populate the successive font lists at 100ms intervals.
  463.     // (Note: the third parameter to setTimeout() is going to be
  464.     // passed as argument to the callback function.)
  465.     window.setTimeout(lazyAppendFontNames, 100, 0);
  466.  
  467.     // in the meantime, disable the menu lists
  468.     for( var i = 0; i < fontTypes.length; i++ )
  469.       {
  470.         var listElement = document.getElementById( fontTypes[i] );
  471.         listElement.setAttribute( "value", "" );
  472.         listElement.setAttribute( "label", "" );
  473.         listElement.setAttribute( "disabled", "true" );
  474.       }
  475.  
  476.     // and set the font sizes
  477.     var dataObject = gPrefWindow.wsm.dataManager.pageData["chrome://browser/content/pref/pref-fonts.xul"].userData;
  478.     var langData = null;
  479.     try
  480.       {
  481.         var sizeVarVal, sizeFixedVal;
  482.         if ('languageData' in dataObject) {
  483.           langData = dataObject.languageData[currentLanguage];
  484.           sizeVarVal = langData.variableSize;
  485.           sizeFixedVal = langData.fixedSize;
  486.         }
  487.         else {          
  488.           var variableSizePref = "font.size.variable." + languageList.value;
  489.           sizeVarVal = gPrefWindow.pref.GetIntPref( variableSizePref );
  490.           var fixedSizePref = "font.size.fixed." + languageList.value;
  491.           sizeFixedVal = gPrefWindow.pref.GetIntPref( fixedSizePref );
  492.         }
  493.         variableSize.selectedItem = variableSize.getElementsByAttribute( "value", sizeVarVal )[0];
  494.         fixedSize.selectedItem = fixedSize.getElementsByAttribute( "value", sizeFixedVal )[0];
  495.       }
  496.     catch(e) { } // font size lists can simply default to the first entry
  497.  
  498.     var minSizeVal = 0;
  499.     try 
  500.       {
  501.         if (langData) {
  502.           minSizeVal = langData.minSize;
  503.         }
  504.         else {        
  505.           var minSizePref = "font.minimum-size." + languageList.value;
  506.           minSizeVal = gPrefWindow.pref.GetIntPref( minSizePref );
  507.         }
  508.       }
  509.     catch(e) { }
  510.     minSizeSelect( minSizeVal );
  511.   }
  512.  
  513. function changeScreenResolution()
  514.   {
  515.     var screenResolution = document.getElementById("screenResolution");
  516.     var userResolution = document.getElementById("userResolution");
  517.  
  518.     var previousSelection = screenResolution.getElementsByAttribute("current", "true")[0];
  519.  
  520.     if (screenResolution.value == "other")
  521.       {
  522.         // If the user selects "Other..." we bring up the calibrate screen dialog
  523.         var rv = { newdpi : 0 };
  524.         var calscreen = window.openDialog("chrome://browser/content/pref/pref-calibrate-screen.xul", 
  525.                                       "_blank", 
  526.                                       "modal,chrome,centerscreen,resizable=no,titlebar",
  527.                                       rv);
  528.         if (rv.newdpi != -1) 
  529.           {
  530.             // They have entered values, and we have a DPI value back
  531.             setResolution ( rv.newdpi );
  532.             previousSelection.removeAttribute("current");
  533.             screenResolution.selectedItem.setAttribute("current", "true");
  534.           }
  535.         else
  536.           {
  537.             // They've cancelled. We can't leave "Other..." selected, so...
  538.             // we re-select the previously selected item.
  539.             screenResolution.selectedItem = previousSelection;
  540.           }
  541.       }
  542.     else if (!(screenResolution.value == userResolution.value))
  543.       {
  544.         // User has selected one of the hard-coded resolutions
  545.         userResolution.setAttribute("hidden", "true");
  546.  
  547.         previousSelection.removeAttribute("current");
  548.         screenResolution.selectedItem.setAttribute("current", "true");
  549.       }
  550.   }
  551.  
  552. function setResolution( resolution )
  553.   {
  554.     // Given a number, if it's equal to a hard-coded resolution we use that,
  555.     // otherwise we set the userResolution field.
  556.     var screenResolution = document.getElementById( "screenResolution" );
  557.     var userResolution = document.getElementById( "userResolution" );
  558.  
  559.     var items = screenResolution.getElementsByAttribute( "value", resolution );
  560.     if (items.length)
  561.       {
  562.         // If it's one of the hard-coded values, we'll select it directly 
  563.         screenResolution.selectedItem = items[0];
  564.         userResolution.setAttribute( "hidden", "true" );
  565.       }   
  566.     else
  567.       {
  568.         // Otherwise we need to set up the userResolution field
  569.         var dpi = screenResolution.getAttribute( "dpi" );
  570.         userResolution.setAttribute( "value", resolution );
  571.         userResolution.setAttribute( "label", dpi.replace(/\$val/, resolution) );
  572.         userResolution.removeAttribute( "hidden" );
  573.         screenResolution.selectedItem = userResolution;   
  574.       }
  575.   }
  576.   
  577. // "Calibrate screen" dialog code
  578.  
  579. function Init()
  580.   {
  581.       sizeToContent();
  582.       doSetOKCancel(onOK, onCancel);
  583.       document.getElementById("horizSize").focus();
  584.   }
  585.   
  586. function onOK()
  587.   {
  588.     // Get value from the dialog to work out dpi
  589.     var horizSize = parseFloat(document.getElementById("horizSize").value);
  590.     var units = document.getElementById("units").value;
  591.   
  592.     if (!horizSize || horizSize < 0)
  593.       {
  594.         // We can't calculate anything without a proper value
  595.         window.arguments[0].newdpi = -1;
  596.         return true;
  597.       }
  598.       
  599.     // Convert centimetres to inches.
  600.     // The magic number is allowed because it's a fundamental constant :-)
  601.     if (units === "centimetres")
  602.       {
  603.         horizSize /= 2.54;
  604.       }
  605.   
  606.     // These shouldn't change, but you can't be too careful.
  607.     var horizBarLengthPx = document.getElementById("horizRuler").boxObject.width;
  608.   
  609.     var horizDPI = parseInt(horizBarLengthPx) / horizSize;
  610.   
  611.     // Average the two <shrug>.
  612.     window.arguments[0].newdpi = Math.round(horizDPI);
  613.   
  614.     return true;
  615.   }
  616.  
  617. function onCancel()
  618.   {
  619.       // We return -1 to show that no value has been given.
  620.       window.arguments[0].newdpi = -1;
  621.       return true;
  622.   }
  623.  
  624. // disable font items, but not the useMyFonts checkbox nor the resolution
  625. // menulist
  626. function disableAllFontElements()
  627.   {
  628.       var doc_ids = [ "selectLangs", "proportionalFont",
  629.                       "sizeVar", "serif", "sans-serif",
  630.                       "sizeMono", "minSize" ];
  631.       for (i=0; i<doc_ids.length; i++) {
  632.           element = document.getElementById( doc_ids[i] );
  633.           element.disabled = true;
  634.       }
  635.   }
  636.  
  637.