2008-01-25 20:21:11 +01:00
/ * *
2008-06-06 09:29:15 +02:00
* SWFUpload v2 . 1.0 by Jacob Roberts , Feb 2008 , http : //www.swfupload.org, http://swfupload.googlecode.com, http://www.swfupload.org
2008-01-25 20:21:11 +01:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2008-06-06 09:29:15 +02:00
* SWFUpload is ( c ) 2006 Lars Huring , Olov Nilz <EFBFBD> n and Mammon Media and is released under the MIT License :
2008-01-25 20:21:11 +01:00
* http : //www.opensource.org/licenses/mit-license.php
*
* See Changelog . txt for version history
*
* /
/* *********** */
/* Constructor */
/* *********** */
2008-06-06 09:29:15 +02:00
var SWFUpload = function ( settings ) {
this . initSWFUpload ( settings ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . initSWFUpload = function ( settings ) {
2008-01-25 20:21:11 +01:00
try {
this . customSettings = { } ; // A container where developers can place their own settings associated with this instance.
2008-06-06 09:29:15 +02:00
this . settings = settings ;
2008-01-25 20:21:11 +01:00
this . eventQueue = [ ] ;
this . movieName = "SWFUpload_" + SWFUpload . movieCount ++ ;
this . movieElement = null ;
// Setup global control tracking
SWFUpload . instances [ this . movieName ] = this ;
// Load the settings. Load the Flash movie.
2008-06-06 09:29:15 +02:00
this . initSettings ( ) ;
2008-01-25 20:21:11 +01:00
this . loadFlash ( ) ;
this . displayDebugInfo ( ) ;
2008-06-06 09:29:15 +02:00
} catch ( ex ) {
delete SWFUpload . instances [ this . movieName ] ;
throw ex ;
2008-01-25 20:21:11 +01:00
}
2008-06-06 09:29:15 +02:00
} ;
2008-01-25 20:21:11 +01:00
/* *************** */
2008-06-06 09:29:15 +02:00
/* Static Members */
2008-01-25 20:21:11 +01:00
/* *************** */
SWFUpload . instances = { } ;
SWFUpload . movieCount = 0 ;
2008-06-06 09:29:15 +02:00
SWFUpload . version = "2.1.0" ;
2008-01-25 20:21:11 +01:00
SWFUpload . QUEUE _ERROR = {
QUEUE _LIMIT _EXCEEDED : - 100 ,
FILE _EXCEEDS _SIZE _LIMIT : - 110 ,
ZERO _BYTE _FILE : - 120 ,
INVALID _FILETYPE : - 130
} ;
SWFUpload . UPLOAD _ERROR = {
HTTP _ERROR : - 200 ,
MISSING _UPLOAD _URL : - 210 ,
IO _ERROR : - 220 ,
SECURITY _ERROR : - 230 ,
UPLOAD _LIMIT _EXCEEDED : - 240 ,
UPLOAD _FAILED : - 250 ,
SPECIFIED _FILE _ID _NOT _FOUND : - 260 ,
FILE _VALIDATION _FAILED : - 270 ,
FILE _CANCELLED : - 280 ,
UPLOAD _STOPPED : - 290
} ;
SWFUpload . FILE _STATUS = {
QUEUED : - 1 ,
IN _PROGRESS : - 2 ,
ERROR : - 3 ,
COMPLETE : - 4 ,
CANCELLED : - 5
} ;
2008-06-06 09:29:15 +02:00
/* ******************** */
/* Instance Members */
/* ******************** */
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
// Private: initSettings ensures that all the
// settings are set, getting a default value if one was not assigned.
SWFUpload . prototype . initSettings = function ( ) {
this . ensureDefault = function ( settingName , defaultValue ) {
this . settings [ settingName ] = ( this . settings [ settingName ] == undefined ) ? defaultValue : this . settings [ settingName ] ;
} ;
2008-01-25 20:21:11 +01:00
// Upload backend settings
2008-06-06 09:29:15 +02:00
this . ensureDefault ( "upload_url" , "" ) ;
this . ensureDefault ( "file_post_name" , "Filedata" ) ;
this . ensureDefault ( "post_params" , { } ) ;
this . ensureDefault ( "use_query_string" , false ) ;
this . ensureDefault ( "requeue_on_error" , false ) ;
2008-01-25 20:21:11 +01:00
// File Settings
2008-06-06 09:29:15 +02:00
this . ensureDefault ( "file_types" , "*.*" ) ;
this . ensureDefault ( "file_types_description" , "All Files" ) ;
this . ensureDefault ( "file_size_limit" , 0 ) ; // Default zero means "unlimited"
this . ensureDefault ( "file_upload_limit" , 0 ) ;
this . ensureDefault ( "file_queue_limit" , 0 ) ;
2008-01-25 20:21:11 +01:00
// Flash Settings
2008-06-06 09:29:15 +02:00
this . ensureDefault ( "flash_url" , "swfupload_f9.swf" ) ;
this . ensureDefault ( "flash_color" , "#FFFFFF" ) ;
2008-01-25 20:21:11 +01:00
// Debug Settings
2008-06-06 09:29:15 +02:00
this . ensureDefault ( "debug" , false ) ;
this . settings . debug _enabled = this . settings . debug ; // Here to maintain v2 API
2008-01-25 20:21:11 +01:00
// Event Handlers
2008-06-06 09:29:15 +02:00
this . settings . return _upload _start _handler = this . returnUploadStart ;
this . ensureDefault ( "swfupload_loaded_handler" , null ) ;
this . ensureDefault ( "file_dialog_start_handler" , null ) ;
this . ensureDefault ( "file_queued_handler" , null ) ;
this . ensureDefault ( "file_queue_error_handler" , null ) ;
this . ensureDefault ( "file_dialog_complete_handler" , null ) ;
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
this . ensureDefault ( "upload_start_handler" , null ) ;
this . ensureDefault ( "upload_progress_handler" , null ) ;
this . ensureDefault ( "upload_error_handler" , null ) ;
this . ensureDefault ( "upload_success_handler" , null ) ;
this . ensureDefault ( "upload_complete_handler" , null ) ;
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
this . ensureDefault ( "debug_handler" , this . debugMessage ) ;
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
this . ensureDefault ( "custom_settings" , { } ) ;
2008-01-25 20:21:11 +01:00
// Other settings
2008-06-06 09:29:15 +02:00
this . customSettings = this . settings . custom _settings ;
delete this . ensureDefault ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Private: loadFlash generates the HTML tag for the Flash
// It then adds the flash to the body
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . loadFlash = function ( ) {
2008-06-06 09:29:15 +02:00
var targetElement , container ;
2008-01-25 20:21:11 +01:00
// Make sure an element with the ID we are going to use doesn't already exist
if ( document . getElementById ( this . movieName ) !== null ) {
2008-06-06 09:29:15 +02:00
throw "ID " + this . movieName + " is already in use. The Flash Object could not be added" ;
2008-01-25 20:21:11 +01:00
}
// Get the body tag where we will be adding the flash movie
2008-06-06 09:29:15 +02:00
targetElement = document . getElementsByTagName ( "body" ) [ 0 ] ;
if ( targetElement == undefined ) {
throw "Could not find the 'body' element." ;
2008-01-25 20:21:11 +01:00
}
// Append the container and load the flash
container = document . createElement ( "div" ) ;
2008-06-06 09:29:15 +02:00
container . style . width = "1px" ;
container . style . height = "1px" ;
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
targetElement . appendChild ( container ) ;
2008-01-25 20:21:11 +01:00
container . innerHTML = this . getFlashHTML ( ) ; // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
} ;
2008-06-06 09:29:15 +02:00
// Private: getFlashHTML generates the object tag needed to embed the flash in to the document
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . getFlashHTML = function ( ) {
2008-06-06 09:29:15 +02:00
// Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay
return [ '<object id="' , this . movieName , '" type="application/x-shockwave-flash" data="' , this . settings . flash _url , '" width="1" height="1" style="-moz-user-focus: ignore;">' ,
'<param name="movie" value="' , this . settings . flash _url , '" />' ,
'<param name="bgcolor" value="' , this . settings . flash _color , '" />' ,
'<param name="quality" value="high" />' ,
'<param name="menu" value="false" />' ,
'<param name="allowScriptAccess" value="always" />' ,
'<param name="flashvars" value="' + this . getFlashVars ( ) + '" />' ,
'</object>' ] . join ( "" ) ;
} ;
// Private: getFlashVars builds the parameter string that will be passed
// to flash in the flashvars param.
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . getFlashVars = function ( ) {
// Build a string from the post param object
2008-06-06 09:29:15 +02:00
var paramString = this . buildParamString ( ) ;
2008-01-25 20:21:11 +01:00
// Build the parameter string
2008-06-06 09:29:15 +02:00
return [ "movieName=" , encodeURIComponent ( this . movieName ) ,
"&uploadURL=" , encodeURIComponent ( this . settings . upload _url ) ,
"&useQueryString=" , encodeURIComponent ( this . settings . use _query _string ) ,
"&requeueOnError=" , encodeURIComponent ( this . settings . requeue _on _error ) ,
"&params=" , encodeURIComponent ( paramString ) ,
"&filePostName=" , encodeURIComponent ( this . settings . file _post _name ) ,
"&fileTypes=" , encodeURIComponent ( this . settings . file _types ) ,
"&fileTypesDescription=" , encodeURIComponent ( this . settings . file _types _description ) ,
"&fileSizeLimit=" , encodeURIComponent ( this . settings . file _size _limit ) ,
"&fileUploadLimit=" , encodeURIComponent ( this . settings . file _upload _limit ) ,
"&fileQueueLimit=" , encodeURIComponent ( this . settings . file _queue _limit ) ,
"&debugEnabled=" , encodeURIComponent ( this . settings . debug _enabled ) ] . join ( "" ) ;
} ;
// Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload
// The element is cached after the first lookup
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . getMovieElement = function ( ) {
2008-06-06 09:29:15 +02:00
if ( this . movieElement == undefined ) {
2008-01-25 20:21:11 +01:00
this . movieElement = document . getElementById ( this . movieName ) ;
}
2008-06-06 09:29:15 +02:00
if ( this . movieElement === null ) {
throw "Could not find Flash element" ;
}
2008-01-25 20:21:11 +01:00
return this . movieElement ;
} ;
2008-06-06 09:29:15 +02:00
// Private: buildParamString takes the name/value pairs in the post_params setting object
// and joins them up in to a string formatted "name=value&name=value"
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . buildParamString = function ( ) {
2008-06-06 09:29:15 +02:00
var postParams = this . settings . post _params ;
var paramStringPairs = [ ] ;
if ( typeof ( postParams ) === "object" ) {
for ( var name in postParams ) {
if ( postParams . hasOwnProperty ( name ) ) {
paramStringPairs . push ( encodeURIComponent ( name . toString ( ) ) + "=" + encodeURIComponent ( postParams [ name ] . toString ( ) ) ) ;
2008-01-25 20:21:11 +01:00
}
}
}
2008-06-06 09:29:15 +02:00
return paramStringPairs . join ( "&" ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: Used to remove a SWFUpload instance from the page. This method strives to remove
// all references to the SWF, and other objects so memory is properly freed.
// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state.
SWFUpload . prototype . destroy = function ( ) {
try {
// Make sure Flash is done before we try to remove it
this . stopUpload ( ) ;
// Remove the SWFUpload DOM nodes
var movieElement = null ;
try {
movieElement = this . getMovieElement ( ) ;
} catch ( ex ) {
}
if ( movieElement != undefined && movieElement . parentNode != undefined && typeof ( movieElement . parentNode . removeChild ) === "function" ) {
var container = movieElement . parentNode ;
if ( container != undefined ) {
container . removeChild ( movieElement ) ;
if ( container . parentNode != undefined && typeof ( container . parentNode . removeChild ) === "function" ) {
container . parentNode . removeChild ( container ) ;
}
}
}
// Destroy references
SWFUpload . instances [ this . movieName ] = null ;
delete SWFUpload . instances [ this . movieName ] ;
delete this . movieElement ;
delete this . settings ;
delete this . customSettings ;
delete this . eventQueue ;
delete this . movieName ;
return true ;
} catch ( ex1 ) {
return false ;
2008-01-25 20:21:11 +01:00
}
} ;
2008-06-06 09:29:15 +02:00
// Public: displayDebugInfo prints out settings and configuration
// information about this SWFUpload instance.
// This function (and any references to it) can be deleted when placing
// SWFUpload in production.
SWFUpload . prototype . displayDebugInfo = function ( ) {
this . debug (
[
"---SWFUpload Instance Info---\n" ,
"Version: " , SWFUpload . version , "\n" ,
"Movie Name: " , this . movieName , "\n" ,
"Settings:\n" ,
"\t" , "upload_url: " , this . settings . upload _url , "\n" ,
"\t" , "use_query_string: " , this . settings . use _query _string . toString ( ) , "\n" ,
"\t" , "file_post_name: " , this . settings . file _post _name , "\n" ,
"\t" , "post_params: " , this . settings . post _params . toString ( ) , "\n" ,
"\t" , "file_types: " , this . settings . file _types , "\n" ,
"\t" , "file_types_description: " , this . settings . file _types _description , "\n" ,
"\t" , "file_size_limit: " , this . settings . file _size _limit , "\n" ,
"\t" , "file_upload_limit: " , this . settings . file _upload _limit , "\n" ,
"\t" , "file_queue_limit: " , this . settings . file _queue _limit , "\n" ,
"\t" , "flash_url: " , this . settings . flash _url , "\n" ,
"\t" , "flash_color: " , this . settings . flash _color , "\n" ,
"\t" , "debug: " , this . settings . debug . toString ( ) , "\n" ,
"\t" , "custom_settings: " , this . settings . custom _settings . toString ( ) , "\n" ,
"Event Handlers:\n" ,
"\t" , "swfupload_loaded_handler assigned: " , ( typeof ( this . settings . swfupload _loaded _handler ) === "function" ) . toString ( ) , "\n" ,
"\t" , "file_dialog_start_handler assigned: " , ( typeof ( this . settings . file _dialog _start _handler ) === "function" ) . toString ( ) , "\n" ,
"\t" , "file_queued_handler assigned: " , ( typeof ( this . settings . file _queued _handler ) === "function" ) . toString ( ) , "\n" ,
"\t" , "file_queue_error_handler assigned: " , ( typeof ( this . settings . file _queue _error _handler ) === "function" ) . toString ( ) , "\n" ,
"\t" , "upload_start_handler assigned: " , ( typeof ( this . settings . upload _start _handler ) === "function" ) . toString ( ) , "\n" ,
"\t" , "upload_progress_handler assigned: " , ( typeof ( this . settings . upload _progress _handler ) === "function" ) . toString ( ) , "\n" ,
"\t" , "upload_error_handler assigned: " , ( typeof ( this . settings . upload _error _handler ) === "function" ) . toString ( ) , "\n" ,
"\t" , "upload_success_handler assigned: " , ( typeof ( this . settings . upload _success _handler ) === "function" ) . toString ( ) , "\n" ,
"\t" , "upload_complete_handler assigned: " , ( typeof ( this . settings . upload _complete _handler ) === "function" ) . toString ( ) , "\n" ,
"\t" , "debug_handler assigned: " , ( typeof ( this . settings . debug _handler ) === "function" ) . toString ( ) , "\n"
] . join ( "" )
) ;
} ;
/ * N o t e : a d d S e t t i n g a n d g e t S e t t i n g a r e n o l o n g e r u s e d b y S W F U p l o a d b u t a r e i n c l u d e d
the maintain v2 API compatibility
* /
// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used.
SWFUpload . prototype . addSetting = function ( name , value , default _value ) {
if ( value == undefined ) {
return ( this . settings [ name ] = default _value ) ;
} else {
return ( this . settings [ name ] = value ) ;
2008-01-25 20:21:11 +01:00
}
} ;
2008-06-06 09:29:15 +02:00
// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found.
SWFUpload . prototype . getSetting = function ( name ) {
if ( this . settings [ name ] != undefined ) {
return this . settings [ name ] ;
2008-01-25 20:21:11 +01:00
}
2008-06-06 09:29:15 +02:00
return "" ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Private: callFlash handles function calls made to the Flash element.
// Calls are made with a setTimeout for some functions to work around
// bugs in the ExternalInterface library.
SWFUpload . prototype . callFlash = function ( functionName , argumentArray ) {
argumentArray = argumentArray || [ ] ;
var self = this ;
var callFunction = function ( ) {
var movieElement = self . getMovieElement ( ) ;
var returnValue ;
if ( typeof ( movieElement [ functionName ] ) === "function" ) {
// We have to go through all this if/else stuff because the Flash functions don't have apply() and only accept the exact number of arguments.
if ( argumentArray . length === 0 ) {
returnValue = movieElement [ functionName ] ( ) ;
} else if ( argumentArray . length === 1 ) {
returnValue = movieElement [ functionName ] ( argumentArray [ 0 ] ) ;
} else if ( argumentArray . length === 2 ) {
returnValue = movieElement [ functionName ] ( argumentArray [ 0 ] , argumentArray [ 1 ] ) ;
} else if ( argumentArray . length === 3 ) {
returnValue = movieElement [ functionName ] ( argumentArray [ 0 ] , argumentArray [ 1 ] , argumentArray [ 2 ] ) ;
2008-01-25 20:21:11 +01:00
} else {
2008-06-06 09:29:15 +02:00
throw "Too many arguments" ;
}
// Unescape file post param values
if ( returnValue != undefined && typeof ( returnValue . post ) === "object" ) {
returnValue = self . unescapeFilePostParams ( returnValue ) ;
2008-01-25 20:21:11 +01:00
}
2008-06-06 09:29:15 +02:00
return returnValue ;
} else {
throw "Invalid function name" ;
2008-01-25 20:21:11 +01:00
}
2008-06-06 09:29:15 +02:00
} ;
return callFunction ( ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
2008-01-25 20:21:11 +01:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-- Flash control methods --
Your UI should use these
to operate SWFUpload
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2008-06-06 09:29:15 +02:00
// Public: selectFile causes a File Selection Dialog window to appear. This
// dialog only allows 1 file to be selected.
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . selectFile = function ( ) {
2008-06-06 09:29:15 +02:00
this . callFlash ( "SelectFile" ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: selectFiles causes a File Selection Dialog window to appear/ This
// dialog allows the user to select any number of files
// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names.
// If the selection name length is too long the dialog will fail in an unpredictable manner. There is no work-around
// for this bug.
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . selectFiles = function ( ) {
2008-06-06 09:29:15 +02:00
this . callFlash ( "SelectFiles" ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: startUpload starts uploading the first file in the queue unless
// the optional parameter 'fileID' specifies the ID
SWFUpload . prototype . startUpload = function ( fileID ) {
this . callFlash ( "StartUpload" , [ fileID ] ) ;
2008-01-25 20:21:11 +01:00
} ;
/* Cancels a the file upload. You must specify a file_id */
2008-06-06 09:29:15 +02:00
// Public: cancelUpload cancels any queued file. The fileID parameter
// must be specified.
SWFUpload . prototype . cancelUpload = function ( fileID ) {
this . callFlash ( "CancelUpload" , [ fileID ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue.
// If nothing is currently uploading then nothing happens.
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . stopUpload = function ( ) {
2008-06-06 09:29:15 +02:00
this . callFlash ( "StopUpload" ) ;
2008-01-25 20:21:11 +01:00
} ;
/ * * * * * * * * * * * * * * * * * * * * * * * * *
* Settings methods
2008-06-06 09:29:15 +02:00
* These methods change the SWFUpload settings .
* SWFUpload settings should not be changed directly on the settings object
* since many of the settings need to be passed to Flash in order to take
* effect .
* * * * * * * * * * * * * * * * * * * * * * * * * /
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
// Public: getStats gets the file statistics object.
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . getStats = function ( ) {
2008-06-06 09:29:15 +02:00
return this . callFlash ( "GetStats" ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: setStats changes the SWFUpload statistics. You shouldn't need to
// change the statistics but you can. Changing the statistics does not
// affect SWFUpload accept for the successful_uploads count which is used
// by the upload_limit setting to determine how many files the user may upload.
SWFUpload . prototype . setStats = function ( statsObject ) {
this . callFlash ( "SetStats" , [ statsObject ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: getFile retrieves a File object by ID or Index. If the file is
// not found then 'null' is returned.
SWFUpload . prototype . getFile = function ( fileID ) {
if ( typeof ( fileID ) === "number" ) {
return this . callFlash ( "GetFileByIndex" , [ fileID ] ) ;
2008-01-25 20:21:11 +01:00
} else {
2008-06-06 09:29:15 +02:00
return this . callFlash ( "GetFile" , [ fileID ] ) ;
2008-01-25 20:21:11 +01:00
}
} ;
2008-06-06 09:29:15 +02:00
// Public: addFileParam sets a name/value pair that will be posted with the
// file specified by the Files ID. If the name already exists then the
// exiting value will be overwritten.
SWFUpload . prototype . addFileParam = function ( fileID , name , value ) {
return this . callFlash ( "AddFileParam" , [ fileID , name , value ] ) ;
} ;
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
// Public: removeFileParam removes a previously set (by addFileParam) name/value
// pair from the specified file.
SWFUpload . prototype . removeFileParam = function ( fileID , name ) {
this . callFlash ( "RemoveFileParam" , [ fileID , name ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: setUploadUrl changes the upload_url setting.
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . setUploadURL = function ( url ) {
2008-06-06 09:29:15 +02:00
this . settings . upload _url = url . toString ( ) ;
this . callFlash ( "SetUploadURL" , [ url ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: setPostParams changes the post_params setting
SWFUpload . prototype . setPostParams = function ( paramsObject ) {
this . settings . post _params = paramsObject ;
this . callFlash ( "SetPostParams" , [ paramsObject ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: addPostParam adds post name/value pair. Each name can have only one value.
SWFUpload . prototype . addPostParam = function ( name , value ) {
this . settings . post _params [ name ] = value ;
this . callFlash ( "SetPostParams" , [ this . settings . post _params ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: removePostParam deletes post name/value pair.
SWFUpload . prototype . removePostParam = function ( name ) {
delete this . settings . post _params [ name ] ;
this . callFlash ( "SetPostParams" , [ this . settings . post _params ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: setFileTypes changes the file_types setting and the file_types_description setting
SWFUpload . prototype . setFileTypes = function ( types , description ) {
this . settings . file _types = types ;
this . settings . file _types _description = description ;
this . callFlash ( "SetFileTypes" , [ types , description ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: setFileSizeLimit changes the file_size_limit setting
SWFUpload . prototype . setFileSizeLimit = function ( fileSizeLimit ) {
this . settings . file _size _limit = fileSizeLimit ;
this . callFlash ( "SetFileSizeLimit" , [ fileSizeLimit ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: setFileUploadLimit changes the file_upload_limit setting
SWFUpload . prototype . setFileUploadLimit = function ( fileUploadLimit ) {
this . settings . file _upload _limit = fileUploadLimit ;
this . callFlash ( "SetFileUploadLimit" , [ fileUploadLimit ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: setFileQueueLimit changes the file_queue_limit setting
SWFUpload . prototype . setFileQueueLimit = function ( fileQueueLimit ) {
this . settings . file _queue _limit = fileQueueLimit ;
this . callFlash ( "SetFileQueueLimit" , [ fileQueueLimit ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: setFilePostName changes the file_post_name setting
SWFUpload . prototype . setFilePostName = function ( filePostName ) {
this . settings . file _post _name = filePostName ;
this . callFlash ( "SetFilePostName" , [ filePostName ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: setUseQueryString changes the use_query_string setting
SWFUpload . prototype . setUseQueryString = function ( useQueryString ) {
this . settings . use _query _string = useQueryString ;
this . callFlash ( "SetUseQueryString" , [ useQueryString ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
// Public: setRequeueOnError changes the requeue_on_error setting
SWFUpload . prototype . setRequeueOnError = function ( requeueOnError ) {
this . settings . requeue _on _error = requeueOnError ;
this . callFlash ( "SetRequeueOnError" , [ requeueOnError ] ) ;
} ;
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
// Public: setDebugEnabled changes the debug_enabled setting
SWFUpload . prototype . setDebugEnabled = function ( debugEnabled ) {
this . settings . debug _enabled = debugEnabled ;
this . callFlash ( "SetDebugEnabled" , [ debugEnabled ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Flash Event Interfaces
These functions are used by Flash to trigger the various
events .
All these functions a Private .
Because the ExternalInterface library is buggy the event calls
are added to a queue and the queue then executed by a setTimeout .
This ensures that events are executed in a determinate order and that
the ExternalInterface bugs are avoided .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . queueEvent = function ( handlerName , argumentArray ) {
// Warning: Don't call this.debug inside here or you'll create an infinite loop
if ( argumentArray == undefined ) {
argumentArray = [ ] ;
} else if ( ! ( argumentArray instanceof Array ) ) {
argumentArray = [ argumentArray ] ;
2008-01-25 20:21:11 +01:00
}
var self = this ;
2008-06-06 09:29:15 +02:00
if ( typeof ( this . settings [ handlerName ] ) === "function" ) {
// Queue the event
this . eventQueue . push ( function ( ) {
this . settings [ handlerName ] . apply ( this , argumentArray ) ;
} ) ;
// Execute the next queued event
setTimeout ( function ( ) {
self . executeNextEvent ( ) ;
} , 0 ) ;
} else if ( this . settings [ handlerName ] !== null ) {
throw "Event handler " + handlerName + " is unknown or is not a function" ;
}
} ;
// Private: Causes the next event in the queue to be executed. Since events are queued using a setTimeout
// we must queue them in order to garentee that they are executed in order.
SWFUpload . prototype . executeNextEvent = function ( ) {
// Warning: Don't call this.debug inside here or you'll create an infinite loop
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
var f = this . eventQueue ? this . eventQueue . shift ( ) : null ;
if ( typeof ( f ) === "function" ) {
f . apply ( this ) ;
2008-01-25 20:21:11 +01:00
}
} ;
2008-06-06 09:29:15 +02:00
// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterfance cannot have
// properties that contain characters that are not valid for JavaScript identifiers. To work around this
// the Flash Component escapes the parameter names and we must unescape again before passing them along.
SWFUpload . prototype . unescapeFilePostParams = function ( file ) {
var reg = /[$]([0-9a-f]{4})/i ;
var unescapedPost = { } ;
var uk ;
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
if ( file != undefined ) {
for ( var k in file . post ) {
if ( file . post . hasOwnProperty ( k ) ) {
uk = k ;
var match ;
while ( ( match = reg . exec ( uk ) ) !== null ) {
uk = uk . replace ( match [ 0 ] , String . fromCharCode ( parseInt ( "0x" + match [ 1 ] , 16 ) ) ) ;
}
unescapedPost [ uk ] = file . post [ k ] ;
}
}
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
file . post = unescapedPost ;
2008-01-25 20:21:11 +01:00
}
2008-06-06 09:29:15 +02:00
return file ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . flashReady = function ( ) {
// Check that the movie element is loaded correctly with its ExternalInterface methods defined
var movieElement = this . getMovieElement ( ) ;
if ( typeof ( movieElement . StartUpload ) !== "function" ) {
throw "ExternalInterface methods failed to initialize." ;
2008-01-25 20:21:11 +01:00
}
2008-06-06 09:29:15 +02:00
this . queueEvent ( "swfupload_loaded_handler" ) ;
2008-01-25 20:21:11 +01:00
} ;
/* This is a chance to do something before the browse window opens */
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . fileDialogStart = function ( ) {
this . queueEvent ( "file_dialog_start_handler" ) ;
2008-01-25 20:21:11 +01:00
} ;
/* Called when a file is successfully added to the queue. */
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . fileQueued = function ( file ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "file_queued_handler" , file ) ;
2008-01-25 20:21:11 +01:00
} ;
/* Handle errors that occur when an attempt to queue a file fails. */
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . fileQueueError = function ( file , errorCode , message ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "file_queue_error_handler" , [ file , errorCode , message ] ) ;
2008-01-25 20:21:11 +01:00
} ;
/ * C a l l e d a f t e r t h e f i l e d i a l o g h a s c l o s e d a n d t h e s e l e c t e d f i l e s h a v e b e e n q u e u e d .
You could call startUpload here if you want the queued files to begin uploading immediately . * /
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . fileDialogComplete = function ( numFilesSelected , numFilesQueued ) {
this . queueEvent ( "file_dialog_complete_handler" , [ numFilesSelected , numFilesQueued ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . uploadStart = function ( file ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "return_upload_start_handler" , file ) ;
} ;
SWFUpload . prototype . returnUploadStart = function ( file ) {
var returnValue ;
if ( typeof ( this . settings . upload _start _handler ) === "function" ) {
file = this . unescapeFilePostParams ( file ) ;
returnValue = this . settings . upload _start _handler . call ( this , file ) ;
} else if ( this . settings . upload _start _handler != undefined ) {
throw "upload_start_handler must be a function" ;
}
// Convert undefined to true so if nothing is returned from the upload_start_handler it is
// interpretted as 'true'.
if ( returnValue === undefined ) {
returnValue = true ;
}
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
returnValue = ! ! returnValue ;
2008-01-25 20:21:11 +01:00
2008-06-06 09:29:15 +02:00
this . callFlash ( "ReturnUploadStart" , [ returnValue ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . uploadProgress = function ( file , bytesComplete , bytesTotal ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "upload_progress_handler" , [ file , bytesComplete , bytesTotal ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . uploadError = function ( file , errorCode , message ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "upload_error_handler" , [ file , errorCode , message ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . uploadSuccess = function ( file , serverData ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "upload_success_handler" , [ file , serverData ] ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
SWFUpload . prototype . uploadComplete = function ( file ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "upload_complete_handler" , file ) ;
2008-01-25 20:21:11 +01:00
} ;
2008-06-06 09:29:15 +02:00
/ * C a l l e d b y S W F U p l o a d J a v a S c r i p t a n d F l a s h f u n c t i o n s w h e n d e b u g i s e n a b l e d . B y d e f a u l t i t w r i t e s m e s s a g e s t o t h e
internal debug console . You can override this event and have messages written where you want . * /
SWFUpload . prototype . debug = function ( message ) {
this . queueEvent ( "debug_handler" , message ) ;
} ;
2008-01-25 20:21:11 +01:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Debug Console
The debug console is a self contained , in page location
for debug message to be sent . The Debug Console adds
itself to the body if necessary .
The console is automatically scrolled as messages appear .
2008-06-06 09:29:15 +02:00
If you are using your own debug handler or when you deploy to production and
have debug disabled you can remove these functions to reduce the file size
and complexity .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
// Private: debugMessage is the default debug_handler. If you want to print debug messages
// call the debug() function. When overriding the function your own function should
// check to see if the debug setting is true before outputting debug information.
2008-01-25 20:21:11 +01:00
SWFUpload . prototype . debugMessage = function ( message ) {
2008-06-06 09:29:15 +02:00
if ( this . settings . debug ) {
var exceptionMessage , exceptionValues = [ ] ;
// Check for an exception object and print it nicely
if ( typeof ( message ) === "object" && typeof ( message . name ) === "string" && typeof ( message . message ) === "string" ) {
for ( var key in message ) {
if ( message . hasOwnProperty ( key ) ) {
exceptionValues . push ( key + ": " + message [ key ] ) ;
}
}
exceptionMessage = exceptionValues . join ( "\n" ) || "" ;
exceptionValues = exceptionMessage . split ( "\n" ) ;
exceptionMessage = "EXCEPTION: " + exceptionValues . join ( "\nEXCEPTION: " ) ;
SWFUpload . Console . writeLine ( exceptionMessage ) ;
} else {
SWFUpload . Console . writeLine ( message ) ;
2008-01-25 20:21:11 +01:00
}
}
} ;
SWFUpload . Console = { } ;
SWFUpload . Console . writeLine = function ( message ) {
var console , documentForm ;
try {
console = document . getElementById ( "SWFUpload_Console" ) ;
if ( ! console ) {
documentForm = document . createElement ( "form" ) ;
document . getElementsByTagName ( "body" ) [ 0 ] . appendChild ( documentForm ) ;
console = document . createElement ( "textarea" ) ;
console . id = "SWFUpload_Console" ;
console . style . fontFamily = "monospace" ;
console . setAttribute ( "wrap" , "off" ) ;
console . wrap = "off" ;
console . style . overflow = "auto" ;
console . style . width = "700px" ;
console . style . height = "350px" ;
console . style . margin = "5px" ;
documentForm . appendChild ( console ) ;
}
console . value += message + "\n" ;
console . scrollTop = console . scrollHeight - console . clientHeight ;
} catch ( ex ) {
alert ( "Exception: " + ex . name + " Message: " + ex . message ) ;
}
} ;