/*
ua.js revision 4PF1.1 14-Aug-2002

Contributor(s): Bob Clary, Netscape Communications, Copyright 2001
   Michael Cowperthwaite, Four Papayas and a Fnord, Copright 2002

Netscape grants you a royalty free license to use, modify and
distribute this software provided that this copyright notice
appears on all copies.  This software is provided "AS IS,"
without a warranty of any kind.

Four Papayas and a Fnord (4PF) grants you the same license.

Reference documentation:

Mozilla: 
	http://www.mozilla.org/build/revised-user-agent-strings.html
	http://www.mozilla.org/docs/dom/domref/dom_window_ref.html#1011624


*/

function xbCheckOSX()
//================================================
//  Function parses names of plugins searching for an indicator that this
//  is an OS X system.  Should work for "Default Plugin Carbon", if nothing else.
//  Apparently Mac browsers don't show OS X in any of the regular navigator fields.
{
	for (var i = 0; i < navigator.plugins.length; i++)
	{
		var  pname = ' ' + navigator.plugins[i].name.toLowerCase();
		if ((pname.indexOf("carbon") > 0) || (pname.indexOf("os x") > 0))
			return true;
	}
	return false;
}


function xbDetectBrowser()
//================================================
//  Function parses the userAgent string and determines info about the system
//  by placing new attributes into the system 'navigator' object:
//    navigator.OS: the operating system  [win, max, nix]
//    navigator.family: the browser ID [ie3, ie4, nn3, nn4, gecko, opera, omniweb, icab]
//    navigator.version: a floating-point value (e.g. 4.1, 6.0, 0.99)
//  To be updated as the browser market develops.
//## OmniWeb doesn't allow modifications to the navigator object??
{
	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.family = '';
	navigator.version = parseFloat(navigator.appVersion);

	var ua = ' ' + window.navigator.userAgent.toLowerCase();
	var platform;

	// This is a good idea: navigator.platform is typically not spoofed
	// However, it is not well documented, particularly regarding Mac and Linux/Unix systems
	if (null != navigator.oscpu)				// [Mozilla]
		platform = ' '	+ navigator.oscpu.toLowerCase();
	else if (null != navigator.platform)	// [JS1.2]
		platform = ' ' + navigator.platform.toLowerCase();
	else
		platform = navigator.appVersion.toLowerCase();
	if (platform != '')						// Did we get one?
	{
		// check for 3.1x, 3.5x or win16
		if ((platform.indexOf('3.') > 0) || (platform.indexOf('win16') > 0))
			navigator.OS = 'w16';
		else if (platform.indexOf('win') > 0)
			navigator.OS = 'win';
		else if ((platform.indexOf('os x') > 0) || /*??*/(platform.indexOf('osx') > 0))
			navigator.OS = 'osx';
		else if (platform.indexOf('mac') > 0)
			navigator.OS = 'mac';
		else if (platform.indexOf('os/2') > 0)
			navigator.OS = 'os2';
		else if (platform.indexOf('unix') > 0 || platform.indexOf('sun') > 0 ||
					platform.indexOf('linux') > 0 ||
					platform.indexOf('irix') > 0 ||
					platform.indexOf('debian') > 0 || platform.indexOf('bsd') > 0)
			navigator.OS = 'nix';
	}
	// 
	if (navigator.OS == 'win')
	{
		// further test for Win16 --??
	}
	else if (navigator.OS == 'mac')
	{
		if ((ua.indexOf('os x') > 0) || (ua.indexOf('osx') > 0))
			navigator.OS == 'osx';
	}

	var i = 0;

	//  Identify the browser, as best we can -- userAgent can, and often is, spoofed,
	//  sometimes deliberately to interfere with sniffing.
	//  Start by searching for known minority browsers
	if ((i = ua.indexOf('opera')) > 0)
	{
		// Opera browser (multiple OS, many versions)
		//  userAgent: Opera/6.03 (Windows 2000; U) [en]    --OR--
		//    Mozilla/5.0 (Windows 2000; U) Opera 6.03 [en]  --OR--
		//    Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.03 [en]
		navigator.family = 'opera';
		navigator.version = parseFloat('0' + ua.substr(i+6), 10);
	}
	else if ((i = ua.indexOf('safari')) > 0)
	{
		// Safari browser (Mac OS X)
		//  userAgent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/48 (like Gecko) Safari/48
		//  platform:  MacPPC
		//  default appName: Netscape
		navigator.family = 'safari';
		navigator.version = parseFloat('0' + ua.substr(i+7), 10);
		navigator.OS = 'osx';              // always # shouldn't be necessary, UA contains "os x"
	}
	else if ((i = ua.indexOf('omniweb')) > 0)
	{
		// OmniWeb browser (Mac OS X)
		//  userAgent: Mozilla/4.5 (compatible; OmniWeb/4.1-v422; Mac_PowerPC)
		//  platform:  MacPPC
		navigator.family = 'omniweb';
		navigator.version = parseFloat('0' + ua.substr(i+8), 10);
		navigator.OS = 'osx';              // always
	}
	else if ((i = ua.indexOf(' icab ')) > 0)	// some useragents contain "icab" substring
	{
		// iCab browser (Mac)
		// navigator.userAgent: Mozilla/4.5 (compatible; iCab 2.8.2; Macintosh; U; PPC)
		// oscpu: PPC Mac OS X
		navigator.family = 'icab';
		navigator.version = parseFloat('0' + ua.substr(i+6), 10);
	}
	else if ((i = ua.indexOf('hotjava')) > 0)
	{
		// hotjava
		navigator.family = 'hotjava';
	}
	else if (ua.indexOf('gecko') > 0)
	{
		// Gecko: Mozilla, Netscape 6+, Chimera, Phoenix, Galeon
		//  useragent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826
		//  appName often is "Netscape"!
		navigator.family = 'gecko';

		var rvStart = ua.indexOf('rv:') + 3;
		var rvEnd = ua.indexOf(')', rvStart);
		var rv = ua.substring(rvStart, rvEnd);
		navigator.version = parseFloat(rv);
	}
	// many strings include "msie" in useragent for compatibility
	else if ((i = ua.indexOf('msie')) > 0)
	{
		// MSIE
		// userAgent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; [id-string])
		navigator.version = parseFloat('0' + ua.substr(i+5), 10);

		if (navigator.version < 4)
			navigator.family = 'ie3';
		else
			navigator.family = 'ie4'
		// IE's UA for Mac looks like:
		if ((navigator.OS == 'mac') && xbCheckOSX())
			navigator.OS = 'osx';
	}
	else if ((ua.indexOf('mozilla') > 0) && (ua.indexOf('compatible') < 0))
	{
		navigator.version = parseFloat(navigator.appVersion);
		if (navigator.version >= 4.0)
			navigator.family = 'nn4';
		else
			navigator.family = 'nn3';
	}

	window.onError = oldOnError;
}

var bname = '[a browser]';
var pname = '[an OS]';


function xbSetNames()
//================================================
//  4PF has very simple needs for distinguishing browsers.
//  The most important is identifying a Windows/IE installation, as the HTML tags for applets
//  are special for that combination.
//  For assisting users with determining their Java capabilities, it's good to know whether
//  the browser or OS are too old to run Java 2.
//  This function generates some usable names for the browser and OS, using the granularity
//  important to us.
{
	// we can add to this...
	// pname should end a sentence following "... running on "
	var type = navigator.OS;

	if (type == 'win')
		pname = 'Windows';
	else if (type == 'osx')
		pname = 'Mac OS X';
	else if (type == 'nix')
		pname = 'some variant of Unix or Linux';
	else if (type == 'os2')
		pname = 'OS/2';
	else if (type == 'mac')
		pname = 'a Macintosh (pre-OS&nbsp;X)';
	else if (type == 'w16')
		pname = 'Windows 3.x';
	else
		pname = 'an unknown operating system';


	type = navigator.family;
	// known gummers
	if (type == 'hotjava')
	{
		bname = 'HotJava';
		pname = 'an early Java';
	}
	else if (type == 'ie3')
		bname = 'an old Internet Explorer';
	else if (type == 'aol')
		bname = 'AOL';

	// known bums
	else if ((type == 'nn3') || (type == 'nn4'))
	{
		if (navigator.version < 3)		// Navigator prior to 3 is just not in the running
			bname = 'an ancient Netscape';
		else
			bname = 'an old Netscape';
	}
	else if (type == 'omniweb')
		bname = 'OmniWeb';

	// known good-guys
	else if (type == 'ie4')
		bname = 'Internet Explorer';
	else if (type == 'opera')
	{
		if (navigator.version < 5)
			bname = 'an old Opera';
		else
			bname = 'Opera';
	}
	else if (type == 'gecko')
		bname = navigator.appName + ' (a Gecko-based browser)';
	else
		bname = navigator.appName + ' (capabilities unknown)';
}

xbDetectBrowser();         // call the function; 'navigator' now has the desired data

