Flash = {
	_browser: {
		ie: Prototype.Browser.IE,
		win: (navigator.appVersion.toLowerCase().indexOf("win") != -1),
		gecko: Prototype.Browser.Gecko,
		opera: Prototype.Browser.Opera,
		safari: Prototype.Browser.Webkit
	},
	_controlVersion: function(){
		var l_versionString = "";
		var l_version = {major: 0, minor: 0, revision: 0};
		var l_object = null;

		try{
			l_object = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
			l_versionString = l_object.GetVariable("$version");
		}catch(e){
		};

		if(!l_version){
			try{
				l_object = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
				// installed player is some revision of 6.0
				// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
				// so we have to be careful. 
				
				// default to the first public version
				l_versionString = "WIN 6,0,21,0";

				// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
				l_object.AllowScriptAccess = "always";

				// safe to call for 6.0r47 or greater
				l_versionString = l_object.GetVariable("$version");
			}catch(e){
			};
		};

		if(!l_version){
			try{
				// version will be set for 4.X or 5.X player
				l_object = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
				l_versionString = l_object.GetVariable("$version");
			}catch(e){
			};
		};

		if(!l_version){
			try{
				// version will be set for 3.X player
				l_object = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
				l_versionString = "WIN 3,0,18,0";
			}catch(e){
			};
		};

		if(!l_version){
			try{
				// version will be set for 2.X player
				l_object = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
				l_versionString = "WIN 2,0,0,11";
			}catch(e){
				l_versionString = "";
			};
		};

		if(!l_versionString.blank()){
			var l_tempArray = l_versionString.split(" ");
			var l_versionArray = l_tempArray[1].split(".");

			l_version = Object.extend(l_version, {major: l_versionArray[0], minor: l_versionArray[1], revision: l_versionArray[2]});
		}

		return l_version;
	},
	_version: function(){
		var l_version = {major: 0, minor: 0, revision: 0};
		if(navigator.plugins != null && navigator.plugins.length > 0){
			if(navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]){
				var l_version2 = navigator.plugins["Shockwave Flash 2.0"] ? "2.0" : "";
				var l_description = navigator.plugins["Shockwave Flash" + l_version2].description;
				var l_array = l_description.split(" ");
				var l_tempArray = l_array[2].split(".");
				var l_versionMajor = l_tempArray[0];
				var l_versionMinor = l_tempArray[1];
				var l_versionRevision = l_array[3];
				if(l_versionRevision == ""){
					l_versionRevision = l_array[4];
				};
				if(l_versionRevision[0] == "d"){
					l_versionRevision = l_versionRevision.substring(1);
				}else if(l_versionRevision[0] == "r"){
					l_versionRevision = l_versionRevision.substring(1);
					if(l_versionRevision.indexOf("d") > 0){
						l_versionRevision = l_versionRevision.substring(0, l_versionRevision.indexOf("d"));
					};
				};

				l_version = Object.extend(l_version, {major: l_versionMajor, minor: l_versionMinor, revision: l_versionRevision});
			};
		}else if(navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1){
			l_version = Object.extend(l_version, {major: 4});
		}else if(navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1){
			l_version = Object.extend(l_version, {major: 3});
		}else if(navigator.userAgent.toLowerCase().indexOf("webtv") != -1){
			l_version = Object.extend(l_version, {major: 2});
		}else if(this._browser.ie && this._browser.win && !this._browser.opera){
			l_version = Object.extend(l_version, this._controlVersion());
		};
		return l_version;
	},
	_detectVersion: function(major, minor, revision){
		var l_version = this._version();
		if(typeof l_version.major === "undefined"){
			return false;
		}else{
			if(l_version.major && (l_version.major > parseFloat(major))){
				return true;
			}else if(l_version.major && (l_version.major == parseFloat(major))){
				if(l_version.minor && (l_version.minor > parseFloat(minor))){
					return true;
				}else if(l_version.minor && (l_version.minor == parseFloat(minor))){
					if(l_version.revision && (l_version.revision >= parseFloat(revision))){
						return true;
					};
				};
			};
			return false;
		};
	},
	_draw: function(option){
		option = Object.extend({
			"classid": "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000",
			"type": "application/x-shockwave-flash",
			"pluginspage": "http://www.adobe.com/go/getflashplayer",
			"codebase": "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0",
			"align": "middle",
			"quality": "high",
			"bgcolor": "#ffffff",
			"menu": "false",
			"allowScriptAccess": "always",
			"wmode": "transparent"
		}, option);


		var l_objectAttributes = Object.extend({}, this._extendObject(option));
		var l_embedAttributes = Object.extend({}, this._extendEmbed(option));
		var l_parameters = Object.extend({}, this._extendParameter(option));

		var l_html = "<object ";

		for(var l_key in l_objectAttributes){
			l_html += (l_key + "=\"" + l_objectAttributes[l_key] + "\" ");
		};
		l_html += ">";

		for(l_key in l_parameters){
			l_html += ("<param name=\"" + l_key + "\" value=\"" + l_parameters[l_key] + "\" \/>");
		};

		l_html += "<embed ";
		for(var l_key in l_embedAttributes){
			l_html += (l_key + "=\"" + l_embedAttributes[l_key] + "\" ");
		};
		l_html += " \/>";
		l_html += "<\/object>";

		return l_html;
	},
	_extendObject: function(option){
		var l_option = {};
		
		for(var l_key in option){
			switch(l_key.toLowerCase()){
				case "classid":
				case "onafterupdate":
				case "onbeforeupdate":
				case "onblur":
				case "oncellchange":
				case "onclick":
				case "ondblClick":
				case "ondrag":
				case "ondragend":
				case "ondragenter":
				case "ondragleave":
				case "ondragover":
				case "ondrop":
				case "onfinish":
				case "onfocus":
				case "onhelp":
				case "onmousedown":
				case "onmouseup":
				case "onmouseover":
				case "onmousemove":
				case "onmouseout":
				case "onkeypress":
				case "onkeydown":
				case "onkeyup":
				case "onload":
				case "onlosecapture":
				case "onpropertychange":
				case "onreadystatechange":
				case "onrowsdelete":
				case "onrowenter":
				case "onrowexit":
				case "onrowsinserted":
				case "onstart":
				case "onscroll":
				case "onbeforeeditfocus":
				case "onactivate":
				case "onbeforedeactivate":
				case "ondeactivate":
				case "type":
				case "codebase":
				case "id":
				case "width":
				case "height":
				case "align":
				case "vspace": 
				case "hspace":
				case "class":
				case "title":
				case "accesskey":
				case "name":
				case "tabindex":
					l_option[l_key] = option[l_key];
			};
		};

		return l_option;
	},
	_extendEmbed: function(option){
		var l_option = {};
		
		for(var l_key in option){
			switch(l_key.toLowerCase()){
				case "classid":
				case "onafterupdate":
				case "onbeforeupdate":
				case "onblur":
				case "oncellchange":
				case "onclick":
				case "ondblClick":
				case "ondrag":
				case "ondragend":
				case "ondragenter":
				case "ondragleave":
				case "ondragover":
				case "ondrop":
				case "onfinish":
				case "onfocus":
				case "onhelp":
				case "onmousedown":
				case "onmouseup":
				case "onmouseover":
				case "onmousemove":
				case "onmouseout":
				case "onkeypress":
				case "onkeydown":
				case "onkeyup":
				case "onload":
				case "onlosecapture":
				case "onpropertychange":
				case "onreadystatechange":
				case "onrowsdelete":
				case "onrowenter":
				case "onrowexit":
				case "onrowsinserted":
				case "onstart":
				case "onscroll":
				case "onbeforeeditfocus":
				case "onactivate":
				case "onbeforedeactivate":
				case "ondeactivate":
				case "codebase":
					break;
				default:
					l_option[l_key] = option[l_key];
			};
		};

		return l_option;
	},
	_extendParameter: function(option){
		var l_option = {};
		
		for(var l_key in option){
			switch(l_key.toLowerCase()){
				case "classid":
				case "pluginspage":
				case "onafterupdate":
				case "onbeforeupdate":
				case "onblur":
				case "oncellchange":
				case "onclick":
				case "ondblClick":
				case "ondrag":
				case "ondragend":
				case "ondragenter":
				case "ondragleave":
				case "ondragover":
				case "ondrop":
				case "onfinish":
				case "onfocus":
				case "onhelp":
				case "onmousedown":
				case "onmouseup":
				case "onmouseover":
				case "onmousemove":
				case "onmouseout":
				case "onkeypress":
				case "onkeydown":
				case "onkeyup":
				case "onload":
				case "onlosecapture":
				case "onpropertychange":
				case "onreadystatechange":
				case "onrowsdelete":
				case "onrowenter":
				case "onrowexit":
				case "onrowsinserted":
				case "onstart":
				case "onscroll":
				case "onbeforeeditfocus":
				case "onactivate":
				case "onbeforedeactivate":
				case "ondeactivate":
				case "type":
				case "codebase":
				case "id":
				case "width":
				case "height":
				case "align":
				case "vspace": 
				case "hspace":
				case "class":
				case "title":
				case "accesskey":
				case "name":
				case "tabindex":
					break;
				case "src":
					l_option["movie"] = option[l_key];
					break;
				default:
					l_option[l_key] = option[l_key];
			};
		};

		return l_option;
	},
	create: function(url, option){

		document.write(this.toString(url, option));
	},
	toString: function(url, option){
		var l_id = (option && option.id) ? option.id : url.replace(/\S*\/([^\/]+).[a-zA-Z0-9]{3,4}(?:\?.+)$/, '$1');
		var l_name = (option && option.name) ? option.name : l_id;

		var l_option = {
			id: l_id,
			name: l_name,
			src: url
		};
		
		return this._draw(Object.extend(l_option, option));
	}
};