//
bswBrowser = new function() {
	// convert all characters to lowercase to simplify testing
	var agt=navigator.userAgent.toLowerCase();

    // *** BROWSER VERSION ***
    // Note: On IE5, these return 4, so use this.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.moz = ((agt.indexOf('mozilla')!=-1) && ((agt.indexOf('spoofer')==-1) && (agt.indexOf('compatible')==-1)));
	this.nav2 = (this.moz && (this.major == 2));
	this.nav3 = (this.moz && (this.major == 3));
	this.nav4 = (this.moz && (this.major == 4));
	this.nav4up = (this.moz && (this.major >= 4));
	this.navonly = (this.moz && ((agt.indexOf(";nav") != -1) || (agt.indexOf("; nav") != -1)));
	this.nav6 = (this.moz && (this.major == 5));
	this.nav6up = (this.moz && (this.major >= 5));
	this.gecko = (agt.indexOf('gecko') != -1);
	this.ffox = (agt.indexOf('firefox')!=-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.ie5_5 = (this.ie && (this.major == 4) && (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) && (agt.indexOf("msie 6.")!=-1) );
	this.ie6up = (this.ie && !this.ie3 && !this.ie4 && !this.ie5 && !this.ie5_5);
	
	// KNOWN BUG: 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 = (agt.indexOf("aol") != -1);
	this.aol3 = (this.aol && this.ie3);
	this.aol4 = (this.aol && this.ie4);
	this.aol5 = (agt.indexOf("aol 5") != -1);
	this.aol6 = (agt.indexOf("aol 6") != -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.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));

	// *** 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 ***
    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));

    this.winme = ((agt.indexOf("win 9x 4.90")!=-1));
    this.win2k = ((agt.indexOf("windows nt 5.0")!=-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.os2 = ((agt.indexOf("os/2")!=-1) || (navigator.appVersion.indexOf("OS/2")!=-1) || (agt.indexOf("ibm-webexplorer")!=-1));

    this.mac = (agt.indexOf("mac")!=-1);
    // hack ie5 js version for mac
    if (this.mac && this.ie5up) this.js = 1.4;
    this.mac68k = (this.mac && ((agt.indexOf("68k")!=-1) || (agt.indexOf("68000")!=-1)));
    this.macppc = (this.mac && ((agt.indexOf("ppc")!=-1) || (agt.indexOf("powerpc")!=-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.vms = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));

	var sBrowser = "";
	//
	/*
	This function is accessable from outside the object and uses the two following internal functions
	to determine what kind of xml http request object is supported... i.e. they try create objects and
	return true on success or false on failure... this function returns a string either: "XMLHttpRequest"
	"ActiveX DOMDocument" or "Unsupported" if both tests fail.
	*/
	this.testXMLRequestObject = function() {
		var testXML = "";
		if(testXMLHttpRequest()) {
			testXML = "XMLHttpRequest";
			return testXML;
		} else if(testActiveXXMLDom()) {
			testXML = "ActiveX DOMDocument";
			return testXML;
		} else {
			testXML = "Unsupported";
			return testXML;
		}
	}
	//
	function testXMLHttpRequest() {
		try
		{
			var xmlfile = new XMLHttpRequest();
			return true;
		}
		catch (e)
		{	
			return false;
		}
	}
	//
	function testActiveXXMLDom() {
		try
		{
			var testDoc = new ActiveXObject('MSXML2.DOMDocument.3.0');
			return true;
		}
		catch (e)
		{	
			return false;
		}
	}
	//
	/*
	
	*/
	this.testXSLTProcessor = function() {
		var testXSLT = "";
		if(testXSLTProcObject()) {
			testXSLT = "XSLTProcessor";
			return testXSLT;
		} else if(testActiveXXSLTemp()) {
			testXSLT = "ActiveX XSLTemplate";
			return testXSLT;
		} else {
			testXSLT = "Unsupported";
			return testXSLT;
		}
	}
	//
	function testXSLTProcObject() {
		try
		{
			var xsltproc = new XSLTProcessor();
			return true;
		}
		catch (e)
		{	
			return false;
		}
	}
	//
	function testActiveXXSLTemp() {
		try
		{
			var cache = new ActiveXObject("Msxml2.XSLTemplate.3.0");
			return true;
		}
		catch (e)
		{	
			return false;
		}
	}
	//
	this.getBrowserString = function() {
		// this is a dumby to see if it "fixes" the error... it did... I don't know why.
	}
	//
	this.getPlatformString = function() {
		var regexpWin = /^(Win){1}/;
		var regexpMac = /^(Mac){1}/;
		var sPlatform = navigator.platform;
		if(regexpWin.test(sPlatform)) {
			sPlatform = "PC";
			return sPlatform;
		} else if(regexpMac.test(sPlatform)) {
			sPlatform = "Mac";
			return sPlatform;
		} else {
			sPlatform = "Other";
			return sPlatform;
		}
	}
	//
	this.getOSString = function() {
		var sUA = navigator.userAgent;
		var i1 = sUA.indexOf(";");
		var i2 = sUA.substring(i1+1, sUA.length).indexOf(";");
		var i3 = sUA.substring(i2+1, sUA.length).indexOf(";");
		var sOS = sUA.substring(i1+i2+3, i1+i2+i3+4);
		return sOS;
	}
	/*
	this.getPluginsObject = function() {
		var objPlugins;
		if(isInternetExplorer()) {
			objPlugins = document.embeds.length;
			return objPlugins;
		} else if(isMozilla()) {
			objPlugins = navigator.plugins;
			return objPlugins;
		}
	}
	//
	this.getPluginsString = function() {
		var sPlugins;
		var iNumPlugins = getPluginsObject().length;
		for(i=0;i<iNumPlugins;i++) {
			var sPlug = getPluginsObject()[i];
			var sName = sPlug.name;
			sPlugins =  sPlugins + sName + " ";
		}
		return sPlugins;
	}
	*/


	// determine width of browser in px
	this.base_x = function(){
		var x;
		if(document.all){
			x = document.body.clientWidth;
		} else {
			x = window.innerWidth;
		}	
		return x;
	}


	// determine height of browser in px
	this.base_y = function (){
		var y;
		if(document.all){
			y = document.body.clientHeight;
		} else {
			y = window.innerHeight;
		}	
		return y;
	}



	// retrieve values from the query string
	
	getQueryStringValue = function(name){

		var w = window.location.toString();
		var i = w.indexOf("?");
		var qsvars = w.substring(i + 1,w.length).split('&');
		
		for(q in qsvars){
			
			var i = qsvars[q].indexOf("=");
			var qsName = qsvars[q].substring(0,i);
			var qsValue = qsvars[q].substring(i + 1,qsvars[q].length)
			
			if(qsName == name){
				return qsValue;
			}
		}

		return null;
	}


	setCookie = function(name,value)
	{		
		var expires = "";
		if(navigator.cookieEnabled) {
			document.cookie = name + "=" + value + expires + "; path=/";
		} else {
			alert("Cookies must be enabled");
		}
	}			
		
		
		// find a cookie
	bswReadCookie = function(name)
	{
	
		var ca = document.cookie.split(';');
		var nameEQ = name + "=";
		for(var i=0; i < ca.length; i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1, c.length); //delete spaces
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
			}
		return null;
	}	


}
