;(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));
  });
  
};

$$.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;
};

$$.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;
};

$$.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';
};

$$.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() {};
  });
}
  
})();
