// JavaScript Browser Sniffer
// Eric Krok, Andy King, Michel Plungjan Jan. 31, 2002
// see http://www.webreference.com/ for more information
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
//  (at your option) any later version.

function inAgt(str){
	return agt.indexOf(str);
}	

var objClient = new Object();
// convert all characters to lowercase to simplify testing
var agt=navigator.userAgent.toLowerCase();
var appVer = navigator.appVersion.toLowerCase();
var isT = true;
var isF = false;

// *** BROWSER VERSION ***
var intMinor = parseFloat(appVer);
var intMajor = parseInt(intMinor);

objClient.isOpera = (inAgt("opera") != -1);
objClient.isOpera2 = (inAgt("opera 2") != -1 || inAgt("opera/2") != -1);
objClient.isOpera3 = (inAgt("opera 3") != -1 || inAgt("opera/3") != -1);
objClient.isOpera4 = (inAgt("opera 4") != -1 || inAgt("opera/4") != -1);
objClient.isOpera5 = (inAgt("opera 5") != -1 || inAgt("opera/5") != -1);
objClient.isOpera6 = (inAgt("opera 6") != -1 || inAgt("opera/6") != -1); // new 020128- abk
objClient.isOpera7 = (inAgt("opera 7") != -1 || inAgt("opera/7") != -1); // new 021205- dmr
objClient.isOpera5up = (objClient.isOpera && !objClient.isOpera2 && !objClient.isOpera3 && !objClient.isOpera4);
objClient.isOpera6up = (objClient.isOpera && !objClient.isOpera2 && !objClient.isOpera3 && !objClient.isOpera4 && !objClient.isOpera5); // new020128
objClient.isOpera7up = (objClient.isOpera && !objClient.isOpera2 && !objClient.isOpera3 && !objClient.isOpera4 && !objClient.isOpera5 && !objClient.isOpera6); // new021205 -- dmr

// Note: On IE, start of appVersion return 3 or 4
// which supposedly is the version of Netscape it is compatible with.
// So we look for the real version further on in the string
var iePos = appVer.indexOf('msie');
if (iePos !=-1) {
	intMinor = parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos)))
	intMajor = parseInt(intMinor);
}

// ditto Konqueror
objClient.isKonq = isF;
var kqPos = inAgt('konqueror');
if (kqPos !=-1) {
	objClient.isKonq  = isT;
	intMinor = parseFloat(agt.substring(kqPos+10,inAgt(';',kqPos)));
	intMajor = parseInt(intMinor);
}                                 

objClient.isgetElementById   = (document.getElementById) ? isT : isF; // 001121-abk
objClient.isgetElementsByTagName = (document.getElementsByTagName) ? isT : isF; // 001127-abk
objClient.isdocumentElement = (document.documentElement) ? isT : isF; // 001121-abk

objClient.isSafari = ((inAgt('safari')!=-1)&&(inAgt('mac')!=-1))?isT:isF;
objClient.isKhtml  = (objClient.isSafari || objClient.isKonq);

objClient.isGecko = ((!objClient.isKhtml)&&(navigator.product)&&(navigator.product.toLowerCase()=="gecko"))?isT:isF;
objClient.intGver  = 0;
if (objClient.isGecko) objClient.intGver=Number(navigator.productSub);

objClient.isMoz = ((inAgt('mozilla/5')!=-1) && (inAgt('spoofer')==-1) && (inAgt('compatible')==-1) && 
					(inAgt('opera')==-1) && (inAgt('webtv')==-1) && (inAgt('hotjava')==-1) && 
					(objClient.isGecko) && ((navigator.vendor=="")||(navigator.vendor=="Mozilla")||(navigator.vendor=="Debian")));
objClient.isFb = ((inAgt('mozilla/5')!=-1) && (inAgt('spoofer')==-1) &&
					(inAgt('compatible')==-1) && (inAgt('opera')==-1)  &&
					(inAgt('webtv')==-1) && (inAgt('hotjava')==-1)     &&
					(objClient.isGecko) && (navigator.vendor=="Firebird"));
objClient.isFx = ((inAgt('mozilla/5')!=-1) && (inAgt('spoofer')==-1) &&
					(inAgt('compatible')==-1) && (inAgt('opera')==-1)  &&
					(inAgt('webtv')==-1) && (inAgt('hotjava')==-1)     &&
					(objClient.isGecko) && (navigator.vendor=="Firefox"));

if ((objClient.isMoz)||(objClient.isFb)||(objClient.isFx)) {  // 032504 - dmr
	objClient.intMozVer = (navigator.vendorSub)?navigator.vendorSub:0;
	if(!(objClient.intMozVer)) {
		objClient.intMozVer = inAgt('rv:');
		objClient.intMozVer = agt.substring(objClient.intMozVer+3);
		is_paren   = objClient.intMozVer.indexOf(')');
		objClient.intMozVer = objClient.intMozVer.substring(0,is_paren);
	}
	intMinor = objClient.intMozVer;
	intMajor = parseInt(objClient.intMozVer);
}
objClient.intFbVer = objClient.intMozVer;
objClient.intFxVer = objClient.intMozVer;

objClient.isNav  = ((inAgt('mozilla')!=-1) && (inAgt('spoofer')==-1)
					&& (inAgt('compatible') == -1) && (inAgt('opera')==-1)
					&& (inAgt('webtv')==-1) && (inAgt('hotjava')==-1)
					&& (!objClient.isKhtml) && (!(objClient.isMoz)) && (!objClient.isFb) && (!objClient.isFx));

// Netscape6 is mozilla/5 + Netscape6/6.0!!!
// Mozilla/5.0 (Windows; U; Win98; en-US; m18) Gecko/20001108 Netscape6/6.0
// Changed this to use navigator.vendor/vendorSub - dmr 060502   
// var nav6Pos = inAgt('netscape6');
// if (nav6Pos !=-1) {
if ((navigator.vendor)&&((navigator.vendor=="Netscape6")||(navigator.vendor=="Netscape"))&&(objClient.isNav)) {
	intMajor = parseInt(navigator.vendorSub);
// here we need intMinor as a valid float for testing. We'll
// revert to the actual content before printing the result. 
	intMinor = parseFloat(navigator.vendorSub);
}

objClient.isNav2 = (objClient.isNav && (intMajor == 2));
objClient.isNav3 = (objClient.isNav && (intMajor == 3));
objClient.isNav4 = (objClient.isNav && (intMajor == 4));
objClient.isNav4up = (objClient.isNav && intMinor >= 4);  // changed to intMinor for consistency - dmr, 011001
objClient.isNavOnly = (objClient.isNav && ((inAgt(";nav") != -1) || (inAgt("; nav") != -1)) );

objClient.isNav6   = (objClient.isNav && intMajor==6);    // new 010118 mhp
objClient.isNav6up = (objClient.isNav && intMinor >= 6) // new 010118 mhp

objClient.isNav5   = (objClient.isNav && intMajor == 5 && !objClient.isNav6); // checked for ns6
objClient.isNav5up = (objClient.isNav && intMinor >= 5);

objClient.isNav7   = (objClient.isNav && intMajor == 7);
objClient.isNav7up = (objClient.isNav && intMinor >= 7);

objClient.isIE   = ((iePos!=-1) && (!objClient.isOpera) && (!objClient.isKhtml));
objClient.isIE3  = (objClient.isIE && (intMajor < 4));

objClient.isIE4   = (objClient.isIE && intMajor == 4);
objClient.isIE4up = (objClient.isIE && intMinor >= 4);
objClient.isIE5   = (objClient.isIE && intMajor == 5);
objClient.isIE5up = (objClient.isIE && intMinor >= 5);

objClient.isIE5_5  = (objClient.isIE && (inAgt("msie 5.5") !=-1)); // 020128 new - abk
objClient.isIE5_5up =(objClient.isIE && intMinor >= 5.5);                // 020128 new - abk

objClient.isIE6   = (objClient.isIE && intMajor == 6);
objClient.isIE6up = (objClient.isIE && intMinor >= 6);

// KNOWN BUG: On AOL4, returns false if IE3 is embedded browser
// or if this is the first browser window opened.  Thus the
// variables objClient.isAOL, objClient.isAOL3, and objClient.isAOL4 aren't 100% reliable.

objClient.isAOL   = (inAgt("aol") != -1);
objClient.isAOL3  = (objClient.isAOL && objClient.isIE3);
objClient.isAOL4  = (objClient.isAOL && objClient.isIE4);
objClient.isAOL5  = (inAgt("aol 5") != -1);
objClient.isAOL6  = (inAgt("aol 6") != -1);
objClient.isAOL7  = ((inAgt("aol 7")!=-1) || (inAgt("aol7")!=-1));
objClient.isAOL8  = ((inAgt("aol 8")!=-1) || (inAgt("aol8")!=-1));

objClient.isWebTV = (inAgt("webtv") != -1);

// new 020128 - abk

objClient.isTVNavigator = ((inAgt("navio") != -1) || (inAgt("navio_aoltv") != -1)); 
objClient.isAOLTV = objClient.isTVNavigator;

objClient.isHotJava = (inAgt("hotjava") != -1);
objClient.isHotJava3 = (objClient.isHotJava && (intMajor == 3));
objClient.isHotJava3up = (objClient.isHotJava && (intMajor >= 3));

// end new

// *** JAVASCRIPT VERSION CHECK ***
// Useful to workaround Nav3 bug in which Nav3
// loads <SCRIPT LANGUAGE="JavaScript1.2">.
// updated 020131 by dragle
objClient.intJS = 0;
if (objClient.isNav2 || objClient.isIE3) objClient.intJS = 1.0;
else if (objClient.isNav3) objClient.intJS = 1.1;
else if ((objClient.isOpera5)||(objClient.isOpera6)) objClient.intJS = 1.3; // 020214 - dmr
else if (objClient.isOpera7up) objClient.intJS = 1.5; // 031010 - dmr
else if (objClient.isKhtml) objClient.intJS = 1.5;   // 030110 - dmr
else if (objClient.isOpera) objClient.intJS = 1.1;
else if ((objClient.isNav4 && (intMinor <= 4.05)) || objClient.isIE4) objClient.intJS = 1.2;
else if ((objClient.isNav4 && (intMinor > 4.05)) || objClient.isIE5) objClient.intJS = 1.3;
else if (objClient.isNav5 && !(objClient.isNav6)) objClient.intJS = 1.4;
else if (objClient.isHotJava3up) objClient.intJS = 1.4; // new 020128 - abk
else if (objClient.isNav6up) objClient.intJS = 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 (objClient.isNav && (intMajor > 5)) objClient.intJS = 1.4;
else if (objClient.isIE && (intMajor > 5)) objClient.intJS = 1.3;
else if (objClient.isMoz) objClient.intJS = 1.5;
else if (objClient.isFb||objClient.isFx) objClient.intJS = 1.5; // 032504 - dmr

// what about ie6 and ie6up for js version? abk

// HACK: no idea for other browsers; always check for JS version 
// with > or >=
else objClient.intJS = 0.0;
// HACK FOR IE5 MAC = js vers = 1.4 (if put inside if/else jumps out at 1.3)
if ((inAgt("mac")!=-1) && objClient.isIE5up) objClient.intJS = 1.4; // 020128 - abk

// Done with intMinor testing; revert to real for N6/7
if (objClient.isNav6up) intMinor = Number(navigator.vendorSub);

// *** PLATFORM ***
objClient.isWin   = ( (inAgt("win")!=-1) || (inAgt("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.
objClient.isWin95 = ((inAgt("win95")!=-1) || (inAgt("windows 95")!=-1));

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

objClient.isWin31 = ((inAgt("windows 3.1")!=-1) || (inAgt("win16")!=-1) ||
					(inAgt("windows 16-bit")!=-1));

objClient.isWinME = ((inAgt("win 9x 4.90")!=-1));    // new 020128 - abk
objClient.isWin2k = ((inAgt("windows nt 5.0")!=-1) || (inAgt("windows 2000")!=-1)); // 020214 - dmr
objClient.isWinXP = ((inAgt("windows nt 5.1")!=-1) || (inAgt("windows xp")!=-1)); // 020214 - dmr

// 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".
objClient.isWin98 = ((inAgt("win98")!=-1) || (inAgt("windows 98")!=-1));
objClient.isWinNT = ((inAgt("winnt")!=-1) || (inAgt("windows nt")!=-1) && !objClient.isWinXP);
objClient.isWin32 = (objClient.isWin95 || objClient.isWinNT || objClient.isWin98 ||
					((intMajor >= 4) && (navigator.platform == "Win32")) || 
					(inAgt("win32")!=-1) || (inAgt("32bit")!=-1));

objClient.isMac    = (inAgt("mac")!=-1);
if (objClient.isMac) objClient.isWin = !objClient.isMac; // dmr - 06/20/2002

// additional checks, abk
objClient.isFrames = (window.frames) ? isT : isF;
if (objClient.isFrames) objClient.intFrames = window.frames.length;
else objClient.intFrames = 0;

// java
objClient.isJava = (navigator.javaEnabled());

// Flash checking code adapted from Doc JavaScript information; 
// see http://webref.com/js/column84/2.html

objClient.isFlash = isF;
objClient.intFlashVer = 0;

if ((objClient.isNav||objClient.isOpera||objClient.isMoz||objClient.isFb||objClient.isFx)||(objClient.isMac&&objClient.isIE5up)) {
	var plugin = (navigator.mimeTypes && 
				navigator.mimeTypes["application/x-shockwave-flash"] &&
				navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin) ?
				navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0;
	if (plugin) {
		objClient.isFlash = isT;
		objClient.intFlashVer = parseInt(plugin.description.substring(plugin.description.indexOf(".")-1));
	}
}

if (objClient.isWin&&objClient.isIE4up) {
	document.write(
		'<scr' + 'ipt language=VBScript>' + '\n' +
		'Dim hasPlayer, playerversion' + '\n' +
		'hasPlayer = false' + '\n' +
		'playerversion = 10' + '\n' +
		'Do While playerversion > 0' + '\n' +
		'On Error Resume Next' + '\n' +
		'hasPlayer = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash." & playerversion)))' + '\n' +
		'If hasPlayer = true Then Exit Do' + '\n' +
		'playerversion = playerversion - 1' + '\n' +
		'Loop' + '\n' +
		'objClient.intFlashVer = playerversion' + '\n' +
		'objClient.isFlash = hasPlayer' + '\n' +
		'<\/sc' + 'ript>');
}



// If browser is not supported, redirect to error page

var updatePage = false;

//document.write('objClient.isNav6:'+objClient.isNav6+'<br>');
//document.write('objClient.isGecko:'+objClient.isGecko+'<br>');
//document.write('objClient.isNav7up:'+objClient.isNav7up+'<br>');
//document.write('objClient.isIE5_5up:'+objClient.isIE5_5up+'<br>');


if (objClient.isWin) {



	if (objClient.isNav6 || (!objClient.isGecko && !objClient.isNav7up && !objClient.isIE5_5up && !objClient.isOpera7up)) {
//document.write('a'+'<br>');
		updatePage = true;
	} else if (objClient.isGecko && (objClient.intGver < 1)) {
//document.write('b'+'<br>');
		updatePage = true;
	}
} else if (objClient.isMac) {
	if (!objClient.isGecko && !objClient.isNav7up && !objClient.isSafari  && !objClient.isOpera7up) {
		updatePage = true;
	} else if (objClient.isGecko && (objClient.intGver < 1)) {
		updatePage = true;
	}
}
//document.write('updatePage:'+updatePage+'</br>');
if(updatePage==true){
	window.location = 'updateBrowser.php';
}