if(location.href.toLowerCase().indexOf("file://")>-1){ throw new Error("dojox.embed.Flash can't be run directly from a file. To instatiate the required SWF correctly it must be run from a server, like localHost."); }
// available: Number // If there is a flash player available, and if so what version. this.available = dojox.embed.Flash.available;
// minimumVersion: Number // The minimum version of Flash required to run this movie. this.minimumVersion = kwArgs.minimumVersion || minimumVersion; //console.log("AVAILABLE:", this);
// id: String // The id of the DOMNode to be used for this movie. Can be used with dojo.byId to get a reference. this.id = null;
// movie: FlashObject // A reference to the movie itself. this.movie = null;
// domNode: DOMNode // A reference to the DOMNode that contains this movie. this.domNode = null; if(node){ node = dojo.byId(node); } // setTimeout Fixes #8743 - creating double SWFs // also allows time for code to attach to onError setTimeout(dojo.hitch(this, function(){ if(kwArgs.expressInstall || this.available && this.available >= this.minimumVersion){ if(kwArgs && node){ this.init(kwArgs, node); }else{ this.onError("embed.Flash was not provided with the proper arguments."); } }else{ if(!this.available){ this.onError("Flash is not installed."); }else{ this.onError("Flash version detected: "+this.available+" is out of date. Minimum required: "+this.minimumVersion); } } }), 100);
summary
Create a wrapper object around a Flash movie; this is the DojoX equivilent
to SWFObject.
description
Creates a wrapper object around a Flash movie. Wrapper object will
insert the movie reference in node; when the browser first starts
grabbing the movie, onReady will be fired; when the movie has finished
loading, it will fire onLoad.
If your movie uses ExternalInterface, you should use the onLoad event
to do any kind of proxy setup (see dojox.embed.Flash.proxy); this seems
to be the only consistent time calling EI methods are stable (since the
Flash movie will shoot several methods into the window object before
EI callbacks can be used properly).
*Important note*: this code includes a workaround for the Eolas "fix" from
Microsoft; in order to work around the "click to activate this control" message
on any embedded Flash movie, this code will load a separate, non-dojo.require
javascript file in order to write the Flash movie into the document. As such
it cannot be used with Dojo's scope map techniques for working with multiple
versions of Dojo on the same page.
example
Embed a flash movie in a document using the new operator, and get a reference to it.
var movie = new dojox.embed.Flash({
path: "path/to/my/movie.swf",
width: 400,
height: 300
}, myWrapperNode, "testLoaded");
example
Embed a flash movie in a document without using the new operator.
var movie = dojox.embed.Flash({
path: "path/to/my/movie.swf",
width: 400,
height: 300,
style: "position:absolute;top:0;left:0"
}, myWrapperNode, "testLoaded");
File can only be run from a server, due to SWF dependency.
console.warn("embed.Flash.movie.onReady:", movie) // summary: // Stub function for you to attach to when the movie reference is first // pushed into the document.
console.warn("embed.Flash.movie.onLoad:", movie) // summary: // Stub function for you to attach to when the movie has finished downloading // and is ready to be manipulated.
console.log("embed.Flash.movie.init") // summary // Initialize (i.e. place and load) the movie based on kwArgs. this.destroy(); // ensure we are clean first. node = dojo.byId(node || this.domNode); if(!node){ throw new Error("dojox.embed.Flash: no domNode reference has been passed."); }
// vars to help determine load status var p = 0, testLoaded=false; this._poller = null; this._pollCount = 0; this._pollMax = 15; this.pollTime = 100;
// catch errors if not quite ready. try{ p = this.movie.PercentLoaded(); }catch(e){ /* squelch */ console.warn("this.movie.PercentLoaded() failed"); }
if(p == 100){ // if percent = 100, movie is fully loaded and we're communicating this._onload();
}else if(p==0 && this._pollCount++ > this._pollMax){ // after several attempts, we're not past zero. // FIXME: What if we get stuck on 33% or something? clearInterval(this._poller); throw new Error("Building SWF failed."); } }), this.pollTime); }), 1); }
// attach some cleanup for IE, thanks to deconcept :) dojo.addOnUnload(function(){ var dummy = function(){}; var objs = dojo.query("object"). reverse(). style("display", "none"). forEach(function(i){ for(var p in i){ if((p != "FlashVars") && dojo.isFunction(i[p])){ try{ i[p] = dummy; }catch(e){} } } }); });
// TODO: ...and double check this fix; is IE really firing onbeforeunload with any kind of href="#" link? /* var beforeUnloadHandle = dojo.connect(dojo.global, "onbeforeunload", function(){ try{ if(__flash_unloadHandler){ __flash_unloadHandler=function(){ }; } if(__flash_savedUnloadHandler){ __flash_savedUnloadHandler=function(){ }; } } catch(e){ } dojo.disconnect(beforeUnloadHandle); }); */ } else { // *** Sane browsers branch ****************************************************************** fMarkup = function(kwArgs){ kwArgs = prep(kwArgs); if(!kwArgs){ return null; }
var p; var path = kwArgs.path; if(kwArgs.vars){ var a = []; for(p in kwArgs.vars){ a.push(p + '=' + kwArgs.vars[p]); } kwArgs.params.flashVars = a.join("&"); delete kwArgs.vars; } var s = '
// attach some cleanup for IE, thanks to deconcept :) dojo.addOnUnload(function(){ var dummy = function(){}; var objs = dojo.query("object"). reverse(). style("display", "none"). forEach(function(i){ for(var p in i){ if((p != "FlashVars") && dojo.isFunction(i[p])){ try{ i[p] = dummy; }catch(e){} } } }); });
// TODO: ...and double check this fix; is IE really firing onbeforeunload with any kind of href="#" link? /* var beforeUnloadHandle = dojo.connect(dojo.global, "onbeforeunload", function(){ try{ if(__flash_unloadHandler){ __flash_unloadHandler=function(){ }; } if(__flash_savedUnloadHandler){ __flash_savedUnloadHandler=function(){ }; } } catch(e){ } dojo.disconnect(beforeUnloadHandle); }); */ } else { // *** Sane browsers branch ****************************************************************** fMarkup = function(kwArgs){ kwArgs = prep(kwArgs); if(!kwArgs){ return null; }
var p; var path = kwArgs.path; if(kwArgs.vars){ var a = []; for(p in kwArgs.vars){ a.push(p + '=' + kwArgs.vars[p]); } kwArgs.params.flashVars = a.join("&"); delete kwArgs.vars; } var s = '
summary
dojox.embed.Flash.byId
type
Function
parameters:
movieName: (typeof String)
The name of the SWF
doc: (typeof Object)
The document, if not current window
(not fully supported)
dojo.forEach((dojo.isArray(methods) ? methods : [ methods ]), function(item){ this[item] = dojo.hitch(this, function(){ return (function(){ return eval(this.movie.CallFunction( '' + '' + dojo.map(arguments, function(item){ // FIXME: // investigate if __flash__toXML will // accept direct application via map() // (e.g., does it ignore args past the // first? or does it blow up?) return __flash__toXML(item); }).join("") + '' + '' )); }).apply(this, arguments||[]); }); }, obj);
summary
Create the set of passed methods on the dojox.embed.Flash object
so that you can call that object directly, as opposed to having to
delve into the internal movie to do this. Intended to make working
with Flash movies that use ExternalInterface much easier to use.
example
Create "setMessage" and "getMessage" methods on foo.
var foo = new dojox.embed.Flash(args, someNode);
dojo.connect(foo, "onLoad", dojo.hitch(foo, function(){
dojox.embed.Flash.proxy(this, [ "setMessage", "getMessage" ]);
this.setMessage("dojox.embed.Flash.proxy is pretty cool...");
console.log(this.getMessage());
}));