    /* ***** BEGIN LICENSE BLOCK *****
     * Licensed under Version: MPL 1.1/GPL 2.0/LGPL 2.1
     * Full Terms at http://devedge.netscape.com/lib/js/license/mpl-tri-license.txt
     *
     * Software distributed under the License is distributed on an "AS IS" basis,
     * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
     * for the specific language governing rights and limitations under the
     * License.
     *
     * The Original Code is Netscape code.
     *
     * The Initial Developer of the Original Code is
     * Netscape Corporation.
     * Portions created by the Initial Developer are Copyright (C) 2001
     * the Initial Developer. All Rights Reserved.
     *
     * Contributor(s): Bob Clary
     *
     * ***** END LICENSE BLOCK ***** */

    function xbDetectBrowser()
    {
      var oldOnError = window.onerror;
      var element = null;

      window.onerror = null;

      // work around bug in xpcdom Mozilla 0.9.1
      window.saveNavigator = window.navigator;

      navigator.OS    = '';
      navigator.version  = parseFloat(navigator.appVersion);
      navigator.org    = '';
      navigator.family  = '';

      var platform;
      if (typeof(window.navigator.platform) != 'undefined')
      {
        platform = window.navigator.platform.toLowerCase();
        if (platform.indexOf('win') != -1)
          navigator.OS = 'win';
        else if (platform.indexOf('mac') != -1)
          navigator.OS = 'mac';
        else if (platform.indexOf('unix') != -1 || platform.indexOf('linux') != -1 || platform.indexOf('sun') != -1)
          navigator.OS = 'nix';
      }

      var i = 0;
      var ua = window.navigator.userAgent.toLowerCase();

      if (ua.indexOf('opera') != -1)
      {
        i = ua.indexOf('opera');
        navigator.family  = 'opera';
        navigator.org    = 'opera';
        navigator.version  = parseFloat('0' + ua.substr(i+6), 10);
      }
      else if ((i = ua.indexOf('msie')) != -1)
      {
        navigator.org    = 'microsoft';
        navigator.version  = parseFloat('0' + ua.substr(i+5), 10);

        if (navigator.version < 4)
          navigator.family = 'ie3';
        else
          navigator.family = 'ie4'
      }
      else if (ua.indexOf('gecko') != -1)
      {
        navigator.family = 'gecko';
        var rvStart = ua.indexOf('rv:');
        var rvEnd   = ua.indexOf(')', rvStart);
        var rv      = ua.substring(rvStart+3, rvEnd);
        var rvParts = rv.split('.');
        var rvValue = 0;
        var exp     = 1;

        for (var i = 0; i < rvParts.length; i++)
        {
          var val = parseInt(rvParts[i]);
          rvValue += val / exp;
          exp *= 100;
        }
        navigator.version = rvValue;

        if (ua.indexOf('netscape') != -1)
          navigator.org = 'netscape';
        else if (ua.indexOf('compuserve') != -1)
          navigator.org = 'compuserve';
        else
          navigator.org = 'mozilla';
      }
      else if ((ua.indexOf('mozilla') !=-1) && (ua.indexOf('spoofer')==-1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('opera')==-1)&& (ua.indexOf('webtv')==-1) && (ua.indexOf('hotjava')==-1))
      {
        var is_major = parseFloat(navigator.appVersion);

        if (is_major < 4)
          navigator.version = is_major;
        else
        {
          i = ua.lastIndexOf('/')
          navigator.version = parseFloat('0' + ua.substr(i+1), 10);
        }
        navigator.org = 'netscape';
        navigator.family = 'nn' + parseInt(navigator.appVersion);
      }
      else if ((i = ua.indexOf('aol')) != -1 )
      {
        // aol
        navigator.family  = 'aol';
        navigator.org    = 'aol';
        navigator.version  = parseFloat('0' + ua.substr(i+4), 10);
      }
      else if ((i = ua.indexOf('hotjava')) != -1 )
      {
        // hotjava
        navigator.family  = 'hotjava';
        navigator.org    = 'sun';
        navigator.version  = parseFloat(navigator.appVersion);
      }

      window.onerror = oldOnError;
    }

    xbDetectBrowser();