

/*
	SwfElement : add <object> element to ...
	             1. the element specified by ID
	             2. the parent element of the <script> element that requests this script.

	@param arg    Object which describes arguments for swf file.
	@param id     ID of the element you want to add <object> element as its child.
	@return [nothing]

	[arg sample]
		var sampleArg = {
			requiredVersion : "5.0.0",
			element : {
				data   : "./image/movie.swf",	//SWF file
				alt    : "./image/alt.gif",		//alternative image
				width  : "570",
				height : "220",
				id     : "ITO"
			},
			param : {
				bgcolor : "#ffffff",
				quality : "high",
				scale   : "noscale",
				salign  : "lt",
				menu    : "false",
				allowScriptAccess : "sameDomain",
				flashvars :{}
			}
		};
*/
function SwfElement(arg, id) {
	var html = "";
	if (isVersionOk(arg.requiredVersion)) {
		html = buildTag(arg);
	}
	else {
		html = buildAlt(arg);
	}
	write(html, id);

	/*
		compare the version of plug-in and that of argument requires.
		@param verStr : string describes required version
		@return  true...OK, false...NG
	*/
	function isVersionOk(verStr){
		var requiredVer = verStr ? verStr.split(".") : [0,0,0];
		var currentVer  = getSwfVersion();
		for (var i=0; i<requiredVer.length; i++) {
			if (requiredVer[i]*1 > currentVer[i]*1) return false;
		}
		return true;
	}

	/*
		get the version of the flash player.
		@param (none)
		@return Array which represents version. ex) [9, 0, 15]
	*/
	function getSwfVersion(){
		var version = [0,0,0];
		var player = null;
		if(navigator.plugins && navigator.mimeTypes.length){
			var plugin = navigator.plugins["Shockwave Flash"];
			if(plugin && plugin.description){
				version = plugin.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split(".");
			}
		}
		else{
			var name = "ShockwaveFlash.ShockwaveFlash";
			try{
				player = new ActiveXObject(name + ".7");
			}
			catch(e){
				try{
					player = new ActiveXObject(name + ".6");
					version = [6,0,21];
					player.AllowScriptAccess="always";
				}
				catch(e){
					if(version[0]==6) return version;
				}
				try{
					player = new ActiveXObject(name);
				}
				catch(e){
					//
				}
			}
			if(player != null){
				version = player.GetVariable("$version").split(" ")[1].split(",");
			}
		}
		return version;
	}

	/*
		build <object> element from arguments.
		@param arg arguments for <object> element and <param> elements.
		@return String which represents <object> element.
	*/
	function buildTag(arg) {
		var objTagStr = "<object", embedTagStr="<embed";
		arg.element.type = "application/x-shockwave-flash";	// type attribute
		for (var name in arg.element) {
			if (name == "alt") continue;
			objTagStr += " " + name + "=\""+arg.element[name] + "\"";
			embedTagStr += " " + name + "=\""+arg.element[name] + "\"";
		}
		objTagStr += ">";
		arg.param.movie = arg.element.data;
		for (var name in arg.param) {
			if (name == "flashvars") {
				//not implemented yet : vars for swf file
				var vars=[];
				for(var prop in arg.param[name]){
					vars[vars.length]=(prop+'='+encodeURIComponent(arg.param[name][prop]));
				}
				objTagStr += "<param name=\"" + name + "\" value=\"" + vars.join('&') + "\"/>";
				embedTagStr += " " + name + "=\""+ vars.join('&') + "\"";
			}
			else {
				objTagStr += "<param name=\"" + name + "\" value=\"" + arg.param[name] + "\"/>";
				embedTagStr += " " + name + "=\""+arg.param[name] + "\"";
			}
		}
		objTagStr += embedTagStr+' />';
		objTagStr += "</object>";
		return objTagStr;
	}


	/*
		build <img> element from arguments.
		@param arg arguments for <object> element and <param> elements.
		@return String which represents <img> element.
	*/
	function buildAlt(arg) {
		var objTagStr = "<img";
		arg.element.src = arg.element.alt;
		arg.element.alt = "You need Flash Player " + arg.requiredVersion + "or newer.";
		for (var name in arg.element) {
			if (name == "data") continue;
			objTagStr += " " + name + "=\""+arg.element[name] + "\"";
		}
		objTagStr += " />"
		return objTagStr;
	}


	/*
		add <object> element to the specified element
		@param objTag ... string that represents <object> element.
		@param id ... string that represents ID for the parent element. (option)
		@return (none)
	*/
	function write(objTag, id) {
		var div = getDiv(id);
		if (div) div.innerHTML = objTag;
	}

	/*
		get element by specified ID.
		@param id ... ID for the element. (option)
		@return  1. the element which has specified ID
		         2. the parent element of the <script> element of this script.
	*/
	function getDiv(id) {
		var div = document.getElementById(id);
		if (!div) {
			var tags = document.getElementsByTagName("script");
			var tag = tags[tags.length - 1];
			div = tag.parentNode || tag.parentElement;
			if (/body|head/i.test(div.tagName)) div = null;
		}
		return div;
	}

}



