/**
 * EnvChecker.js
 */
EnvChecker= {
	playerVersion : (function(){
		var version='0.0.0';
		if(navigator.plugins && navigator.mimeTypes['application/x-shockwave-flash']){
			var plugin=navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin;
			if (plugin && plugin.description) {
				// convert the description like 'Shockwave Flash 9.0 r28' into version string like '9.0.8';
				// regex is provided by SWFObject
				version=plugin.description.replace(/^[A-Za-z\s]+/, '').replace(/(\s+r|\s+b[0-9]+)/, ".");
			}
		} else { // in the case of Win IE
			var x='';
			try {
				// for ver.7 and later
				var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
				x=axo.GetVariable("$version");
			} catch(e) {
				try {
					// for ver.6
					axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
					x="WIN 6,0,21,0";
					/*
					* GetVariable() crashes player version 6.0.22-29, and
					* players which have those versions throws when access 
					* to AllowScriptAccess
					*/
					axo.AllowScriptAccess="always";
					x=axo.GetVariable("$version");
				} catch(e) {
					if (!x.match(/^WIN/)) {
						try {
							// for 4.x,5.x
							axo=null;
							axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
							// version 3 player throws when you call GetVariale().
							x=axo.GetVariable("$version");
						} catch(e) {
							if (axo) {
								// for 3.x
								x="WIN 3,0,18,0";
							} else {
								try {
									// for 2.x
									axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
									x="WIN 2,0,0,11";
								} catch(e) {
									x="WIN 0,0,0,0";
								}
							}
						}
					}
				}
			}
			// convert ActiveX version string to our version string like '9.0.28'
			version=x.replace(/^WIN /,'').replace(/,[0-9]+$/,'').replace(/,/g,'.');
		}
		
		// check version string format
		// Quicktime enabled Safari returns a description in natural language
		if (version.match(/^[0-9]+\.[0-9]+\.[0-9]+$/)) {
			return version;
		} else {
			return '0.0.0';
		}
		
	})(),
	
	supportPlayerMajorVersion : 9,
	supportPlayerMinorVersion : 0,
	supportPlayerRevision : 28,

	path : '',
	swf : '',
	area : '',
	loading : '',
	supportedOS : true,
	supportedBrowser : true,
	supportedPlayer : true,
	supportedNetwork : true,
	supportedCamera : true,
	supportedMic : true,
	supportedRtmp : true,

	// checker result
	os : '',
	browser : '',
	speed : 0,
	camera : 0,
	mic : 0,
	nc : 0,
	
	// start method
	initialize : function(path){
		this.path = path || './';
		this.swf = document.all? window['externalcheck'] : document['externalcheck'];
		this.loading = this.bgColor? this.path + "img/loading_white.gif" : this.path + "img/loading.gif?081030";
		// check version
		var v = this.playerVersion;
		try{
			var major = v.substring(0, v.indexOf("."));
			var minor = v.substring(v.indexOf(".")+1, v.lastIndexOf("."));
			var revision = v.substring(v.lastIndexOf(".")+1);
			if(major<this.supportPlayerMajorVersion) {
				this.supportedPlayer = false;
			} else if(major<=this.supportPlayerMajorVersion && revision<this.supportPlayerRevision){
				this.supportedPlayer = false;
			}
		}catch(e){
			this.supportedPlayer = false;
		}

		// check os
		var navi = navigator.userAgent.toUpperCase();
		if(navi.indexOf("WIN") != -1 ){
			var key = navi.match(/WINDOWS\sNT\s[0-9]\.[0-9]/);
			var version = key[0].substring("WINDOWS NT ".length, key[0].length);
			
			if(version == 6.0) this.os = 'Windows Vista';
			else if(version == 5.1) this.os = 'Windows XP';
			else this.supportedOS = false;
		} else if(navi.indexOf("MAC") != -1 ){
			this.os = 'Macintosh';
		} else {
			this.supportedOS = false;
		}

		// check browser
		var b = jQuery.browser;
		if(b.msie){
			// Internet Explorer
			this.browser = "Internet Explorer " + b.version;
			if(parseFloat(b.version) < 7) this.supportedBrowser = false;
		} else if(b.safari){
			// Google Chrome
			if(navi.indexOf("CHROME") != -1){
				var key = navi.match(/CHROME\/[0-9]\.[0-9]\.[0-9]*/);
				var version = key[0].substring("CHROME/".length, key[0].length);
				this.browser = "Google Chrome " + version;
				this.supportedBrowser = false;
			}
			// Safari
			else {
				var key = navi.match(/VERSION\/[0-9]\.[0-9]/);
				var version = key[0].substring("VERSION/".length, key[0].length);
				this.browser = "Safari " + version;
				if(parseFloat(version) < 3) this.supportedBrowser = false;
			}
		} else if(b.opera){
			// Opera
			this.browser = "Opera " + b.version;
			if(b.version < 9.5) this.supportedBrowser = false;
		} else if(b.mozilla){
			// Firefox
			var key = navi.match(/FIREFOX\/[0-9]\.[0-9]\.[0-9]/);
			var version = key[0].substring("FIREFOX/".length, key[0].length);
			this.browser = "Firefox" + version;
			if(parseFloat(version) < 3) this.supportedBrowser = false;
		}
		// display the swf
		this.start();
	},
	
	setOS : function(){
		var status, detail;
		if(this.supportedOS){
			status = "performance-cont-status-ok";
			detail = "performance-cont-detail-ok";
		} else {
			status = "performance-cont-status-ng";
			detail = "performance-cont-detail-ng";
			this.os = this.os_ng_cont;
		}
		$('#performance-cont-os-status').attr('class', status);
		$('#performance-cont-os-detail').attr('class', detail);
		$('#performance-cont-os-detail').html(this.os);
	},

	setBrowser : function(){
		var status, detail;
		if(this.supportedBrowser){
			status = "performance-cont-status-ok";
			detail = "performance-cont-detail-ok";
		} else {
			status = "performance-cont-status-ng";
			detail = "performance-cont-detail-ng";
			if(this.browser == '') this.browser = this.browser_ng_cont;
		}
		$('#performance-cont-browser-status').attr('class', status);
		$('#performance-cont-browser-detail').attr('class', detail);
		$('#performance-cont-browser-detail').html(this.browser);
	},
	
	setFlashPlayer : function(){
		this.setOS();
		this.setBrowser();

		var status, detail;
		if(this.supportedPlayer){
			status = "performance-cont-status-ok";
			detail = "performance-cont-detail-ok";
		} else {
			status = "performance-cont-status-ng";
			detail = "performance-cont-detail-ng";
		}
		$('#performance-cont-flashplayer-status').attr('class', status);
		$('#performance-cont-flashplayer-detail').attr('class', detail);
		$('#performance-cont-flashplayer-detail').html(this.playerVersion);
		$('#performance-cont-rtmp-status').html('<img src="' + this.loading + '" />');
	},
	
	setRtmpConnect : function(n){
		var status, detail;
		this.nc = n;
		$('#performance-cont-throughput-status').html('<img src="' + this.loading + '" />');
		if(n){
			status = "performance-cont-status-ok";
			detail = "performance-cont-detail-ok";
			cont_rtmp = this.rtmp_ok_cont;
			
			$('#performance-cont-rtmp-status').html('&nbsp;');
			$('#performance-cont-rtmp-status').attr('class', status);
			$('#performance-cont-rtmp-detail').attr('class', detail);
			$('#performance-cont-rtmp-detail').html(cont_rtmp);
		} else {
			status = "performance-cont-status-ng";
			detail = "performance-cont-detail-ng";
			cont_rtmp = this.rtmp_ng_cont;
			cont_throughput = this.network_ng_cont;
			this.supportedRtmp = false;

			$('#performance-cont-rtmp-status').html('&nbsp;');
			$('#performance-cont-rtmp-status').attr('class', status);
	
			$('#performance-cont-throughput-status').html("&nbsp;");
			$('#performance-cont-throughput-status').attr('class', status);

			$('#performance-cont-rtmp-detail').attr('class', detail);
			$('#performance-cont-throughput-detail').attr('class', detail);

			$('#performance-cont-rtmp-detail').html(cont_rtmp);
			$('#performance-cont-throughput-detail').html(cont_throughput);
			$('#performance-cont-camera-status').html('<img src="' + this.loading + '" />');

			var doc= document.all? window["externalpl"] : document["externalpl"];
			doc.startDeviceCheck();
			
		}
	},
	
	setSpeed : function(speed){
		var status, detail, cont;
		this.speed = speed;
		if(speed > 25){
			status = "performance-cont-status-ok";
			detail = "performance-cont-detail-ok";
			cont   = EnvChecker.network_middle_cont;
			if(speed > 100) cont = EnvChecker.network_high_cont;
		} else {
			status = "performance-cont-status-ng";
			detail = "performance-cont-detail-ng";
			cont   = EnvChecker.network_low_cont;
			this.supportedNetwork = false;
		}
		
		$('#performance-cont-throughput-status').html("&nbsp;");
		$('#performance-cont-throughput-status').attr('class', status);
		$('#performance-cont-throughput-detail').attr('class', detail);
		$('#performance-cont-throughput-detail').html(cont);
		$('#performance-cont-camera-status').html('<img src="' + this.loading + '" />');
		var swfplayer= document.all? window["externalpl"] : document["externalpl"];
		swfplayer.startDeviceCheck();
	},

	setCameraNum: function(n){
		var status, detail, cont;
		this.camera = n;
		if(n > 0){
			status = "performance-cont-status-ok";
			detail = "performance-cont-detail-ok";
			cont   = this.camera_ok_cont;
		} else {
			status = "performance-cont-status-ng";
			detail = "performance-cont-detail-ng";
			cont   = this.camera_ng_cont;
			this.supportedCamera = false;
		}
		$('#performance-cont-camera-status').html("&nbsp;");
		$('#performance-cont-camera-status').attr('class', status);
		$('#performance-cont-camera-detail').attr('class', detail);
		$('#performance-cont-camera-detail').html(cont);
		$('#performance-cont-microphone-status').html('<img src="' + this.loading + '" />');
	},
	
	setMicNum : function(n){
		var status, detail, cont;
		this.mic = n;
		if(n > 0){
			status = "performance-cont-status-ok";
			detail = "performance-cont-detail-ok";
			cont   = this.mic_ok_cont;
		} else {
			status = "performance-cont-status-ng";
			detail = "performance-cont-detail-ng";
			cont   = this.mic_ng_cont;
			this.supportedMic = false;
		}
		$('#performance-cont-microphone-status').html('&nbsp;');
		$('#performance-cont-microphone-status').attr('class', status);
		$('#performance-cont-microphone-detail').attr('class', detail);
		$('#performance-cont-microphone-detail').html(cont);
		this.showCheckResult();
	},
	
	start : function(){
		var version = /*'0.80722'*/Math.random();
		var h = '&host=' + location.host;
		var bgColor = this.bgColor? this.bgColor : '#333333';
		var c = '&bgColor=' + bgColor.replace('#', '0x');
		var data = [];
		data.push('<object id="externalpl" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" align="middle" width="144" height="23">');
		data.push('<param name="allowScriptAccess" value="sameDomain" />');
		data.push('<param name="allowFullScreen" value="true" />');
		data.push('<param name="movie" value="' + this.path + 'swf/EnvChecker.swf?version=' + version + '" />');
		data.push('<param name="quality" value="high" />');
		data.push('<param name="bgcolor" value="' + bgColor + '" />');
		data.push('<param name="FlashVars" value="path=' + this.path + h + c + '" />');
		data.push('<embed name="externalpl" src="' + this.path + 'swf/EnvChecker.swf?version=' + version + '" quality="high" bgcolor="' + bgColor + '" width="144" height="23" align="middle" allowFullScreen="true" allowScriptAccess="sameDomain" '); 
		data.push('FlashVars="path=' + this.path + h +  c + '"'); 
		data.push('type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />');
		data.push('</object>');
		document.write(data.join(""));
	},
	
	showCheckResult : function(){
		if(this.supportedOS && this.supportedBrowser && this.supportedPlayer && this.supportedNetwork && this.supportedCamera && this.supportedMic && this.supportedRtmp)
		{	
			$('#performance-ok').css('display', 'block');
		} else {
			$('#performance-ng').css('display', 'block');
			if(this.supportedOS) $('li#os').css('display', 'none');
			if(this.supportedBrowser) $('li#browser').css('display', 'none');
			if(this.supportedRtmp) $('li#rtmp').css('display', 'none');
			if(this.supportedPlayer) $('li#player').css('display', 'none');
			if(this.supportedNetwork) $('li#network').css('display', 'none');
			if(this.supportedCamera) $('li#camera').css('display', 'none');
			if(this.supportedMic) $('li#mic').css('display', 'none');
		}
	}

};

