<!--

// Ultimate client-side JavaScript client sniff. Version 3.03

// (C) Netscape Communications 1999-2001.  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 25 Aug 03 to add NS7 detection

// Everything you always wanted to know about your JavaScript client
// but were afraid to ask. Creates "is_" variables indicating:
// (1) browser vendor:
//     is_nav, is_ie, is_opera, is_aol, is_webtv, is_TVNavigator
// (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
//     is_nav2, is_nav3, is_nav4, is_nav4up, is_nav6, is_nav6up, is_nav61, is_nav62, is_nav7, is_gecko
//     is_ie3, is_ie4, is_ie4up, is_ie5, is_ie5up, is_ie5_5, is_ie5_5up, is_ie6, is_ie6up,
//     is_opera2, is_opera3, is_opera4, is_opera5, is_opera5up
// (4) OS platform and version:
//     is_win, is_win16, is_win32, is_win31, is_win95, is_winnt, is_win98, is_winme, is_win2k
//     is_mac, is_mac68k, is_macppc
//     is_linux
//
// 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 is_ie5up ("IE 5.0 or greater") 
// is_opera5up ("Opera 5.0 or greater") instead of is_ie5 or is_opera5
// to check version in code which you want to work on future
// versions.

    // convert all characters to lowercase to simplify testing
    var agt=navigator.userAgent.toLowerCase()+ " ";

    // *** BROWSER VERSION ***
    // Note: On IE5, these return 4, so use is_ie5up to detect IE5.
    var is_major = parseInt(navigator.appVersion);
    var is_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.
	// NAVIGATOR USER STRINGS   http://devedge.netscape.com/viewsource/2002/gecko-useragent-strings/
    var is_nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
                && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
                && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)
                && (agt.indexOf('safari')==-1) && (agt.indexOf('firefox')==-1)
                && (agt.indexOf('chrome')==-1) && (agt.indexOf('camino')==-1));
    var is_nav2 = (is_nav && (is_major == 2));
    var is_nav3 = (is_nav && (is_major == 3));
    var is_nav4 = (is_nav && (is_major == 4));
    var is_nav4up = (is_nav && (is_major >= 4));
    var is_navonly      = (is_nav && ((agt.indexOf(";nav") != -1) ||
                          (agt.indexOf("; nav") != -1)) );
    var is_nav6 = (is_nav && (agt.indexOf("netscape6/6.") != -1));
    var is_nav6up = (is_nav && (is_major >= 5));
    var is_nav7 = (is_nav && (agt.indexOf("netscape/7") != -1));

    var is_gecko  = ((agt.indexOf('gecko') != -1) && (agt.indexOf('webkit') == -1));
    var is_webkit = (agt.indexOf('webkit') != -1);

    var is_safari = ((agt.indexOf('safari') != -1) && (agt.indexOf('chrome') == -1));
    var is_chrome = ((agt.indexOf('safari') != -1) && (agt.indexOf('chrome') != -1));
    var is_camino = (agt.indexOf('camino') != -1);
    var is_ff = ((agt.indexOf('firefox') != -1) && (agt.indexOf('camino') == -1));

	if (is_gecko) {
		// return the rv value of a Gecko user agent
		// as a floating point number. 
		// returns -1 for non-gecko browsers, 
		//          0 for pre Netscape 6.1/Gecko 0.9.1 browsers
		//          number > 0 where each portion of 
		//          the rv value delimited by . 
		//          will be treated as value out of 100.
		//          e.g. for rv: 3.12.42, 
		//          getGeckoRv() returns 3.1242
		//          
		var rvValue = 0;
		var ua      = agt.toLowerCase();
		var rvStart = ua.indexOf('rv:');
		var rvEnd   = ua.indexOf(')', rvStart);
		var rv      = ua.substring(rvStart+3, rvEnd);
		var rvParts = rv.split('.');
		var exp     = 1;

		for (var i = 0; i < rvParts.length; i++) {
			var val = parseInt(rvParts[i]);
			rvValue += val / exp;
			exp *= 100;
		}

		var rv = rvValue;
	}


	if (is_webkit) {
		var wkValue = 0;
		var ua      = agt.toLowerCase();
		var wkStart = ua.indexOf('webkit/');
		var wkEnd   = ua.indexOf(' ', wkStart);
		var wk      = ua.substring(wkStart+7, wkEnd);
		var wkParts = wk.split('.');
		var exp     = 1;

		for (var i = 0; i < wkParts.length; i++) {
			var val = parseInt(wkParts[i]);
			wkValue += val / exp;
			exp *= 100;
		}

		var wk = wkValue;
	}

    var browser_version = "";

    var is_ff2	  = (is_ff && (agt.indexOf("firefox/2") != -1));
    var is_ff3	  = (is_ff && (agt.indexOf("firefox/3") != -1));

    var is_safari2 = (is_safari && (wk > 400) && (wk < 500));
    var is_safari3 = (is_safari && (wk > 500) && (wk < 600));

    var is_ie     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
    var is_ie3    = (is_ie && (is_major < 4));
    var is_ie4    = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
    var is_ie4up  = (is_ie && (is_major >= 4));
    var is_ie5    = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );
    var is_ie5_5  = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
    var is_ie5up  = (is_ie && !is_ie3 && !is_ie4);
    var is_ie5_5up =(is_ie && !is_ie3 && !is_ie4 && !is_ie5);
    var is_ie6    = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) );
    var is_ie6up  = (is_ie && !is_ie3 && !is_ie4 && !is_ie5 && !is_ie5_5);
    var is_ie7	  = (is_ie && (is_major == 4) && (agt.indexOf("msie 7.")!=-1) );
    var is_ie7up  = (is_ie && !is_ie3 && !is_ie4 && !is_ie5 && !is_ie5_5 && !is_ie6);
    var is_ie8	  = (is_ie && (is_major == 4) && (agt.indexOf("msie 8.")!=-1) );
    var is_ie8up  = (is_ie && !is_ie3 && !is_ie4 && !is_ie5 && !is_ie5_5 && !is_ie6 && !is_ie7);

    // KNOWN BUG: On AOL4, returns false if IE3 is 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.
    var is_aol   = (agt.indexOf("aol") != -1);
    var is_aol3  = (is_aol && is_ie3);
    var is_aol4  = (is_aol && is_ie4);
    var is_aol5  = (agt.indexOf("aol 5") != -1);
    var is_aol6  = (agt.indexOf("aol 6") != -1);
    var is_aol7  = (agt.indexOf("aol 7") != -1);
    var is_aol8  = (agt.indexOf("aol 8") != -1);
    var is_aol9  = (agt.indexOf("aol 9") != -1);

    var is_opera = (agt.indexOf("opera") != -1);
    var is_opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
    var is_opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
    var is_opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
    var is_opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
    var is_opera6 = (agt.indexOf("opera 6") != -1 || agt.indexOf("opera/6") != -1);
    var is_opera7 = (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1);
    var is_opera8 = (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1);
    var is_opera9 = (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1);
    var is_opera5up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4);
    var is_opera6up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5);
    var is_opera7up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5 && !is_opera6);
    var is_opera8up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5 && !is_opera6 && !is_opera7);
    var is_opera9up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5 && !is_opera6 && !is_opera7 && !is_opera8);

    var is_webtv = (agt.indexOf("webtv") != -1); 

    if (is_safari3) {
	browser_version = agt.substring(agt.indexOf('version/')+8,agt.indexOf(' ', agt.indexOf('version/')));
    }

    if (is_safari2) {
	browser_version = "2.0.x";
    }

    if (is_ff) {
	browser_version = agt.substring(agt.indexOf('firefox/')+8,agt.indexOf(' ', agt.indexOf('firefox/')));
    }	

    if (is_camino) {
	browser_version = agt.substring(agt.indexOf('camino/')+7,agt.indexOf(' ', agt.indexOf('camino/')));
    }	
    
    if (is_chrome) {
	browser_version = agt.substring(agt.indexOf('chrome/')+7,agt.indexOf(' ', agt.indexOf('chrome/')));
    }	

    if (is_ie) {
	browser_version = agt.substring(agt.indexOf('msie ')+5,agt.indexOf(';', agt.indexOf('msie ')));
    }

    // *** PLATFORM ***
    var is_win   = ((agt.indexOf("windows")!=-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 is_win95 = ((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1));

    // is this a 16 bit compiled version?
    var is_win16 = ((agt.indexOf("win16")!=-1) || 
               (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1) || 
               (agt.indexOf("windows 16-bit")!=-1) );  

    var is_win31 = ((agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) ||
                    (agt.indexOf("windows 16-bit")!=-1));

    var is_winme = ((agt.indexOf("win 9x 4.90")!=-1));
    var is_win2k = ((agt.indexOf("windows nt 5.0")!=-1));
    var is_winxp = ((agt.indexOf("windows nt 5.1")!=-1));
    var is_winvista = ((agt.indexOf("windows nt 6.0")!=-1));
    var is_win7  = ((agt.indexOf("windows nt 6.1")!=-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 is_win98 = ((agt.indexOf("win98")!=-1) || (agt.indexOf("windows 98")!=-1));
    var is_winnt = ((agt.indexOf("winnt")!=-1) || (agt.indexOf("windows nt")!=-1));
    var is_win32 = (is_win95 || is_winnt || is_win98 || 
                    ((is_major >= 4) && (navigator.platform == "Win32")) ||
                    (agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1));

    var is_os2   = ((agt.indexOf("os/2")!=-1) || 
                    (navigator.appVersion.indexOf("OS/2")!=-1) ||   
                    (agt.indexOf("ibm-webexplorer")!=-1));

    var is_mac    = ((agt.indexOf("macintosh")!=-1) || (agt.indexOf("mac os") != -1));

    var is_mac68k = (is_mac && ((agt.indexOf("68k")!=-1) || (agt.indexOf("68000")!=-1)));
    var is_macppc = (is_mac && ((agt.indexOf("ppc")!=-1) || (agt.indexOf("powerpc")!=-1)));
    var is_macintel = (is_mac && (agt.indexOf("intel") != -1));

    var is_iphone = (is_mac && ((agt.indexOf("iphone")!=-1) && (agt.indexOf("ipod")==-1)));
    var is_ipod   = (is_mac && ((agt.indexOf("iphone")!=-1) && (agt.indexOf("ipod")!=-1)));

    var is_linux = ((agt.indexOf("linux")!=-1) || (agt.indexOf("bsd")!=-1));

//-->

