function FlashPlayer() {

	///////////////////////////////////////////////////////////////////////
	// Begin Public Interface
	//
	
	this.getMajorVersion   = getMajorVersion;				// major.x.x.x
	this.getMinorVersion   = getMinorVersion;				// x.minor.x.x
	this.getReleaseVersion = getReleaseVersion;				// x.x.release.x
	this.getBuildVersion   = getBuildVersion;				// x.x.x.build (null/undefined if not known)
	this.getVersionString  = getVersionString;				// "major.minor.release" or "major.minor.release.build"
	this.getDescription    = getDescription;				// as reported by plugin or ActiveX object
	this.isSupported       = isSupported;					// if player verion is at least the given major[[, minor], release]
	this.isInstalled       = isInstalled;					// true if some version of flash player is installed
	
	//
	// End Public Interface
	///////////////////////////////////////////////////////////////////////
	// Begin Private Implementation
	//
	
	var installed = false;
	var version = null;					// includes all version numbers.
	var desc = "none detected";			// as reported by the plugin or activex object

	if (navigator.plugins && navigator.plugins.length) {
		// Netscape-compatible plug-ins
		for (var x = 0; x < navigator.plugins.length; ++x) {
			if (navigator.plugins[x].name.indexOf('Shockwave Flash') != -1) {
				desc = navigator.plugins[x].description;
				var d = desc;
				// firefox only reports 3 version numbers in the description.
				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
				var v = [ 0, 0, 0 ];
				v[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
				v[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
				v[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
				version = v;
				installed = true;
				break;
			}
		}
	} else if (window.ActiveXObject) {
		// ActiveX-style plug-ins
		var oFlash;
		try {
			oFlash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			if (oFlash) {
				desc = oFlash.GetVariable("$version");
				var d = desc;
				d = d.split(" ")[1].split(",");
				// IE reports 4 numbers in version info
				var v = [ 0, 0, 0, 0 ];
				v[0] = parseInt(d[0], 10);
				v[1] = parseInt(d[1], 10);
				v[2] = parseInt(d[2], 10);
				v[3] = parseInt(d[3], 10);
				version = v;
				installed = true;
			}
		} catch(e) {}
	}

	function getMajorVersion() {
		return version[0];
	}
	
	function getMinorVersion() {
		return version[1];
	}
	
	function getReleaseVersion() {
		return version[2];
	}
	
	function getBuildVersion() {
		return ( (version.length < 4) ? null : version[3] );
	}
	
	function getVersionString() {
		var d = "";
		for (var i = 0; i < version.length; ++i) {
			d += version[i] + ".";
		}
		// remove the last "."
		d = d.replace(/\.$/, "");
		return d;
	}
	
	function getDescription() {
		return desc;
	}
	
	function isSupported(major, minor, release) {
		var supported = false;
		if (major > getMajorVersion()) {
			supported = true;
		} else if (major == getMajorVersion()) {
			if (minor > getMinorVersion()) {
				supported = true;
			} else if (minor == getMinorVersion() && release >= getReleaseVersion()) {
				supported = true;
			}
		}
		return supported;
	}
	
	function isInstalled() {
		return installed;
	}

	//
	// End Private Implementation
	///////////////////////////////////////////////////////////////////////

}

