2011-07-29 15:21:21 -04:00
/ * *
* SWFUpload : http : //www.swfupload.org, http://swfupload.googlecode.com
*
* mmSWFUpload 1.0 : Flash upload dialog - http : //profandesign.se/swfupload/, http://www.vinterwebb.se/
*
2014-08-12 23:56:17 -04:00
* SWFUpload is ( c ) 2006 - 2007 Lars Huring , Olov Nilz <EFBFBD> n and Mammon Media and is released under the MIT License :
2011-07-29 15:21:21 -04:00
* http : //www.opensource.org/licenses/mit-license.php
*
* SWFUpload 2 is ( c ) 2007 - 2008 Jake Roberts and is released under the MIT License :
* http : //www.opensource.org/licenses/mit-license.php
*
* /
/* ******************* */
/* Constructor & Init */
/* ******************* */
var SWFUpload ;
if ( SWFUpload == undefined ) {
SWFUpload = function ( settings ) {
this . initSWFUpload ( settings ) ;
} ;
}
SWFUpload . prototype . initSWFUpload = function ( settings ) {
try {
this . customSettings = { } ; // A container where developers can place their own settings associated with this instance.
this . settings = settings ;
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.
this . initSettings ( ) ;
this . loadFlash ( ) ;
this . displayDebugInfo ( ) ;
} catch ( ex ) {
delete SWFUpload . instances [ this . movieName ] ;
throw ex ;
}
} ;
/* *************** */
/* Static Members */
/* *************** */
SWFUpload . instances = { } ;
SWFUpload . movieCount = 0 ;
SWFUpload . version = "2.2.0 2009-03-25" ;
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
} ;
SWFUpload . BUTTON _ACTION = {
SELECT _FILE : - 100 ,
SELECT _FILES : - 110 ,
START _UPLOAD : - 120
} ;
SWFUpload . CURSOR = {
ARROW : - 1 ,
HAND : - 2
} ;
SWFUpload . WINDOW _MODE = {
WINDOW : "window" ,
TRANSPARENT : "transparent" ,
OPAQUE : "opaque"
} ;
// Private: takes a URL, determines if it is relative and converts to an absolute URL
// using the current site. Only processes the URL if it can, otherwise returns the URL untouched
SWFUpload . completeURL = function ( url ) {
if ( typeof ( url ) !== "string" || url . match ( /^https?:\/\//i ) || url . match ( /^\// ) ) {
return url ;
}
var currentURL = window . location . protocol + "//" + window . location . hostname + ( window . location . port ? ":" + window . location . port : "" ) ;
var indexSlash = window . location . pathname . lastIndexOf ( "/" ) ;
if ( indexSlash <= 0 ) {
path = "/" ;
} else {
path = window . location . pathname . substr ( 0 , indexSlash ) + "/" ;
}
return /*currentURL +*/ path + url ;
} ;
/* ******************** */
/* Instance Members */
/* ******************** */
// 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 ] ;
} ;
// Upload backend settings
this . ensureDefault ( "upload_url" , "" ) ;
this . ensureDefault ( "preserve_relative_urls" , false ) ;
this . ensureDefault ( "file_post_name" , "Filedata" ) ;
this . ensureDefault ( "post_params" , { } ) ;
this . ensureDefault ( "use_query_string" , false ) ;
this . ensureDefault ( "requeue_on_error" , false ) ;
this . ensureDefault ( "http_success" , [ ] ) ;
this . ensureDefault ( "assume_success_timeout" , 0 ) ;
// File Settings
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 ) ;
// Flash Settings
this . ensureDefault ( "flash_url" , "swfupload.swf" ) ;
this . ensureDefault ( "prevent_swf_caching" , true ) ;
// Button Settings
this . ensureDefault ( "button_image_url" , "" ) ;
this . ensureDefault ( "button_width" , 1 ) ;
this . ensureDefault ( "button_height" , 1 ) ;
this . ensureDefault ( "button_text" , "" ) ;
this . ensureDefault ( "button_text_style" , "color: #000000; font-size: 16pt;" ) ;
this . ensureDefault ( "button_text_top_padding" , 0 ) ;
this . ensureDefault ( "button_text_left_padding" , 0 ) ;
this . ensureDefault ( "button_action" , SWFUpload . BUTTON _ACTION . SELECT _FILES ) ;
this . ensureDefault ( "button_disabled" , false ) ;
this . ensureDefault ( "button_placeholder_id" , "" ) ;
this . ensureDefault ( "button_placeholder" , null ) ;
this . ensureDefault ( "button_cursor" , SWFUpload . CURSOR . ARROW ) ;
this . ensureDefault ( "button_window_mode" , SWFUpload . WINDOW _MODE . WINDOW ) ;
// Debug Settings
this . ensureDefault ( "debug" , false ) ;
this . settings . debug _enabled = this . settings . debug ; // Here to maintain v2 API
// Event Handlers
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 ) ;
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 ) ;
this . ensureDefault ( "debug_handler" , this . debugMessage ) ;
this . ensureDefault ( "custom_settings" , { } ) ;
// Other settings
this . customSettings = this . settings . custom _settings ;
// Update the flash url if needed
if ( ! ! this . settings . prevent _swf _caching ) {
this . settings . flash _url = this . settings . flash _url + ( this . settings . flash _url . indexOf ( "?" ) < 0 ? "?" : "&" ) + "preventswfcaching=" + new Date ( ) . getTime ( ) ;
}
if ( ! this . settings . preserve _relative _urls ) {
//this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url); // Don't need to do this one since flash doesn't look at it
this . settings . upload _url = SWFUpload . completeURL ( this . settings . upload _url ) ;
this . settings . button _image _url = SWFUpload . completeURL ( this . settings . button _image _url ) ;
}
delete this . ensureDefault ;
} ;
// Private: loadFlash replaces the button_placeholder element with the flash movie.
SWFUpload . prototype . loadFlash = function ( ) {
var targetElement , tempParent ;
// Make sure an element with the ID we are going to use doesn't already exist
if ( document . getElementById ( this . movieName ) !== null ) {
throw "ID " + this . movieName + " is already in use. The Flash Object could not be added" ;
}
// Get the element where we will be placing the flash movie
targetElement = document . getElementById ( this . settings . button _placeholder _id ) || this . settings . button _placeholder ;
if ( targetElement == undefined ) {
throw "Could not find the placeholder element: " + this . settings . button _placeholder _id ;
}
// Append the container and load the flash
tempParent = document . createElement ( "div" ) ;
tempParent . innerHTML = this . getFlashHTML ( ) ; // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
targetElement . parentNode . replaceChild ( tempParent . firstChild , targetElement ) ;
// Fix IE Flash/Form bug
if ( window [ this . movieName ] == undefined ) {
window [ this . movieName ] = this . getMovieElement ( ) ;
}
} ;
// Private: getFlashHTML generates the object tag needed to embed the flash in to the document
SWFUpload . prototype . getFlashHTML = function ( ) {
// 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="' , this . settings . button _width , '" height="' , this . settings . button _height , '" class="swfupload">' ,
'<param name="wmode" value="' , this . settings . button _window _mode , '" />' ,
'<param name="movie" value="' , this . settings . flash _url , '" />' ,
'<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.
SWFUpload . prototype . getFlashVars = function ( ) {
// Build a string from the post param object
var paramString = this . buildParamString ( ) ;
var httpSuccessString = this . settings . http _success . join ( "," ) ;
// Build the parameter string
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 ) ,
"&httpSuccess=" , encodeURIComponent ( httpSuccessString ) ,
"&assumeSuccessTimeout=" , encodeURIComponent ( this . settings . assume _success _timeout ) ,
"&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 ) ,
"&buttonImageURL=" , encodeURIComponent ( this . settings . button _image _url ) ,
"&buttonWidth=" , encodeURIComponent ( this . settings . button _width ) ,
"&buttonHeight=" , encodeURIComponent ( this . settings . button _height ) ,
"&buttonText=" , encodeURIComponent ( this . settings . button _text ) ,
"&buttonTextTopPadding=" , encodeURIComponent ( this . settings . button _text _top _padding ) ,
"&buttonTextLeftPadding=" , encodeURIComponent ( this . settings . button _text _left _padding ) ,
"&buttonTextStyle=" , encodeURIComponent ( this . settings . button _text _style ) ,
"&buttonAction=" , encodeURIComponent ( this . settings . button _action ) ,
"&buttonDisabled=" , encodeURIComponent ( this . settings . button _disabled ) ,
"&buttonCursor=" , encodeURIComponent ( this . settings . button _cursor )
] . join ( "" ) ;
} ;
// Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload
// The element is cached after the first lookup
SWFUpload . prototype . getMovieElement = function ( ) {
if ( this . movieElement == undefined ) {
this . movieElement = document . getElementById ( this . movieName ) ;
}
if ( this . movieElement === null ) {
throw "Could not find Flash element" ;
}
return this . movieElement ;
} ;
// 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"
SWFUpload . prototype . buildParamString = function ( ) {
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 ( ) ) ) ;
}
}
}
return paramStringPairs . join ( "&" ) ;
} ;
// 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.
// Credits: Major improvements provided by steffen
SWFUpload . prototype . destroy = function ( ) {
try {
// Make sure Flash is done before we try to remove it
this . cancelUpload ( null , false ) ;
// Remove the SWFUpload DOM nodes
var movieElement = null ;
movieElement = this . getMovieElement ( ) ;
if ( movieElement && typeof ( movieElement . CallFunction ) === "unknown" ) { // We only want to do this in IE
// Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround)
for ( var i in movieElement ) {
try {
if ( typeof ( movieElement [ i ] ) === "function" ) {
movieElement [ i ] = null ;
}
} catch ( ex1 ) { }
}
// Remove the Movie Element from the page
try {
movieElement . parentNode . removeChild ( movieElement ) ;
} catch ( ex ) { }
}
// Remove IE form fix reference
window [ this . movieName ] = null ;
// Destroy other references
SWFUpload . instances [ this . movieName ] = null ;
delete SWFUpload . instances [ this . movieName ] ;
this . movieElement = null ;
this . settings = null ;
this . customSettings = null ;
this . eventQueue = null ;
this . movieName = null ;
return true ;
} catch ( ex2 ) {
return false ;
}
} ;
// 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" , "flash_url: " , this . settings . flash _url , "\n" ,
"\t" , "use_query_string: " , this . settings . use _query _string . toString ( ) , "\n" ,
"\t" , "requeue_on_error: " , this . settings . requeue _on _error . toString ( ) , "\n" ,
"\t" , "http_success: " , this . settings . http _success . join ( ", " ) , "\n" ,
"\t" , "assume_success_timeout: " , this . settings . assume _success _timeout , "\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" , "debug: " , this . settings . debug . toString ( ) , "\n" ,
"\t" , "prevent_swf_caching: " , this . settings . prevent _swf _caching . toString ( ) , "\n" ,
"\t" , "button_placeholder_id: " , this . settings . button _placeholder _id . toString ( ) , "\n" ,
"\t" , "button_placeholder: " , ( this . settings . button _placeholder ? "Set" : "Not Set" ) , "\n" ,
"\t" , "button_image_url: " , this . settings . button _image _url . toString ( ) , "\n" ,
"\t" , "button_width: " , this . settings . button _width . toString ( ) , "\n" ,
"\t" , "button_height: " , this . settings . button _height . toString ( ) , "\n" ,
"\t" , "button_text: " , this . settings . button _text . toString ( ) , "\n" ,
"\t" , "button_text_style: " , this . settings . button _text _style . toString ( ) , "\n" ,
"\t" , "button_text_top_padding: " , this . settings . button _text _top _padding . toString ( ) , "\n" ,
"\t" , "button_text_left_padding: " , this . settings . button _text _left _padding . toString ( ) , "\n" ,
"\t" , "button_action: " , this . settings . button _action . toString ( ) , "\n" ,
"\t" , "button_disabled: " , this . settings . button _disabled . 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 ) ;
}
} ;
// 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 ] ;
}
return "" ;
} ;
// 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 movieElement = this . getMovieElement ( ) ;
var returnValue , returnString ;
// Flash's method if calling ExternalInterface methods (code adapted from MooTools).
try {
returnString = movieElement . CallFunction ( '<invoke name="' + functionName + '" returntype="javascript">' + _ _flash _ _argumentsToXML ( argumentArray , 0 ) + '</invoke>' ) ;
returnValue = eval ( returnString ) ;
} catch ( ex ) {
throw "Call to " + functionName + " failed" ;
}
// Unescape file post param values
if ( returnValue != undefined && typeof returnValue . post === "object" ) {
returnValue = this . unescapeFilePostParams ( returnValue ) ;
}
return returnValue ;
} ;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-- Flash control methods --
Your UI should use these
to operate SWFUpload
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
// WARNING: this function does not work in Flash Player 10
// Public: selectFile causes a File Selection Dialog window to appear. This
// dialog only allows 1 file to be selected.
SWFUpload . prototype . selectFile = function ( ) {
this . callFlash ( "SelectFile" ) ;
} ;
// WARNING: this function does not work in Flash Player 10
// 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.
SWFUpload . prototype . selectFiles = function ( ) {
this . callFlash ( "SelectFiles" ) ;
} ;
// 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 ] ) ;
} ;
// Public: cancelUpload cancels any queued file. The fileID parameter may be the file ID or index.
// If you do not specify a fileID the current uploading file or first file in the queue is cancelled.
// If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter.
SWFUpload . prototype . cancelUpload = function ( fileID , triggerErrorEvent ) {
if ( triggerErrorEvent !== false ) {
triggerErrorEvent = true ;
}
this . callFlash ( "CancelUpload" , [ fileID , triggerErrorEvent ] ) ;
} ;
// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue.
// If nothing is currently uploading then nothing happens.
SWFUpload . prototype . stopUpload = function ( ) {
this . callFlash ( "StopUpload" ) ;
} ;
/ * * * * * * * * * * * * * * * * * * * * * * * * *
* Settings methods
* 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 .
* * * * * * * * * * * * * * * * * * * * * * * * * /
// Public: getStats gets the file statistics object.
SWFUpload . prototype . getStats = function ( ) {
return this . callFlash ( "GetStats" ) ;
} ;
// 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 ] ) ;
} ;
// 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 ] ) ;
} else {
return this . callFlash ( "GetFile" , [ fileID ] ) ;
}
} ;
// 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 ] ) ;
} ;
// 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 ] ) ;
} ;
// Public: setUploadUrl changes the upload_url setting.
SWFUpload . prototype . setUploadURL = function ( url ) {
this . settings . upload _url = url . toString ( ) ;
this . callFlash ( "SetUploadURL" , [ url ] ) ;
} ;
// Public: setPostParams changes the post_params setting
SWFUpload . prototype . setPostParams = function ( paramsObject ) {
this . settings . post _params = paramsObject ;
this . callFlash ( "SetPostParams" , [ paramsObject ] ) ;
} ;
// 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 ] ) ;
} ;
// 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 ] ) ;
} ;
// 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 ] ) ;
} ;
// Public: setFileSizeLimit changes the file_size_limit setting
SWFUpload . prototype . setFileSizeLimit = function ( fileSizeLimit ) {
this . settings . file _size _limit = fileSizeLimit ;
this . callFlash ( "SetFileSizeLimit" , [ fileSizeLimit ] ) ;
} ;
// Public: setFileUploadLimit changes the file_upload_limit setting
SWFUpload . prototype . setFileUploadLimit = function ( fileUploadLimit ) {
this . settings . file _upload _limit = fileUploadLimit ;
this . callFlash ( "SetFileUploadLimit" , [ fileUploadLimit ] ) ;
} ;
// Public: setFileQueueLimit changes the file_queue_limit setting
SWFUpload . prototype . setFileQueueLimit = function ( fileQueueLimit ) {
this . settings . file _queue _limit = fileQueueLimit ;
this . callFlash ( "SetFileQueueLimit" , [ fileQueueLimit ] ) ;
} ;
// Public: setFilePostName changes the file_post_name setting
SWFUpload . prototype . setFilePostName = function ( filePostName ) {
this . settings . file _post _name = filePostName ;
this . callFlash ( "SetFilePostName" , [ filePostName ] ) ;
} ;
// Public: setUseQueryString changes the use_query_string setting
SWFUpload . prototype . setUseQueryString = function ( useQueryString ) {
this . settings . use _query _string = useQueryString ;
this . callFlash ( "SetUseQueryString" , [ useQueryString ] ) ;
} ;
// Public: setRequeueOnError changes the requeue_on_error setting
SWFUpload . prototype . setRequeueOnError = function ( requeueOnError ) {
this . settings . requeue _on _error = requeueOnError ;
this . callFlash ( "SetRequeueOnError" , [ requeueOnError ] ) ;
} ;
// Public: setHTTPSuccess changes the http_success setting
SWFUpload . prototype . setHTTPSuccess = function ( http _status _codes ) {
if ( typeof http _status _codes === "string" ) {
http _status _codes = http _status _codes . replace ( " " , "" ) . split ( "," ) ;
}
this . settings . http _success = http _status _codes ;
this . callFlash ( "SetHTTPSuccess" , [ http _status _codes ] ) ;
} ;
// Public: setHTTPSuccess changes the http_success setting
SWFUpload . prototype . setAssumeSuccessTimeout = function ( timeout _seconds ) {
this . settings . assume _success _timeout = timeout _seconds ;
this . callFlash ( "SetAssumeSuccessTimeout" , [ timeout _seconds ] ) ;
} ;
// Public: setDebugEnabled changes the debug_enabled setting
SWFUpload . prototype . setDebugEnabled = function ( debugEnabled ) {
this . settings . debug _enabled = debugEnabled ;
this . callFlash ( "SetDebugEnabled" , [ debugEnabled ] ) ;
} ;
// Public: setButtonImageURL loads a button image sprite
SWFUpload . prototype . setButtonImageURL = function ( buttonImageURL ) {
if ( buttonImageURL == undefined ) {
buttonImageURL = "" ;
}
this . settings . button _image _url = buttonImageURL ;
this . callFlash ( "SetButtonImageURL" , [ buttonImageURL ] ) ;
} ;
// Public: setButtonDimensions resizes the Flash Movie and button
SWFUpload . prototype . setButtonDimensions = function ( width , height ) {
this . settings . button _width = width ;
this . settings . button _height = height ;
var movie = this . getMovieElement ( ) ;
if ( movie != undefined ) {
movie . style . width = width + "px" ;
movie . style . height = height + "px" ;
}
this . callFlash ( "SetButtonDimensions" , [ width , height ] ) ;
} ;
// Public: setButtonText Changes the text overlaid on the button
SWFUpload . prototype . setButtonText = function ( html ) {
this . settings . button _text = html ;
this . callFlash ( "SetButtonText" , [ html ] ) ;
} ;
// Public: setButtonTextPadding changes the top and left padding of the text overlay
SWFUpload . prototype . setButtonTextPadding = function ( left , top ) {
this . settings . button _text _top _padding = top ;
this . settings . button _text _left _padding = left ;
this . callFlash ( "SetButtonTextPadding" , [ left , top ] ) ;
} ;
// Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button
SWFUpload . prototype . setButtonTextStyle = function ( css ) {
this . settings . button _text _style = css ;
this . callFlash ( "SetButtonTextStyle" , [ css ] ) ;
} ;
// Public: setButtonDisabled disables/enables the button
SWFUpload . prototype . setButtonDisabled = function ( isDisabled ) {
this . settings . button _disabled = isDisabled ;
this . callFlash ( "SetButtonDisabled" , [ isDisabled ] ) ;
} ;
// Public: setButtonAction sets the action that occurs when the button is clicked
SWFUpload . prototype . setButtonAction = function ( buttonAction ) {
this . settings . button _action = buttonAction ;
this . callFlash ( "SetButtonAction" , [ buttonAction ] ) ;
} ;
// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button
SWFUpload . prototype . setButtonCursor = function ( cursor ) {
this . settings . button _cursor = cursor ;
this . callFlash ( "SetButtonCursor" , [ cursor ] ) ;
} ;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
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 .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
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 ] ;
}
var self = this ;
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
var f = this . eventQueue ? this . eventQueue . shift ( ) : null ;
if ( typeof ( f ) === "function" ) {
f . apply ( this ) ;
}
} ;
// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface 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 ;
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 ] ;
}
}
file . post = unescapedPost ;
}
return file ;
} ;
// Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working)
SWFUpload . prototype . testExternalInterface = function ( ) {
try {
return this . callFlash ( "TestExternalInterface" ) ;
} catch ( ex ) {
return false ;
}
} ;
// Private: This event is called by Flash when it has finished loading. Don't modify this.
// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded.
SWFUpload . prototype . flashReady = function ( ) {
// Check that the movie element is loaded correctly with its ExternalInterface methods defined
var movieElement = this . getMovieElement ( ) ;
if ( ! movieElement ) {
this . debug ( "Flash called back ready but the flash movie can't be found." ) ;
return ;
}
this . cleanUp ( movieElement ) ;
this . queueEvent ( "swfupload_loaded_handler" ) ;
} ;
// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE.
// This function is called by Flash each time the ExternalInterface functions are created.
SWFUpload . prototype . cleanUp = function ( movieElement ) {
// Pro-actively unhook all the Flash functions
try {
if ( this . movieElement && typeof ( movieElement . CallFunction ) === "unknown" ) { // We only want to do this in IE
this . debug ( "Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)" ) ;
for ( var key in movieElement ) {
try {
if ( typeof ( movieElement [ key ] ) === "function" ) {
movieElement [ key ] = null ;
}
} catch ( ex ) {
}
}
}
} catch ( ex1 ) {
}
// Fix Flashes own cleanup code so if the SWFMovie was removed from the page
// it doesn't display errors.
window [ "__flash__removeCallback" ] = function ( instance , name ) {
try {
if ( instance ) {
instance [ name ] = null ;
}
} catch ( flashEx ) {
}
} ;
} ;
/* This is a chance to do something before the browse window opens */
SWFUpload . prototype . fileDialogStart = function ( ) {
this . queueEvent ( "file_dialog_start_handler" ) ;
} ;
/* Called when a file is successfully added to the queue. */
SWFUpload . prototype . fileQueued = function ( file ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "file_queued_handler" , file ) ;
} ;
/* Handle errors that occur when an attempt to queue a file fails. */
SWFUpload . prototype . fileQueueError = function ( file , errorCode , message ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "file_queue_error_handler" , [ file , errorCode , message ] ) ;
} ;
/ * 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 . * /
SWFUpload . prototype . fileDialogComplete = function ( numFilesSelected , numFilesQueued , numFilesInQueue ) {
this . queueEvent ( "file_dialog_complete_handler" , [ numFilesSelected , numFilesQueued , numFilesInQueue ] ) ;
} ;
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 ;
}
returnValue = ! ! returnValue ;
this . callFlash ( "ReturnUploadStart" , [ returnValue ] ) ;
} ;
SWFUpload . prototype . uploadProgress = function ( file , bytesComplete , bytesTotal ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "upload_progress_handler" , [ file , bytesComplete , bytesTotal ] ) ;
} ;
SWFUpload . prototype . uploadError = function ( file , errorCode , message ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "upload_error_handler" , [ file , errorCode , message ] ) ;
} ;
SWFUpload . prototype . uploadSuccess = function ( file , serverData , responseReceived ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "upload_success_handler" , [ file , serverData , responseReceived ] ) ;
} ;
SWFUpload . prototype . uploadComplete = function ( file ) {
file = this . unescapeFilePostParams ( file ) ;
this . queueEvent ( "upload_complete_handler" , file ) ;
} ;
/ * 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 ) ;
} ;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
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 .
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.
SWFUpload . prototype . debugMessage = function ( message ) {
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 ) ;
}
}
} ;
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 ) ;
}
} ;