/*
	HTML Format:
	<div id="swfContents">
		<img src="..."/>
		<script src="SwfElement.js"></script>
		<script src="densaSwft.js"></script>
	</div>
*/
/*
	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/densa.swf",	//SWF file
				width  : "570",
				height : "220",
				id     : "densa"
			},
			param : {
				bgcolor : "#ffffff",
				quality : "high",
				scale   : "noscale",
				salign  : "lt",
				menu    : "false",
				allowScriptAccess : "sameDomain",
				flashvars :{}
			}
		};
*/
function SwfElement(arg, id) {
	if (isVersionOk(arg.requiredVersion)) {
		html = buildTag(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 Array which represents version. ex) [9, 0, 15]
	*/
	function buildTag(arg) {
		var objTagStr = "<object";
		arg.element.type = "application/x-shockwave-flash";	// type attribute
		for (var name in arg.element) {
			objTagStr += " " + 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
			}
			else {
				objTagStr += "<param name=\"" + name + "\" value=\"" + arg.param[name] + "\"/>";
			}
		}
		objTagStr += "</object>";
		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;
			if (/body|head/i.test(div.tagName)) div = null;
		}
		return div;
	}
}
