home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 May / PCWorld_2003-05_cd.bin / Komunik / phoenix / chrome / browser.jar / content / browser / pref / pref-fonts.js < prev    next >
Text File  |  2002-10-10  |  27KB  |  661 lines

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