var PLATFORM_OK = 0;
var BAD_BROWSER = 1;
var BAD_OS      = 2;

// Checker
// Initialize variables to be consumed by clients
// Initialize pointers to functions
function Checker()
{
// Initialize variables
	this.browser        = "Unknown";
	this.browserVersion = "Unknown";
	this.os             = "Unknown";
	this.osVersion      = "Unknown";
// Initialize pointers to functions
	this.check             = pPlatformCheck;
	this.getBrowser        = pGetBrowser;
	this.getBrowserVersion = pGetBrowserVersion;
	this.getOS             = pGetOS;
	this.getOSVersion      = pGetOSVersion;

	this.browserOK         = pBrowserOK;
	this.osOK              = pOSOK;
}

function pPlatformCheck()
{	
	var status = PLATFORM_OK;

	if (!this.browserOK()) {
		status |= BAD_BROWSER;
	}
	
	if (!this.osOK()) {
		status |= BAD_OS;
	}
	
	return status;
}

function pGetBrowser()
{
	return this.browser;
}

function pGetBrowserVersion()
{
	return this.browserVersion;
}

function pGetOS()
{
	return this.os;
}

function pGetOSVersion()
{
	return this.osVersion;
}

function pBrowserOK()
{
	var browserOK = false;
    var appVer = navigator.appVersion.toLowerCase();
	var agt=navigator.userAgent.toLowerCase();

	if (appVer.indexOf("konqueror") != -1)	{
	    var kqPos   = agt.indexOf('konqueror');
        is_minor = parseFloat(agt.substring(kqPos+10,agt.indexOf(';',kqPos)));
        is_major = parseInt(is_minor);
  		this.browser = "Konqueror";
        this.browserVersion = is_major + " " + is_minor;
	} else if (appVer.indexOf("safari") != -1) {
	     	browserOK = true;
            this.browser = "Safari"
    } else if (appVer.indexOf("omniweb") != -1) {
            this.browser = "OmniWeb"
    } else if (appVer.indexOf("opera") != -1) {
            this.browser = "Opera"
    } else if (appVer.indexOf("webtv") != -1) {
           this.browser = "WebTV";
	} else if (appVer.indexOf("icab") != -1) {
	       this.browser = "iCab"
	} else if (appVer.indexOf("msie") != -1) {
		var is_mac = (agt.indexOf("mac")!=-1);
		var iePos  = appVer.indexOf('msie');
		if (iePos !=-1) {
			if(is_mac) {
				var iePos = agt.indexOf('msie');
				is_minor = parseFloat(agt.substring(iePos+5,agt.indexOf(';',iePos)));
			}
				else is_minor = parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos)));
				is_major = parseInt(is_minor);
			}
	       this.browser = "Internet Explorer"
	       this.browserVersion = is_major + " " + is_minor;
		   if (is_major >= 5) {
			  browserOK = true;
		   }
	} else if (appVer.indexOf("netscape")  != -1 || agt.indexOf("netscape") != -1) {
		this.browser = "Netscape";
		if (agt.indexOf("netscape" != -1))
			this.browserVersion = parseFloat(agt.substring(agt.indexOf('netscape')+9));
		else
			this.browserVersion = parseFloat(navigator.appVersion);
		browserOK = true;
	} else if ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
                    (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1)  &&
                    (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1) &&
                    (navigator.product.toLowerCase()=="gecko") &&
                    ((navigator.vendor=="")||(navigator.vendor=="Mozilla")||(navigator.vendor=="Debian"))) {
	    this.browser = "Mozilla";
        is_moz_ver = agt.indexOf('rv:');
        is_moz_ver = agt.substring(is_moz_ver+3);
        is_paren   = is_moz_ver.indexOf(')');
        is_moz_ver = is_moz_ver.substring(0,is_paren);
        this.browserVersion = parseInt(is_moz_ver) + " " + is_moz_ver;
        browserOK = true;
    } else if ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
               (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1)  &&
               (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)     &&
               (navigator.product.toLowerCase()=="gecko") && (navigator.vendor=="Firebird")) {
	    this.browser = "Firebird";
        is_moz_ver = agt.indexOf('rv:');
        is_moz_ver = agt.substring(is_moz_ver+3);
        is_paren   = is_moz_ver.indexOf(')');
        is_moz_ver = is_moz_ver.substring(0,is_paren);
        this.browserVersion = parseInt(is_moz_ver) + " " + is_moz_ver;
        browserOK = true;
    } else if ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
                 (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1)  &&
                 (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)     &&
                 (navigator.product.toLowerCase()=="gecko") && (navigator.vendor=="Firefox")) {
	    this.browser = "Firefox";
        is_moz_ver = agt.indexOf('rv:');
        is_moz_ver = agt.substring(is_moz_ver+3);
        is_paren   = is_moz_ver.indexOf(')');
        is_moz_ver = is_moz_ver.substring(0,is_paren);
        this.browserVersion = parseInt(is_moz_ver) + " " + is_moz_ver;
        browserOK = true;
    }
	else {
		this.browser = agt;
		this.browserVersion = "An unknown browser";
	}

	return browserOK;
}

function pOSOK()
{
	var osOK = false;
	var agt=navigator.userAgent.toLowerCase();
	if (agt.indexOf("win") != -1) {
		this.os = "Windows";
		if (agt.indexOf("windows nt") != -1 || agt.indexOf("winnt") != -1) {
			osOK = true;
			if (agt.indexOf("windows nt 5.0") != -1)
				this.osVersion = "2000";
			else if (agt.indexOf("windows nt 5.1") != -1)
				this.osVersion = "XP";
			else
				this.osVersion = "NT";
		}
		else if (agt.indexOf("windows 98") != -1 || agt.indexOf("win98") != -1) {
			osOK = true;
			this.osVersion = "98";
		}
		else if (agt.indexOf("windows 95") != -1 || agt.indexOf("win95") != -1) {
			this.osOK = true;
			this.osVersion = "95";
		}
		else if (agt.indexOf("windows 3.1") != -1 || agt.indexOf("win16") != -1) {
			this.osVersion = "3.1";
		}
	}
	else if (agt.indexOf("mac") != -1) {
		osOK = true;
		this.os = "Macintosh";
		this.osVersion = "";
	}
		else if (agt.indexOf("freeBSD") != -1) {
			this.os = "Unix";
			this.osVersion = "FreeBSD";
		}
		else if (agt.indexOf("linux") != -1) {
			this.os = "Unix";
			this.osVersion = "Linux";
		}
		else if (agt.indexOf("solaris") != -1) {
			this.os = "Unix";
			this.osVersion = "Solaris";
		}
		else if (agt.indexOf("sunos") != -1) {
			this.os = "Unix";
			this.osVersion = "SunOS";
		}
		else if (agt.indexOf("irix") != -1) {
			this.os = "Unix";
			this.osVersion = "IRIX";
		}
		else if (agt.indexOf("hpux") != -1) {
			this.os = "Unix";
			this.osVersion = "HPUX";
		}
		else if (agt.indexOf("aix") != -1) {
			this.os = "Unix";
			this.osVersion = "AIX";
		}
		else if (agt.indexOf("unix") != -1) {
			this.os = "Unix";
			this.osVersion = "";
		}
		else {
			this.os = agt;
			this.osversion = "Unknown";
		}
	// if the OS is OK, return true. Also, if the OS is unknown, assume the best and return true
	return osOK;
}


var chk = new Checker();
var checkReturn = chk.check();
