﻿function shell(params){
	try{
		build();
	}catch(e){ alert('shell error: ' + e.message); }

	function build(){
		if(!('place_holder' in params)) throw new Error('Missing Parameter, place_holder');
		if(!('swf_file' in params)) throw new Error('Missing Parameter, swf_file');
		if(params.swf_file.search(/\.swf$/) == -1) throw new Error('Invalid Parameter, swf_file, ' + params.swf_file);
		if(!('content_xml' in params)) throw new Error('Missing Parameter, content_xml');
			
		params.width = ('width' in params) ? params.width : build.DEFAULT_WIDTH;
		params.height = ('height' in params) ? params.height : build.DEFAULT_HEIGHT;
		var palce_holder = document.getElementById(params.place_holder);
		if(palce_holder == null) throw new Error('Place Holder div with id ' + params.place_holder + ' does not exists.');
		var object = document.createElement('object'),
			embed = document.createElement('embed'),
			object_params = {"movie": document.createElement('param')};
		object_params.movie.name = "movie";
		object_params.movie.value = embed.src = params.swf_file;
		embed.width = object.width = params.width;
		embed.height = object.height = params.height;
		var param_name;
		var flashvars = '';
		for(param_name in params){
			if(param_name == 'place_holder' || param_name == 'swf_file' || param_name == 'width' || param_name == 'height') continue;
			if(param_name == 'wmode'){
				object_params.wmode = document.createElement('param');
				object_params.wmode.name = 'wmode';
				object_params.wmode.value = params[param_name];
				embed.setAttribute("wmode", params[param_name]);
				continue;
			}
			if(param_name == 'backgroundColor'){
				if(params.backgroundColor.search(/^(?:#|0x)[0-9A-Fa-f]{6}$/) != -1){
					embed.setAttribute("bgcolor", params.backgroundColor.replace(/0x/, '#'));
				}
				continue;
			}
			flashvars += param_name + '=' + encode(params[param_name]) + '&';
		}
		embed.setAttribute("FlashVars", flashvars.substring(0, flashvars.length - 1));
		try{
			for(param_name in object_params)
				object.appendChild(object_params[param_name]);
			object.appendChild(embed);
			palce_holder.appendChild(object);
		}catch(e){ doIE(palce_holder, object_params, flashvars); }
	}
	build.DEFAULT_WIDTH = 550;
	build.DEFAULT_HEIGHT = 400;
	
	function encode(value) {
		var replacement = '', encoded = '';
		for(var i = 0; i < value.length;i++){
			replacement = value.charAt(i);
			if(replacement == ';') replacement = '%3B';
			else if(replacement == '?') replacement = '%3F';
			else if(replacement == '/') replacement = '%2F';
			else if(replacement == ':') replacement = '%3A';
			else if(replacement == '#') replacement = '%23';
			else if(replacement == '&') replacement = '%24';
			else if(replacement == '=') replacement = '%3D';
			else if(replacement == '+') replacement = '%2B';
			else if(replacement == '$') replacement = '%26';
			else if(replacement == ',') replacement = '%2C';
			else if(replacement == ' ') replacement = '%20';
			else if(replacement == '%') replacement = '%25';
			else if(replacement == '<') replacement = '%3C';
			else if(replacement == '>') replacement = '%3E';
			else if(replacement == '~') replacement = '%7E';
			encoded += replacement;
		}
		return encoded;
	}
	
	function doIE(palce_holder, object_params, flashvars){
		innerHTML = "<object width='" + params.width  + "' height='" + params.height + "' > ";
		for(param_name in object_params)
			innerHTML += "<param name='" + param_name + "' value='" + object_params[param_name].value + "' />";
		innerHTML += "<embed src='" + params.swf_file + "' width='" + params.width + "' height='" + params.height + "' ";
		if('backgroundColor' in params) 
			innerHTML += "bgcolor='" + params.backgroundColor.replace(/0x/, '#') + "' ";
		if('wmode' in params)
			innerHTML += "wmode='" + params.wmode + "' ";
		innerHTML += "flashvars='" + flashvars.substring(0, flashvars.length - 1) + "' /></object>";
		// Need to remove the place holder, then wrap the object in a new place holder, and then call
		// document.write(innerHTML);
		palce_holder.innerHTML = innerHTML; 
	}
}
