source: Dev/trunk/src/client/dojox/flash/_base.js @ 532

Last change on this file since 532 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 25.2 KB
Line 
1dojo.provide("dojox.flash._base");
2dojo.experimental("dojox.flash");
3
4// for dojo.window.getBox(), needed by dojox.flash.Embed.center()
5dojo.require("dojo.window");
6
7dojox.flash = {
8        // summary:
9        //              Utilities to embed and communicate with the Flash player from Javascript
10        // description:
11        //              The goal of dojox.flash is to make it easy to extend Flash's capabilities
12        //              into an Ajax/DHTML environment.
13        //
14        //              dojox.flash provides an easy object for interacting with the Flash plugin.
15        //              This object provides methods to determine the current version of the Flash
16        //              plugin (dojox.flash.info); write out the necessary markup to
17        //              dynamically insert a Flash object into the page (dojox.flash.Embed; and
18        //              do dynamic installation and upgrading of the current Flash plugin in
19        //              use (dojox.flash.Install). If you want to call methods on the Flash object
20        //              embedded into the page it is your responsibility to use Flash's ExternalInterface
21        //              API and get a reference to the Flash object yourself.
22        //
23        //              To use dojox.flash, you must first wait until Flash is finished loading
24        //              and initializing before you attempt communication or interaction.
25        //              To know when Flash is finished use dojo.connect:
26        //
27        // |    dojo.connect(dojox.flash, "loaded", myInstance, "myCallback");
28        //
29        //              Then, while the page is still loading provide the file name:
30        //
31        // |    dojox.flash.setSwf(dojo.moduleUrl("dojox", "_storage/storage.swf"));
32        //
33        //              If no SWF files are specified, then Flash is not initialized.
34        //
35        //              Your Flash must use Flash's ExternalInterface to expose Flash methods and
36        //              to call JavaScript.
37        //
38        //              setSwf can take an optional 'visible' attribute to control whether
39        //              the Flash object is visible or not on the page; the default is visible:
40        //
41        // |    dojox.flash.setSwf(dojo.moduleUrl("dojox", "_storage/storage.swf"), false);
42        //
43        //              Once finished, you can query Flash version information:
44        //
45        // |    dojox.flash.info.version
46        //
47        //              Or can communicate with Flash methods that were exposed:
48        //
49        // |    var f = dojox.flash.get();
50        // |    var results = f.sayHello("Some Message");
51        //
52        //              Your Flash files should use DojoExternalInterface.as to register methods;
53        //              this file wraps Flash's normal ExternalInterface but correct various
54        //              serialization bugs that ExternalInterface has.
55        //
56        //              Notes:
57        //
58        //              - dojox.flash is not meant to be a generic Flash embedding
59        //              mechanism; it is as generic as necessary to make Dojo Storage's
60        //              Flash Storage Provider as clean and modular as possible. If you want
61        //              a generic Flash embed mechanism see [SWFObject](http://blog.deconcept.com/swfobject/).
62        //              - dojox.flash can currently only work with one Flash object
63        //              on the page; it does not yet support multiple Flash objects on
64        //              the same page.
65        //              - Your code can detect whether the Flash player is installing or having
66        //              its version revved in two ways. First, if dojox.flash detects that
67        //              Flash installation needs to occur, it sets dojox.flash.info.installing
68        //              to true. Second, you can detect if installation is necessary with the
69        //              following callback:
70        //
71        // |    dojo.connect(dojox.flash, "installing", myInstance, "myCallback");
72        //
73        //              You can use this callback to delay further actions that might need Flash;
74        //              when installation is finished the full page will be refreshed and the
75        //              user will be placed back on your page with Flash installed.
76        //
77        //              -------------------
78        //              Todo/Known Issues
79        //              -------------------
80        //
81        //              - On Internet Explorer, after doing a basic install, the page is
82        //              not refreshed or does not detect that Flash is now available. The way
83        //              to fix this is to create a custom small Flash file that is pointed to
84        //              during installation; when it is finished loading, it does a callback
85        //              that says that Flash installation is complete on IE, and we can proceed
86        //              to initialize the dojox.flash subsystem.
87        //              - Things aren't super tested for sending complex objects to Flash
88        //              methods, since Dojo Storage only needs strings.
89        //
90        //              Author- Brad Neuberg, http://codinginparadise.org
91
92        ready: false,
93        url: null,
94       
95        _visible: true,
96        _loadedListeners: [],
97        _installingListeners: [],
98       
99        setSwf: function(/* String */ url, /* boolean? */ visible){
100                // summary:
101                //              Sets the SWF files and versions we are using.
102                // url: String
103                //              The URL to this Flash file.
104                // visible: boolean?
105                //              Whether the Flash file is visible or not. If it is not visible we hide
106                //              it off the screen. This defaults to true (i.e. the Flash file is
107                //              visible).
108                this.url = url;
109               
110                this._visible = true;
111                if(visible !== null && visible !== undefined){
112                        this._visible = visible;
113                }
114               
115                // initialize ourselves
116                this._initialize();
117        },
118       
119        addLoadedListener: function(/* Function */ listener){
120                // summary:
121                //      Adds a listener to know when Flash is finished loading.
122                //      Useful if you don't want a dependency on dojo.event.
123                // listener: Function
124                //      A function that will be called when Flash is done loading.
125               
126                this._loadedListeners.push(listener);
127        },
128
129        addInstallingListener: function(/* Function */ listener){
130                // summary:
131                //      Adds a listener to know if Flash is being installed.
132                //      Useful if you don't want a dependency on dojo.event.
133                // listener: Function
134                //      A function that will be called if Flash is being
135                //      installed
136               
137                this._installingListeners.push(listener);
138        },
139       
140        loaded: function(){
141                // summary:
142                //              Called back when the Flash subsystem is finished loading.
143                // description:
144                //              A callback when the Flash subsystem is finished loading and can be
145                //              worked with. To be notified when Flash is finished loading, add a
146                //              loaded listener:
147                //
148                //              dojox.flash.addLoadedListener(loadedListener);
149       
150                dojox.flash.ready = true;
151                if(dojox.flash._loadedListeners.length){ // FIXME: redundant if? use forEach?
152                        for(var i = 0;i < dojox.flash._loadedListeners.length; i++){
153                                dojox.flash._loadedListeners[i].call(null);
154                        }
155                }
156        },
157       
158        installing: function(){
159                // summary:
160                //              Called if Flash is being installed.
161                // description:
162                //              A callback to know if Flash is currently being installed or
163                //              having its version revved. To be notified if Flash is installing, connect
164                //              your callback to this method using the following:
165                //
166                //              dojo.event.connect(dojox.flash, "installing", myInstance, "myCallback");
167               
168                if(dojox.flash._installingListeners.length){ // FIXME: redundant if? use forEach?
169                        for(var i = 0; i < dojox.flash._installingListeners.length; i++){
170                                dojox.flash._installingListeners[i].call(null);
171                        }
172                }
173        },
174       
175        // Initializes dojox.flash.
176        _initialize: function(){
177                //console.debug("dojox.flash._initialize");
178                // see if we need to rev or install Flash on this platform
179                var installer = new dojox.flash.Install();
180                dojox.flash.installer = installer;
181
182                if(installer.needed()){
183                        installer.install();
184                }else{
185                        // write the flash object into the page
186                        dojox.flash.obj = new dojox.flash.Embed(this._visible);
187                        dojox.flash.obj.write();
188                       
189                        // setup the communicator
190                        dojox.flash.comm = new dojox.flash.Communicator();
191                }
192        }
193};
194
195
196dojox.flash.Info = function(){
197        // summary:
198        //              A class that helps us determine whether Flash is available.
199        // description:
200        //              A class that helps us determine whether Flash is available,
201        //              it's major and minor versions, and what Flash version features should
202        //              be used for Flash/JavaScript communication. Parts of this code
203        //              are adapted from the automatic Flash plugin detection code autogenerated
204        //              by the Macromedia Flash 8 authoring environment.
205        //
206        //              An instance of this class can be accessed on dojox.flash.info after
207        //              the page is finished loading.
208
209        this._detectVersion();
210};
211
212dojox.flash.Info.prototype = {
213        // version: String
214        //              The full version string, such as "8r22".
215        version: -1,
216       
217        // versionMajor, versionMinor, versionRevision: String
218        //              The major, minor, and revisions of the plugin. For example, if the
219        //              plugin is 8r22, then the major version is 8, the minor version is 0,
220        //              and the revision is 22.
221        versionMajor: -1,
222        versionMinor: -1,
223        versionRevision: -1,
224       
225        // capable: Boolean
226        //              Whether this platform has Flash already installed.
227        capable: false,
228       
229        // installing: Boolean
230        //              Set if we are in the middle of a Flash installation session.
231        installing: false,
232       
233        isVersionOrAbove: function(
234                                                        /* int */ reqMajorVer,
235                                                        /* int */ reqMinorVer,
236                                                        /* int */ reqVer){ /* Boolean */
237                // summary:
238                //              Asserts that this environment has the given major, minor, and revision
239                //              numbers for the Flash player.
240                // description:
241                //              Asserts that this environment has the given major, minor, and revision
242                //              numbers for the Flash player.
243                //
244                //              Example- To test for Flash Player 7r14:
245                //
246                //              dojox.flash.info.isVersionOrAbove(7, 0, 14)
247                // returns:
248                //              Returns true if the player is equal
249                //              or above the given version, false otherwise.
250               
251                // make the revision a decimal (i.e. transform revision 14 into
252                // 0.14
253                reqVer = parseFloat("." + reqVer);
254               
255                if(this.versionMajor >= reqMajorVer && this.versionMinor >= reqMinorVer
256                         && this.versionRevision >= reqVer){
257                        return true;
258                }else{
259                        return false;
260                }
261        },
262       
263        _detectVersion: function(){
264                var versionStr;
265               
266                // loop backwards through the versions until we find the newest version
267                for(var testVersion = 25; testVersion > 0; testVersion--){
268                        if(dojo.isIE){
269                                var axo;
270                                try{
271                                        if(testVersion > 6){
272                                                axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash."
273                                                                                                                                                + testVersion);
274                                        }else{
275                                                axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
276                                        }
277                                        if(typeof axo == "object"){
278                                                if(testVersion == 6){
279                                                        axo.AllowScriptAccess = "always";
280                                                }
281                                                versionStr = axo.GetVariable("$version");
282                                        }
283                                }catch(e){
284                                        continue;
285                                }
286                        }else{
287                                versionStr = this._JSFlashInfo(testVersion);
288                        }
289                               
290                        if(versionStr == -1 ){
291                                this.capable = false;
292                                return;
293                        }else if(versionStr != 0){
294                                var versionArray;
295                                if(dojo.isIE){
296                                        var tempArray = versionStr.split(" ");
297                                        var tempString = tempArray[1];
298                                        versionArray = tempString.split(",");
299                                }else{
300                                        versionArray = versionStr.split(".");
301                                }
302                                       
303                                this.versionMajor = versionArray[0];
304                                this.versionMinor = versionArray[1];
305                                this.versionRevision = versionArray[2];
306                               
307                                // 7.0r24 == 7.24
308                                var versionString = this.versionMajor + "." + this.versionRevision;
309                                this.version = parseFloat(versionString);
310                               
311                                this.capable = true;
312                               
313                                break;
314                        }
315                }
316        },
317         
318        // JavaScript helper required to detect Flash Player PlugIn version
319        // information. Internet Explorer uses a corresponding Visual Basic
320        // version to interact with the Flash ActiveX control.
321        _JSFlashInfo: function(testVersion){
322                // NS/Opera version >= 3 check for Flash plugin in plugin array
323                if(navigator.plugins != null && navigator.plugins.length > 0){
324                        if(navigator.plugins["Shockwave Flash 2.0"] ||
325                                 navigator.plugins["Shockwave Flash"]){
326                                var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
327                                var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
328                                var descArray = flashDescription.split(" ");
329                                var tempArrayMajor = descArray[2].split(".");
330                                var versionMajor = tempArrayMajor[0];
331                                var versionMinor = tempArrayMajor[1];
332                                var tempArrayMinor = (descArray[3] || descArray[4]).split("r");
333                                var versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
334                                var version = versionMajor + "." + versionMinor + "." + versionRevision;
335                                                                                       
336                                return version;
337                        }
338                }
339               
340                return -1;
341        }
342};
343
344dojox.flash.Embed = function(visible){
345        // summary:
346        //              A class that is used to write out the Flash object into the page.
347        // description:
348        //              Writes out the necessary tags to embed a Flash file into the page. Note that
349        //              these tags are written out as the page is loaded using document.write, so
350        //              you must call this class before the page has finished loading.
351       
352        this._visible = visible;
353};
354
355dojox.flash.Embed.prototype = {
356        // width: int
357        //              The width of this Flash applet. The default is the minimal width
358        //              necessary to show the Flash settings dialog. Current value is
359        //              215 pixels.
360        width: 215,
361       
362        // height: int
363        //              The height of this Flash applet. The default is the minimal height
364        //              necessary to show the Flash settings dialog. Current value is
365        //              138 pixels.
366        height: 138,
367       
368        // id: String
369        //              The id of the Flash object. Current value is 'flashObject'.
370        id: "flashObject",
371       
372        // Controls whether this is a visible Flash applet or not.
373        _visible: true,
374
375        protocol: function(){
376                switch(window.location.protocol){
377                        case "https:":
378                                return "https";
379                                break;
380                        default:
381                                return "http";
382                                break;
383                }
384        },
385       
386        write: function(/* Boolean? */ doExpressInstall){
387                // summary:
388                //              Writes the Flash into the page.
389                // description:
390                //              This must be called before the page
391                //              is finished loading.
392                // doExpressInstall: Boolean
393                //              Whether to write out Express Install
394                //              information. Optional value; defaults to false.
395               
396                // figure out the SWF file to get and how to write out the correct HTML
397                // for this Flash version
398                var objectHTML;
399                var swfloc = dojox.flash.url;
400                var swflocObject = swfloc;
401                var swflocEmbed = swfloc;
402                var dojoUrl = dojo.baseUrl;
403                var xdomainBase = document.location.protocol + '//' + document.location.host;
404                if(doExpressInstall){
405                        // the location to redirect to after installing
406                        var redirectURL = escape(window.location);
407                        document.title = document.title.slice(0, 47) + " - Flash Player Installation";
408                        var docTitle = escape(document.title);
409                        swflocObject += "?MMredirectURL=" + redirectURL
410                                        + "&MMplayerType=ActiveX"
411                                        + "&MMdoctitle=" + docTitle
412                                        + "&baseUrl=" + escape(dojoUrl)
413                                        + "&xdomain=" + escape(xdomainBase);
414                        swflocEmbed += "?MMredirectURL=" + redirectURL
415                                        + "&MMplayerType=PlugIn"
416                                        + "&baseUrl=" + escape(dojoUrl)
417                                        + "&xdomain=" + escape(xdomainBase);
418                }else{
419                        // IE/Flash has an evil bug that shows up some time: if we load the
420                        // Flash and it isn't in the cache, ExternalInterface works fine --
421                        // however, the second time when its loaded from the cache a timing
422                        // bug can keep ExternalInterface from working. The trick below
423                        // simply invalidates the Flash object in the cache all the time to
424                        // keep it loading fresh. -- Brad Neuberg
425                        swflocObject += "?cachebust=" + new Date().getTime();
426                        swflocObject += "&baseUrl=" + escape(dojoUrl);
427                        swflocObject += "&xdomain=" + escape(xdomainBase);
428                }
429
430                if(swflocEmbed.indexOf("?") == -1){
431                        swflocEmbed += '?baseUrl='+escape(dojoUrl);
432                }else{
433                  swflocEmbed += '&baseUrl='+escape(dojoUrl);
434                }
435                swflocEmbed += '&xdomain='+escape(xdomainBase);
436               
437                objectHTML =
438                        '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '
439                          + 'codebase="'
440                                + this.protocol()
441                                + '://fpdownload.macromedia.com/pub/shockwave/cabs/flash/'
442                                + 'swflash.cab#version=8,0,0,0"\n '
443                          + 'width="' + this.width + '"\n '
444                          + 'height="' + this.height + '"\n '
445                          + 'id="' + this.id + '"\n '
446                          + 'name="' + this.id + '"\n '
447                          + 'align="middle">\n '
448                          + '<param name="allowScriptAccess" value="always"></param>\n '
449                          + '<param name="movie" value="' + swflocObject + '"></param>\n '
450                          + '<param name="quality" value="high"></param>\n '
451                          + '<param name="bgcolor" value="#ffffff"></param>\n '
452                          + '<embed src="' + swflocEmbed + '" '
453                                  + 'quality="high" '
454                                  + 'bgcolor="#ffffff" '
455                                  + 'width="' + this.width + '" '
456                                  + 'height="' + this.height + '" '
457                                  + 'id="' + this.id + 'Embed' + '" '
458                                  + 'name="' + this.id + '" '
459                                  + 'swLiveConnect="true" '
460                                  + 'align="middle" '
461                                  + 'allowScriptAccess="always" '
462                                  + 'type="application/x-shockwave-flash" '
463                                  + 'pluginspage="'
464                                  + this.protocol()
465                                  +'://www.macromedia.com/go/getflashplayer" '
466                                  + '></embed>\n'
467                        + '</object>\n';
468                                       
469                // using same mechanism on all browsers now to write out
470                // Flash object into page
471
472                // document.write no longer works correctly due to Eolas patent workaround
473                // in IE; nothing happens (i.e. object doesn't go into page if we use it)
474                dojo.connect(dojo, "loaded", dojo.hitch(this, function(){
475                        // Prevent putting duplicate SWFs onto the page
476                        var containerId = this.id + "Container";
477                        if(dojo.byId(containerId)){
478                                return;
479                        }
480                       
481                        var div = document.createElement("div");
482                        div.id = this.id + "Container";
483                       
484                        div.style.width = this.width + "px";
485                        div.style.height = this.height + "px";
486                        if(!this._visible){
487                                div.style.position = "absolute";
488                                div.style.zIndex = "10000";
489                                div.style.top = "-1000px";
490                        }
491
492                        div.innerHTML = objectHTML;
493
494                        var body = document.getElementsByTagName("body");
495                        if(!body || !body.length){
496                                throw new Error("No body tag for this page");
497                        }
498                        body = body[0];
499                        body.appendChild(div);
500                }));
501        },
502       
503        get: function(){ /* Object */
504                // summary:
505                //              Gets the Flash object DOM node.
506
507                if(dojo.isIE || dojo.isWebKit){
508                        //TODO: should this really be the else?
509                        return dojo.byId(this.id);
510                }else{
511                        // different IDs on OBJECT and EMBED tags or
512                        // else Firefox will return wrong one and
513                        // communication won't work;
514                        // also, document.getElementById() returns a
515                        // plugin but ExternalInterface calls don't
516                        // work on it so we have to use
517                        // document[id] instead
518                        return document[this.id + "Embed"];
519                }
520        },
521       
522        setVisible: function(/* Boolean */ visible){
523                // summary:
524                //              Sets the visibility of this Flash object.
525
526                //console.debug("setVisible, visible="+visible);
527
528                var container = dojo.byId(this.id + "Container");
529                if(visible){
530                        container.style.position = "absolute"; // IE -- Brad Neuberg
531                        container.style.visibility = "visible";
532                }else{
533                        container.style.position = "absolute";
534                        container.style.y = "-1000px";
535                        container.style.visibility = "hidden";
536                }
537        },
538       
539        center: function(){
540                // summary:
541                //              Centers the flash applet on the page.
542               
543                var elementWidth = this.width;
544                var elementHeight = this.height;
545
546                var viewport = dojo.window.getBox();
547
548                // compute the centered position
549                var x = viewport.l + (viewport.w - elementWidth) / 2;
550                var y = viewport.t + (viewport.h - elementHeight) / 2;
551               
552                // set the centered position
553                var container = dojo.byId(this.id + "Container");
554                container.style.top = y + "px";
555                container.style.left = x + "px";
556        }
557};
558
559
560dojox.flash.Communicator = function(){
561        // summary:
562        //      A class that is used to communicate between Flash and JavaScript.
563        // description:
564        //      This class helps mediate Flash and JavaScript communication. Internally
565        //      it uses Flash 8's ExternalInterface API, but adds functionality to fix
566        //      various encoding bugs that ExternalInterface has.
567}
568
569dojox.flash.Communicator.prototype = {
570        // Registers the existence of a Flash method that we can call with
571        // JavaScript, using Flash 8's ExternalInterface.
572        _addExternalInterfaceCallback: function(methodName){
573                //console.debug("addExternalInterfaceCallback, methodName="+methodName);
574                var wrapperCall = dojo.hitch(this, function(){
575                        // some browsers don't like us changing values in the 'arguments' array, so
576                        // make a fresh copy of it
577                        var methodArgs = new Array(arguments.length);
578                        for(var i = 0; i < arguments.length; i++){
579                                methodArgs[i] = this._encodeData(arguments[i]);
580                        }
581                       
582                        var results = this._execFlash(methodName, methodArgs);
583                        results = this._decodeData(results);
584                       
585                        return results;
586                });
587               
588                this[methodName] = wrapperCall;
589        },
590       
591        // Encodes our data to get around ExternalInterface bugs that are still
592        // present even in Flash 9.
593        _encodeData: function(data){
594                //console.debug("encodeData, data=", data);
595                if(!data || typeof data != "string"){
596                        return data;
597                }
598               
599                // transforming \ into \\ doesn't work; just use a custom encoding
600                data = data.replace("\\", "&custom_backslash;");
601
602                // also use custom encoding for the null character to avoid problems
603                data = data.replace(/\0/g, "&custom_null;");
604
605                return data;
606        },
607       
608        // Decodes our data to get around ExternalInterface bugs that are still
609        // present even in Flash 9.
610        _decodeData: function(data){
611                //console.debug("decodeData, data=", data);
612                // weirdly enough, Flash sometimes returns the result as an
613                // 'object' that is actually an array, rather than as a String;
614                // detect this by looking for a length property; for IE
615                // we also make sure that we aren't dealing with a typeof string
616                // since string objects have length property there
617                if(data && data.length && typeof data != "string"){
618                        data = data[0];
619                }
620               
621                if(!data || typeof data != "string"){
622                        return data;
623                }
624               
625                // needed for IE; \0 is the NULL character
626                data = data.replace(/\&custom_null\;/g, "\0");
627       
628                // certain XMLish characters break Flash's wire serialization for
629                // ExternalInterface; these are encoded on the
630                // DojoExternalInterface side into a custom encoding, rather than
631                // the standard entity encoding, because otherwise we won't be able to
632                // differentiate between our own encoding and any entity characters
633                // that are being used in the string itself
634                data = data.replace(/\&custom_lt\;/g, "<")
635                        .replace(/\&custom_gt\;/g, ">")
636                        .replace(/\&custom_backslash\;/g, '\\');
637               
638                return data;
639        },
640       
641        // Executes a Flash method; called from the JavaScript wrapper proxy we
642        // create on dojox.flash.comm.
643        _execFlash: function(methodName, methodArgs){
644                //console.debug("execFlash, methodName="+methodName+", methodArgs=", methodArgs);
645                var plugin = dojox.flash.obj.get();
646                methodArgs = (methodArgs) ? methodArgs : [];
647               
648                // encode arguments that are strings
649                for(var i = 0; i < methodArgs; i++){
650                        if(typeof methodArgs[i] == "string"){
651                                methodArgs[i] = this._encodeData(methodArgs[i]);
652                        }
653                }
654
655                // we use this gnarly hack below instead of
656                // plugin[methodName] for two reasons:
657                // 1) plugin[methodName] has no call() method, which
658                // means we can't pass in multiple arguments dynamically
659                // to a Flash method -- we can only have one
660                // 2) On IE plugin[methodName] returns undefined --
661                // plugin[methodName] used to work on IE when we
662                // used document.write but doesn't now that
663                // we use dynamic DOM insertion of the Flash object
664                // -- Brad Neuberg
665                var flashExec = function(){
666                        return eval(plugin.CallFunction(
667                                                 "<invoke name=\"" + methodName
668                                                + "\" returntype=\"javascript\">"
669                                                + __flash__argumentsToXML(methodArgs, 0)
670                                                + "</invoke>"));
671                };
672                var results = flashExec.call(methodArgs);
673               
674                if(typeof results == "string"){
675                        results = this._decodeData(results);
676                }
677                       
678                return results;
679        }
680}
681
682// FIXME: dojo.declare()-ify this
683
684// TODO: I did not test the Install code when I refactored Dojo Flash from 0.4 to
685// 1.0, so am not sure if it works. If Flash is not present I now prefer
686// that Gears is installed instead of Flash because GearsStorageProvider is
687// much easier to work with than Flash's hacky ExternalInterface.
688// -- Brad Neuberg
689dojox.flash.Install = function(){
690        // summary:
691        //              Helps install Flash plugin if needed.
692        // description:
693        //              Figures out the best way to automatically install the Flash plugin
694        //              for this browser and platform. Also determines if installation or
695        //              revving of the current plugin is needed on this platform.
696};
697
698dojox.flash.Install.prototype = {
699        needed: function(){ /* Boolean */
700                // summary:
701                //              Determines if installation or revving of the current plugin is
702                //              needed.
703       
704                // do we even have flash?
705                if(!dojox.flash.info.capable){
706                        return true;
707                }
708
709                // Must have ExternalInterface which came in Flash 8
710                if(!dojox.flash.info.isVersionOrAbove(8, 0, 0)){
711                        return true;
712                }
713
714                // otherwise we don't need installation
715                return false;
716        },
717
718        install: function(){
719                // summary:
720                //              Performs installation or revving of the Flash plugin.
721                var installObj;
722       
723                // indicate that we are installing
724                dojox.flash.info.installing = true;
725                dojox.flash.installing();
726               
727                if(dojox.flash.info.capable == false){ // we have no Flash at all
728                        // write out a simple Flash object to force the browser to prompt
729                        // the user to install things
730                        installObj = new dojox.flash.Embed(false);
731                        installObj.write(); // write out HTML for Flash
732                }else if(dojox.flash.info.isVersionOrAbove(6, 0, 65)){ // Express Install
733                        installObj = new dojox.flash.Embed(false);
734                        installObj.write(true); // write out HTML for Flash 8 version+
735                        installObj.setVisible(true);
736                        installObj.center();
737                }else{ // older Flash install than version 6r65
738                        alert("This content requires a more recent version of the Macromedia "
739                                                +" Flash Player.");
740                        window.location.href = + dojox.flash.Embed.protocol() +
741                                                "://www.macromedia.com/go/getflashplayer";
742                }
743        },
744       
745        // Called when the Express Install is either finished, failed, or was
746        // rejected by the user.
747        _onInstallStatus: function(msg){
748                if (msg == "Download.Complete"){
749                        // Installation is complete.
750                        dojox.flash._initialize();
751                }else if(msg == "Download.Cancelled"){
752                        alert("This content requires a more recent version of the Macromedia "
753                                                +" Flash Player.");
754                        window.location.href = dojox.flash.Embed.protocol() +
755                                                "://www.macromedia.com/go/getflashplayer";
756                }else if (msg == "Download.Failed"){
757                        // The end user failed to download the installer due to a network failure
758                        alert("There was an error downloading the Flash Player update. "
759                                                + "Please try again later, or visit macromedia.com to download "
760                                                + "the latest version of the Flash plugin.");
761                }
762        }
763};
764
765// find out if Flash is installed
766dojox.flash.info = new dojox.flash.Info();
767
768// vim:ts=4:noet:tw=0:
Note: See TracBrowser for help on using the repository browser.