diff options
Diffstat (limited to 'js/dojo/dojox/form/uploader/plugins/Flash.js')
| -rw-r--r-- | js/dojo/dojox/form/uploader/plugins/Flash.js | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/js/dojo/dojox/form/uploader/plugins/Flash.js b/js/dojo/dojox/form/uploader/plugins/Flash.js new file mode 100644 index 0000000..473410b --- /dev/null +++ b/js/dojo/dojox/form/uploader/plugins/Flash.js @@ -0,0 +1,307 @@ +//>>built +define("dojox/form/uploader/plugins/Flash", [ + "dojo/dom-form", + "dojo/dom-style", + "dojo/dom-construct", + "dojo/dom-attr", + "dojo/_base/declare", + "dojo/_base/config", + "dojo/_base/connect", + "dojo/_base/lang", + "dojo/_base/array", + "dojox/form/uploader/plugins/HTML5", + "dojox/embed/Flash" +],function(domForm, domStyle, domConstruct, domAttr, declare, config, connect, lang, array, formUploaderPluginsHTML5, embedFlash){ + + +var pluginsFlash = declare("dojox.form.uploader.plugins.Flash", [], { + // + // Version: 1.6 + // + // summary: + // A plugin for dojox.form.Uploader that utilizes a Flash SWF for handling to upload in IE. + // All other browsers will use the HTML5 plugin, unless force="flash" is used, then Flash + // will be used in all browsers. force="flash" is provided because Flash has some features + // that HTML5 does not yet have. But it is still not recommended because of the many problems + // that Firefox and Webkit have with the Flash plugin. + // + // description: + // Inherits all properties from dojox.form.Uploader and formUploaderPluginsHTML5. + // All properties and methods listed here are specific to the Flash plugin only. + // + // swfPath:String + // Path to SWF. Can be overwritten or provided in djConfig. + swfPath:config.uploaderPath || require.toUrl("dojox/form/resources/uploader.swf"), + // + // skipServerCheck: Boolean + // If true, will not verify that the server was sent the correct format. + // This can be safely set to true. The purpose of the server side check + // is mainly to show the dev if they've implemented the different returns + // correctly. + skipServerCheck:true, + // + // serverTimeout:Number (milliseconds) + // The amount of time given to the uploaded file + // to wait for a server response. After this amount + // of time, the onComplete is fired but with a 'server timeout' + // error in the returned item. + serverTimeout: 2000, + // + // isDebug: Boolean + // If true, outputs traces from the SWF to console. What exactly gets passed + // is very relative, and depends upon what traces have been left in the DEFT SWF. + isDebug:false, + // + // devMode: Boolean. + // Re-implemented. devMode increases the logging, adding style tracing from the SWF. + devMode:false, + // + // deferredUploading: Number (1 - X) + // (Flash only) throttles the upload to a certain amount of files at a time. + // By default, Flash uploads file one at a time to the server, but in parallel. + // Firefox will try to queue all files at once, leading to problems. Set this + // to the amount to upload in parallel at a time. + // Generally, 1 should work fine, but you can experiment with queuing more than + // one at a time. + // This is of course ignored if selectMultipleFiles equals false. + deferredUploading:0, + // + // force: String + // Use "flash" to always use Flash (and hopefully force the user to download the plugin + // if they don't have it). + force:"", + + postMixInProperties: function(){ + if(!this.supports("multiple")){ + // Flash will only be used in IE6-8 unless force="flash" + this.uploadType = "flash"; + this._files = []; + this._fileMap = {}; + this._createInput = this._createFlashUploader; + this.getFileList = this.getFlashFileList; + this.reset = this.flashReset; + this.upload = this.uploadFlash; + this.fieldname = "flashUploadFiles"; ///////////////////// this.name + } + this.inherited(arguments); + }, + + /************************* + * Public Events * + *************************/ + + onReady: function(/* dojox.form.FileUploader */ uploader){ + // summary: + // Stub - Fired when embedFlash has created the + // Flash object, but it has not necessarilly finished + // downloading, and is ready to be communicated with. + }, + + onLoad: function(/* dojox.form.FileUploader */ uploader){ + // summary: + // Stub - SWF has been downloaded 100%. + }, + + onFileChange: function(fileArray){ + // summary: + // Stub - Flash-specific event. Fires on each selection of files + // and only provides the files selected on that event - not all files + // selected, as with HTML5 + }, + + onFileProgress: function(fileArray){ + // summary: + // Stub - Flash-specific event. Fires on progress of upload + // and only provides a file-specific event + }, + + + /************************* + * Public Methods * + *************************/ + + getFlashFileList: function(){ + // summary: + // Returns list of currently selected files + return this._files; // Array + }, + + flashReset: function(){ + this.flashMovie.reset(); + this._files = []; + }, + + /************************* + * Private Methods * + *************************/ + + uploadFlash: function(/*Object ? */formData){ + // summary: + // Uploads selected files. Alias "upload()" should be used instead. + // tags: + // private + this.onBegin(this.getFileList()); + this.flashMovie.doUpload(formData); + }, + + _change: function(fileArray){ + this._files = this._files.concat(fileArray); + array.forEach(fileArray, function(f){ + f.bytesLoaded = 0; + f.bytesTotal = f.size; + this._fileMap[f.name+"_"+f.size] = f; + }, this); + this.onChange(this._files); + this.onFileChange(fileArray); + }, + _complete: function(fileArray){ + var o = this._getCustomEvent(); + o.type = "load"; + this.onComplete(fileArray); + }, + _progress: function(f){ + this._fileMap[f.name+"_"+f.bytesTotal].bytesLoaded = f.bytesLoaded; + var o = this._getCustomEvent(); + this.onFileProgress(f); + this.onProgress(o); + }, + _error: function(err){ + this.onError(err); + }, + _onFlashBlur: function(fileArray){ + //console.log("UploaderFlash._onFlashBlur"); + }, + + _getCustomEvent: function(){ + var o = { + bytesLoaded:0, + bytesTotal:0, + type:"progress", + timeStamp:new Date().getTime() + }; + + + for(var nm in this._fileMap){ + o.bytesTotal += this._fileMap[nm].bytesTotal; + o.bytesLoaded += this._fileMap[nm].bytesLoaded; + } + o.decimal = o.bytesLoaded / o.bytesTotal; + o.percent = Math.ceil((o.bytesLoaded / o.bytesTotal)*100)+"%"; + return o; // Object + }, + + _connectFlash: function(){ + // summary: + // Subscribing to published topics coming from the + // Flash uploader. + // description: + // Sacrificing some readbilty for compactness. this.id + // will be on the beginning of the topic, so more than + // one uploader can be on a page and can have unique calls. + // + + this._subs = []; + this._cons = []; + + var doSub = lang.hitch(this, function(s, funcStr){ + this._subs.push(connect.subscribe(this.id + s, this, funcStr)); + }); + + doSub("/filesSelected", "_change"); + doSub("/filesUploaded", "_complete"); + doSub("/filesProgress", "_progress"); + doSub("/filesError", "_error"); + doSub("/filesCanceled", "onCancel"); + doSub("/stageBlur", "_onFlashBlur"); + + this.connect(this.domNode, "focus", function(){ + // TODO: some kind of indicator that the Flash button + // is in focus + this.flashMovie.focus(); + this.flashMovie.doFocus(); + }); + if(this.tabIndex>=0){ + domAttr.set(this.domNode, "tabIndex", this.tabIndex); + } + }, + _createFlashUploader: function(){ + // summary: + // Internal. Creates Flash Uploader + // + var url = this.getUrl(); + if(url){ + if(url.toLowerCase().indexOf("http")<0 && url.indexOf("/")!=0){ + // Appears to be a relative path. Attempt to + // convert it to absolute, so it will better + //target the SWF. + // + var loc = window.location.href.split("/"); + loc.pop(); + loc = loc.join("/")+"/"; + url = loc+url; + } + }else{ + console.warn("Warning: no uploadUrl provided."); + } + + this.inputNode = domConstruct.create("div", {className:"dojoxFlashNode"}, this.domNode, "first"); + domStyle.set(this.inputNode, { + position:"absolute", + top:"-2px", + width:this.btnSize.w+"px", + height:this.btnSize.h+"px", + opacity:0 + }); + + var w = this.btnSize.w; + var h = this.btnSize.h; + + var args = { + expressInstall:true, + path: (this.swfPath.uri || this.swfPath) + "?cb_" + (new Date().getTime()), + width: w, + height: h, + allowScriptAccess:"always", + allowNetworking:"all", + vars: { + uploadDataFieldName: this.flashFieldName || this.name+"Flash", + uploadUrl: url, + uploadOnSelect: this.uploadOnSelect, + deferredUploading:this.deferredUploading || 0, + selectMultipleFiles: this.multiple, + id: this.id, + isDebug: this.isDebug, + noReturnCheck: this.skipServerCheck, + serverTimeout:this.serverTimeout + }, + params: { + scale:"noscale", + wmode:"transparent", + wmode:"opaque", + allowScriptAccess:"always", + allowNetworking:"all" + } + + }; + + this.flashObject = new embedFlash(args, this.inputNode); + this.flashObject.onError = lang.hitch(function(msg){ + console.error("Flash Error: " + msg); + }); + this.flashObject.onReady = lang.hitch(this, function(){ + this.onReady(this); + }); + this.flashObject.onLoad = lang.hitch(this, function(mov){ + this.flashMovie = mov; + this.flashReady = true; + + this.onLoad(this); + }); + this._connectFlash(); + } +}); +dojox.form.addUploaderPlugin(pluginsFlash); + + +return pluginsFlash; +}); |
