var deployJava = {
	debug :null,
	myInterval :null,
	preInstallJREList :null,
	returnPage :null,
	brand :null,
	locale :null,
	installType :null,
	EAInstallEnabled :false,
	EarlyAccessURL :null,
	getJavaURL :'http://java.sun.com/webapps/getjava/BrowserRedirect?host=java.com',
	appleRedirectPage :'http://www.apple.com/support/downloads/',
	oldMimeType :'application/npruntime-scriptable-plugin;DeploymentToolkit',
	mimeType :'application/java-deployment-toolkit',
	launchButtonPNG :'http://java.sun.com/products/jfc/tsc/articles/swing2d/webstart.png',
	getJREs : function() {
		var list = new Array();
		if (deployJava.isPluginInstalled()) {
			var plugin = deployJava.getPlugin();
			var VMs = plugin.jvms;
			for ( var i = 0; i < VMs.getLength(); i++) {
				list[i] = VMs.get(i).version;
			}
		} else {
			var browser = deployJava.getBrowser();
			if (browser == 'MSIE') {
				if (deployJava.testUsingActiveX('1.8.0')) {
					list[0] = '1.8.0';
				} else if (deployJava.testUsingActiveX('1.7.0')) {
					list[0] = '1.7.0';
				} else if (deployJava.testUsingActiveX('1.6.0')) {
					list[0] = '1.6.0';
				} else if (deployJava.testUsingActiveX('1.5.0')) {
					list[0] = '1.5.0';
				} else if (deployJava.testUsingActiveX('1.4.2')) {
					list[0] = '1.4.2';
				} else if (deployJava.testForMSVM()) {
					list[0] = '1.1';
				}
			} else if (browser == 'Netscape Family') {
				if (deployJava.testUsingMimeTypes('1.8')) {
					list[0] = '1.8.0';
				} else if (deployJava.testUsingMimeTypes('1.7')) {
					list[0] = '1.7.0';
				} else if (deployJava.testUsingMimeTypes('1.6')) {
					list[0] = '1.6.0';
				} else if (deployJava.testUsingMimeTypes('1.5')) {
					list[0] = '1.5.0';
				} else if (deployJava.testUsingMimeTypes('1.4.2')) {
					list[0] = '1.4.2';
				}
			} else if (browser == 'Safari') {
				if (deployJava.testUsingPluginsArray('1.8.0')) {
					list[0] = '1.8.0';
				} else if (deployJava.testUsingPluginsArray('1.7.0')) {
					list[0] = '1.7.0';
				} else if (deployJava.testUsingPluginsArray('1.6.0')) {
					list[0] = '1.6.0';
				} else if (deployJava.testUsingPluginsArray('1.5.0')) {
					list[0] = '1.5.0';
				} else if (deployJava.testUsingPluginsArray('1.4.2')) {
					list[0] = '1.4.2';
				}
			}
		}
		if (deployJava.debug) {
			for ( var i = 0; i < list.length; ++i) {
				alert('We claim to have detected Java SE ' + list[i]);
			}
		}
		return list;
	},
	installJRE : function(requestVersion) {
		var ret = false;
		if (deployJava.isPluginInstalled()) {
			if (deployJava.getPlugin().installJRE(requestVersion)) {
				deployJava.refresh();
				if (deployJava.returnPage != null) {
					document.location = deployJava.returnPage;
				}
				return true;
			} else {
				return false;
			}
		} else {
			return deployJava.installLatestJRE();
		}
	},
	installLatestJRE : function() {
		if (deployJava.isPluginInstalled()) {
			if (deployJava.getPlugin().installLatestJRE()) {
				deployJava.refresh();
				if (deployJava.returnPage != null) {
					document.location = deployJava.returnPage;
				}
				return true;
			} else {
				return false;
			}
		} else {
			var browser = deployJava.getBrowser();
			var platform = navigator.platform.toLowerCase();
			if ((deployJava.EAInstallEnabled == 'true')
					&& (platform.indexOf('win') != -1)
					&& (deployJava.EarlyAccessURL != null)) {
				deployJava.preInstallJREList = deployJava.getJREs();
				if (deployJava.returnPage != null) {
					deployJava.myInterval = setInterval("deployJava.poll()",
							3000);
				}
				location.href = deployJava.EarlyAccessURL;
				return false;
			} else {
				if (browser == 'MSIE') {
					return deployJava.IEInstall();
				} else if ((browser == 'Netscape Family')
						&& (platform.indexOf('win32') != -1)) {
					return deployJava.FFInstall();
				} else {
					location.href = deployJava.getJavaURL
							+ ((deployJava.returnPage != null) ? ('&returnPage=' + deployJava.returnPage)
									: '')
							+ ((deployJava.locale != null) ? ('&locale=' + deployJava.locale)
									: '')
							+ ((deployJava.brand != null) ? ('&brand=' + deployJava.brand)
									: '');
				}
				return false;
			}
		}
	},
	runApplet : function(attributes, parameters, minimumVersion) {
		if (minimumVersion == 'undefined' || minimumVersion == null) {
			minimumVersion = '1.1';
		}
		var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
		var matchData = minimumVersion.match(regex);
		if (deployJava.returnPage == null) {
			deployJava.returnPage = document.location;
		}
		if (matchData != null) {
			var browser = deployJava.getBrowser();
			if ((browser != '?') && (browser != 'Safari')) {
				if (deployJava.versionCheck(minimumVersion + '+')) {
					return deployJava.writeAppletTag(attributes, parameters);
				} else if (deployJava.installJRE(minimumVersion + '+')) {
					deployJava.refresh();
					location.href = document.location;
					return deployJava.writeAppletTag(attributes, parameters);
				}
			} else {
				return deployJava.writeAppletTag(attributes, parameters);
			}
		} else {
			if (deployJava.debug) {
				alert('Invalid minimumVersion argument to runApplet():' + minimumVersion);
			}
		}
	},
	writeAppletTag : function(attributes, parameters) {
		var s = '<' + 'applet ';
		for ( var attribute in attributes) {
			s += (' ' + attribute + '="' + attributes[attribute] + '"');
		}
		s += '>';
		//document.write(s);
		if (parameters != 'undefined' && parameters != null) {
			var codebaseParam = false;
			for ( var parameter in parameters) {
				if (parameter == 'codebase_lookup') {
					codebaseParam = true;
				}
				s += '<param name="' + parameter + '" value="'
						+ parameters[parameter] + '">';
				//console.log(s);
				//document.write(s);
			}
			if (!codebaseParam) {
				//document.write('<param name="codebase_lookup" value="false">');
				s += '<param name="codebase_lookup" value="false">';
				//console.log(s);
			}
		}
		//document.write('<' + '/' + 'applet' + '>');*/
		s += '<' + '/' + 'applet' + '>';
		//console.log(s);
		return s;
	},
	versionCheck : function(versionPattern) {
		var index = 0;
		var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?(\\*|\\+)?$";
		var matchData = versionPattern.match(regex);
		if (matchData != null) {
			var familyMatch = true;
			var patternArray = new Array();
			for ( var i = 1; i < matchData.length; ++i) {
				if ((typeof matchData[i] == 'string') && (matchData[i] != '')) {
					patternArray[index] = matchData[i];
					index++;
				}
			}
			if (patternArray[patternArray.length - 1] == '+') {
				familyMatch = false;
				patternArray.length--;
			} else {
				if (patternArray[patternArray.length - 1] == '*') {
					patternArray.length--;
				}
			}
			var list = deployJava.getJREs();
			for ( var i = 0; i < list.length; ++i) {
				if (deployJava.compareVersionToPattern(list[i], patternArray,
						familyMatch)) {
					return true;
				}
			}
			return false;
		} else {
			alert('Invalid versionPattern passed to versionCheck: ' + versionPattern);
			return false;
		}
	},
	isWebStartInstalled : function(minimumVersion) {
		var browser = deployJava.getBrowser();
		if ((browser == '?') || (browser == 'Safari')) {
			return true;
		}
		if (minimumVersion == 'undefined' || minimumVersion == null) {
			minimumVersion = '1.4.2';
		}
		var retval = false;
		var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
		var matchData = minimumVersion.match(regex);
		if (matchData != null) {
			retval = deployJava.versionCheck(minimumVersion + '+');
		} else {
			if (deployJava.debug) {
				alert('Invalid minimumVersion argument to isWebStartInstalled(): ' + minimumVersion);
			}
			retval = deployJava.versionCheck('1.4.2+');
		}
		return retval;
	},
	createWebStartLaunchButton : function(jnlp, minimumVersion) {
		if (deployJava.returnPage == null) {
			deployJava.returnPage = jnlp;
		}
		var url = 'javascript:' + 'if (!deployJava.isWebStartInstalled(&quot;'
				+ minimumVersion + '&quot;)) {'
				+ 'if (deployJava.installLatestJRE()) {'
				+ 'if (deployJava.launch(&quot;' + jnlp + '&quot;)) {}' + '}'
				+ '} else {' + 'if (deployJava.launch(&quot;' + jnlp
				+ '&quot;)) {}' + '}';
		document.write('<' + 'a href="' + url
				+ '" onMouseOver="window.status=\'\'; ' + 'return true;"><'
				+ 'img ' + 'src="' + deployJava.launchButtonPNG + '" '
				+ 'border="0" /><' + '/' + 'a' + '>');
	},
	launch : function(jnlp) {
		if (deployJava.isPluginInstalled()) {
			return deployJava.getPlugin().launch(jnlp);
		} else {
			document.location = jnlp;
			return true;
		}
	},
	isPluginInstalled : function() {
		var plugin = deployJava.getPlugin();
		if (plugin && plugin.jvms) {
			return true;
		} else {
			return false;
		}
	},
	isAutoUpdateEnabled : function() {
		if (deployJava.isPluginInstalled()) {
			return deployJava.getPlugin().isAutoUpdateEnabled();
		}
		return false;
	},
	setAutoUpdateEnabled : function() {
		if (deployJava.isPluginInstalled()) {
			return deployJava.getPlugin().setAutoUpdateEnabled();
		}
		return false;
	},
	setInstallerType : function(type) {
		deployJava.installType = type;
		if (deployJava.isPluginInstalled()) {
			return deployJava.getPlugin().setInstallerType(type);
		}
		return false;
	},
	setAdditionalPackages : function(packageList) {
		if (deployJava.isPluginInstalled()) {
			return deployJava.getPlugin().setAdditionalPackages(packageList);
		}
		return false;
	},
	setEarlyAccess : function(enabled) {
		deployJava.EAInstallEnabled = enabled;
	},
	isPlugin2 : function() {
		if (deployJava.isPluginInstalled()) {
			if (deployJava.versionCheck('1.6.0_10+')) {
				try {
					return deployJava.getPlugin().isPlugin2();
				} catch (err) {
				}
			}
		}
		return false;
	},
	getPlugin : function() {
		deployJava.refresh();
		var ret = document.getElementById('deployJavaPlugin');
		return ret;
	},
	compareVersionToPattern : function(version, patternArray, familyMatch) {
		var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
		var matchData = version.match(regex);
		if (matchData != null) {
			var index = 0;
			var result = new Array();
			for ( var i = 1; i < matchData.length; ++i) {
				if ((typeof matchData[i] == 'string') && (matchData[i] != '')) {
					result[index] = matchData[i];
					index++;
				}
			}
			var l = Math.min(result.length, patternArray.length);
			if (familyMatch) {
				for ( var i = 0; i < l; ++i) {
					if (result[i] != patternArray[i])
						return false;
				}
				return true;
			} else {
				for ( var i = 0; i < l; ++i) {
					if (result[i] < patternArray[i]) {
						return false;
					} else if (result[i] > patternArray[i]) {
						return true;
					}
				}
				return true;
			}
		} else {
			return false;
		}
	},
	getBrowser : function() {
		var browser = navigator.userAgent.toLowerCase();
		if (deployJava.debug) {
			alert('userAgent -> ' + browser);
		}
		if ((navigator.vendor)
				&& (navigator.vendor.toLowerCase().indexOf('apple') != -1)
				&& (browser.indexOf('safari') != -1)) {
			if (deployJava.debug) {
				alert('We claim to have detected "Safari".');
			}
			return 'Safari';
		} else if (browser.indexOf('msie') != -1) {
			if (deployJava.debug) {
				alert('We claim to have detected "IE".');
			}
			return 'MSIE';
		} else if ((browser.indexOf('mozilla') != -1)
				|| (browser.indexOf('firefox') != -1)) {
			if (deployJava.debug) {
				alert('We claim to have detected a Netscape family browser.');
			}
			return 'Netscape Family';
		} else {
			if (deployJava.debug) {
				alert('We claim to have failed to detect a browser.');
			}
			return '?';
		}
	},
	testUsingActiveX : function(version) {
		var objectName = 'JavaWebStart.isInstalled.' + version + '.0';
		if (!ActiveXObject) {
			if (deployJava.debug) {
				alert('Browser claims to be IE, but no ActiveXObject object?');
			}
			return false;
		}
		try {
			return (new ActiveXObject(objectName) != null);
		} catch (exception) {
			return false;
		}
	},
	testForMSVM : function() {
		var clsid = '{08B0E5C0-4FCB-11CF-AAA5-00401C608500}';
		if (typeof oClientCaps != 'undefined') {
			var v = oClientCaps.getComponentVersion(clsid, "ComponentID");
			if ((v == '') || (v == '5,0,5000,0')) {
				return false;
			} else {
				return true;
			}
		} else {
			return false;
		}
	},
	testUsingMimeTypes : function(version) {
		if (!navigator.mimeTypes) {
			if (deployJava.debug) {
				alert('Browser claims to be Netscape family, but no mimeTypes[] array?');
			}
			return false;
		}
		for ( var i = 0; i < navigator.mimeTypes.length; ++i) {
			s = navigator.mimeTypes[i].type;
			var m = s
					.match(/^application\/x-java-applet\x3Bversion=(1\.8|1\.7|1\.6|1\.5|1\.4\.2)$/);
			if (m != null) {
				if (deployJava.compareVersions(m[1], version)) {
					return true;
				}
			}
		}
		return false;
	},
	testUsingPluginsArray : function(version) {
		if ((!navigator.plugins) || (!navigator.plugins.length)) {
			return false;
		}
		var platform = navigator.platform.toLowerCase();
		for ( var i = 0; i < navigator.plugins.length; ++i) {
			s = navigator.plugins[i].description;
			if (s.search(/^Java Switchable Plug-in (Cocoa)/) != -1) {
				if (deployJava.compareVersions("1.5.0", version)) {
					return true;
				}
			} else if (s.search(/^Java/) != -1) {
				if (platform.indexOf('win') != -1) {
					if (deployJava.compareVersions("1.5.0", version)
							|| deployJava.compareVersions("1.6.0", version)) {
						return true;
					}
				}
			}
		}
		if (deployJava.compareVersions("1.5.0", version)) {
			return true;
		}
		return false;
	},
	IEInstall : function() {
		location.href = deployJava.getJavaURL
				+ ((deployJava.returnPage != null) ? ('&returnPage=' + deployJava.returnPage)
						: '')
				+ ((deployJava.locale != null) ? ('&locale=' + deployJava.locale)
						: '')
				+ ((deployJava.brand != null) ? ('&brand=' + deployJava.brand)
						: '')
				+ ((deployJava.installType != null) ? ('&type=' + deployJava.installType)
						: '');
		return false;
	},
	done : function(name, result) {
	},
	FFInstall : function() {
		location.href = deployJava.getJavaURL
				+ ((deployJava.returnPage != null) ? ('&returnPage=' + deployJava.returnPage)
						: '')
				+ ((deployJava.locale != null) ? ('&locale=' + deployJava.locale)
						: '')
				+ ((deployJava.brand != null) ? ('&brand=' + deployJava.brand)
						: '')
				+ ((deployJava.installType != null) ? ('&type=' + deployJava.installType)
						: '');
		return false;
	},
	compareVersions : function(installed, required) {
		var a = installed.split('.');
		var b = required.split('.');
		for ( var i = 0; i < a.length; ++i) {
			a[i] = Number(a[i]);
		}
		for ( var i = 0; i < b.length; ++i) {
			b[i] = Number(b[i]);
		}
		if (a.length == 2) {
			a[2] = 0;
		}
		if (a[0] > b[0])
			return true;
		if (a[0] < b[0])
			return false;
		if (a[1] > b[1])
			return true;
		if (a[1] < b[1])
			return false;
		if (a[2] > b[2])
			return true;
		if (a[2] < b[2])
			return false;
		return true;
	},
	enableAlerts : function() {
		deployJava.debug = true;
	},
	poll : function() {
		deployJava.refresh();
		var postInstallJREList = deployJava.getJREs();
		if ((deployJava.preInstallJREList.length == 0)
				&& (postInstallJREList.length != 0)) {
			clearInterval(deployJava.myInterval);
			if (deployJava.returnPage != null) {
				location.href = deployJava.returnPage;
			}
			;
		}
		if ((deployJava.preInstallJREList.length != 0)
				&& (postInstallJREList.length != 0)
				&& (deployJava.preInstallJREList[0] != postInstallJREList[0])) {
			clearInterval(deployJava.myInterval);
			if (deployJava.returnPage != null) {
				location.href = deployJava.returnPage;
			}
		}
	},
	writePluginTag : function() {
		var browser = deployJava.getBrowser();
		if (browser == 'MSIE') {
			document.write('<'
							+ 'object classid="clsid:CAFEEFAC-DEC7-0000-0000-ABCDEFFEDCBA" '
							+ 'id="deployJavaPlugin" width="0" height="0">'
							+ '<' + '/' + 'object' + '>');
		} else if (browser == 'Netscape Family') {
			deployJava.writeEmbedTag();
		}
	},
	refresh : function() {
		navigator.plugins.refresh(false);
		var browser = deployJava.getBrowser();
		if (browser == 'Netscape Family') {
			var plugin = document.getElementById('deployJavaPlugin');
			if (plugin == null) {
				deployJava.writeEmbedTag();
			}
		}
	},
	writeEmbedTag : function() {
		var written = false;
		if (navigator.mimeTypes != null) {
			for ( var i = 0; i < navigator.mimeTypes.length; i++) {
				if (navigator.mimeTypes[i].type == deployJava.mimeType) {
					if (navigator.mimeTypes[i].enabledPlugin) {
						document.write('<' + 'embed id="deployJavaPlugin" type="' + deployJava.mimeType + '" hidden="true" />');
						written = true;
					}
				}
			}
			if (!written)
				for ( var i = 0; i < navigator.mimeTypes.length; i++) {
					if (navigator.mimeTypes[i].type == deployJava.oldMimeType) {
						if (navigator.mimeTypes[i].enabledPlugin) {
							document.write('<' + 'embed id="deployJavaPlugin" type="' + deployJava.oldMimeType + '" hidden="true" />');
							//return '<' + 'embed id="deployJavaPlugin" type="' + deployJava.oldMimeType + '" hidden="true" />';
						}
					}
				}
		}
	},
	do_initialize : function() {
		deployJava.writePluginTag();
		if (deployJava.locale == null) {
			var loc = null;
			if (loc == null)
				try {
					loc = navigator.userLanguage;
				} catch (err) {
				}
			if (loc == null)
				try {
					loc = navigator.systemLanguage;
				} catch (err) {
				}
			if (loc == null)
				try {
					loc = navigator.language;
				} catch (err) {
				}
			if (loc != null) {
				loc.replace("-", "_")
				deployJava.locale = loc;
			}
		}
	}
};
deployJava.do_initialize();
