dojo.provide("dojox.form.Uploader");
dojo.experimental("dojox.form.Uploader");
dojo.require("dojox.form.uploader.Base");
dojo.require("dijit.form.Button");
//
// TODO:
// i18n
// label via innerHTML
// Doc and or test what can be extended.
// Doc custom file events
// Use new FileReader() for thumbnails
// flashFieldName should default to Flash
// get('value'); and set warning
//
dojo.declare("dojox.form.Uploader", [dojox.form.uploader.Base], {
//
// Version: 1.6
//
// summary:
// A widget that creates a stylable file-input button, with optional multi-file selection,
// using only HTML elements. Non-HTML5 browsers have fallback options of Flash or an iframe.
//
// description:
// A bare-bones, stylable file-input button, with optional multi-file selection. The list
// of files is not displayed, that is for you to handle by connecting to the onChange
// event, or use the dojox.form.uploader.FileList.
//
// Uploader without plugins does not have any ability to upload - it is for use in forms
// where you handle the upload either by a standard POST or with Ajax using an iFrame. This
// class is for convenience of multiple files only. No progress events are available.
//
// If the browser supports a file-input with the "multiple" attribute, that will be used.
// If the browser does not support "multiple" (ergo, IE) multiple inputs are used,
// one for each selection.
//
//
// uploadOnSelect: Boolean
// If true, uploads imediately after a file has been selected. If false,
// waits for upload() to be called.
uploadOnSelect:false,
// tabIndex: Number|String
// The tab order in the DOM.
tabIndex:0,
// multiple: Boolean
// If true and flash mode, multiple files may be selected from the dialog.
multiple:false,
//
// label: String
// The text used in the button that when clicked, opens a system Browse Dialog.
label:"Upload...",
//
// url: String
// The url targeted for upload. An absolute URL is preferred. Relative URLs are
// changed to absolute.
url:"",
//
// name: String
// The name attribute needs to end with square brackets: [] as this is the standard way
// of handling an attribute "array". This requires a slightly different technique on the
// server.
name:"uploadedfile",
//
// flashFieldName: String
// If set, this will be the name of the field of the flash uploaded files that the server
// is expecting. If not set, "Flash" is appended to the "name" property.
flashFieldName:"",
//
// uploadType: String [readonly]
// The type of uploader being used. As an alternative to determining the upload type on the
// server based on the fieldName, this property could be sent to the server to help
// determine what type of parsing should be used.
uploadType:"form",
//
_nameIndex:0,
widgetsInTemplate:true,
templateString:'
',
postMixInProperties: function(){
this._inputs = [];
this._getButtonStyle(this.srcNodeRef);
this.inherited(arguments);
},
postCreate: function(){
var restore = false;
var parent = this.domNode.parentNode;
var position = this._getNodePosition(this.domNode);
if(!this.btnSize.w || !this.btnSize.h) {
dojo.body().appendChild(this.domNode);
this._getButtonStyle(this.domNode);
restore = true;
}
this._setButtonStyle();
if(restore){
dojo.place(this.domNode, position.node, position.pos)
}
this.inherited(arguments);
},
/*************************
* Public Events *
*************************/
onChange: function(/* Array */fileArray){
// summary:
// stub to connect
// Fires when files are selected
// Event is an array of last files selected
},
onBegin: function(/* Array */dataArray){
// summary:
// Fires when upload begins
},
onProgress: function(/* Object */customEvent){
// summary:
// Stub to connect
// Fires on upload progress. Event is a normalized object of common properties
// from HTML5 uploaders and the Flash uploader. Will not fire for IFrame.
// customEvent:
// bytesLoaded: Number
// Amount of bytes uploaded so far of entire payload (all files)
// bytesTotal: Number
// Amount of bytes of entire payload (all files)
// type: String
// Type of event (progress or load)
// timeStamp: Number
// Timestamp of when event occurred
},
onComplete: function(/* Object */customEvent){
// summary:
// stub to connect
// Fires when all files have uploaded
// Event is an array of all files
this.reset();
},
onCancel: function(){
// summary:
// Stub to connect
// Fires when dialog box has been closed
// without a file selection
},
onAbort: function(){
// summary:
// Stub to connect
// Fires when upload in progress was canceled
},
onError: function(/* Object or String */evtObject){
// summary:
// Fires on errors
//
//FIXME: Unsure of a standard form of error events
},
/*************************
* Public Methods *
*************************/
upload: function(/*Object ? */formData){
// summary:
// When called, begins file upload. Only supported with plugins.
},
submit: function(/* form Node ? */form){
// summary:
// If Uploader is in a form, and other data should be sent along with the files, use
// this instead of form submit. Only supported with plugins.
},
reset: function(){
// summary
// Resets entire input, clearing all files.
// NOTE:
// Removing individual files is not yet supported, because the HTML5 uploaders can't
// be edited.
// TODO:
// Add this ability by effectively, not uploading them
//
this._disconnectButton();
dojo.forEach(this._inputs, dojo.destroy, dojo);
this._inputs = [];
this._nameIndex = 0;
this._createInput();