/*
Declare and initialise variables.
*/
var d, dom, nu='', brow='', ie, ie4, ie5, ie5x, ie6, ie7;
var ns4, moz, moz_rv_sub, release_date='', moz_brow, moz_brow_nu='', moz_brow_nu_sub='', rv_full=''; 
var mac, win, old, lin, ie5mac, ie5xwin, konq, saf, op, op4, op5, op6, op7;
//
function DetectBrowsers() {
	/*
	Browser, os detection.
	*/
	d = document;
	n = navigator;
	nav = n.appVersion;
	nan = n.appName;
	nua = n.userAgent;
	old = (nav.substring(0,1) < 4);
	mac = (nav.indexOf('Mac') != -1);
	win = (((nav.indexOf('Win') != -1) || (nav.indexOf('NT') != -1)) && !mac) ? true : false;
	lin = (nua.indexOf('Linux') != -1);
	/*
	Begin primary dom/ns4 test.
	This is the most important test on the page.
	*/
	if (!document.layers) {
		dom = (d.getElementById) ? d.getElementById : false;
	} else { 
		/*
		NOTE: Only netscape 4 supports document layers.
		*/
		dom = false; 
		ns4 = true;
	}
	//
	op = (nua.indexOf('Opera') != -1);
	saf = (nua.indexOf('Safari') != -1);
	konq = (!saf && (nua.indexOf('Konqueror') != -1)) ? true : false;
	moz = ((!saf && !konq) && (nua.indexOf('Gecko') != -1)) ? true : false;
	ie = ((nua.indexOf('MSIE') != -1) && !op);
	/*
	
	Opera
	-----
	
	*/
	if (op) {
		str_pos = nua.indexOf('Opera');
		nu = nua.substr((str_pos+6),4);
		brow = 'Opera';
	}
	/*
	
	Safari
	------
	
	*/
	else if (saf) {
		str_pos = nua.indexOf('Safari');
		nu = nua.substr((str_pos+7),5);
		brow = 'Safari';
	}
	/*
	
	Konqueror
	---------
	
	*/
	else if (konq) {
		str_pos = nua.indexOf('Konqueror');
		nu = nua.substr((str_pos+10),3);
		brow = 'Konqueror';
	}
	/*
	
	Mozilla
	--------
	This part is complicated a bit, don't mess with it unless you understand regular expressions.
	NOTE: For most comparisons that are practical, compare the 3 digit rv nubmer, that is the output placed into 'nu'.
	
	*/
	else if (moz) {
		/*
		Regular expression pattern that will be used to extract main version/rv numbers.
		*/
		pattern = /[(); \n]/;
		/*
		Mozilla type array - add to this if you need to.
		*/
		moz_types = new Array('Firebird', 'Phoenix', 'Firefox', 'Iceweasel', 'Galeon', 'K-Meleon', 'Camino', 'Epiphany', 'Netscape6', 'Netscape', 'MultiZilla', 'Gecko Debian', 'rv');
		/*
		Find 'rv' position in 'nua' string.
		*/
		rv_pos = nua.indexOf('rv');
		/*
		Cut out maximum size it can be, eg: 1.8a2, 1.0.0 etc.
		*/
		rv_full = nua.substr(rv_pos + 3, 6);
		/*
		Search for occurance of any of characters in pattern, if found get position of that character.
		*/
		rv_slice = (rv_full.search(pattern) != -1) ? rv_full.search(pattern) : '';
		/*
		Check to make sure there was a result, if not do nothing.
		Otherwise slice out the part that you want if there is a slice position
		*/
		(rv_slice) ? rv_full = rv_full.substr(0, rv_slice) : '';
		/*
		This is the working id number, 3 digits, you'd use this for number comparison, like if nu >= 1.3 do something.
		*/
		nu = rv_full.substr( 0, 3 );
		for (var i=0; i<moz_types.length; i++) {
			if (nua.indexOf(moz_types[i]) != -1) {
				moz_brow = moz_types[i];
				break;
			}
		}
		/*
		If it was found in the array...
		*/
		if (moz_brow) {
			/*
			Extract string position.
			*/
			str_pos = nua.indexOf(moz_brow);
			/*
			Slice out working number, 3 digit.
			*/
			moz_brow_nu = nua.substr( (str_pos + moz_brow.length + 1 ) ,3);
			/*
			If you got it, use it, else use nu.
			*/
			moz_brow_nu = (isNaN(moz_brow_nu)) ? moz_brow_nu = nu : moz_brow_nu;
			moz_brow_nu_sub = nua.substr((str_pos + moz_brow.length + 1), 8);
			/*
			This makes sure that it's only the id number.
			*/
			sub_nu_slice = (moz_brow_nu_sub.search(pattern) != -1) ? moz_brow_nu_sub.search(pattern) : '';
			/*
			Check to make sure there was a result, if not do nothing.
			*/
			(sub_nu_slice) ? moz_brow_nu_sub = moz_brow_nu_sub.substr(0, sub_nu_slice) : '';
		}
		//
		if (moz_brow == 'Netscape6') {
			moz_brow = 'Netscape';
		} else if (moz_brow == 'rv' || moz_brow == '') {
			/*
			Default value if no other gecko name fit.
			*/
			moz_brow = 'Mozilla';
		} 
		/*
		Use rv number if nothing else is available.
		*/
		if (!moz_brow_nu) {
			moz_brow_nu = nu;
			moz_brow_nu_sub = nu;
		}
		//
		if (n.productSub) {
			release_date = n.productSub;
		}
	}
	/*
	
	Internet Explorer
	-----------------
	
	*/
	else if (ie) {
		str_pos = nua.indexOf('MSIE');
		nu = nua.substr((str_pos+5),3);
		brow = 'Microsoft Internet Explorer';
	}
	/*
	Default to navigator app name.
	*/
	else  {
		brow = nan;
	}
	//
	op5 = (op && (nu.substring(0,1)==5));
	op6 = (op && (nu.substring(0,1)==6));
	op7 = (op && (nu.substring(0,1)==7));
	op8 = (op && (nu.substring(0,1)==8));
	op9 = (op && (nu.substring(0,1)==9));
	ie4 = (ie && !dom);
	ie5 = (ie && (nu.substring(0,1)==5));
	ie6 = (ie && (nu.substring(0,1)==6));
	ie7 = (ie && (nu.substring(0,1)==7));
	/*
	Default to get number from navigator app version.
	*/
	if (!nu) {
		nu = nav.substring(0,1);
	}
	/*
	'ie5x' tests only for functionality. dom or ie5x would be default settings. 
	Opera will register true in this test if set to identify as IE 5
	*/
	ie5x = (d.all&&dom);
	ie5mac = (mac&&ie5);
	ie5xwin = (win&&ie5x);
}
//
function TestBrowsers() {
	var aBadBrowsers = new Array();
	aBadBrowsers.push({sName:"Firefox", nMinVersion:2});
	aBadBrowsers.push({sName:"Opera"});
	//
	var os;
	if (win) {
		os = 'Windows';
	} else if (mac) {
		os = 'MacIntosh';
	} else if (lin) {
		os = 'Linux';
	} else {
		os = '!os';
	}
	//
	var app_nu;
	var browser;
	if (d.layers) {
		app_nu = nav.substring(0,4);
		browser = 'Netscape Navigator';
	} else if (!moz_brow && !moz_brow_nu) {
		browser = brow;
		app_nu = nu;
	} else if (moz_brow && moz_brow_nu) {
		app_nu = (moz_brow_nu_sub) ? moz_brow_nu_sub : moz_brow_nu;
		browser = moz_brow;
		(!app_nu) ? app_nu = nu : '';
	} else {
		app_nu = '!app_nu';
		browser = '!browser';
	}
	//
	for (var i=0; i<aBadBrowsers.length; i++) {
		var oBrowser = aBadBrowsers[i];
		if (browser.toLowerCase() == oBrowser.sName.toLowerCase() && ((oBrowser.nMinVersion) ? (parseFloat(app_nu) < oBrowser.nMinVersion) : true)) {
				location.href = "browser.php?bn="+oBrowser.sName+"&bv="+app_nu;
		}
	}
}
//
DetectBrowsers();
TestBrowsers();