(function($){

$.fn.flash = function(opts,htmlOptions) {
	
	opts = $.extend({
		src		: null,
		version	: null,
		width	: '100%',
		height	: '100%'
	},opts);
	
	htmlOptions = $.extend({
		flashvars	: {},
		pluginspage	: 'https://www.adobe.com/go/getflashplayer',
		type		: 'application/x-shockwave-flash',
		wmode		: 'transparent'
	},htmlOptions);
	
	var ieParams = {
		wmode:null,
		flashvars:null,
		salign:'',
		quality:'high',
		play:'true',
		loop:'true',
		scale:'exactFit',
		devicefont:'false',
		bgcolor:'#FFF',
		menu:'true',
		allowScriptAccess:'sameDomain',
		allowFullScreen:'false'
	};
	
	function hasVersion() {
		switch(typeof opts.version) {
			case 'string':
				var required = opts.version.split(',');
				break;
			case 'number':
				var required = [opts.version];
				break;
			default:
				return true;
		}
		var	installed = getVersion(),
			pass = true;
		if (installed != -1){
			installed = installed.split(',');	
		}
		for(var i=0;i<required.length;i++) {
			pass = pass && required[i] <= installed[i];
		}
		return pass;
	}
	
	function getVersion() {
		var flashVer = -1;
		try {
			var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
			return axo.GetVariable("$version").replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
		}
		catch(e){
			if (navigator.plugins != null && navigator.plugins.length > 0) {
				if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
					var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
					var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
					var descArray = flashDescription.split(" ");
					var tempArrayMajor = descArray[2].split(".");			
					var flashVer = tempArrayMajor.join(',');
				}
			}
		}
		return flashVer;
	}
	
	function attributeString(attrs) {
		var s = '';
		for(var key in attrs) {
			if(typeof attrs[key] != 'function') {
				s += key+'="'+attrs[key]+'" ';
			}
		}
		return s;
	}
	
	function queryString(attrs) {
		var s = '';
		for(var key in attrs) {
			if(typeof attrs[key] != 'function') {
				s += key+'='+encodeURIComponent(this[key])+'&';
			}
		}
		return s.replace(/&$/, '');
	}
	
	function htmlString() {
		if($.browser.msie) {

			var str = '';
			str += '<object width="'+htmlOptions.width+'" height="'+htmlOptions.height+'" type="'+htmlOptions.type+'" id="'+htmlOptions.id+'" >';
			
			str += '<param name="movie" value="' + htmlOptions.src + '" />';
			for (var i in ieParams) {
				if(htmlOptions[i]) {
					str += '<param name="'+i+'" value="' + htmlOptions[i] + '" />';
				}
				else {
					str += '<param name="'+i+'" value="' + ieParams[i] + '" />';
				}
			}
			str += '</object>';
			return str;
		}
		else {
			return '<embed ' + attributeString(htmlOptions) + '/>';
		}
	}
	
	return $(this).each(function(){
		
		var $this = $(this);
		
		if(hasVersion()) {
			if(!opts.src) {
				throw new Error('Flash src is not defined');
			}
			htmlOptions.width = opts.width;
			htmlOptions.height = opts.height;
			htmlOptions.src = opts.src;
			htmlOptions.flashvars = queryString(htmlOptions.flashvars);
			
			$this[0].innerHTML = htmlString();
			
			var swf = $this.children()[0];
			
			$this.bind('externalInterface',function(){
				var params = $.makeArray(arguments);
				params.shift();
				var fn = params.shift();
				(function(){
					try{
						swf[fn].call(swf,params[0]);
					}
					catch(e) {
						setTimeout(arguments.callee,10);
					}
				})()
			});
		}
		else {
			// if flash version not installed, trigger failure event with version number available
			$this.trigger('noflash',getVersion());
		}
	});
	
}

})(jQuery);
