/**
 * 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 $$;

$$ = 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() {};
   });
}

})();