//>>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; });