(function ()   var $$;   $$ = 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)) {             if (pluginOptions.expressInstall &amp;&amp; $$.hasFlash(6, 0, 65)) {                 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 {                 return this;             }         }         // Merge the default, express install and passed html options.         htmlOptions = $$.copy($$.htmlOptions, expressInstallOptions, htmlOptions);         return this.each(function () {             block.call(this, $$.copy(htmlOptions));         });     };  $$.copy = function () {         var options = {}, flashvars = {};         for (var i = 0; i &lt; arguments.length; i++) {             var arg = arguments[i];             if (arg == undefined) continue;             jQuery.extend(options, arg);             // don't clobber one flash vars object with another             if (arg.flashvars == undefined) continue;             jQuery.extend(flashvars, arg.flashvars);         }         options.flashvars = flashvars;         return options;     };   $$.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 &lt; 3; i++) {             pv[i] = parseInt(pv[i] || 0);             rv[i] = parseInt(rv[i] || 0);             // player is less than required             if (pv[i] &lt; rv[i]) return false;             // player is greater than required             if (pv[i] &gt; rv[i]) return true;         }         // major version, minor version and revision match exactly         return true;     };  $$.hasFlash.playerVersion = function () {         // ie         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];             // 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';     };   $$.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 = '&lt;div class="alt"&gt;' + this.innerHTML + '&lt;/div&gt;';         jQuery(this)         .addClass('flash-replaced')         .prepend($$.transform(htmlOptions));     };     /**     $$.update = function (htmlOptions) {         var url = String(location).split('?');         url.splice(1, 0, '?hasFlash=true&amp;');         url = url.join('');         var msg = '&lt;p&gt;This content requires the Flash Player. &lt;a href="http://www.adobe.com/go/getflashplayer"&gt;Download Flash Player&lt;/a&gt;. Already have Flash Player? &lt;a href="' + url + '"&gt;Click here.&lt;/a&gt;&lt;/p&gt;';         this.innerHTML = '&lt;span class="alt"&gt;' + this.innerHTML + '&lt;/span&gt;';         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]) + '&amp;';         return s.replace(/&amp;$/, '');     };     $$.transform = function (htmlOptions) {         htmlOptions.toString = toAttributeString;         if (htmlOptions.flashvars) htmlOptions.flashvars.toString = toFlashvarsString;         return '&lt;embed ' + String(htmlOptions) + '/&gt;';     };     if (window.attachEvent) {         window.attachEvent("onbeforeunload", function () {             __flash_unloadHandler = function () { };             __flash_savedUnloadHandler = function () { };         });     } })();
