;(function(){
	var $$;
	$$ = jQuery.fn.flash = function(htmlOptions, pluginOptions, replace, update) {
		var block = replace || $$.replace;
		pluginOptions = $$.copy($$.pluginOptions, pluginOptions);
		if(!$$.hasFlash(pluginOptions.version)) {
			if(pluginOptions.expressInstall && $$.hasFlash(6,0,65)) {
				var expressInstallOptions = {
					flashvars: {  	
						MMredirectURL: location,
						MMplayerType: 'PlugIn',
						MMdoctitle: jQuery('title').text() 
					}					
				};
			} else if (pluginOptions.update) {
				block = update || $$.update;
			} else {
				return this;
			}
		}
		htmlOptions = $$.copy($$.htmlOptions, expressInstallOptions, htmlOptions);
		return this.each(function(){
			block.call(this, $$.copy(htmlOptions));
		});
	};
	$$.copy = function() {
		var options = {}, flashvars = {};
		for(var i = 0; i < arguments.length; i++) {
			var arg = arguments[i];
			if(arg == undefined) continue;
			jQuery.extend(options, arg);
			if(arg.flashvars == undefined) continue;
			jQuery.extend(flashvars, arg.flashvars);
		}
		options.flashvars = flashvars;
		return options;
	};
	$$.hasFlash = function() {
		if(/hasFlash\=true/.test(location)) return true;
		if(/hasFlash\=false/.test(location)) return false;
		var pv = $$.hasFlash.playerVersion().match(/\d+/g);
		var rv = String([arguments[0], arguments[1], arguments[2]]).match(/\d+/g) || String($$.pluginOptions.version).match(/\d+/g);
		for(var i = 0; i < 3; i++) {
			pv[i] = parseInt(pv[i] || 0);
			rv[i] = parseInt(rv[i] || 0);
			if(pv[i] < rv[i]) return false;
			if(pv[i] > rv[i]) return true;
		}
		return true;
	};
	$$.hasFlash.playerVersion = function() {
		try {
			try {
				var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');
				try { axo.AllowScriptAccess = 'always';	} 
				catch(e) { return '6,0,0'; }				
			} catch(e) {}
			return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
		} catch(e) {
			try {
				if(navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){
					return (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
				}
			} catch(e) {}		
		}
		return '0,0,0';
	};
	$$.htmlOptions = {
		height: 240,
		flashvars: {},
		pluginspage: 'http://www.adobe.com/go/getflashplayer',
		src: '#',
		type: 'application/x-shockwave-flash',
		width: 320		
	};
	$$.pluginOptions = {
		expressInstall: false,
		update: true,
		version: '6.0.65'
	};
	$$.replace = function(htmlOptions) {
		this.innerHTML = '<div class="alt">'+this.innerHTML+'</div>';
		jQuery(this)
			.addClass('flash-replaced')
			.prepend($$.transform(htmlOptions));
	};
	$$.update = function(htmlOptions) {
		var url = String(location).split('?');
		url.splice(1,0,'?hasFlash=true&');
		url = url.join('');
		var msg = '<p>This content requires the Flash Player. <a href="http://www.adobe.com/go/getflashplayer">Download Flash Player</a>. Already have Flash Player? <a href="'+url+'">Click here.</a></p>';
		this.innerHTML = '<span class="alt">'+this.innerHTML+'</span>';
		jQuery(this)
			.addClass('flash-update')
			.prepend(msg);
	};
	function toAttributeString() {
		var s = '';
		for(var key in this)
			if(typeof this[key] != 'function')
				s += key+'="'+this[key]+'" ';
		return s;		
	};
	function toFlashvarsString() {
		var s = '';
		for(var key in this)
			if(typeof this[key] != 'function')
				s += key+'='+encodeURIComponent(this[key])+'&';
		return s.replace(/&$/, '');		
	};
	$$.transform = function(htmlOptions) {
		htmlOptions.toString = toAttributeString;
		if(htmlOptions.flashvars) htmlOptions.flashvars.toString = toFlashvarsString;
		return '<embed ' + String(htmlOptions) + '/>';		
	};
	if (window.attachEvent) {
		window.attachEvent("onbeforeunload", function(){
			__flash_unloadHandler = function() {};
			__flash_savedUnloadHandler = function() {};
		});
	}
})();