dojo.provide("dojox.embed.Flash"); (function(){ /******************************************************* dojox.embed.Flash Base functionality to insert a flash movie into a document on the fly. Usage: var movie=new dojox.embed.Flash({ args }, containerNode); ******************************************************/ var fMarkup, fVersion; var keyBase="dojox-embed-flash-", keyCount=0; function prep(kwArgs){ kwArgs=dojo.mixin({ expressInstall: false, width: 320, height: 240, style: null, redirect: null }, kwArgs||{}); if(!("path" in kwArgs)){ console.error("dojox.embed.Flash(ctor):: no path reference to a Flash movie was provided."); return null; } if(!("id" in kwArgs)){ kwArgs.id=(keyBase + keyCount++); } return kwArgs; } if(dojo.isIE){ fMarkup=function(kwArgs){ kwArgs=prep(kwArgs); if(!kwArgs){ return null; } var path=kwArgs.path; if(kwArgs.vars){ var a=[]; for(var p in kwArgs.vars){ a.push(p+'='+kwArgs.vars[p]); } path += ((path.indexOf("?")==-1) ? "?":"&") + a.join("&"); } var s='' + ''; if(kwArgs.params){ for(var p in kwArgs.params){ s += ''; } } s += ''; return { id: kwArgs.id, markup: s }; }; fVersion=(function(){ var testVersion=10, testObj=null; while(!testObj && testVersion > 7){ try { testObj = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + testVersion--); } catch(e){ } } if(testObj){ var v = testObj.GetVariable("$version").split(" ")[1].split(","); return { major: (v[0]!=null)?parseInt(v[0]):0, minor: (v[1]!=null)?parseInt(v[1]):0, rev: (v[2]!=null)?parseInt(v[2]):0 }; } return { major: 0, minor: 0, rev: 0 }; })(); // attach some cleanup for IE, thanks to deconcept :) dojo.addOnUnload(function(){ var objs=dojo.query("object"); for(var i=objs.length-1; i>=0; i--){ objs[i].style.display="none"; for(var p in objs[i]){ if(p!="FlashVars" && dojo.isFunction(objs[i][p])){ objs[i][p]=function(){ }; } } } }); // 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 path=kwArgs.path; if(kwArgs.vars){ var a=[]; for(var p in kwArgs.vars){ a.push(p+'='+kwArgs.vars[p]); } path += ((path.indexOf("?")==-1) ? "?":"&") + a.join("&"); } var s = ' this._pollMax){ clearInterval(this._poller); delete this._poller; delete this._pollCount; delete this._pollMax; this.onLoad(this.movie); } }), 10); }), 1); } }, _destroy: function(){ // summary // Kill the movie and reset all the properties of this object. this.domNode.removeChild(this.movie); this.id = this.movie = this.domNode = null; }, destroy: function(){ // summary // Public interface for destroying all the properties in this object. // Will also clean all proxied methods. if(!this.movie){ return; } // remove any proxy functions var test = dojo.mixin({}, { id:true, movie:true, domNode:true, onReady:true, onLoad:true }); for(var p in this){ if(!test[p]){ delete this[p]; } } // pull the movie if(this._poller){ // wait until onLoad to destroy dojo.connect(this, "onLoad", this, "_destroy"); } else { this._destroy(); } } }); // expose information through the constructor function itself. dojo.mixin(dojox.embed.Flash, { // summary: // A singleton object used internally to get information // about the Flash player available in a browser, and // as the factory for generating and placing markup in a // document. // // minSupported: Number // The minimum supported version of the Flash Player, defaults to 8. // available: Number // Used as both a detection (i.e. if(dojox.embed.Flash.available){ }) // and as a variable holding the major version of the player installed. // supported: Boolean // Whether or not the Flash Player installed is supported by dojox.embed. // version: Object // The version of the installed Flash Player; takes the form of // { major, minor, rev }. To get the major version, you'd do this: // var v=dojox.embed.Flash.version.major; // initialized: Boolean // Whether or not the Flash engine is available for use. // onInitialize: Function // A stub you can connect to if you are looking to fire code when the // engine becomes available. A note: DO NOT use this event to // place a movie in a document; it will usually fire before DOMContentLoaded // is fired, and you will get an error. Use dojo.addOnLoad instead. minSupported : 8, available: fVersion.major, supported: (fVersion.major >= 8), version: fVersion, initialized: false, onInitialize: function(){ dojox.embed.Flash.initialized=true; }, __ie_markup__: function(kwArgs){ return fMarkup(kwArgs); }, proxy: function(/* dojox.embed.Flash */obj, /* Array | String */methods){ // 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()); // | })); 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){ return __flash__toXML(item); }).join("") + '' + '' )); }).apply(this, arguments||[]); }); }, obj); } }); if(dojo.isIE){ // Ugh! if(dojo._initFired){ var e=document.createElement("script"); e.type="text/javascript"; e.src=dojo.moduleUrl("dojox", "embed/IE/flash.js"); document.getElementsByTagName("head")[0].appendChild(e); } else { // we can use document.write. What a kludge. document.write('' + ''); } } else { dojox.embed.Flash.place = function(kwArgs, node){ var o=fMarkup(kwArgs); node=dojo.byId(node); if(!node){ node=dojo.doc.createElement("div"); node.id=o.id+"-container"; dojo.body().appendChild(node); } if(o){ node.innerHTML=o.markup; // return document[o.id]; return o.id; } return null; } dojox.embed.Flash.onInitialize(); } })();