/** * 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="../system/'+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="../system/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() {};	});}	})();