forked from hummypkg/webif
288 lines
8.3 KiB
JavaScript
288 lines
8.3 KiB
JavaScript
|
/**
|
||
|
* 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() {};
|
||
|
});
|
||
|
}
|
||
|
|
||
|
})();
|