Show:
                                /**
                                 * The FileFlash class provides a wrapper for a file pointer stored in Flash. The File wrapper
                                 * also implements the mechanics for uploading a file and tracking its progress.
                                 * @module file-flash
                                 */
                                /**
                                 * The class provides a wrapper for a file pointer in Flash.
                                 * @class FileFlash
                                 * @extends Base
                                 * @constructor
                                 * @param {Object} config Configuration object.
                                 */
                            
                                var FileFlash = function(o) {
                                    FileFlash.superclass.constructor.apply(this, arguments);
                                };
                            
                                Y.extend(FileFlash, Y.Base, {
                            
                                   /**
                                    * Construction logic executed during FileFlash instantiation.
                                    *
                                    * @method initializer
                                    * @protected
                                    */
                                    initializer : function (cfg) {
                                        if (!this.get("id")) {
                                            this._set("id", Y.guid("file"));
                                        }
                                    },
                            
                                   /**
                                    * Handler of events dispatched by the Flash player.
                                    *
                                    * @method _swfEventHandler
                                    * @param {Event} event The event object received from the Flash player.
                                    * @protected
                                    */
                                    _swfEventHandler: function (event) {
                                      if (event.id === this.get("id")) {
                                      switch (event.type) {
                                        /**
                                         * Signals that this file's upload has started.
                                         *
                                         * @event uploadstart
                                         * @param event {Event} The event object for the `uploadstart` with the
                                         *                      following payload:
                                         *  <dl>
                                         *      <dt>uploader</dt>
                                         *          <dd>The Y.SWF instance of Flash uploader that's handling the upload.</dd>
                                         *  </dl>
                                         */
                                        case "uploadstart":
                                             this.fire("uploadstart", {uploader: this.get("uploader")});
                                             break;
                                        case "uploadprogress":
                            
                                              /**
                                               * 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:
                                               *  <dl>
                                               *      <dt>originEvent</dt>
                                               *          <dd>The original event fired by the Flash uploader instance.</dd>
                                               *      <dt>bytesLoaded</dt>
                                               *          <dd>The number of bytes of the file that has been uploaded.</dd>
                                               *      <dt>bytesTotal</dt>
                                               *          <dd>The total number of bytes in the file (the file size)</dd>
                                               *      <dt>percentLoaded</dt>
                                               *          <dd>The fraction of the file that has been uploaded, out of 100.</dd>
                                               *  </dl>
                                               */
                                             this.fire("uploadprogress", {originEvent: event,
                                                                          bytesLoaded: event.bytesLoaded,
                                                                          bytesTotal: event.bytesTotal,
                                                                          percentLoaded: Math.min(100, Math.round(10000*event.bytesLoaded/event.bytesTotal)/100)
                                                                         });
                                             this._set("bytesUploaded", event.bytesLoaded);
                                             break;
                                        case "uploadcomplete":
                            
                                              /**
                                               * Signals that this file's upload has completed, but data has not yet been received from the server.
                                               *
                                               * @event uploadfinished
                                               * @param event {Event} The event object for the `uploadfinished` with the
                                               *                      following payload:
                                               *  <dl>
                                               *      <dt>originEvent</dt>
                                               *          <dd>The original event fired by the Flash player instance.</dd>
                                               *  </dl>
                                               */
                                             this.fire("uploadfinished", {originEvent: event});
                                             break;
                                        case "uploadcompletedata":
                                            /**
                                             * 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:
                                             *  <dl>
                                             *      <dt>originEvent</dt>
                                             *          <dd>The original event fired by the Flash player instance.</dd>
                                             *      <dt>data</dt>
                                             *          <dd>The data returned by the server.</dd>
                                             *  </dl>
                                             */
                                             this.fire("uploadcomplete", {originEvent: event,
                                                                          data: event.data});
                                             break;
                                        case "uploadcancel":
                            
                                            /**
                                             * Signals that this file's upload has been cancelled.
                                             *
                                             * @event uploadcancel
                                             * @param event {Event} The event object for the `uploadcancel` with the
                                             *                      following payload:
                                             *  <dl>
                                             *      <dt>originEvent</dt>
                                             *          <dd>The original event fired by the Flash player instance.</dd>
                                             *  </dl>
                                             */
                                             this.fire("uploadcancel", {originEvent: event});
                                             break;
                                        case "uploaderror":
                            
                                            /**
                                             * 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:
                                             *  <dl>
                                             *      <dt>originEvent</dt>
                                             *          <dd>The original event fired by the Flash player instance.</dd>
                                             *      <dt>status</dt>
                                             *          <dd>The status code reported by the Flash Player. If it's an HTTP error,
                                             *                then this corresponds to the HTTP status code received by the uploader.</dd>
                                             *      <dt>statusText</dt>
                                             *          <dd>The text of the error event reported by the Flash Player.</dd>
                                             *      <dt>source</dt>
                                             *          <dd>Either "http" (if it's an HTTP error), or "io" (if it's a network transmission
                                             *              error.)</dd>
                                             *  </dl>
                                             */
                                             this.fire("uploaderror", {originEvent: event, status: event.status, statusText: event.message, source: event.source});
                            
                                      }
                                    }
                                    },
                            
                                   /**
                                    * 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) {
                            
                                    if (this.get("uploader")) {
                            
                                        var myUploader = this.get("uploader"),
                                            fileField = fileFieldName || "Filedata",
                                            id = this.get("id"),
                                            params = parameters || null;
                            
                                        this._set("bytesUploaded", 0);
                            
                                        myUploader.on("uploadstart", this._swfEventHandler, this);
                                        myUploader.on("uploadprogress", this._swfEventHandler, this);
                                        myUploader.on("uploadcomplete", this._swfEventHandler, this);
                                        myUploader.on("uploadcompletedata", this._swfEventHandler, this);
                                        myUploader.on("uploaderror", this._swfEventHandler, this);
                            
                                        myUploader.callSWF("upload", [id, url, params, fileField]);
                                     }
                            
                                    },
                            
                                   /**
                                    * Cancels the upload of a specific file, if currently in progress.
                                    *
                                    * @method cancelUpload
                                    */
                                    cancelUpload: function () {
                                     if (this.get("uploader")) {
                                       this.get("uploader").callSWF("cancel", [this.get("id")]);
                                       this.fire("uploadcancel");
                                     }
                                    }
                            
                                }, {
                            
                                   /**
                                    * 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 'flash'
                                    * @readOnly
                                    * @protected
                                    * @static
                                    */
                                    TYPE: "flash",
                            
                                   /**
                                    * 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 FileFlash. This value is supplied by the Flash player uploader.
                                    *
                                    * @attribute size
                                    * @type {Number}
                                    * @initOnly
                                    */
                                    size: {
                                        writeOnce: "initOnly",
                                        value: 0
                                    },
                            
                                   /**
                                    * The name of the file wrapped by FileFlash. This value is supplied by the Flash player uploader.
                                    *
                                    * @attribute name
                                    * @type {String}
                                    * @initOnly
                                    */
                                    name: {
                                        writeOnce: "initOnly",
                                        value: null
                                    },
                            
                                   /**
                                    * The date that the file wrapped by FileFlash was created on. This value is supplied by the Flash player uploader.
                                    *
                                    * @attribute dateCreated
                                    * @type {Date}
                                    * @initOnly
                                    */
                                    dateCreated: {
                                        writeOnce: "initOnly",
                                        value: null
                                    },
                            
                                   /**
                                    * The date that the file wrapped by FileFlash was last modified on. This value is supplied by the Flash player uploader.
                                    *
                                    * @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 FileFlash. This value is provided by the Flash player
                                    * uploader.
                                    *
                                    * @attribute type
                                    * @type {String}
                                    * @initOnly
                                    */
                                    type: {
                                        writeOnce: "initOnly",
                                        value: null
                                    },
                            
                                   /**
                                    * The instance of Y.SWF wrapping the Flash player uploader associated with this file.
                                    *
                                    * @attribute uploder
                                    * @type {SWF}
                                    * @initOnly
                                    */
                                    uploader: {
                                        writeOnce: "initOnly",
                                        value: null
                                    }
                                    }
                                });
                            
                                Y.FileFlash = FileFlash;