text: /**
   * Flash (http://jquery.lukelutman.com/plugins/flash)
   * A jQuery plugin for embedding Flash movies.
   * 
   * Version 1.0
   * November 9th, 2006
   *
   * Copyright (c) 2006 Luke Lutman (http://www.lukelutman.com)
   * Dual licensed under the MIT and GPL licenses.
   * http://www.opensource.org/licenses/mit-license.php
   * http://www.opensource.org/licenses/gpl-license.php
   * 
   * Inspired by:
   * SWFObject (http://blog.deconcept.com/swfobject/)
   * UFO (http://www.bobbyvandersluis.com/ufo/)
   * sIFR (http://www.mikeindustries.com/sifr/)
   * 
   * IMPORTANT: 
   * The packed version of jQuery breaks ActiveX control
   * activation in Internet Explorer. Use JSMin to minifiy
   * jQuery (see: http://jquery.lukelutman.com/plugins/flash#activex).
   *
   **/ 
  ;(function(){
  	
  var $$;
  
  /**
   * 
   * @desc Replace matching elements with a flash movie.
   * @author Luke Lutman
   * @version 1.0.1
   *
   * @name flash
   * @param Hash htmlOptions Options for the embed/object tag.
   * @param Hash pluginOptions Options for detecting/updating the Flash plugin (optional).
   * @param Function replace Custom block called for each matched element if flash is installed (optional).
   * @param Function update Custom block called for each matched if flash isn't installed (optional).
   * @type jQuery
   *
   * @cat plugins/flash
   * 
   * @example $('#hello').flash({ src: 'hello.swf' });
   * @desc Embed a Flash movie.
   *
   * @example $('#hello').flash({ src: 'hello.swf' }, { version: 8 });
   * @desc Embed a Flash 8 movie.
   *
   * @example $('#hello').flash({ src: 'hello.swf' }, { expressInstall: true });
   * @desc Embed a Flash movie using Express Install if flash isn't installed.
   *
   * @example $('#hello').flash({ src: 'hello.swf' }, { update: false });
   * @desc Embed a Flash movie, don't show an update message if Flash isn't installed.
   *
  **/
  $$ = jQuery.fn.flash = function(htmlOptions, pluginOptions, replace, update) {
  	
  	// Set the default block.
  	var block = replace || $$.replace;
  	
  	// Merge the default and passed plugin options.
  	pluginOptions = $$.copy($$.pluginOptions, pluginOptions);
  	
  	// Detect Flash.
  	if(!$$.hasFlash(pluginOptions.version)) {
  		// Use Express Install (if specified and Flash plugin 6,0,65 or higher is installed).
  		if(pluginOptions.expressInstall && $$.hasFlash(6,0,65)) {
  			// Add the necessary flashvars (merged later).
  			var expressInstallOptions = {
  				flashvars: {  	
  					MMredirectURL: location,
  					MMplayerType: 'PlugIn',
  					MMdoctitle: jQuery('title').text() 
  				}					
  			};
  		// Ask the user to update (if specified).
  		} else if (pluginOptions.update) {
  			// Change the block to insert the update message instead of the flash movie.
  			block = update || $$.update;
  		// Fail
  		} else {
  			// The required version of flash isn't installed.
  			// Express Install is turned off, or flash 6,0,65 isn't installed.
  			// Update is turned off.
  			// Return without doing anything.
  			return this;
  		}
  	}
  	
  	// Merge the default, express install and passed html options.
  	htmlOptions = $$.copy($$.htmlOptions, expressInstallOptions, htmlOptions);
  	
  	// Invoke $block (with a copy of the merged html options) for each element.
  	return this.each(function(){
  		block.call(this, $$.copy(htmlOptions));
  	});
  	
  };
  /**
   *
   * @name flash.copy
   * @desc Copy an arbitrary number of objects into a new object.
   * @type Object
   * 
   * @example $$.copy({ foo: 1 }, { bar: 2 });
   * @result { foo: 1, bar: 2 };
   *
  **/
  $$.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);
  		// don't clobber one flash vars object with another
  		// merge them instead
  		if(arg.flashvars == undefined) continue;
  		jQuery.extend(flashvars, arg.flashvars);
  	}
  	options.flashvars = flashvars;
  	return options;
  };
  /*
   * @name flash.hasFlash
   * @desc Check if a specific version of the Flash plugin is installed
   * @type Boolean
   *
  **/
  $$.hasFlash = function() {
  	// look for a flag in the query string to bypass flash detection
  	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);
  		// player is less than required
  		if(pv[i] < rv[i]) return false;
  		// player is greater than required
  		if(pv[i] > rv[i]) return true;
  	}
  	// major version, minor version and revision match exactly
  	return true;
  };
  /**
   *
   * @name flash.hasFlash.playerVersion
   * @desc Get the version of the installed Flash plugin.
   * @type String
   *
  **/
  $$.hasFlash.playerVersion = function() {
  	// ie
  	try {
  		try {
  			// avoid fp6 minor version lookup issues
  			// see: http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/
  			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];
  	// other browsers
  	} 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';
  };
  /**
   *
   * @name flash.htmlOptions
   * @desc The default set of options for the object or embed tag.
   *
  **/
  $$.htmlOptions = {
  	height: 240,
  	flashvars: {},
  	pluginspage: 'http://www.adobe.com/go/getflashplayer',
  	src: '#',
  	type: 'application/x-shockwave-flash',
  	width: 320		
  };
  /**
   *
   * @name flash.pluginOptions
   * @desc The default set of options for checking/updating the flash Plugin.
   *
  **/
  $$.pluginOptions = {
  	expressInstall: false,
  	update: true,
  	version: '6.0.65'
  };
  /**
   *
   * @name flash.replace
   * @desc The default method for replacing an element with a Flash movie.
   *
  **/
  $$.replace = function(htmlOptions) {
  	this.innerHTML = '<div class="alt">'+this.innerHTML+'</div>';
  	jQuery(this)
  		.addClass('flash-replaced')
  		.prepend($$.transform(htmlOptions));
  };
  /**
   *
   * @name flash.update
   * @desc The default method for replacing an element with an update message.
   *
  **/
  $$.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);
  };
  /**
   *
   * @desc Convert a hash of html options to a string of attributes, using Function.apply(). 
   * @example toAttributeString.apply(htmlOptions)
   * @result foo="bar" foo="bar"
   *
  **/
  function toAttributeString() {
  	var s = '';
  	for(var key in this)
  		if(typeof this[key] != 'function')
  			s += key+'="'+this[key]+'" ';
  	return s;		
  };
  /**
   *
   * @desc Convert a hash of flashvars to a url-encoded string, using Function.apply(). 
   * @example toFlashvarsString.apply(flashvarsObject)
   * @result foo=bar&foo=bar
   *
  **/
  function toFlashvarsString() {
  	var s = '';
  	for(var key in this)
  		if(typeof this[key] != 'function')
  			s += key+'='+encodeURIComponent(this[key])+'&';
  	return s.replace(/&$/, '');		
  };
  /**
   *
   * @name flash.transform
   * @desc Transform a set of html options into an embed tag.
   * @type String 
   *
   * @example $$.transform(htmlOptions)
   * @result <embed src="foo.swf" ... />
   *
   * Note: The embed tag is NOT standards-compliant, but it 
   * works in all current browsers. flash.transform can be
   * overwritten with a custom function to generate more 
   * standards-compliant markup.
   *
  **/
  $$.transform = function(htmlOptions) {
  	htmlOptions.toString = toAttributeString;
  	if(htmlOptions.flashvars) htmlOptions.flashvars.toString = toFlashvarsString;
  	return '<embed ' + String(htmlOptions) + '/>';		
  };
  
  /**
   *
   * Flash Player 9 Fix (http://blog.deconcept.com/2006/07/28/swfobject-143-released/)
   *
  **/
  if (window.attachEvent) {
  	window.attachEvent("onbeforeunload", function(){
  		__flash_unloadHandler = function() {};
  		__flash_savedUnloadHandler = function() {};
  	});
  }
  	
  })();