Nicholas,
On a related note, the detect.
js script built up in chapter 8 also treats navigator.appVersion as a float. At the top of the script you have the following:
var fAppVersion = parseFloat(navigator.appVersion);
In all, there are actually four places where version strings are parsed as floats, and then numerical comparisons are made using these floats. Having considered this in a little more detail, I think this approach is fundamentally flawed. A simple example should illustrate the point - versions "1.1" and "1.10" are clearly ordered, yet both parse to the same floating point value after which it's impossible to reestablish the correct ordering. Since you already have the compareVersions() function for comparing version strings, why not use it, and avoid dealing with floats altogether?
Sorry if I'm being a bit picky here! I realize that few if any of the version numbers actually being compared by this script are likely to ever reach a minor point release of .10 or beyond before the major release number is incremented, but to me it feels like a fly in the ointment of an otherwise very comprehensive detection script. A simple google for detect.
js yields several example scripts, none of which come close to being as comprehensive as the script you've created here. Well done!
Chris