// RICONOSCIMENTO DEL CLIENT

// Basato sull'Ultimate client-side JavaScript client sniff 3.05 © Netscape Communications
// web http://developer.netscape.com
// Permission granted to reuse and distribute.
// Revised 17 May 99 to add is_nav5up and is_ie5up (see below).
// Revised 20 Dec 00 to add is_gecko and change is_nav5up to is_nav6up
//                      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 28 Feb 02 by Fabio Rufino Gallo to add winXP detection
// Revised 18 Sep 02 by Fabio Rufino Gallo to add win.NET detection

// Everything you always wanted to know about your JavaScript client
// but were afraid to ask. Creates "is_" variables indicating:
// (1) browser vendor:
//     .nav, .ie, .opera, .hotjava, .webtv, .TVNavigator, .AOLTV
// (2) browser version number:
//     .major (integer indicating major version number: 2, 3, 4 ...)
//     .minor (float indicating full  version number: 2.02, 3.01, 4.04 ...)
// (3) browser vendor AND major version number
//     .nav2, .nav3, .nav4, .nav4up, .nav6, .nav6up, .gecko, .ie3,
//     .ie4, .ie4up, .ie5, .ie5up, .ie5_5, .ie5_5up, .ie6, .ie6up, .hotjava3, .hotjava3up,
//     .opera2, .opera3, .opera4, .opera5, .opera5up, .aol3, .aol4, .aol5, .aol6
// (4) JavaScript version number:
//     .js (float indicating full JavaScript version number: 1, 1.1, 1.2 ...)
// (5) OS platform and version:
//     .win, .win16, .win32, .win31, .win95, .winnt, .win98, .winme, .win2k
//     .os2
//     .mac, .mac68k, .macppc
//     .unix
//     .sun, .sun4, .sun5, .suni86
//     .irix, .irix5, .irix6
//     .hpux, .hpux9, .hpux10
//     .aix, .aix1, .aix2, .aix3, .aix4
//     .linux, .sco, .unixware, .mpras, .reliant
//     .dec, .sinix, .freebsd, .bsd
//     .vms
//
// 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 .ie5up ("IE 5.0 or greater") 
// .opera5up ("Opera 5.0 or greater") instead of .ie5 or .opera5
// to check version in code which you want to work on future
// versions.

function ClientSniffer() {
    // *** BROWSER VERSION CHECK ***
    // Agent string and browser version
    this.agt         = navigator.userAgent.toLowerCase();
    // NOTE: On IE5, these return 4, so use .ie5up to detect IE5.
    this.major       = parseInt(navigator.appVersion);
    this.minor       = 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.
    this.nav         = this.agt.indexOf('mozilla') != -1
                     && this.agt.indexOf('spoofer') == -1
                     && this.agt.indexOf('compatible') == -1
                     && this.agt.indexOf('opera') == -1
                     && this.agt.indexOf('webtv') == -1
                     && this.agt.indexOf('hotjava') == -1;
    this.navonly     = this.nav
                     && (this.agt.indexOf(";nav") != -1 || this.agt.indexOf("; nav") != -1);
    this.nav2        = this.nav
                     && this.major == 2;
    this.nav3        = this.nav
                     && this.major == 3;
    this.nav4        = this.nav
                     && this.major == 4;
    this.nav4up      = this.nav
                     && this.major >= 4;
    this.nav6        = this.nav
                     && this.major == 5;
    this.nav6up      = this.nav
                     && this.major >= 5;
    this.gecko       = this.agt.indexOf('gecko') != -1;

    this.ie          = this.agt.indexOf("msie") != -1
                     && this.agt.indexOf("opera") == -1;
    this.ie3         = this.ie
                     && this.major < 4;
    this.ie4         = this.ie
                     && this.major == 4
                     && this.agt.indexOf("msie 4") != -1;
    this.ie4up       = this.ie
                     && this.major >= 4;
    this.ie5         = this.ie
                     && this.major == 4
                     && this.agt.indexOf("msie 5.0") != -1;
    this.ie5_5       = this.ie
                     && this.major == 4
                     && this.agt.indexOf("msie 5.5") != -1;
    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
                     && this.agt.indexOf("msie 6.") != -1;
    this.ie6up       = this.ie
                     && !this.ie3
                     && !this.ie4
                     && !this.ie5
                     && !this.ie5_5;

    // NOTE: On AOL4, returns false if IE3 is embedded browser
    // or if this is the first browser window opened. Thus the
    // variables this.aol, this.aol3, and this.aol4 aren't 100% reliable.
    this.aol         = this.agt.indexOf("aol") != -1;
    this.aol3        = this.aol
                     && this.ie3;
    this.aol4        = this.aol
                     && this.ie4;
    this.aol5        = this.agt.indexOf("aol 5") != -1;
    this.aol6        = this.agt.indexOf("aol 6") != -1;

    this.opera       = this.agt.indexOf("opera") != -1;
    this.opera2      = this.agt.indexOf("opera 2") != -1
                     || this.agt.indexOf("opera/2") != -1;
    this.opera3      = this.agt.indexOf("opera 3") != -1
                     || this.agt.indexOf("opera/3") != -1;
    this.opera4      = this.agt.indexOf("opera 4") != -1
                     || this.agt.indexOf("opera/4") != -1;
    this.opera5      = this.agt.indexOf("opera 5") != -1
                     || this.agt.indexOf("opera/5") != -1;
    this.opera5up    = this.opera
                     && !this.opera2
                     && !this.opera3
                     && !this.opera4;

    this.webtv       = this.agt.indexOf("webtv") != -1; 

    this.TVNavigator = this.agt.indexOf("navio") != -1
                     || this.agt.indexOf("navio_aoltv") != -1; 
    this.AOLTV       = this.TVNavigator;

    this.hotjava     = this.agt.indexOf("hotjava") != -1;
    this.hotjava3    = this.hotjava
                     && this.major == 3;
    this.hotjava3up  = this.hotjava
                     && this.major >= 3;

    // *** JAVASCRIPT VERSION CHECK ***
    this.js;
    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;
    // 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(this.nav6up) this.js = 1.5;
    // NOTE: ie5up on mac is 1.4
    else if(this.ie5up) this.js = 1.3
    // HACK: no idea for other browsers; always check for JS version with > or >=
    else this.js = 0.0;

    // *** PLATFORM VERSION CHECK ***
    this.win         = this.agt.indexOf("win") != -1
                     || this.agt.indexOf("16bit") != -1;
    // is this a 16 bit compiled version?
    this.win16       = this.agt.indexOf("win16") != -1
                     || this.agt.indexOf("16bit") != -1
                     || this.agt.indexOf("windows 3.1") != -1
                     || this.agt.indexOf("windows 16-bit") != -1;
    this.win31       = this.win16;
    // NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
    //        Win32, so you can't distinguish between Win95 and WinNT.
    this.win95       = this.agt.indexOf("win95") != -1
                     || this.agt.indexOf("windows 95") != -1;
    this.winnt       = this.agt.indexOf("winnt") != -1
                     || this.agt.indexOf("windows nt") != -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".
    this.win98       = this.agt.indexOf("win98") != -1
                     || this.agt.indexOf("windows 98") != -1;
    this.winme       = this.agt.indexOf("win 9x 4.90") != -1;
    this.win2k       = this.agt.indexOf("windows nt 5.0") != -1;
	this.winxp       = this.agt.indexOf("windows nt 5.1") != -1;
	this.windotnet   = this.agt.indexOf("windows nt 5.2") != -1;
    this.win32       = this.win95
                     || this.winnt
                     || this.win98
                     || this.winme
                     || this.win2k
                     || this.winxp
                     || this.windotnet
                     || (this.major >= 4 && navigator.platform == "Win32")
                     || this.agt.indexOf("win32") != -1
                     || this.agt.indexOf("32bit") != -1;

    this.os2         = this.agt.indexOf("os/2") != -1
                     || navigator.appVersion.indexOf("OS/2") != -1
                     || this.agt.indexOf("ibm-webexplorer") != -1;

    this.mac         = this.agt.indexOf("mac") != -1;
    // HACK: ie5 js version for mac
    if (this.mac && this.ie5up) this.js = 1.4;
    this.mac68k      = this.mac
                     && (this.agt.indexOf("68k") != -1 || this.agt.indexOf("68000") != -1);
    this.macppc      = this.mac
                     && (this.agt.indexOf("ppc") != -1 || this.agt.indexOf("powerpc") != -1);

    this.sun         = this.agt.indexOf("sunos") != -1;
    this.sun4        = this.agt.indexOf("sunos 4") != -1;
    this.sun5        = this.agt.indexOf("sunos 5") != -1;
    this.suni86      = this.sun
                     && this.agt.indexOf("i86") != -1;
    this.irix        = this.agt.indexOf("irix") != -1; // SGI
    this.irix5       = this.agt.indexOf("irix 5") != -1;
    this.irix6       = this.agt.indexOf("irix 6") != -1
                     || this.agt.indexOf("irix6") != -1;
    this.hpux        = this.agt.indexOf("hp-ux") != -1;
    this.hpux9       = this.hpux
                     && this.agt.indexOf("09.") != -1;
    this.hpux10      = this.hpux
                     && this.agt.indexOf("10.") != -1;
    this.aix         = this.agt.indexOf("aix") != -1; // IBM
    this.aix1        = this.agt.indexOf("aix 1") != -1;    
    this.aix2        = this.agt.indexOf("aix 2") != -1;    
    this.aix3        = this.agt.indexOf("aix 3") != -1;    
    this.aix4        = this.agt.indexOf("aix 4") != -1;    
    this.linux       = this.agt.indexOf("inux") != -1;
    this.sco         = this.agt.indexOf("sco") != -1
                     || this.agt.indexOf("unix_sv") != -1;
    this.unixware    = this.agt.indexOf("unix_system_v") != -1; 
    this.mpras       = this.agt.indexOf("ncr") != -1; 
    this.reliant     = this.agt.indexOf("reliantunix") != -1;
    this.dec         = this.agt.indexOf("dec") != -1
                     || this.agt.indexOf("osf1") != -1
                     || this.agt.indexOf("dec_alpha") != -1
                     || this.agt.indexOf("alphaserver") != -1
                     || this.agt.indexOf("ultrix") != -1
                     || this.agt.indexOf("alphastation") != -1; 
    this.sinix       = this.agt.indexOf("sinix") != -1;
    this.freebsd     = this.agt.indexOf("freebsd") != -1;
    this.bsd         = this.agt.indexOf("bsd") != -1;
    this.unix        = this.agt.indexOf("x11") != -1
                     || 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;

    this.vms         = this.agt.indexOf("vax") != -1
                     || this.agt.indexOf("openvms") != -1;
}