// sniffer v1
// Based on Ultimate client-side JavaScript client sniff
// (C) Netscape Communications 1999.  Permission granted to reuse and distribute.

function Is ()
{
	// 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
    // or is.ie6up to detect IE6.

    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.moz     = ((agt.indexOf('mozilla') != -1) && (agt.indexOf('spoofer')==-1)
                   && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
                   && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
    this.moz2    = (this.moz && (this.major == 2));
    this.moz3    = (this.moz && (this.major == 3));
    this.moz4    = (this.moz && (this.major == 4));
    this.moz4up  = (this.moz && (this.major >= 4));
    this.moz5    = (this.moz && (this.major == 5));
    this.moz5up  = (this.moz && (this.major >= 5));
    this.gecko   = (agt.indexOf('gecko') != -1);

    this.firefox = (agt.indexOf('firefox') != -1);
    this.firefox1 = (agt.indexOf('firefox/1.0') != -1);
    this.firefox1up = (this.firefox && !this.firefox1);
	this.firefox1_5 = (agt.indexOf('firefox/1.5') != -1);
	this.firefox1_5up = (this.firefox1up && !this.firefox1_5);
	this.firefox2 = (agt.indexOf('firefox/2.') != -1);
	this.firefox2up = (this.firefox1_5up && !this.firefox2);

	this.seamonkey = (agt.indexOf('seamonkey') != -1);
	this.seamonkey1 = (agt.indexOf('seamonkey/1') != -1);

    this.nav2    = this.moz2;
    this.nav3    = this.moz3;
    this.nav4    = this.moz4;
    this.nav4up  = (this.nav4 || ((this.major >= 4) && (agt.indexOf("netscape") != -1)));
    this.nav     = (this.nav2 || this.nav3 || this.nav4);
    this.nav6    = (this.moz && (this.major == 5) && (agt.indexOf("netscape6/6") != -1));
    this.nav6up  = (this.moz && (this.major >= 5) && (agt.indexOf("netscape") != -1));
    this.nav7    = (this.moz && (this.major == 5) && (agt.indexOf("netscape/7") != -1));
    this.nav7up  = (this.nav6up && !this.nav6);
    this.nav8    = (this.moz && (this.major == 5) && (agt.indexOf("netscape/8") != -1));
    this.nav8up  = (this.nav7up && !this.nav7);
    this.navonly = (this.nav && ((agt.indexOf(";nav") != -1) || (agt.indexOf("; nav") != -1)) );

    this.mozilla  = (this.moz && this.gecko);
    this.mozilla1 = (this.moz && this.gecko && (agt.indexOf("rv:1") != -1));

    this.ie      = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
    this.ie3     = (this.ie && (this.major < 4));
    this.ie4     = (this.ie && (this.major == 4) && (agt.indexOf("msie 4") != -1) );
    this.ie4up   = (this.ie && (this.major >= 4));
    this.ie5     = (this.ie && (this.major == 4) && (agt.indexOf("msie 5.0") != -1) );
    this.ie5up   = (this.ie4up && !this.ie4);
    this.ie5_5   = (this.ie && (this.major == 4) && (agt.indexOf("msie 5.5") != -1));
    this.ie5_5up = (this.ie5up && !this.ie5);
    this.ie6     = (this.ie && (this.major == 4) && (agt.indexOf("msie 6.") != -1) );
    this.ie6up   = (this.ie5_5up && !this.ie5_5);
    this.ie7     = (this.ie && (this.major == 4) && (agt.indexOf("msie 7.") != -1) );
    this.ie7up   = (this.ie6up && !this.ie6);

    this.msn    = (this.ie4up && (agt.indexOf("msn") != -1));
    this.msn2_5 = (this.msn && (agt.indexOf("msn 2.5") != -1));
    this.msn2_6 = (this.msn && (agt.indexOf("msn 2.6") != -1));

    this.aol      = (agt.indexOf("aol") != -1);
    this.aol3     = (this.aol && this.ie3);
    this.aol4ie3  = (this.aol && this.ie3);
    this.aol4ie4  = (this.aol && this.ie4);
    this.aol4     = (this.aol4ie3 || this.aol4ie4);
    this.aol5     = (agt.indexOf("aol 5") != -1);
    this.aol6     = (agt.indexOf("aol 6") != -1);
    this.aol7     = ((agt.indexOf("aol 7") != -1) || agt.indexOf("aol/7") != -1);
    this.aol8     = ((agt.indexOf("aol 8") != -1) || agt.indexOf("aol/8") != -1);
    this.aol9     = ((agt.indexOf("aol 9") != -1) || agt.indexOf("aol/9") != -1);

    this.opera = (agt.indexOf("opera") != -1);
    this.opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
    this.opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
    this.opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
    this.opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
    this.opera5up = (this.opera && !this.opera2 && !this.opera3 && !this.opera4);
    this.opera6 = (agt.indexOf("opera 6") != -1 || agt.indexOf("opera/6") != -1);
    this.opera6up = (this.opera5up && !this.opera5);
	this.opera7 = (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1);
    this.opera7up = (this.opera6up && !this.opera6);
    this.opera8 = (agt.indexOf("opera 8.0") != -1 || agt.indexOf("opera/8.0") != -1);
    this.opera8up = (this.opera7up && !this.opera7);
    this.opera8_5 = (agt.indexOf("opera 8.5") != -1 || agt.indexOf("opera/8.5") != -1);
    this.opera8_5up = (this.opera8up && !this.opera8);
    this.opera9 = (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1);
    this.opera9up = (this.opera8_5up && !this.opera8_5);

    this.webtv = (agt.indexOf("webtv") != -1);

    this.TVNavigator = ((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1));
    this.AOLTV = this.TVNavigator;

    this.hotjava = (agt.indexOf("hotjava") != -1);
    this.hotjava3 = (this.hotjava && (this.major == 3));
    this.hotjava3up = (this.hotjava && (this.major >= 3));

	this.konqueror = (agt.indexOf("konqueror") != -1);
	this.safari = ((agt.indexOf('safari')!=-1) && (agt.indexOf('mac')!=-1));
    this.khtml  = (this.safari || this.konqueror);

	function jsVersion()
	{
		document.write('<script language="JavaScript1.0"> var jsVer=1.0; </script>');
		document.write('<script language="JavaScript1.1"> var jsVer=1.1; </script>');
		document.write('<script language="JavaScript1.2"> var jsVer=1.2; </script>');
		document.write('<script language="JavaScript1.3"> var jsVer=1.3; </script>');
		document.write('<script language="JavaScript1.4"> var jsVer=1.4; </script>');
		document.write('<script language="JavaScript1.5"> var jsVer=1.5; </script>');
		document.write('<script language="JavaScript2.0"> var jsVer=2.0; </script>');
		return jsVer;
	}
	this.js = jsVersion();

    // *** PLATFORM ***
    this.win   = ( (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.
    this.win95 = ((agt.indexOf("win95") != -1) || (agt.indexOf("windows 95") != -1));

    // is this a 16 bit compiled version?
    this.win16 = ((agt.indexOf("win16") != -1) ||
               (agt.indexOf("16bit") != -1) || (agt.indexOf("windows 3.1") != -1) ||
               (agt.indexOf("windows 16-bit") != -1) );

    this.win31 = ((agt.indexOf("windows 3.1") != -1) || (agt.indexOf("win16") != -1) ||
                    (agt.indexOf("windows 16-bit") != -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 = ((agt.indexOf("win98") != -1) || (agt.indexOf("windows 98") != -1));
    this.winnt = ((agt.indexOf("winnt") != -1) || (agt.indexOf("windows nt") != -1));
    this.win32 = (this.win95 || this.winnt || this.win98 ||
                    ((this.major >= 4) && (navigator.platform == "Win32")) ||
                    (agt.indexOf("win32") != -1) || (agt.indexOf("32bit") != -1));

    this.winme = ((agt.indexOf("win 9x 4.90") != -1));
    this.win2k = ((agt.indexOf("windows nt 5.0") != -1) || (agt.indexOf("windows 2000") != -1));
    this.winxp = ((agt.indexOf("windows nt 5.1") != -1) || (agt.indexOf("windows xp") != -1));
    this.win2k3 = ((agt.indexOf("windows nt 5.2")!= -1) || (agt.indexOf("windows 2003") != -1));

	this.dotnet = ((agt.indexOf(".net clr") != -1));
	this.dotnet1 = ((agt.indexOf(".net clr") != -1) && (agt.indexOf(".net clr 1.0.3705") != -1));
	this.dotnet1_1 = ((agt.indexOf(".net clr") != -1) && (agt.indexOf(".net clr 1.1.4322") != -1));
	this.dotnet2 = ((agt.indexOf(".net clr") != -1) && (agt.indexOf(".net clr 2.0.50727") != -1));

    this.os2   = ((agt.indexOf("os/2") != -1) ||
                    (navigator.appVersion.indexOf("OS/2") != -1) ||
                    (agt.indexOf("ibm-webexplorer") != -1));

    this.mac68k = ((agt.indexOf("68k") != -1) || (agt.indexOf("68000") != -1));
    this.macppc = ((agt.indexOf("ppc") != -1) || (agt.indexOf("powerpc") != -1));
    this.mac    = (this.mac68k || this.macppc || (agt.indexOf("mac") != -1));
    // hack ie5 js version for mac
    if (this.mac && this.ie5up) this.js = 1.4;
    // macos detection not a exact science, too little info in ua
    this.macos  = (this.mac && ((agt.indexOf("mac os") != -1) ||
                                (agt.indexOf("macos") != -1) ||
                                this.ie));
    this.macos8 = (this.macos && ((agt.indexOf("os 8") != -1) ||
                                  (agt.indexOf("os8") != -1)));
    // ie5.13 reports as ie5.12 on os x
    this.macos9 = ((this.mac && (this.ie5 && (agt.indexOf("msie 5.13") != -1))) ||
                   (this.macos && ((agt.indexOf("os 9") != -1) ||
                                   (agt.indexOf("os9") != -1))));
    this.macosx = (this.macos && ((agt.indexOf("os x") != -1) ||
                                  (agt.indexOf("osx") != -1)));
	this.macosxintel = (this.macosx && (agt.indexOf("intel") != -1));

    this.sun   = (agt.indexOf("sunos")!=-1);
    this.sun4  = (agt.indexOf("sunos 4")!=-1);
    this.sun5  = (agt.indexOf("sunos 5")!=-1);
    this.suni86= (this.sun && (agt.indexOf("i86")!=-1));
    this.irix  = (agt.indexOf("irix") !=-1);    // SGI
    this.irix5 = (agt.indexOf("irix 5") !=-1);
    this.irix6 = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));
    this.hpux  = (agt.indexOf("hp-ux")!=-1);
    this.hpux9 = (this.hpux && (agt.indexOf("09.")!=-1));
    this.hpux10= (this.hpux && (agt.indexOf("10.")!=-1));
    this.aix   = (agt.indexOf("aix") !=-1);      // IBM
    this.aix1  = (agt.indexOf("aix 1") !=-1);
    this.aix2  = (agt.indexOf("aix 2") !=-1);
    this.aix3  = (agt.indexOf("aix 3") !=-1);
    this.aix4  = (agt.indexOf("aix 4") !=-1);
    this.linux = (agt.indexOf("inux")!=-1);
    this.sco   = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1);
    this.unixware = (agt.indexOf("unix_system_v")!=-1);
    this.mpras    = (agt.indexOf("ncr")!=-1);
    this.reliant  = (agt.indexOf("reliantunix")!=-1);
    this.dec   = ((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));
    this.sinix = (agt.indexOf("sinix")!=-1);
    this.freebsd = (agt.indexOf("freebsd")!=-1);
    this.bsd = (agt.indexOf("bsd")!=-1);
    this.unix  = ((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.macosx);

    this.vms   = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));


	// PLUGINS BIT

	this.cookies = (navigator.cookieEnabled) ? true : false;
	if (typeof navigator.cookieEnabled == "undefined" && !this.cookies)
	{
		document.cookie = "testcookie";
		this.cookies = (document.cookie.indexOf("testcookie")!=-1) ? true : false;
	}

	//java
	this.plugin_java = navigator.javaEnabled() ? true : false;
	if (navigator.javaEnabled() && typeof java != 'undefined')
	{
		this.plugin_java_ver = parseFloat(java.lang.System.getProperty("java.version").split('_')[0]);
		this.plugin_java_ver = Math.round(this.plugin_java_ver*10)/10;
	}
	else
	{
		this.plugin_java_ver = 'unknown';
	}

	if (this.ie && this.win)
	{
		//detect using IE way
		//check for acrobat
		this.plugin_acrobat_ver = 0;
		if (detectIE("PDF.PdfCtrl.4")) this.plugin_acrobat_ver = 4;
		if (detectIE("PDF.PdfCtrl.5")) this.plugin_acrobat_ver = 5;
		if (detectIE("PDF.PdfCtrl.6")) this.plugin_acrobat_ver = 6;
		if (detectIE("AcroPDF.PDF.1")) this.plugin_acrobat_ver = 7;
		this.plugin_acrobat = (this.plugin_acrobat_ver > 0);

		//check for flash
		this.plugin_flash_ver = 0;
		if (detectIE("ShockwaveFlash.ShockwaveFlash.1")) this.plugin_flash_ver = 1;
		//there is no ShockwaveFlash.ShockwaveFlash.2
		if (detectIE("ShockwaveFlash.ShockwaveFlash.3")) this.plugin_flash_ver = 3;
		if (detectIE("ShockwaveFlash.ShockwaveFlash.4")) this.plugin_flash_ver = 4;
		if (detectIE("ShockwaveFlash.ShockwaveFlash.5")) this.plugin_flash_ver = 5;
		if (detectIE("ShockwaveFlash.ShockwaveFlash.6")) this.plugin_flash_ver = 6;
		if (detectIE("ShockwaveFlash.ShockwaveFlash.7")) this.plugin_flash_ver = 7;
		if (detectIE("ShockwaveFlash.ShockwaveFlash.8")) this.plugin_flash_ver = 8;
		this.plugin_flash = (this.plugin_flash_ver > 0);

		//check for quicktime
		try
		{
			oQTime=new ActiveXObject('QuickTimeCheckObject.QuickTimeCheck.1');
			if (oQTime)
			{
				this.plugin_quicktime = oQTime.IsQuickTimeAvailable(0);
				this.plugin_quicktime_ver = parseInt(oQTime.QuickTimeVersion.toString(16).substring(0,3))/100;
			}
		}
		catch(e)
		{
			this.plugin_quicktime = false;
			this.plugin_quicktime_ver = 0;
        }

		//check for shockwave
		this.plugin_shockwave_ver = 0;
		if (detectIE("SWCtl.SWCtl.1")) this.plugin_shockwave_ver = 6;
		if (detectIE("SWCtl.SWCtl.7")) this.plugin_shockwave_ver = 7;
		if (detectIE("SWCtl.SWCtl.7.5")) this.plugin_shockwave_ver = 7.5;
		if (detectIE("SWCtl.SWCtl.8")) this.plugin_shockwave_ver = 8;
		if (detectIE("SWCtl.SWCtl.8.5")) this.plugin_shockwave_ver = 8.5;
		if (detectIE("SWCtl.SWCtl.9")) this.plugin_shockwave_ver = 9;
		if (detectIE("SWCtl.SWCtl.9.5")) this.plugin_shockwave_ver = 9.5;
		this.plugin_shockwave = (this.plugin_shockwave_ver > 0);

		//check for windowsmedia
		try
		{
			oWMP=new ActiveXObject('WMPlayer.OCX.7');
			if (oWMP)
			{
				this.plugin_windowsmedia = true;
				this.plugin_windowsmedia_ver = parseFloat(oWMP.versionInfo);
				if (this.plugin_windowsmedia_ver.toString().length == 1) this.plugin_windowsmedia_ver += '.0';
			}
		}
		catch(e)
		{
			this.plugin_windowsmedia = false;
			this.plugin_windowsmedia_ver = 0;
		}

		//check for adobe svg
		this.plugin_svg = false;
		if (detectIE("Adobe.SVGCtl")) this.plugin_svg = true;

		//check for authorware
		this.plugin_authorware = false;
		if (detectIE("Macromedia.AuthorwareShockwaveControl.1")) this.plugin_authorware = true;

		//check for realplayer
		this.plugin_realplayer = false;
		if (detectIE("rmocx.RealPlayer G2 Control.1")) this.plugin_realplayer = true;

	}
	else if (this.moz || !this.win)
	{
		if (navigator.plugins && navigator.plugins.length)
		{
			//acrobat
			this.plugin_acrobat = false;
			this.plugin_acrobat_ver = 0;
			for (x=0; x < navigator.plugins.length; x++)
			{
				if (navigator.plugins[x].name.indexOf('Adobe Acrobat') != -1)
				{
					this.plugin_acrobat_ver = parseFloat(navigator.plugins[x].description.split('Version ')[1]);
					this.plugin_acrobat = true;
					break;
				}
			}

			//flash
			this.plugin_flash = false;
			this.plugin_flash_ver = 0;
			for (x=0; x < navigator.plugins.length; x++)
			{
				if (navigator.plugins[x].name.indexOf('Shockwave Flash') != -1)
				{
					this.plugin_flash_ver = parseFloat(navigator.plugins[x].description.split('Shockwave Flash ')[1].split(" ")[0]);
					this.plugin_flash = true;
					break;
				}
			}

			//quicktime
			this.plugin_quicktime = false;
			this.plugin_quicktime_ver = 0;
			for (x=0; x < navigator.plugins.length; x++)
			{
				if (navigator.plugins[x].name.indexOf('QuickTime Plug-in') != -1)
				{
					this.plugin_quicktime_ver = navigator.plugins[x].name.split('QuickTime Plug-in ')[1].split(' ')[0];
					this.plugin_quicktime = true;
					break;
				}
			}

			//shockwave
			this.plugin_shockwave = false;
			this.plugin_shockwave_ver = 0;
			for (x=0; x<navigator.plugins.length; x++)
			{
				if (navigator.plugins[x].name.indexOf('Shockwave for Director') != -1)
				{
					this.plugin_shockwave_ver = parseFloat(navigator.plugins[x].description.split('version ')[1]);
					this.plugin_shockwave = true;
					break;
				}
			}

			//windowsmedia
			this.plugin_windowsmedia = false;
			this.plugin_windowsmedia_ver = 0;
			for (x=0; x<navigator.plugins.length; x++)
			{
				if (navigator.plugins[x].name.indexOf('Windows Media') != -1)
				{
					this.plugin_windowsmedia = true;
					break;
				}
			}

			//adobe svg
			this.plugin_svg = ((navigator.mimeTypes["image/svg"] && navigator.mimeTypes["image/svg"].enabledPlugin != null) ||
								(navigator.mimeTypes["image/svg+xml"] && navigator.mimeTypes["image/svg+xml"].enabledPlugin != null) ||
      							(navigator.mimeTypes["image/svg-xml"] && navigator.mimeTypes["image/svg-xml"].enabledPlugin != null)) ? true : false;

			//authorware
			this.plugin_authorware = false;
			//this.plugin_authorware_ver = 0;
			for (x=0; x<navigator.plugins.length; x++)
			{
				if (navigator.plugins[x].name.indexOf('authorware') != -1)
				{
					//this.plugin_authorware_ver = parseFloat(navigator.plugins[x].description.split('version ')[1]);
					this.plugin_authorware = true;
					break;
				}
			}

			//realplayer
			this.plugin_realplayer = (navigator.mimeTypes["audio/x-pn-realaudio-plugin"] &&
										navigator.mimeTypes["audio/x-pn-realaudio-plugin"].enabledPlugin != null) ? true : false;
		}
	}
}

function detectIE(ClassID)
{
	result = false; //reset result
	//write out VBscript to create object for requested plugin
	document.write('<SCRIPT LANGUAGE=VBScript>\n on error resume next \n result = IsObject(CreateObject("' + ClassID + '"))</SCRIPT>\n');
	return result;
}

var is;
var isIE3Mac = false;
// this section is designed specifically for IE3 for the Mac

if ((navigator.appVersion.indexOf("Mac")!=-1) && (navigator.userAgent.indexOf("MSIE")!=-1) && (parseInt(navigator.appVersion)==3))
{
	isIE3Mac = true;
}
else
{
	is = new Is();
}