Mercurial > kallithea
diff pylons_app/public/js/yui/uploader/uploader.js @ 0:564e40829f80
initial commit.
author | Marcin Kuzminski |
---|---|
date | Thu, 18 Feb 2010 13:01:57 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/public/js/yui/uploader/uploader.js Thu Feb 18 13:01:57 2010 +0100 @@ -0,0 +1,1069 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.8.0r4 +*/ +/*extern ActiveXObject, __flash_unloadHandler, __flash_savedUnloadHandler */ +/*! + * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ + * + * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * @namespace YAHOO + */ + +YAHOO.namespace("deconcept"); + +YAHOO.deconcept = YAHOO.deconcept || {}; + +if(typeof YAHOO.deconcept.util == "undefined" || !YAHOO.deconcept.util) +{ + YAHOO.deconcept.util = {}; +} + +if(typeof YAHOO.deconcept.SWFObjectUtil == "undefined" || !YAHOO.deconcept.SWFObjectUtil) +{ + YAHOO.deconcept.SWFObjectUtil = {}; +} + +YAHOO.deconcept.SWFObject = function(swf, id, w, h, ver, c, quality, xiRedirectUrl, redirectUrl, detectKey) +{ + if(!document.getElementById) { return; } + this.DETECT_KEY = detectKey ? detectKey : 'detectflash'; + this.skipDetect = YAHOO.deconcept.util.getRequestParameter(this.DETECT_KEY); + this.params = {}; + this.variables = {}; + this.attributes = []; + if(swf) { this.setAttribute('swf', swf); } + if(id) { this.setAttribute('id', id); } + if(w) { this.setAttribute('width', w); } + if(h) { this.setAttribute('height', h); } + if(ver) { this.setAttribute('version', new YAHOO.deconcept.PlayerVersion(ver.toString().split("."))); } + this.installedVer = YAHOO.deconcept.SWFObjectUtil.getPlayerVersion(); + if (!window.opera && document.all && this.installedVer.major > 7) + { + // only add the onunload cleanup if the Flash Player version supports External Interface and we are in IE + YAHOO.deconcept.SWFObject.doPrepUnload = true; + } + if(c) + { + this.addParam('bgcolor', c); + } + var q = quality ? quality : 'high'; + this.addParam('quality', q); + this.setAttribute('useExpressInstall', false); + this.setAttribute('doExpressInstall', false); + var xir = (xiRedirectUrl) ? xiRedirectUrl : window.location; + this.setAttribute('xiRedirectUrl', xir); + this.setAttribute('redirectUrl', ''); + if(redirectUrl) + { + this.setAttribute('redirectUrl', redirectUrl); + } +}; + +YAHOO.deconcept.SWFObject.prototype = +{ + useExpressInstall: function(path) + { + this.xiSWFPath = !path ? "expressinstall.swf" : path; + this.setAttribute('useExpressInstall', true); + }, + setAttribute: function(name, value){ + this.attributes[name] = value; + }, + getAttribute: function(name){ + return this.attributes[name]; + }, + addParam: function(name, value){ + this.params[name] = value; + }, + getParams: function(){ + return this.params; + }, + addVariable: function(name, value){ + this.variables[name] = value; + }, + getVariable: function(name){ + return this.variables[name]; + }, + getVariables: function(){ + return this.variables; + }, + getVariablePairs: function(){ + var variablePairs = []; + var key; + var variables = this.getVariables(); + for(key in variables) + { + if(variables.hasOwnProperty(key)) + { + variablePairs[variablePairs.length] = key +"="+ variables[key]; + } + } + return variablePairs; + }, + getSWFHTML: function() { + var swfNode = ""; + var params = {}; + var key = ""; + var pairs = ""; + if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { // netscape plugin architecture + if (this.getAttribute("doExpressInstall")) { + this.addVariable("MMplayerType", "PlugIn"); + this.setAttribute('swf', this.xiSWFPath); + } + swfNode = '<embed type="application/x-shockwave-flash" src="'+ this.getAttribute('swf') +'" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ this.getAttribute('style') +'"'; + swfNode += ' id="'+ this.getAttribute('id') +'" name="'+ this.getAttribute('id') +'" '; + params = this.getParams(); + for(key in params) + { + if(params.hasOwnProperty(key)) + { + swfNode += [key] +'="'+ params[key] +'" '; + } + } + pairs = this.getVariablePairs().join("&"); + if (pairs.length > 0){ swfNode += 'flashvars="'+ pairs +'"'; } + swfNode += '/>'; + } else { // PC IE + if (this.getAttribute("doExpressInstall")) { + this.addVariable("MMplayerType", "ActiveX"); + this.setAttribute('swf', this.xiSWFPath); + } + swfNode = '<object id="'+ this.getAttribute('id') +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ this.getAttribute('style') +'">'; + swfNode += '<param name="movie" value="'+ this.getAttribute('swf') +'" />'; + params = this.getParams(); + for(key in params) + { + if(params.hasOwnProperty(key)) + { + swfNode += '<param name="'+ key +'" value="'+ params[key] +'" />'; + } + } + pairs = this.getVariablePairs().join("&"); + if(pairs.length > 0) {swfNode += '<param name="flashvars" value="'+ pairs +'" />';} + swfNode += "</object>"; + } + return swfNode; + }, + write: function(elementId) + { + if(this.getAttribute('useExpressInstall')) { + // check to see if we need to do an express install + var expressInstallReqVer = new YAHOO.deconcept.PlayerVersion([6,0,65]); + if (this.installedVer.versionIsValid(expressInstallReqVer) && !this.installedVer.versionIsValid(this.getAttribute('version'))) { + this.setAttribute('doExpressInstall', true); + this.addVariable("MMredirectURL", escape(this.getAttribute('xiRedirectUrl'))); + document.title = document.title.slice(0, 47) + " - Flash Player Installation"; + this.addVariable("MMdoctitle", document.title); + } + } + if(this.skipDetect || this.getAttribute('doExpressInstall') || this.installedVer.versionIsValid(this.getAttribute('version'))) + { + var n = (typeof elementId == 'string') ? document.getElementById(elementId) : elementId; + n.innerHTML = this.getSWFHTML(); + return true; + } + else + { + if(this.getAttribute('redirectUrl') !== "") + { + document.location.replace(this.getAttribute('redirectUrl')); + } + } + return false; + } +}; + +/* ---- detection functions ---- */ +YAHOO.deconcept.SWFObjectUtil.getPlayerVersion = function() +{ + var axo = null; + var PlayerVersion = new YAHOO.deconcept.PlayerVersion([0,0,0]); + if(navigator.plugins && navigator.mimeTypes.length) + { + var x = navigator.plugins["Shockwave Flash"]; + if(x && x.description) + { + PlayerVersion = new YAHOO.deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split(".")); + } + } + else if (navigator.userAgent && navigator.userAgent.indexOf("Windows CE") >= 0) + { // if Windows CE + var counter = 3; + while(axo) + { + try + { + counter++; + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+ counter); +// document.write("player v: "+ counter); + PlayerVersion = new YAHOO.deconcept.PlayerVersion([counter,0,0]); + } + catch(e) + { + axo = null; + } + } + } + else + { // Win IE (non mobile) + // do minor version lookup in IE, but avoid fp6 crashing issues + // see http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/ + try + { + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); + } + catch(e) + { + try + { + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); + PlayerVersion = new YAHOO.deconcept.PlayerVersion([6,0,21]); + axo.AllowScriptAccess = "always"; // error if player version < 6.0.47 (thanks to Michael Williams @ Adobe for this code) + } + catch(e) + { + if(PlayerVersion.major == 6) + { + return PlayerVersion; + } + } + try + { + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); + } + catch(e) {} + } + + if(axo !== null) + { + PlayerVersion = new YAHOO.deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(",")); + } + } + return PlayerVersion; +}; + +YAHOO.deconcept.PlayerVersion = function(arrVersion) +{ + this.major = arrVersion[0] !== null ? parseInt(arrVersion[0], 0) : 0; + this.minor = arrVersion[1] !== null ? parseInt(arrVersion[1], 0) : 0; + this.rev = arrVersion[2] !== null ? parseInt(arrVersion[2], 0) : 0; +}; + +YAHOO.deconcept.PlayerVersion.prototype.versionIsValid = function(fv) +{ + if(this.major < fv.major) + { + return false; + } + if(this.major > fv.major) + { + return true; + } + if(this.minor < fv.minor) + { + return false; + } + if(this.minor > fv.minor) + { + return true; + } + if(this.rev < fv.rev) + { + return false; + } + return true; +}; + +/* ---- get value of query string param ---- */ +YAHOO.deconcept.util = +{ + getRequestParameter: function(param) + { + var q = document.location.search || document.location.hash; + if(param === null) { return q; } + if(q) + { + var pairs = q.substring(1).split("&"); + for(var i=0; i < pairs.length; i++) + { + if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) + { + return pairs[i].substring((pairs[i].indexOf("=") + 1)); + } + } + } + return ""; + } +}; + +/* fix for video streaming bug */ +YAHOO.deconcept.SWFObjectUtil.cleanupSWFs = function() +{ + var objects = document.getElementsByTagName("OBJECT"); + for(var i = objects.length - 1; i >= 0; i--) + { + objects[i].style.display = 'none'; + for(var x in objects[i]) + { + if(typeof objects[i][x] == 'function') + { + objects[i][x] = function(){}; + } + } + } +}; + +// fixes bug in some fp9 versions see http://blog.deconcept.com/2006/07/28/swfobject-143-released/ +if(YAHOO.deconcept.SWFObject.doPrepUnload) +{ + if(!YAHOO.deconcept.unloadSet) + { + YAHOO.deconcept.SWFObjectUtil.prepUnload = function() + { + __flash_unloadHandler = function(){}; + __flash_savedUnloadHandler = function(){}; + window.attachEvent("onunload", YAHOO.deconcept.SWFObjectUtil.cleanupSWFs); + }; + window.attachEvent("onbeforeunload", YAHOO.deconcept.SWFObjectUtil.prepUnload); + YAHOO.deconcept.unloadSet = true; + } +} + +/* add document.getElementById if needed (mobile IE < 5) */ +if(!document.getElementById && document.all) +{ + document.getElementById = function(id) { return document.all[id]; }; +} +/** + * Wraps Flash embedding functionality and allows communication with SWF through + * attributes. + * + * @namespace YAHOO.widget + * @class FlashAdapter + * @uses YAHOO.util.AttributeProvider + */ +YAHOO.widget.FlashAdapter = function(swfURL, containerID, attributes, buttonSkin) +{ + + this._queue = this._queue || []; + this._events = this._events || {}; + this._configs = this._configs || {}; + attributes = attributes || {}; + + //the Flash Player external interface code from Adobe doesn't play nicely + //with the default value, yui-gen, in IE + this._id = attributes.id = attributes.id || YAHOO.util.Dom.generateId(null, "yuigen"); + attributes.version = attributes.version || "9.0.45"; + attributes.backgroundColor = attributes.backgroundColor || "#ffffff"; + + //we can't use the initial attributes right away + //so save them for once the SWF finishes loading + this._attributes = attributes; + + this._swfURL = swfURL; + this._containerID = containerID; + + //embed the SWF file in the page + this._embedSWF(this._swfURL, this._containerID, attributes.id, attributes.version, + attributes.backgroundColor, attributes.expressInstall, attributes.wmode, buttonSkin); + + /** + * Fires when the SWF is initialized and communication is possible. + * @event contentReady + */ + //Fix for iframe cross-domain issue with FF2x + try + { + this.createEvent("contentReady"); + } + catch(e){} +}; + +YAHOO.widget.FlashAdapter.owners = YAHOO.widget.FlashAdapter.owners || {}; + +YAHOO.extend(YAHOO.widget.FlashAdapter, YAHOO.util.AttributeProvider, +{ + /** + * The URL of the SWF file. + * @property _swfURL + * @type String + * @private + */ + _swfURL: null, + + /** + * The ID of the containing DIV. + * @property _containerID + * @type String + * @private + */ + _containerID: null, + + /** + * A reference to the embedded SWF file. + * @property _swf + * @private + */ + _swf: null, + + /** + * The id of this instance. + * @property _id + * @type String + * @private + */ + _id: null, + + /** + * Indicates whether the SWF has been initialized and is ready + * to communicate with JavaScript + * @property _initialized + * @type Boolean + * @private + */ + _initialized: false, + + /** + * The initializing attributes are stored here until the SWF is ready. + * @property _attributes + * @type Object + * @private + */ + _attributes: null, //the intializing attributes + + /** + * Public accessor to the unique name of the FlashAdapter instance. + * + * @method toString + * @return {String} Unique name of the FlashAdapter instance. + */ + toString: function() + { + return "FlashAdapter " + this._id; + }, + + /** + * Nulls out the entire FlashAdapter instance and related objects and removes attached + * event listeners and clears out DOM elements inside the container. After calling + * this method, the instance reference should be expliclitly nulled by implementer, + * as in myChart = null. Use with caution! + * + * @method destroy + */ + destroy: function() + { + //kill the Flash Player instance + if(this._swf) + { + var container = YAHOO.util.Dom.get(this._containerID); + container.removeChild(this._swf); + } + + var instanceName = this._id; + + //null out properties + for(var prop in this) + { + if(YAHOO.lang.hasOwnProperty(this, prop)) + { + this[prop] = null; + } + } + + }, + + /** + * Embeds the SWF in the page and associates it with this instance. + * + * @method _embedSWF + * @private + */ + _embedSWF: function(swfURL, containerID, swfID, version, backgroundColor, expressInstall, wmode, buttonSkin) + { + //standard SWFObject embed + var swfObj = new YAHOO.deconcept.SWFObject(swfURL, swfID, "100%", "100%", version, backgroundColor); + + if(expressInstall) + { + swfObj.useExpressInstall(expressInstall); + } + + //make sure we can communicate with ExternalInterface + swfObj.addParam("allowScriptAccess", "always"); + + if(wmode) + { + swfObj.addParam("wmode", wmode); + } + + swfObj.addParam("menu", "false"); + + //again, a useful ExternalInterface trick + swfObj.addVariable("allowedDomain", document.location.hostname); + + //tell the SWF which HTML element it is in + swfObj.addVariable("elementID", swfID); + + // set the name of the function to call when the swf has an event + swfObj.addVariable("eventHandler", "YAHOO.widget.FlashAdapter.eventHandler"); + if (buttonSkin) { + swfObj.addVariable("buttonSkin", buttonSkin); + } + var container = YAHOO.util.Dom.get(containerID); + var result = swfObj.write(container); + if(result) + { + this._swf = YAHOO.util.Dom.get(swfID); + YAHOO.widget.FlashAdapter.owners[swfID] = this; + } + else + { + } + }, + + /** + * Handles or re-dispatches events received from the SWF. + * + * @method _eventHandler + * @private + */ + _eventHandler: function(event) + { + var type = event.type; + switch(type) + { + case "swfReady": + this._loadHandler(); + return; + case "log": + return; + } + + + //be sure to return after your case or the event will automatically fire! + this.fireEvent(type, event); + }, + + /** + * Called when the SWF has been initialized. + * + * @method _loadHandler + * @private + */ + _loadHandler: function() + { + this._initialized = false; + this._initAttributes(this._attributes); + this.setAttributes(this._attributes, true); + + this._initialized = true; + this.fireEvent("contentReady"); + }, + + set: function(name, value) + { + //save all the attributes in case the swf reloads + //so that we can pass them in again + this._attributes[name] = value; + YAHOO.widget.FlashAdapter.superclass.set.call(this, name, value); + }, + + /** + * Initializes the attributes. + * + * @method _initAttributes + * @private + */ + _initAttributes: function(attributes) + { + //should be overridden if other attributes need to be set up + + /** + * @attribute wmode + * @description Sets the window mode of the Flash Player control. May be + * "window", "opaque", or "transparent". Only available in the constructor + * because it may not be set after Flash Player has been embedded in the page. + * @type String + */ + + /** + * @attribute expressInstall + * @description URL pointing to a SWF file that handles Flash Player's express + * install feature. Only available in the constructor because it may not be + * set after Flash Player has been embedded in the page. + * @type String + */ + + /** + * @attribute version + * @description Minimum required version for the SWF file. Only available in the constructor because it may not be + * set after Flash Player has been embedded in the page. + * @type String + */ + + /** + * @attribute backgroundColor + * @description The background color of the SWF. Only available in the constructor because it may not be + * set after Flash Player has been embedded in the page. + * @type String + */ + + /** + * @attribute altText + * @description The alternative text to provide for screen readers and other assistive technology. + * @type String + */ + this.getAttributeConfig("altText", + { + method: this._getAltText + }); + this.setAttributeConfig("altText", + { + method: this._setAltText + }); + + /** + * @attribute swfURL + * @description Absolute or relative URL to the SWF displayed by the FlashAdapter. Only available in the constructor because it may not be + * set after Flash Player has been embedded in the page. + * @type String + */ + this.getAttributeConfig("swfURL", + { + method: this._getSWFURL + }); + }, + + /** + * Getter for swfURL attribute. + * + * @method _getSWFURL + * @private + */ + _getSWFURL: function() + { + return this._swfURL; + }, + + /** + * Getter for altText attribute. + * + * @method _getAltText + * @private + */ + _getAltText: function() + { + return this._swf.getAltText(); + }, + + /** + * Setter for altText attribute. + * + * @method _setAltText + * @private + */ + _setAltText: function(value) + { + return this._swf.setAltText(value); + } +}); + + +/** + * Receives event messages from SWF and passes them to the correct instance + * of FlashAdapter. + * + * @method YAHOO.widget.FlashAdapter.eventHandler + * @static + * @private + */ +YAHOO.widget.FlashAdapter.eventHandler = function(elementID, event) +{ + + if(!YAHOO.widget.FlashAdapter.owners[elementID]) + { + //fix for ie: if owner doesn't exist yet, try again in a moment + setTimeout(function() { YAHOO.widget.FlashAdapter.eventHandler( elementID, event ); }, 0); + } + else + { + YAHOO.widget.FlashAdapter.owners[elementID]._eventHandler(event); + } +}; + +/** + * The number of proxy functions that have been created. + * @static + * @private + */ +YAHOO.widget.FlashAdapter.proxyFunctionCount = 0; + +/** + * Creates a globally accessible function that wraps a function reference. + * Returns the proxy function's name as a string for use by the SWF through + * ExternalInterface. + * + * @method YAHOO.widget.FlashAdapter.createProxyFunction + * @static + * @private + */ +YAHOO.widget.FlashAdapter.createProxyFunction = function(func) +{ + var index = YAHOO.widget.FlashAdapter.proxyFunctionCount; + YAHOO.widget.FlashAdapter["proxyFunction" + index] = function() + { + return func.apply(null, arguments); + }; + YAHOO.widget.FlashAdapter.proxyFunctionCount++; + return "YAHOO.widget.FlashAdapter.proxyFunction" + index.toString(); +}; + +/** + * Removes a function created with createProxyFunction() + * + * @method YAHOO.widget.FlashAdapter.removeProxyFunction + * @static + * @private + */ +YAHOO.widget.FlashAdapter.removeProxyFunction = function(funcName) +{ + //quick error check + if(!funcName || funcName.indexOf("YAHOO.widget.FlashAdapter.proxyFunction") < 0) + { + return; + } + + funcName = funcName.substr(26); + YAHOO.widget.FlashAdapter[funcName] = null; +}; +/** + * The YUI Uploader Control + * @module uploader + * @description <p>YUI Uploader provides file upload functionality that goes beyond the basic browser-based methods. + * Specifically, the YUI Uploader allows for: + * <ol> + * <li> Multiple file selection in a single "Open File" dialog.</li> + * <li> File extension filters to facilitate the user's selection.</li> + * <li> Progress tracking for file uploads.</li> + * <li> A range of file metadata: filename, size, date created, date modified, and author.</li> + * <li> A set of events dispatched on various aspects of the file upload process: file selection, upload progress, upload completion, etc.</li> + * <li> Inclusion of additional data in the file upload POST request.</li> + * <li> Faster file upload on broadband connections due to the modified SEND buffer size.</li> + * <li> Same-page server response upon completion of the file upload.</li> + * </ol> + * </p> + * @title Uploader + * @namespace YAHOO.widget + * @requires yahoo, dom, element, event + */ +/** + * Uploader class for the YUI Uploader component. + * + * @namespace YAHOO.widget + * @class Uploader + * @uses YAHOO.widget.FlashAdapter + * @constructor + * @param containerId {HTMLElement} Container element for the Flash Player instance. + * @param buttonSkin {String} [optional]. If defined, the uploader is + * rendered as a button. This parameter must provide the URL of a button + * skin sprite image. Acceptable types are: jpg, gif, png and swf. The + * sprite is divided evenly into four sections along its height (e.g., if + * the sprite is 200 px tall, it's divided into four sections 50px each). + * Each section is used as a skin for a specific state of the button: top + * section is "up", second section is "over", third section is "down", and + * fourth section is "disabled". + * If the parameter is not supplied, the uploader is rendered transparent, + * and it's the developer's responsibility to create a visible UI below it. + * @param forceTransparent {Boolean} This parameter, if true, forces the Flash + * UI to be rendered with wmode set to "transparent". This behavior is useful + * in conjunction with non-rectangular button skins with PNG transparency. + * The parameter is false by default, and ignored if no buttonSkin is defined. + */ +YAHOO.widget.Uploader = function(containerId, buttonSkin, forceTransparent) +{ + var newWMode = "window"; + + if (!(buttonSkin) || (buttonSkin && forceTransparent)) { + newWMode = "transparent"; + } + + + YAHOO.widget.Uploader.superclass.constructor.call(this, YAHOO.widget.Uploader.SWFURL, containerId, {wmode:newWMode}, buttonSkin); + + /** + * Fires when the mouse is pressed over the Uploader. + * Only fires when the Uploader UI is enabled and + * the render type is 'transparent'. + * + * @event mouseDown + * @param event.type {String} The event type + */ + this.createEvent("mouseDown"); + + /** + * Fires when the mouse is released over the Uploader. + * Only fires when the Uploader UI is enabled and + * the render type is 'transparent'. + * + * @event mouseUp + * @param event.type {String} The event type + */ + this.createEvent("mouseUp"); + + /** + * Fires when the mouse rolls over the Uploader. + * + * @event rollOver + * @param event.type {String} The event type + */ + this.createEvent("rollOver"); + + /** + * Fires when the mouse rolls out of the Uploader. + * + * @event rollOut + * @param event.type {String} The event type + */ + this.createEvent("rollOut"); + + /** + * Fires when the uploader is clicked. + * + * @event click + * @param event.type {String} The event type + */ + this.createEvent("click"); + + /** + * Fires when the user has finished selecting files in the "Open File" dialog. + * + * @event fileSelect + * @param event.type {String} The event type + * @param event.fileList {Object} A dictionary of objects with file information + * @param event.fileList[].size {Number} File size in bytes for a specific file in fileList + * @param event.fileList[].cDate {Date} Creation date for a specific file in fileList + * @param event.fileList[].mDate {Date} Modification date for a specific file in fileList + * @param event.fileList[].name {String} File name for a specific file in fileList + * @param event.fileList[].id {String} Unique file id of a specific file in fileList + */ + this.createEvent("fileSelect"); + + /** + * Fires when an upload of a specific file has started. + * + * @event uploadStart + * @param event.type {String} The event type + * @param event.id {String} The id of the file that's started to upload + */ + this.createEvent("uploadStart"); + + /** + * Fires when new information about the upload progress for a specific file is available. + * + * @event uploadProgress + * @param event.type {String} The event type + * @param event.id {String} The id of the file with which the upload progress data is associated + * @param bytesLoaded {Number} The number of bytes of the file uploaded so far + * @param bytesTotal {Number} The total size of the file + */ + this.createEvent("uploadProgress"); + + /** + * Fires when an upload for a specific file is cancelled. + * + * @event uploadCancel + * @param event.type {String} The event type + * @param event.id {String} The id of the file with which the upload has been cancelled. + */ + this.createEvent("uploadCancel"); + + /** + * Fires when an upload for a specific file is complete. + * + * @event uploadComplete + * @param event.type {String} The event type + * @param event.id {String} The id of the file for which the upload has been completed. + */ + this.createEvent("uploadComplete"); + + /** + * Fires when the server sends data in response to a completed upload. + * + * @event uploadCompleteData + * @param event.type {String} The event type + * @param event.id {String} The id of the file for which the upload has been completed. + * @param event.data {String} The raw data returned by the server in response to the upload. + */ + this.createEvent("uploadCompleteData"); + + /** + * Fires when an upload error occurs. + * + * @event uploadError + * @param event.type {String} The event type + * @param event.id {String} The id of the file that was being uploaded when the error has occurred. + * @param event.status {String} The status message associated with the error. + */ + this.createEvent("uploadError"); +} + +/** + * Location of the Uploader SWF + * + * @property Chart.SWFURL + * @private + * @static + * @final + * @default "assets/uploader.swf" + */ +YAHOO.widget.Uploader.SWFURL = "assets/uploader.swf"; + +YAHOO.extend(YAHOO.widget.Uploader, YAHOO.widget.FlashAdapter, +{ +/** + * Starts the upload of the file specified by fileID to the location specified by uploadScriptPath. + * + * @param fileID {String} The id of the file to start uploading. + * @param uploadScriptPath {String} The URL of the upload location. + * @param method {String} Either "GET" or "POST", specifying how the variables accompanying the file upload POST request should be submitted. "GET" by default. + * @param vars {Object} The object containing variables to be sent in the same request as the file upload. + * @param fieldName {String} The name of the variable in the POST request containing the file data. "Filedata" by default. + * </code> + */ + upload: function(fileID, uploadScriptPath, method, vars, fieldName) + { + this._swf.upload(fileID, uploadScriptPath, method, vars, fieldName); + }, + +/** + * Starts the upload of the files specified by fileIDs, or adds them to a currently running queue. The upload queue is automatically managed. + * + * @param fileIDs {Array} The ids of the files to start uploading. + * @param uploadScriptPath {String} The URL of the upload location. + * @param method {String} Either "GET" or "POST", specifying how the variables accompanying the file upload POST request should be submitted. "GET" by default. + * @param vars {Object} The object containing variables to be sent in the same request as the file upload. + * @param fieldName {String} The name of the variable in the POST request containing the file data. "Filedata" by default. + * </code> + */ + uploadThese: function(fileIDs, uploadScriptPath, method, vars, fieldName) + { + this._swf.uploadThese(fileIDs, uploadScriptPath, method, vars, fieldName); + }, + +/** + * Starts uploading all files in the queue. If this function is called, the upload queue is automatically managed. + * + * @param uploadScriptPath {String} The URL of the upload location. + * @param method {String} Either "GET" or "POST", specifying how the variables accompanying the file upload POST request should be submitted. "GET" by default. + * @param vars {Object} The object containing variables to be sent in the same request as the file upload. + * @param fieldName {String} The name of the variable in the POST request containing the file data. "Filedata" by default. + * </code> + */ + uploadAll: function(uploadScriptPath, method, vars, fieldName) + { + this._swf.uploadAll(uploadScriptPath, method, vars, fieldName); + }, + +/** + * Cancels the upload of a specified file. If no file id is specified, all ongoing uploads are cancelled. + * + * @param fileID {String} The ID of the file whose upload should be cancelled. + */ + cancel: function(fileID) + { + this._swf.cancel(fileID); + }, + +/** + * Clears the list of files queued for upload. + * + */ + clearFileList: function() + { + this._swf.clearFileList(); + }, + +/** + * Removes the specified file from the upload queue. + * + * @param fileID {String} The id of the file to remove from the upload queue. + */ + removeFile: function (fileID) + { + this._swf.removeFile(fileID); + }, + +/** + * Turns the logging functionality on. + * Uses Flash internal trace logging, as well as YUI Logger, if available. + * + * @param allowLogging {Boolean} If true, logs are output; otherwise, no logs are produced. + */ + setAllowLogging: function (allowLogging) + { + this._swf.setAllowLogging(allowLogging); + }, + +/** + * Sets the number of simultaneous uploads when using uploadAll() + * The minimum value is 1, and maximum value is 5. The default value is 2. + * + * @param simUploadLimit {int} Number of simultaneous uploads, between 1 and 5. + */ + setSimUploadLimit : function (simUploadLimit) + { + this._swf.setSimUploadLimit(simUploadLimit); + }, + +/** + * Sets the flag allowing users to select multiple files for the upload. + * + * @param allowMultipleFiles {Boolean} If true, multiple files can be selected. False by default. + */ + setAllowMultipleFiles : function (allowMultipleFiles) + { + this._swf.setAllowMultipleFiles(allowMultipleFiles); + }, + +/** + * Sets the file filters for the "Browse" dialog. + * + * @param newFilterArray An array of sets of key-value pairs of the form + * {extensions: extensionString, description: descriptionString, [optional]macType: macTypeString} + * The extensions string is a semicolon-delimited list of elements of the form "*.xxx", + * e.g. "*.jpg;*.gif;*.png". + */ + setFileFilters : function (fileFilters) + { + this._swf.setFileFilters(fileFilters); + }, + + /** + * Enables the mouse events on the Uploader. + * If the uploader is being rendered as a button, + * then the button's skin is set to "up" + * (first section of the button skin sprite). + * + */ + enable : function () + { + this._swf.enable(); + }, + + /** + * Disables the mouse events on the Uploader. + * If the uploader is being rendered as a button, + * then the button's skin is set to "disabled" + * (fourth section of the button skin sprite). + * + */ + disable : function () + { + this._swf.disable(); + } +}); +YAHOO.register("uploader", YAHOO.widget.Uploader, {version: "2.8.0r4", build: "2449"});