diff -r d334a616c023 -r e16a97fb364a src/cm/media/js/lib/yui/yui3-3.15.0/build/file-html5/file-html5.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cm/media/js/lib/yui/yui3-3.15.0/build/file-html5/file-html5.js Mon Mar 10 15:19:48 2014 +0100 @@ -0,0 +1,503 @@ +YUI.add('file-html5', function (Y, NAME) { + + /** + * The FileHTML5 class provides a wrapper for a file pointer in an HTML5 The File wrapper + * also implements the mechanics for uploading a file and tracking its progress. + * @module file-html5 + */ + + /** + * The class provides a wrapper for a file pointer. + * @class FileHTML5 + * @extends Base + * @constructor + * @param {Object} config Configuration object. + */ + var Lang = Y.Lang, + Bind = Y.bind, + Win = Y.config.win; + + var FileHTML5 = function(o) { + + var file = null; + + if (FileHTML5.isValidFile(o)) { + file = o; + } + else if (FileHTML5.isValidFile(o.file)) { + file = o.file; + } + else { + file = false; + } + + FileHTML5.superclass.constructor.apply(this, arguments); + + if (file && FileHTML5.canUpload()) { + if (!this.get("file")) { + this._set("file", file); + } + + if (!this.get("name")) { + this._set("name", file.name || file.fileName); + } + + if (this.get("size") != (file.size || file.fileSize)) { + this._set("size", file.size || file.fileSize); + } + + if (!this.get("type")) { + this._set("type", file.type); + } + + if (file.hasOwnProperty("lastModifiedDate") && !this.get("dateModified")) { + this._set("dateModified", file.lastModifiedDate); + } + } + }; + + + Y.extend(FileHTML5, Y.Base, { + + /** + * Construction logic executed during FileHTML5 instantiation. + * + * @method initializer + * @protected + */ + initializer : function (cfg) { + if (!this.get("id")) { + this._set("id", Y.guid("file")); + } + }, + + /** + * Handler of events dispatched by the XMLHTTPRequest. + * + * @method _uploadEventHandler + * @param {Event} event The event object received from the XMLHTTPRequest. + * @protected + */ + _uploadEventHandler: function (event) { + var xhr = this.get("xhr"); + + switch (event.type) { + case "progress": + /** + * Signals that progress has been made on the upload of this file. + * + * @event uploadprogress + * @param event {Event} The event object for the `uploadprogress` with the + * following payload: + *
+ *
originEvent
+ *
The original event fired by the XMLHttpRequest instance.
+ *
bytesLoaded
+ *
The number of bytes of the file that has been uploaded.
+ *
bytesTotal
+ *
The total number of bytes in the file (the file size)
+ *
percentLoaded
+ *
The fraction of the file that has been uploaded, out of 100.
+ *
+ */ + this.fire("uploadprogress", {originEvent: event, + bytesLoaded: event.loaded, + bytesTotal: this.get("size"), + percentLoaded: Math.min(100, Math.round(10000*event.loaded/this.get("size"))/100) + }); + this._set("bytesUploaded", event.loaded); + break; + + case "load": + /** + * Signals that this file's upload has completed and data has been received from the server. + * + * @event uploadcomplete + * @param event {Event} The event object for the `uploadcomplete` with the + * following payload: + *
+ *
originEvent
+ *
The original event fired by the XMLHttpRequest instance.
+ *
data
+ *
The data returned by the server.
+ *
+ */ + + if (xhr.status >= 200 && xhr.status <= 299) { + this.fire("uploadcomplete", {originEvent: event, + data: event.target.responseText}); + var xhrupload = xhr.upload, + boundEventHandler = this.get("boundEventHandler"); + + xhrupload.removeEventListener ("progress", boundEventHandler); + xhrupload.removeEventListener ("error", boundEventHandler); + xhrupload.removeEventListener ("abort", boundEventHandler); + xhr.removeEventListener ("load", boundEventHandler); + xhr.removeEventListener ("error", boundEventHandler); + xhr.removeEventListener ("readystatechange", boundEventHandler); + + this._set("xhr", null); + } + else { + this.fire("uploaderror", {originEvent: event, + data: xhr.responseText, + status: xhr.status, + statusText: xhr.statusText, + source: "http"}); + } + break; + + case "error": + /** + * Signals that this file's upload has encountered an error. + * + * @event uploaderror + * @param event {Event} The event object for the `uploaderror` with the + * following payload: + *
+ *
originEvent
+ *
The original event fired by the XMLHttpRequest instance.
+ *
data
+ *
The data returned by the server.
+ *
status
+ *
The status code reported by the XMLHttpRequest. If it's an HTTP error, + then this corresponds to the HTTP status code received by the uploader.
+ *
statusText
+ *
The text of the error event reported by the XMLHttpRequest instance
+ *
source
+ *
Either "http" (if it's an HTTP error), or "io" (if it's a network transmission + * error.)
+ * + *
+ */ + this.fire("uploaderror", {originEvent: event, + data: xhr.responseText, + status: xhr.status, + statusText: xhr.statusText, + source: "io"}); + break; + + case "abort": + + /** + * Signals that this file's upload has been cancelled. + * + * @event uploadcancel + * @param event {Event} The event object for the `uploadcancel` with the + * following payload: + *
+ *
originEvent
+ *
The original event fired by the XMLHttpRequest instance.
+ *
+ */ + this.fire("uploadcancel", {originEvent: event}); + break; + + case "readystatechange": + + /** + * Signals that XMLHttpRequest has fired a readystatechange event. + * + * @event readystatechange + * @param event {Event} The event object for the `readystatechange` with the + * following payload: + *
+ *
readyState
+ *
The readyState code reported by the XMLHttpRequest instance.
+ *
originEvent
+ *
The original event fired by the XMLHttpRequest instance.
+ *
+ */ + this.fire("readystatechange", {readyState: event.target.readyState, + originEvent: event}); + break; + } + }, + + /** + * Starts the upload of a specific file. + * + * @method startUpload + * @param url {String} The URL to upload the file to. + * @param parameters {Object} (optional) A set of key-value pairs to send as variables along with the file upload HTTP request. + * @param fileFieldName {String} (optional) The name of the POST variable that should contain the uploaded file ('Filedata' by default) + */ + startUpload: function(url, parameters, fileFieldName) { + + this._set("bytesUploaded", 0); + + this._set("xhr", new XMLHttpRequest()); + this._set("boundEventHandler", Bind(this._uploadEventHandler, this)); + + var uploadData = new FormData(), + fileField = fileFieldName || "Filedata", + xhr = this.get("xhr"), + xhrupload = this.get("xhr").upload, + boundEventHandler = this.get("boundEventHandler"); + + Y.each(parameters, function (value, key) {uploadData.append(key, value);}); + uploadData.append(fileField, this.get("file")); + + + + + xhr.addEventListener ("loadstart", boundEventHandler, false); + xhrupload.addEventListener ("progress", boundEventHandler, false); + xhr.addEventListener ("load", boundEventHandler, false); + xhr.addEventListener ("error", boundEventHandler, false); + xhrupload.addEventListener ("error", boundEventHandler, false); + xhrupload.addEventListener ("abort", boundEventHandler, false); + xhr.addEventListener ("abort", boundEventHandler, false); + xhr.addEventListener ("loadend", boundEventHandler, false); + xhr.addEventListener ("readystatechange", boundEventHandler, false); + + xhr.open("POST", url, true); + + xhr.withCredentials = this.get("xhrWithCredentials"); + + Y.each(this.get("xhrHeaders"), function (value, key) { + xhr.setRequestHeader(key, value); + }); + + xhr.send(uploadData); + + /** + * Signals that this file's upload has started. + * + * @event uploadstart + * @param event {Event} The event object for the `uploadstart` with the + * following payload: + *
+ *
xhr
+ *
The XMLHttpRequest instance handling the file upload.
+ *
+ */ + this.fire("uploadstart", {xhr: xhr}); + + }, + + /** + * Cancels the upload of a specific file, if currently in progress. + * + * @method cancelUpload + */ + cancelUpload: function () { + var xhr = this.get('xhr'); + if (xhr) { + xhr.abort(); + } + } + + + }, { + + /** + * The identity of the class. + * + * @property NAME + * @type String + * @default 'file' + * @readOnly + * @protected + * @static + */ + NAME: 'file', + + /** + * The type of transport. + * + * @property TYPE + * @type String + * @default 'html5' + * @readOnly + * @protected + * @static + */ + TYPE: 'html5', + + /** + * Static property used to define the default attribute configuration of + * the File. + * + * @property ATTRS + * @type {Object} + * @protected + * @static + */ + ATTRS: { + + /** + * A String containing the unique id of the file wrapped by the FileFlash instance. + * The id is supplied by the Flash player uploader. + * + * @attribute id + * @type {String} + * @initOnly + */ + id: { + writeOnce: "initOnly", + value: null + }, + + /** + * The size of the file wrapped by FileHTML5. This value is supplied by the instance of File(). + * + * @attribute size + * @type {Number} + * @initOnly + */ + size: { + writeOnce: "initOnly", + value: 0 + }, + + /** + * The name of the file wrapped by FileHTML5. This value is supplied by the instance of File(). + * + * @attribute name + * @type {String} + * @initOnly + */ + name: { + writeOnce: "initOnly", + value: null + }, + + /** + * The date that the file wrapped by FileHTML5 was created on. This value is supplied by the instance of File(). + * + * @attribute dateCreated + * @type {Date} + * @initOnly + * @default null + */ + dateCreated: { + writeOnce: "initOnly", + value: null + }, + + /** + * The date that the file wrapped by FileHTML5 was last modified on. This value is supplied by the instance of File(). + * + * @attribute dateModified + * @type {Date} + * @initOnly + */ + dateModified: { + writeOnce: "initOnly", + value: null + }, + + /** + * The number of bytes of the file that has been uploaded to the server. This value is + * non-zero only while a file is being uploaded. + * + * @attribute bytesUploaded + * @type {Date} + * @readOnly + */ + bytesUploaded: { + readOnly: true, + value: 0 + }, + + /** + * The type of the file wrapped by FileHTML. This value is provided by the instance of File() + * + * @attribute type + * @type {String} + * @initOnly + */ + type: { + writeOnce: "initOnly", + value: null + }, + + /** + * The pointer to the instance of File() wrapped by FileHTML5. + * + * @attribute file + * @type {File} + * @initOnly + */ + file: { + writeOnce: "initOnly", + value: null + }, + + /** + * The pointer to the instance of XMLHttpRequest used by FileHTML5 to upload the file. + * + * @attribute xhr + * @type {XMLHttpRequest} + * @initOnly + */ + xhr: { + readOnly: true, + value: null + }, + + /** + * The dictionary of headers that should be set on the XMLHttpRequest object before + * sending it. + * + * @attribute xhrHeaders + * @type {Object} + * @initOnly + */ + xhrHeaders: { + value: {} + }, + + /** + * A Boolean indicating whether the XMLHttpRequest should be sent with user credentials. + * This does not affect same-site requests. + * + * @attribute xhrWithCredentials + * @type {Boolean} + * @initOnly + */ + xhrWithCredentials: { + value: true + }, + + /** + * The bound event handler used to handle events from XMLHttpRequest. + * + * @attribute boundEventHandler + * @type {Function} + * @initOnly + */ + boundEventHandler: { + readOnly: true, + value: null + } + }, + + /** + * Checks whether a specific native file instance is valid + * + * @method isValidFile + * @param file {File} A native File() instance. + * @static + */ + isValidFile: function (file) { + return (Win && Win.File && file instanceof File); + }, + + /** + * Checks whether the browser has a native upload capability + * via XMLHttpRequest Level 2. + * + * @method canUpload + * @static + */ + canUpload: function () { + return (Win && Win.FormData && Win.XMLHttpRequest); + } + }); + + Y.FileHTML5 = FileHTML5; + + +}, '@VERSION@', {"requires": ["base"]});