// Browser OS Sniffer
// (c) SealedMedia 2004

// The 'its' object makes the following properties available:
// (1) Browser vendor:
//     is.nav, is.ie, is.opera, is.hotjava, is.webtv, is.TVNavigator, is.AOLTV
// (2) Browser version number:
//     is.major (integer indicating major version number: 2, 3, 4 ...)
//     is.minor (float   indicating full  version number: 2.02, 3.01, 4.04 ...)
// (3) Browser vendor AND major version number (more accurate for version no info)
//     is.nav2, is.nav3, is.nav4, is.nav4up, is.nav6, is.nav6up, is.gecko, is.ie3,
//     is.ie4, is.ie4up, is.ie5, is.ie5up, is.ie5_5, is.ie5_5up, is.ie6, is.ie6up,
//     is.hotjava3, is.hotjava3up
// (4) JavaScript version number:
//     is.js (float indicating full JavaScript version number: 1, 1.1, 1.2 ...)
// (5) OS platform and version:
//     is.win, is.win16, is.win32, is.win31, is.win95, is.winnt, is.win98, is.winme, is.win2k
//     is.os2
//     is.mac, is.mac68k, is.macppc
//     is.unix
//     is.sun, is.sun4, is.sun5, is.suni86
//     is.irix, is.irix5, is.irix6
//     is.hpux, is.hpux9, is.hpux10
//     is.aix, is.aix1, is.aix2, is.aix3, is.aix4
//     is.linux, is.sco, is.unixware, is.mpras, is.reliant
//     is.dec, is.sinix, is.freebsd, is.bsd
//     is.vms
function getVersionString(strInput) {
	var iRestart = 0;
	var iStart = 0;

	// lastIndexOf would not work with a space on the Mac, hence loop below
	while (iStart != -1) {
		iStart = strInput.indexOf(" ",iRestart+1);
		if (iStart != -1) {
			iRestart = iStart;
		}
	}
	return strInput.substring(iRestart+1);
}

function its() {

  // Set everything to lowercase to make string comparisons easier.
  // Prepend a space to the userAgent string to make indexOf tests more
  // compact/readable (can use > 0 instead of != -1)
  var agt = ' ' + navigator.userAgent.toLowerCase();

  // * * BROWSER VERSION * *

  // Browser version note: IE5 returns an appVersion of 4 because its crap
  // so use is.ie5up to detect IE5 and above
  this.major = parseInt(navigator.appVersion)
  this.minor = parseFloat(navigator.appVersion)

  // Netscape Navigator - 'compatible' vers of "mozilla" aren't Navigator
  this.nn = agt.indexOf('mozilla') > 0;
  if (agt.indexOf('compatible') > 0) this.nn = false;
  this.nn2     = (this.nn && (this.major == 2));
  this.nn3     = (this.nn && (this.major == 3));
  this.nn4     = (this.nn && (this.major == 4));
  this.nn4up   = (this.nn && (this.major >= 4));
  this.nn6     = (this.nn && (this.major == 5));
  this.nn6up   = (this.nn && (this.major >= 5));

  this.ie      = ((agt.indexOf("msie") > 0) && (agt.indexOf("opera") == -1));
  this.ie3     = (this.ie && (this.major < 4));
  this.ie4     = (this.ie && (this.major == 4) && (agt.indexOf("msie 4") > 0));
  this.ie4up   = (this.ie && (this.major >= 4));
  this.ie5     = (this.ie && (this.major == 4) && (agt.indexOf("msie 5.0") > 0));
  this.ie5_5   = (this.ie && (this.major == 4) && (agt.indexOf("msie 5.5") > 0));
  this.ie5up   = (this.ie && !this.ie3 && !this.ie4);
  this.ie5_5up = (this.ie && !this.ie3 && !this.ie4 && !this.ie5);
  this.ie6     = (this.ie && (this.major == 4) && (agt.indexOf("msie 6.") > 0));
  this.ie6up   = (this.ie && !this.ie3 && !this.ie4 && !this.ie5 && !this.ie5_5);

  // Known bug: On AOL4, this.aol returns false if IE3 is the embedded browser
  // or if this is the first browser window opened. Thus the variables is.aol,
  // is.aol3 and is.aol4 aren't 100% reliable :-(
  this.aol     = (agt.indexOf("aol") > 0);
  this.aol3    = (this.aol && this.ie3);
  this.aol4    = (this.aol && this.ie4);
  this.aol5    = (agt.indexOf("aol 5") > 0);
  this.aol6    = (agt.indexOf("aol 6") > 0);

  this.opera   = (agt.indexOf("opera") > 0);
  this.opera2  = (agt.indexOf("opera 2") > 0 || agt.indexOf("opera/2") > 0);
  this.opera3  = (agt.indexOf("opera 3") > 0 || agt.indexOf("opera/3") > 0);
  this.opera4  = (agt.indexOf("opera 4") > 0 || agt.indexOf("opera/4") > 0);
  this.opera5  = (agt.indexOf("opera 5") > 0 || agt.indexOf("opera/5") > 0);
  this.opera5up= (this.opera && !this.opera2 && !this.opera3 && !this.opera4);

  this.webtv   = (agt.indexOf("webtv") > 0);
  this.gecko   = (agt.indexOf('gecko') > 0);
  this.AOLTV   = ((agt.indexOf("navio") > 0) || (agt.indexOf("navio_aoltv") > 0));
  this.TVNavigator = this.AOLTV;

  this.hotjava = (agt.indexOf("hotjava") > 0);
  this.hotjava3 = (this.hotjava && (this.major == 3));
  this.hotjava3up = (this.hotjava && (this.major >= 3));

  // * * JAVASCRIPT VERSION * *

  if (this.nav2 || this.ie3) this.js = 1.0;
  else if (this.nav3) this.js = 1.1;
  else if (this.opera5up) this.js = 1.3;
  else if (this.opera) this.js = 1.1;
  else if ((this.nav4 && (this.minor <= 4.05)) || this.ie4) this.js = 1.2;
  else if ((this.nav4 && (this.minor > 4.05)) || this.ie5) this.js = 1.3;
  else if (this.hotjava3up) this.js = 1.4;
  else if (this.nav6 || this.gecko) this.js = 1.5;
  // hack future values for NN & IE to provide upward compatibility
  // note ie5up on mac is 1.4
  else if (this.nav6up) this.js = 1.5;
  else if (this.ie5up) this.js = 1.3
  else this.js = 0.0;

  // * * PLATFORM * *

  // * WINDOWS *
  // Note: Opera 3.0 userAgent string includes "Windows 95/NT4" on all
  // Win32 platforms, so you can't distinguish between Win95 and WinNT.
  this.win   = ((agt.indexOf("win") > 0) || (agt.indexOf("16bit") > 0) );
  this.win95 = ((agt.indexOf("win95") > 0) || (agt.indexOf("windows 95") > 0));
  this.win16 = ((agt.indexOf("16bit") > 0) || (agt.indexOf("windows 3.1") > 0) ||
               (agt.indexOf("win16") > 0) || (agt.indexOf("windows 16-bit") > 0));
  this.win31 = (this.win16 && !(agt.indexOf("16bit") > 0));

  // Reliable detection of Win98 may not be possible. It appears that:
  // - On Nav 4.x and before you'll get plain "Windows" in userAgent.
  // - On Mercury client, the 32-bit version will return "Win98", but
  //   the 16-bit version running on Win98 will still return "Win95".
  this.win98 = ((agt.indexOf("win98") > 0) || (agt.indexOf("windows 98") > 0));
  this.winnt = ((agt.indexOf("winnt") > 0) || (agt.indexOf("windows nt") > 0));
  this.win32 = (this.win95 || this.winnt || this.win98 ||
               ((this.major >= 4) && (navigator.platform == "Win32")) ||
               (agt.indexOf("win32") > 0) || (agt.indexOf("32bit") > 0));
  this.winme = ((agt.indexOf("win 9x 4.90") > 0));
  this.win2k = ((agt.indexOf("windows nt 5.0") > 0));

  // * MAC *
  this.mac    = (agt.indexOf("mac") > 0);
  this.mac68k = (this.mac && ((agt.indexOf("68k") > 0) || (agt.indexOf("68000") > 0)));
  this.macppc = (this.mac && ((agt.indexOf("ppc") > 0) || (agt.indexOf("powerpc") > 0)));
  // hack ie5 js version for mac
  if (this.mac && this.ie5up) this.js = 1.4;

  // * UNIX *
  this.sun    = (agt.indexOf("sunos") > 0);
  this.sun4   = (agt.indexOf("sunos 4") > 0);
  this.sun5   = (agt.indexOf("sunos 5") > 0);
  this.suni86 = (this.sun && (agt.indexOf("i86") > 0));
  this.irix   = (agt.indexOf("irix") > 0);    // SGI
  this.irix5  = (agt.indexOf("irix 5") > 0);
  this.irix6  = ((agt.indexOf("irix 6") > 0) || (agt.indexOf("irix6") > 0));
  this.hpux   = (agt.indexOf("hp-ux") > 0);
  this.hpux9  = (this.hpux && (agt.indexOf("09.") > 0));
  this.hpux10 = (this.hpux && (agt.indexOf("10.") > 0));
  this.aix    = (agt.indexOf("aix")  > 0);      // IBM
  this.aix1   = (agt.indexOf("aix 1") > 0);
  this.aix2   = (agt.indexOf("aix 2") > 0);
  this.aix3   = (agt.indexOf("aix 3") > 0);
  this.aix4   = (agt.indexOf("aix 4") > 0);
  this.linux  = (agt.indexOf("inux") > 0);
  this.sco    = (agt.indexOf("sco") > 0) || (agt.indexOf("unix_sv") > 0);
  this.mpras  = (agt.indexOf("ncr") > 0);
  this.sinix  = (agt.indexOf("sinix") > 0);
  this.bsd    = (agt.indexOf("bsd") > 0);
  this.freebsd= (agt.indexOf("freebsd") > 0);
  this.reliant= (agt.indexOf("reliantunix") > 0);
  this.dec    = ((agt.indexOf("dec") > 0) || (agt.indexOf("osf1") > 0) ||
                (agt.indexOf("dec_alpha") > 0) || (agt.indexOf("alphaserver") > 0) ||
                (agt.indexOf("ultrix") > 0) || (agt.indexOf("alphastation") > 0));
  this.unixware = (agt.indexOf("unix_system_v") > 0);
  this.unix   = ((agt.indexOf("x11") > 0) || this.sun || this.irix || this.hpux ||
                this.sco || this.unixware || this.mpras || this.reliant || this.dec ||
                this.sinix || this.aix || this.linux || this.bsd || this.freebsd);

  // * OTHERS *
  this.vms    = ((agt.indexOf("vax") > 0) || (agt.indexOf("openvms") > 0));
  this.os2    = ((agt.indexOf("os/2") > 0) || (agt.indexOf("ibm-webexplorer") > 0) ||
                (navigator.appVersion.indexOf("OS/2") > 0));
}
