// Ultimate client-side JavaScript client sniff. Version 3.03
// (C) Netscape Communications 1999.  Permission granted to reuse and distribute.
// Revised 17 May 99 to add isNav5up and isIE5up (see below).
// Revised 20 Dec 00 to add isGecko and change isNav5up to isNav6up
//                      also added support for IE5.5 Opera4&5 HotJava3 AOLTV
// Revised 22 Feb 01 to correct Javascript Detection for IE 5.x, Opera 4, 
//                      correct Opera 5 detection
//                      add support for winME and win2k
//                      synch with browser-type-oo.js
// Revised 26 Mar 01 to correct Opera detection
// Revised 02 Oct 01 to add IE6 detection
// Revised 06 May 07 to add IE7 detection

// Everything you always wanted to know about your JavaScript client
// but were afraid to ask. Creates "is" variables indicating:
// (1) browser vendor:
//     isNav, isIE, isOpera, isHotJava, isWebTV, isTVNavigator, isAOLTV, agentName, agentFace
// (2) browser version number:
//     majorVer (integer indicating major version number: 2, 3, 4 ...)
//     minorVer (float   indicating full  version number: 2.02, 3.01, 4.04 ...)
// (3) browser vendor AND major version number
//     isNav2, isNav3, isNav4, isNav4up, isNav6, isNav6up, isGecko,
//     isIE3, isIE4, isIE4up, isIE5, isIE5up, isIE5_5, isIE5_5up, isIE6, isIE6up, isIE7, isIE7up
//     isHotJava3, isHotJava3up, isOpera2, isOpera3, isOpera4, isOpera5, isOpera5up,
//     isAOL3, isAOL4, isAOL5, isAOL6
// (4) JavaScript version number:
//     JSver (float indicating full JavaScript version number: 1, 1.1, 1.2 ...)
// (5) OS platform and version:
//     platformName, platformVer
//     isWin, isWin16, isWin32, isWin31, isWin95, isWinNT, isWin98, isWinME, isWin2K, isWinXP, isWin2003
//     isOS2
//     isMac, isMac68k, isMacPPC
//     isUnix
//     isSun, isSun4, isSun5, isSuni86
//     isIrix, isIrix5, isIrix6
//     ishpux, ishpux9, ishpux10
//     isaix, isaix1, isaix2, isaix3, isaix4
//     islinux, issco, isUnixware, isMpras, isreliant
//     isdec, issinix, isfreebsd, isbsd
//     isVMS
//
// See http://www.it97.de/JavaScript/JS_tutorial/bstat/navobj.html and
// http://www.it97.de/JavaScript/JS_tutorial/bstat/Browseraol.html
// for detailed lists of userAgent strings.
//
// Note: you don't want your Nav4 or IE4 code to "turn off" or
// stop working when new versions of browsers are released, so
// in conditional code forks, use isIE5up ("IE 5.0 or greater") 
// isOpera5up ("Opera 5.0 or greater") instead of isIE5 or isOpera5
// to check version in code which you want to work on future
// versions.

    // agent details
    var agentName = "";
    var agentFace = "";
    var platformName = "";
    var platformVer = 0.0;

    // convert all characters to lowercase to simplify testing
    var agt=navigator.userAgent.toLowerCase();

    // *** BROWSER VERSION ***
    // Note: On IE5, these return 4, so use isIE5up to detect IE5.
    var majorVer = parseInt(navigator.appVersion);
    var minorVer = parseFloat(navigator.appVersion);

    // Note: Opera and WebTV spoof Navigator.  We do strict client detection.
    // If you want to allow spoofing, take out the tests for opera and webtv.
    var isMozilla = (agt.indexOf('mozilla')!=-1);

    var isNav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
                && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
                && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
    var isNav2 = (isNav && (majorVer == 2));
    var isNav3 = (isNav && (majorVer == 3));
    var isNav4 = (isNav && (majorVer == 4));
    var isNav4up = (isNav && (majorVer >= 4));
    var isNavonly      = (isNav && ((agt.indexOf(";nav") != -1) ||
                          (agt.indexOf("; nav") != -1)) );
    var isNav6 = (isNav && (majorVer == 5));
    var isNav6up = (isNav && (majorVer >= 5));
    var isNav7 = (isNav && (majorVer == 6));
    var isNav7up = (isNav && (majorVer >= 6));
    var isGecko = (agt.indexOf('gecko') != -1);

    var isIE     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
    var isIE3    = (isIE && (majorVer < 4));
    var isIE4    = (isIE && (majorVer == 4) && (agt.indexOf("msie 4")!=-1) );
    var isIE4up  = (isIE && (majorVer >= 4));
    var isIE5    = (isIE && (majorVer == 4) && (agt.indexOf("msie 5.0")!=-1) );
    var isIE5up  = (isIE && !isIE3 && !isIE4);
    if (isIE5) {
      majorVer = 5;
      minorVer = 5.0; }
    var isIE5_5  = (isIE && (majorVer == 4) && (agt.indexOf("msie 5.5") !=-1));
    var isIE5_5up = (isIE && !isIE3 && !isIE4 && !isIE5);
    if (isIE5_5) {
      majorVer = 5;
      minorVer = 5.5; }
    var isIE6    = (isIE && (majorVer == 4) && (agt.indexOf("msie 6.")!=-1) );
    var isIE6up  = (isIE && !isIE3 && !isIE4 && !isIE5 && !isIE5_5);
    if (isIE6) {
      majorVer = 6;
      minorVer = 6.0; }
    var isIE7    = (isIE && (majorVer == 4) && (agt.indexOf("msie 7.")!=-1) );
    var isIE7up  = (isIE && !isIE3 && !isIE4 && !isIE5 && !isIE5_5 && !isIE6);
    if (isIE7) {
      majorVer = 7;
      minorVer = 7.0; }

    // KNOWN BUG: On AOL4, returns false if IE3 is embedded browser
    // or if this is the first browser window opened.  Thus the
    // variables isAOL, isAOL3, and isAOL4 aren't 100% reliable.
    var isAOL   = (agt.indexOf("aol") != -1);
    var isAOL3  = (isAOL && isIE3);
    var isAOL4  = (isAOL && isIE4);
    var isAOL5  = (agt.indexOf("aol 5") != -1);
    var isAOL6  = (agt.indexOf("aol 6") != -1);

    var isOpera = (agt.indexOf("opera") != -1);
    var isOpera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
    var isOpera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
    var isOpera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
    var isOpera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
    var isOpera5up = (isOpera && !isOpera2 && !isOpera3 && !isOpera4);

    var isWebTV = (agt.indexOf("webtv") != -1); 

    var isTVNavigator = ((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1)); 
    var isAOLTV = isTVNavigator;

    var isHotJava = (agt.indexOf("hotjava") != -1);
    var isHotJava3 = (isHotJava && (majorVer == 3));
    var isHotJava3up = (isHotJava && (majorVer >= 3));

    // *** BROWSER NAME ASSIGNMENT ***
    if (isMozilla) {
      agentName = "Mozilla Browser";
      if (isNavonly) {
        agentFace = "Netscape (Navigator)"; }
      if (agt.indexOf("firefox") != -1) {
        agentFace = "Firefox"; }
      if (agt.indexOf("seamonkey") != -1 || agt.indexOf("sea monkey") != -1) {
        agentFace = "Sea Monkey"; }
      if (agt.indexOf("firebird") != -1) {
        agentFace = "Firebird"; }}
    if (isIE) {
      agentName = "Microsoft Internet Explorer"; }
    if (isAOL) {
      agentName = "AOL Browser"; }
    if (isOpera) {
      agentName = "Opera"; }
    if (isWebTV) {
      agentName = "Web TV"; }
    if (isTVNavigator) {
      agentName = "(AOL) TV Navigator"; }
    if (isHotJava) {
      agentName = "Hot Java"; }
    if (isGecko) {
      if (agentFace != "") {
        agentFace += " - "; }
      agentFace += "Gecko"; }

    // *** JAVASCRIPT VERSION CHECK ***
    var JSver;
    if (isNav2 || isIE3) JSver = 1.0;
    else if (isNav3) JSver = 1.1;
    else if (isOpera5up) JSver = 1.3;
    else if (isOpera) JSver = 1.1;
    else if ((isNav4 && (minorVer <= 4.05)) || isIE4) JSver = 1.2;
    else if ((isNav4 && (minorVer > 4.05)) || isIE5) JSver = 1.3;
    else if (isHotJava3up) JSver = 1.4;
    else if (isNav6 || isGecko) JSver = 1.5;
    // NOTE: In the future, update this code when newer versions of JS
    // are released. For now, we try to provide some upward compatibility
    // so that future versions of Nav and IE will show they are at
    // *least* JS 1.x capable. Always check for JS version compatibility
    // with > or >=.
    else if (isNav6up) JSver = 1.5;
    // NOTE: ie5up on mac is 1.4
    else if (isIE5up) JSver = 1.3

    // HACK: no idea for other browsers; always check for JS version with > or >=
    else JSver = 0.0;

    // *** PLATFORM ***
    var isWin   = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) );
    // NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
    //        Win32, so you can't distinguish between Win95 and WinNT.
    var isWin95 = ((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1));

    // is this a 16 bit compiled version?
    var isWin16 = ((agt.indexOf("win16")!=-1) || 
               (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1) || 
               (agt.indexOf("windows 16-bit")!=-1) );  

    var isWin31 = ((agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) ||
                    (agt.indexOf("windows 16-bit")!=-1));

    var isWinME = ((agt.indexOf("win 9x 4.90")!=-1));
    var isWin2K = ((agt.indexOf("windows nt 5.0")!=-1));
    var isWinXP = ((agt.indexOf("windows nt 5.1")!=-1));
    var isWin2003 = ((agt.indexOf("windows nt 6.0")!=-1));

    // NOTE: 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".
    var isWin98 = ((agt.indexOf("win98")!=-1) || (agt.indexOf("windows 98")!=-1));
    var isWinNT = ((agt.indexOf("winnt")!=-1) || (agt.indexOf("windows nt")!=-1));
    var isWin32 = (isWin95 || isWinNT || isWin98 || 
                    ((majorVer >= 4) && (navigator.platform == "Win32")) ||
                    (agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1));

    var isOS2   = ((agt.indexOf("os/2")!=-1) || 
                    (navigator.appVersion.indexOf("OS/2")!=-1) ||   
                    (agt.indexOf("ibm-webexplorer")!=-1));

    var isMac    = (agt.indexOf("mac")!=-1);
    // hack ie5 js version for mac
    if (isMac && isIE5up) JSver = 1.4;
    var isMac68k = (isMac && ((agt.indexOf("68k")!=-1) || 
                               (agt.indexOf("68000")!=-1)));
    var isMacPPC = (isMac && ((agt.indexOf("ppc")!=-1) || 
                                (agt.indexOf("powerpc")!=-1)));

    var isSun   = (agt.indexOf("sunos")!=-1);
    var isSun4  = (agt.indexOf("sunos 4")!=-1);
    var isSun5  = (agt.indexOf("sunos 5")!=-1);
    var isSuni86= (isSun && (agt.indexOf("i86")!=-1));
    var isIrix  = (agt.indexOf("irix") !=-1);    // SGI
    var isIrix5 = (agt.indexOf("irix 5") !=-1);
    var isIrix6 = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));
    var ishpux  = (agt.indexOf("hp-ux")!=-1);
    var ishpux9 = (ishpux && (agt.indexOf("09.")!=-1));
    var ishpux10= (ishpux && (agt.indexOf("10.")!=-1));
    var isaix   = (agt.indexOf("aix") !=-1);      // IBM
    var isaix1  = (agt.indexOf("aix 1") !=-1);    
    var isaix2  = (agt.indexOf("aix 2") !=-1);    
    var isaix3  = (agt.indexOf("aix 3") !=-1);    
    var isaix4  = (agt.indexOf("aix 4") !=-1);    
    var islinux = (agt.indexOf("inux")!=-1);
    var issco   = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1);
    var isUnixware = (agt.indexOf("unix_system_v")!=-1); 
    var isMpras    = (agt.indexOf("ncr")!=-1); 
    var isreliant  = (agt.indexOf("reliantunix")!=-1);
    var isdec   = ((agt.indexOf("dec")!=-1) || (agt.indexOf("osf1")!=-1) || 
           (agt.indexOf("dec_alpha")!=-1) || (agt.indexOf("alphaserver")!=-1) || 
           (agt.indexOf("ultrix")!=-1) || (agt.indexOf("alphastation")!=-1)); 
    var issinix = (agt.indexOf("sinix")!=-1);
    var isfreebsd = (agt.indexOf("freebsd")!=-1);
    var isbsd = (agt.indexOf("bsd")!=-1);
    var isUnix  = ((agt.indexOf("x11")!=-1) || isSun || isIrix || ishpux || 
                 issco ||isUnixware || isMpras || isreliant || 
                 isdec || issinix || isaix || islinux || isbsd || isfreebsd);

    var isVMS   = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));

    if (isWin) {
      platformName = "Microsoft Windows ";
      if (isWin31) {
        platformName += "3.1";
        platformVer = 3.1; }
      if (isWin95) {
        platformName += "'95"; }
      if (isWin98) {
        platformName += "'98"; }
      if (isWinME) {
        platformName += "Millenium Edition"; }
      if (isWinNT && !isWin2K && !isWinXP) {
        platformName += "NT"; }
      if (isWin2K) {
        platformName += "2000";
        platformVer = 5; }
      if (isWinXP) {
        platformName += "XP"; }
      if (isWin2003) {
        platformName += "2003"; }}
    if (isOS2) {
      platformName = "O/S 2"; }
    if (isMac) {
      platformName = "Apple Mac ";
      if (isMac68k) {
        platformName += "68K"; }
      if (isMacPPC) {
        platformName += "PowerPC"; }}
    if (isSun) {
      platformName = "Sun Microsystems";
      if (isSuni86) {
        platformName += " (i86)"; }}
    if (isIrix) {
      platformName = "SGI / Irix"; }
    if (ishpux) {
      platformName = "HP-UX"; }
    if (isaix) {
      platformName = "IBM / SAIX"; }
    if (islinux) {
      platformName = "Linux"; }
    if (issco) {
      platformName = "sco"; }
    if (isUnixware) {
      platformName = "Unixware / System V"; }
    if (isMpras) {
      platformName = "NCR"; }
    if (isreliant) {
      platformName = "Reliant"; }
    if (isdec) {
      platformName = "DEC / Alpha Station"; }
    if (issinix) {
      platformName = "Sinix"; }
    if (isfreebsd) {
      platformName = "Free BSD"; }
    if (isbsd) {
      platformName = "BSD"; }
    if (isUnix) {
      platformName += " - UNIX"; }
    if (isVMS) {
      platformName = "Open VMS"; }

