diff --git a/code/AssetAdmin.php b/code/AssetAdmin.php
index ab542726..ae90f166 100755
--- a/code/AssetAdmin.php
+++ b/code/AssetAdmin.php
@@ -74,7 +74,7 @@ class AssetAdmin extends LeftAndMain {
Requirements::javascript(CMS_DIR . "/javascript/AssetAdmin.js");
Requirements::javascript(CMS_DIR . "/javascript/CMSMain_upload.js");
Requirements::javascript(CMS_DIR . "/javascript/Upload.js");
- Requirements::javascript(CMS_DIR . "/thirdparty/swfupload/swfupload.js");
+ Requirements::javascript(SAPPHIRE_DIR . "/thirdparty/swfupload/swfupload/swfupload.js");
Requirements::css(CMS_DIR . "/css/AssetAdmin.css");
diff --git a/code/LeftAndMain.php b/code/LeftAndMain.php
index dff15e41..c0b97798 100644
--- a/code/LeftAndMain.php
+++ b/code/LeftAndMain.php
@@ -276,7 +276,7 @@ class LeftAndMain extends Controller {
'cms/javascript/LeftAndMain.js',
'sapphire/javascript/tree/tree.js',
'cms/javascript/TinyMCEImageEnhancement.js',
- 'cms/thirdparty/swfupload/swfupload.js',
+ 'sapphire/thirdparty/swfupload/swfupload/swfupload.js',
'cms/javascript/Upload.js',
'cms/javascript/TinyMCEImageEnhancement.js',
'sapphire/javascript/TreeSelectorField.js',
diff --git a/javascript/Upload.js b/javascript/Upload.js
index aa1f6c14..1dad0571 100644
--- a/javascript/Upload.js
+++ b/javascript/Upload.js
@@ -74,7 +74,7 @@ Upload.prototype = {
button_window_mode : "transparent",
button_width : this.buttonWidth,
button_height : this.buttonHeight,
- flash_url : 'sapphire/thirdparty/swfupload/swfupload.swf', // Relative to this file
+ flash_url : 'sapphire/thirdparty/swfupload/swfupload/swfupload.swf', // Relative to this file
swfupload_loaded_handler: this.buildUI.bind(this),
debug: false,
preserve_relative_urls: true
diff --git a/thirdparty/swfupload/.piston.yml b/thirdparty/swfupload/.piston.yml
deleted file mode 100644
index 59ea6e46..00000000
--- a/thirdparty/swfupload/.piston.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-format: 1
-handler:
- piston:remote-revision: 854
- piston:uuid: 46bd1c57-1c41-0410-9cc9-652e43039c97
-lock: false
-repository_url: http://swfupload.googlecode.com/svn/swfupload/tags/swfupload_v2.0.1/FlashDevelop
-repository_class: Piston::Svn::Repository
diff --git a/thirdparty/swfupload/Changelog.txt b/thirdparty/swfupload/Changelog.txt
deleted file mode 100644
index 4c0e754e..00000000
--- a/thirdparty/swfupload/Changelog.txt
+++ /dev/null
@@ -1,193 +0,0 @@
- * SWFUpload v2.0 by Jacob Roberts, Nov 2007, www.swfupload.org, linebyline.blogspot.com
-
- * --------- Version 2.0.1 -----------
- * = Fixed a bug where zero-byte files would stop file the queuing process.
- * = Finished updating Features Demo
- * + Added GetFileByIndex(i) that gets a JavaScript File Object. The index never changes. Finished files continue to be available.
- * The JavaScript GetFile function will accept a file_id or an index.
- * + Added CheckFileSize constants to replace the magic numbers
- * + Added some code in an attempt to fix "Script is running slowly" error messages
- * = Better cleanup of FileReference objects
-
- * --------- Version 2.0 -----------
- * + Re-created SWFUpload in Actionscript v2 for Flash 8 compatibility. Flash 8 loses POST and Server Data features. The two versions are otherwise fully compatible.
- * Flash 8 uses URL to pass post_params/file_params.
- * = Changed uploadStart event so it's part of the setTimeout/eventQueue workaround. This allows Flash functions to be called from uploadStart.
- * = Renamed uploadComplete to uploadSuccess and fileComplete to uploadComplete. All started uploads call uploadComplete (even if cancelled or stopped).
- * = Changed startUpload validation failure behavior. Rather than cancelling the upload the file is now requeued. Devs can cancel
- * or do whatever the need to in uploadError to handle the problem.
- * = Fixed fileQueueLimit/fileUploadLimit logic so it works correctly.
- * = Moved the upload request building to a later point so that the post params and file params can be updated in uploadStart.
- * - Removed the last of the UI stuff (ui_container, degraded_container).
- * + Started development on Plug-ins. Graceful Degradation, v1.0.2, Cookies, Queue Handling
- * = Fixed missing file_status field in FileItem.
- * + Added modificationDate to FileItem (file object)
- * + Added setStats function that lets you change the file upload count, etc. This will give more power over the queue limits. Not well tested.
- * = Renamed compeleted_uploads to successful_uploads in getStats object
- * + Added in_progress to getStats object
-
- * --------- Revision 7.0 beta 3 -----------
- * + Added an "event queue". Events are added to an array and executeEvent is called on a setTimeout. This prevents out of order issues that occur
- * in the Safari browser.
- * + Added a check for the UPLOAD_COMPLETE_DATA event constant which only became available in Flash Player 9.0.28. This
- * fixes the Flash Version detection (Flash Object Detection) which was accepting Flash Player 9 versions before 9.0.28.
- * - Removed old code block that was missed when moving from a Flash Timer to the JavaScript timeout (caused certain cancel events to be called twice)
- * = Change ShowUI to the swfUploadLoaded event which will hopefully make it more clear that this is an overrideable event
- * = Changed flashReady to behave like the other events (uses setTimeout and the Event Queue).
-
- * --------- Revision 7.0 beta 2 -----------
- * = Changed ERROR_CODE_FILE_NOT_FOUND to ERROR_CODE_FILE_ID_NOT_FOUND
- * + Grouped the error code constants in objects for queue errors and upload errors.
- * + Added an UPLOAD_STOPPED error code.
- * = Changed Event calling method (using Timer) in Flash. Timer is no longer called
- * instead setTimeout is called in JavaScript. This includes a change to the
- * JavaSCript design so the Event methods are not directly overridden but stored
- * internally and called if defined (with a setTimeout). This is an effort
- * be more compatible with the current Flash Player on Linux
- * = Changed the parameter order for the fileQueueError and uploadError events so the fileObj is first, like other events.
- * + Added an empty JavaScript object (customSettings) where users can store settings associated with the instance.
- * + Worked around an escaping bug in the ExternalInterface library by escaping all backslashes in out-going strings.
- * = Updated all the demos.
-
- * --------- Revision 7.0 beta 1 -----------
- * = Redesigned the Event Chain
- * - Removed much of the queue concepts
- * - Removed the fileValidation events. This can be done in the new uploadStart event
- * - Removed beginUploadOnQueue feature. This can be done in the new dialogComplete event.
- * - Removed use_server_data. This is now always on.
- * + Added functions for retrieving queue stats (number of files uploaded, queued, errors, etc)
- * + Added a file status property to the FileObject. This indicates, uploaded, error, waiting.
- * + Added a single file browser (user cannot select multiple files)
- * + Fixed bug (hopefully) caused if Flash call to JavaScript and in the callback JavaSCript calls to Flash
- * This only place this does not apply is to uploadStart. If you call in to Flash from uploadStart use a setTimeout to do it.
-
- * --------- Revision 6.2 -----------
- * + Added API calls for changing all the changeable settings dynamically
- * = Fixed a bug in FileComplete event handler (in the SWF) that caused an error in Debug Players
- * and prevent the event from being called
- * + Added a setting (use_server_data_event) to indicate whether FileComplete or ServerData should be called.
- * The SWFUpload architecture requires that only one file upload success event can be called.
- * = Updated all the Demos, especially the Features Demo and the Forms Demo
-
-
- * --------- Revision 6 -----------
- * - Removed the call to setUploadSettings in flashReady. This was a left over call that is unnecessary.
- * + Finished the parsing of post params during the init stage. This ommision was hidden by the call to setUploadSettings.
- * - Removed the flash_target_id setting. The Flash file should only ever be added to the body tag.
- * + Fixed (hopefully for good) another SWF race condition. IE executes the SWF very very early. The this.movieElement value should never be referenced.
- * The movie Element should always be retrieved using this.getMovieElement().
-
- * --------- Revision 6 -----------
- * + Ported to ActionScript 3. Revision 6 requires Flash Player 9.
- * = Fixed bug caused when cancelling single files. Would break any function that searched for a file_id.
- * - Removed the automatic cookie sending setting. Devs should just pass the value they want to send in the post_params
- * - Removed the query params settings (global and file specific). All params should be sent in the post_params
- * + Added post_params which adds post values to the file upload post.
- * + Added validate_files setting flag which causes the fileValidation event to be called before each file is uploaded.
- * + Added fileValidation event. Return false if validation fails and true if validation is successful.
- * + Added server_data parameter to the fileComplete event which returns any text that the upload script returns.
- * = Updated all demos to work with Revision 6
- * + Added in-code file extension validation. Before a file is queued the extension is checked against the valid extensions.
- * Files the have invalid extensions cause the error event to be raised.
- * + Added 'file_post_name' setting that allows the post variable name containing the file data to be named something other than 'Filedata'
- * = Fixed a race condition in loadFlash where a cached flash movie would execute before this.movieElement could be assigned and loading would fail.
-
- * --------- Revision 5.2 -----------
- * = A little more code cleaning and variable renaming
- * + Changed from an array queue to a FIFO queue. This eliminates the "current_index" and
- * should reduce some memory usage.
- * + Added out of order file uploading. Call StartUpload(/file_id/).
- * + Added custom query_string parameters in addition to the cookies
- * + Added the ability to modify the URL, cookies, params and send to flash
- * + Added per file query_string params
- * + Added files queued limit. Sometimes you may want the user to only queue one file at a time (or something)
- * + Fixed limits so a zero(0) value means unlimited.
-
- * --------- Revision 5 -------------
- * = More code cleaning. Ported SWF to FlashDevelop. (Since my Flash Studio trial expired)
- * The port to FlashDevelop is a big deal. It significantly changes the code structure
- * and could introduce bugs. Also there have been reported issues with the FlashDevelop
- * version from swfupload.mammon.se: Doesn't start when reloading in IE. Doesn't start
- * in Firefox if the SWF file is visible because of a page scroll.
- * + I fixed the Firefox issue by removing the wmode attribute from the embed object.
- * + I cannot reproduce the IE issue on my local machine (although I can reproduce it at swfupload.mammon.se)
- * + Event Handlers are now attached to the SWFUpload javascript object. The SWF file
- * now calls the handlers in the context of the SWFUpload object which means the "this"
- * object inside the handler refers to the proper SWFUpload instance.
- * + Tested and Fixed upload target cookie attachment
- * = Cleaned up / renamed everything for clarity and consistancy
- * + File queuing is now subject to the upload limit. If the user attempts to queue more files
- * than allowed an error is returned and the files are not queued.
- * + Fixed misc bugs and text encodings.
- * + Added more debug info for the SWF file.
- * + SWF file now obeys the debug setting.
- * + Added SetUploadTargetURL function that allows you to "dynamically" change the upload target
- * + Added error code for zero byte file uploads which always return an IO error. The files are now rejected
- * instead of being uploaded.
-
- * --------- Revision 4 -------------
- * = Cleaned up code. Added comments. Reorganized. Added more try..catches. Removed old unused methods.
- * - Removed the 'create_ui' setting. The UI is now completely up to the developer.
- * + Added upload_backend_cookies setting. Can set a string, or array of cookie names. These values will be
- * passed as part of the upload_backend url
- *
- * = Changed QueueComplete event to only fire if at least one file has been successfully uploaded.
- * + Added "Stop Upload" feature.
- * = Revised the FLA file to clean things up, better handle errors, etc.
- * = Fixed a bug where cancelling the first upload would cause the remaining uploads to fire before calling
- * "startUpload". This change is in the FLA.
- *
- * + Fixed a bug in the upload.swf that prevented further file processing after an error is returned.
- * + Added uploadLimit variable. Only complete uploads are counted. Once the limit is reached the flash
- * movie will not upload any more files. (The ability to select or queue many files is not affected
- * by the upload limit)
- * + Added cancelQueue and cancelUpload methods.
- * + Added ID property to the FileObj in the upload.swf
- * + Added Upload and Queue settings
- * + Added methods for generating the flash HTML and inserting it into the DOM.
- * - Removed SWFObject
- * + Updated the upload.swf and added the "flashReady" event. This will only call back
- * for Flash 8 and above. With this we don't need a flash version detect script.
- * The script initializes the Flash then waits for the Callback to init the UI.
- * + Added seperate ui_target, degraded_target, create_ui settings. This allows fine control
- * over what parts of the GUI the script displays and hides
- *
- * + Changed from a Static Class to an Instance (changed code/class structure)
- * + Added "flash_version" setting. When set to zero the version check is skipped
- * + Added Debug Console. The Instance class can't do document.write.
- * = De-obfuscated SWFObject a bit
- * - Removed standalone mode.
- * + Added "ui_target" setting. When non-blank the link is added.
- * + Added "flash_target" setting. When blank the flash is appended to the
tag
- * = This fixes ASP.Net not allowing the flash to be added to the Form
- * + Added error checking to the callSWF method
- *
-
-
- * -------- -------- -------- -------- -------- -------- -------- --------
- * SWFUpload 0.7: Flash upload dialog - http://profandesign.se/swfupload/
- * SWFUpload is (c) 2006 Lars Huring and Mammon Media and is released under the MIT License:
- * http://www.opensource.org/licenses/mit-license.php
- * -------- -------- -------- -------- -------- -------- -------- --------
-
- * SWFUpload 0.7: Flash upload dialog - http://profandesign.se/swfupload/
- *
- * VERSION HISTORY
- * 0.5 - First release
- *
- * 0.6 - 2006-11-24
- * - Got rid of flash overlay
- * - SWF size reduced to 840b
- * - CSS-only styling of button
- * - Add upload to links etc.
- *
- * 0.7 - 2006-11-27
- * - Added filesize param and check in SWF
- *
- * 0.7.1 - 2006-12-01
- * - Added link_mode param for standalone links
- * if set to "standalone", createElement("a") won't run.
- * - Added link_text param if css isn't needed.
- * - Renamed cssClass to css_class for consistency
- *
- */
diff --git a/thirdparty/swfupload/Flash8/Delegate.as b/thirdparty/swfupload/Flash8/Delegate.as
deleted file mode 100644
index ba4526c7..00000000
--- a/thirdparty/swfupload/Flash8/Delegate.as
+++ /dev/null
@@ -1,8 +0,0 @@
-class Delegate
-{
- static function create(obj:Object, func:Function):Function
- {
- return function() { return func.apply(obj, arguments); };
- }
-
-}
\ No newline at end of file
diff --git a/thirdparty/swfupload/Flash8/ExternalCall.as b/thirdparty/swfupload/Flash8/ExternalCall.as
deleted file mode 100644
index 395381ec..00000000
--- a/thirdparty/swfupload/Flash8/ExternalCall.as
+++ /dev/null
@@ -1,115 +0,0 @@
-import flash.external.ExternalInterface;
-
-class ExternalCall
-{
-
- /*public function ExternalCall()
- {
-
- }
- */
-
- public static function Simple(callback:String):Void {
- ExternalInterface.call(callback);
- }
- public static function FileQueued(callback:String, file_object:Object):Void {
- ExternalInterface.call(callback, EscapeMessage(file_object));
- }
- public static function FileQueueError(callback:String, error_code:Number, file_object:Object, message:String):Void {
-
- ExternalInterface.call(callback, EscapeMessage(file_object), EscapeMessage(error_code), EscapeMessage(message));
-
- }
- public static function FileDialogComplete(callback:String, num_files_selected:Number):Void {
-
- ExternalInterface.call(callback, EscapeMessage(num_files_selected));
-
- }
-
- public static function UploadStart(callback:String, file_object:Object):Void {
- ExternalInterface.call(callback, EscapeMessage(file_object));
- }
-
- public static function UploadProgress(callback:String, file_object:Object, bytes_loaded:Number, bytes_total:Number):Void {
-
- ExternalInterface.call(callback, EscapeMessage(file_object), EscapeMessage(bytes_loaded), EscapeMessage(bytes_total));
-
- }
- public static function UploadSuccess(callback:String, file_object:Object):Void {
-
- ExternalInterface.call(callback, EscapeMessage(file_object));
-
- }
- public static function UploadError(callback:String, error_code:Number, file_object:Object, message:String):Void {
-
- ExternalInterface.call(callback, EscapeMessage(file_object), EscapeMessage(error_code), EscapeMessage(message));
-
- }
- public static function UploadComplete(callback:String, file_object:Object):Void {
-
- ExternalInterface.call(callback, EscapeMessage(file_object));
-
- }
- public static function Debug(callback:String, message:String):Void {
-
- ExternalInterface.call(callback, EscapeMessage(message));
-
- }
-
- /* Escapes all the backslashes which are not translated correctly in the Flash -> JavaScript Interface
- *
- * These functions had to be developed because the ExternalInterface has a bug that simply places the
- * value a string in quotes (except for a " which is escaped) in a JavaScript string literal which
- * is executed by the browser. These often results in improperly escaped string literals if your
- * input string has any backslash characters. For example the string:
- * "c:\Program Files\uploadtools\"
- * is placed in a string literal (with quotes escaped) and becomes:
- * var __flash__temp = "\"c:\Program Files\uploadtools\\"";
- * This statement will cause errors when executed by the JavaScript interpreter:
- * 1) The first \" is succesfully transformed to a "
- * 2) \P is translated to P and the \ is lost
- * 3) \u is interpreted as a unicode character and causes an error in IE
- * 4) \\ is translated to \
- * 5) leaving an unescaped " which causes an error
- *
- * I fixed this by escaping \ characters in all outgoing strings. The above escaped string becomes:
- * var __flash__temp = "\"c:\\Program Files\\uploadtools\\\"";
- * which contains the correct string literal.
- *
- * Note: The "var __flash__temp = " portion of the example is part of the ExternalInterface not part of
- * my escaping routine.
- */
- private static function EscapeMessage(message) {
- if (typeof message == "string") {
- message = EscapeString(message);
- }
- else if (typeof message == "array") {
- message = EscapeArray(message);
- }
- else if (typeof message == "object") {
- message = EscapeObject(message);
- }
-
- return message;
- }
-
- private static function EscapeString(message:String):String {
- //var replacePattern:RegExp = /\\/g; //new RegExp("/\\/", "g");
- return message.split("\\").join("\\\\").split("\n").join("\\n").split("\r").join("\\r").split("\f").join("\\f").split("\b").join("\\b");
- }
- private static function EscapeArray(message_array:Array):Array {
- var length:Number = message_array.length;
- var i:Number = 0;
- for (i=0; i < length; i++) {
- message_array[i] = EscapeMessage(message_array[i]);
- }
- return message_array;
- }
- private static function EscapeObject(message_obj:Object):Object {
- for (var name:String in message_obj) {
- message_obj[name] = EscapeMessage(message_obj[name]);
- }
- return message_obj;
- }
-
-}
\ No newline at end of file
diff --git a/thirdparty/swfupload/Flash8/FileItem.as b/thirdparty/swfupload/Flash8/FileItem.as
deleted file mode 100644
index 15eebb0a..00000000
--- a/thirdparty/swfupload/Flash8/FileItem.as
+++ /dev/null
@@ -1,65 +0,0 @@
-import flash.net.FileReference;
-
-class FileItem
-{
- private static var file_id_sequence:Number = 0; // tracks the file id sequence
-
- private var postObject:Object;
- public var file_reference:FileReference;
- public var id:String;
- public var index:Number = -1;
- public var file_status:Number = 0;
- private var js_object:Object;
-
- public static var FILE_STATUS_QUEUED:Number = -1;
- public static var FILE_STATUS_IN_PROGRESS:Number = -2;
- public static var FILE_STATUS_ERROR:Number = -3;
- public static var FILE_STATUS_SUCCESS:Number = -4;
- public static var FILE_STATUS_CANCELLED:Number = -5;
- public static var FILE_STATUS_NEW:Number = -6; // This file status should never be sent to JavaScript
-
- public function FileItem(file_reference:FileReference, control_id:String)
- {
- this.postObject = {};
- this.file_reference = file_reference;
- this.id = control_id + "_" + (FileItem.file_id_sequence++);
- this.file_status = FileItem.FILE_STATUS_QUEUED;
-
- this.js_object = {
- id: this.id,
- index: this.index,
- name: this.file_reference.name,
- size: this.file_reference.size,
- type: this.file_reference.type,
- creationdate: this.file_reference.creationDate,
- modificationdate: this.file_reference.modificationDate,
- filestatus: this.file_status,
- post: this.GetPostObject()
- };
-
- }
-
- public function AddParam(name:String, value:String):Void {
- this.postObject[name] = value;
- }
-
- public function RemoveParam(name:String):Void {
- delete this.postObject[name];
- }
-
- public function GetPostObject():Object {
- return this.postObject;
- }
-
- // Update the js_object and return it.
- public function ToJavaScriptObject():Object {
- this.js_object.filestatus = this.file_status;
- this.js_object.post = this.GetPostObject();
-
- return this.js_object;
- }
-
- public function toString():String {
- return "FileItem - ID: " + this.id;
- }
-}
\ No newline at end of file
diff --git a/thirdparty/swfupload/Flash8/SWFUpload v2.as2proj b/thirdparty/swfupload/Flash8/SWFUpload v2.as2proj
deleted file mode 100644
index 54be9bc9..00000000
--- a/thirdparty/swfupload/Flash8/SWFUpload v2.as2proj
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- deploy.bat
-
-
-
-
-
-
\ No newline at end of file
diff --git a/thirdparty/swfupload/Flash8/SWFUpload.as b/thirdparty/swfupload/Flash8/SWFUpload.as
deleted file mode 100644
index f62fac31..00000000
--- a/thirdparty/swfupload/Flash8/SWFUpload.as
+++ /dev/null
@@ -1,914 +0,0 @@
-/*
-* Todo:
-* In SWFUpload v3 the file_queue and file_index should be merged. This probably means we'll remove FileItem.id and just
-* use indexes everywhere.
-* */
-
-import flash.net.FileReferenceList;
-import flash.net.FileReference;
-import flash.external.ExternalInterface;
-
-import FileItem;
-import ExternalCall;
-import Delegate;
-
-class SWFUpload {
- // Cause SWFUpload to start as soon as the movie starts
- public static function main():Void
- {
- // Code to attempt to fix "flash script running slowly" error messages
- var counter:Number = 0;
- _root.onEnterFrame = function () {
- if (++counter > 100) counter = 0;
- };
-
- // Start SWFUpload
- var SWFUpload:SWFUpload = new SWFUpload();
- }
-
- private var build_number:String = "SWFUPLOAD 2.0.1 FP8 2007-12-05 0001";
-
- // State tracking variables
- private var fileBrowserMany:FileReferenceList = new FileReferenceList();
- private var fileBrowserOne:FileReference = null; // This isn't set because it can't be reused like the FileReferenceList. It gets setup in the SelectFile method
-
- private var file_queue:Array = new Array(); // holds a list of all items that are to be uploaded.
- private var current_file_item:FileItem = null; // the item that is currently being uploaded.
-
- private var file_index:Array = new Array();
-
- private var successful_uploads:Number = 0; // Tracks the uploads that have been completed
- private var queue_errors:Number = 0; // Tracks files rejected during queueing
- private var upload_errors:Number = 0; // Tracks files that fail upload
- private var upload_cancelled:Number = 0; // Tracks number of cancelled files
- private var queued_uploads:Number = 0; // Tracks the FileItems that are waiting to be uploaded.
-
- private var valid_file_extensions:Array = new Array();// Holds the parsed valid extensions.
-
- private var file_reference_listener:Object;
-
- // Callbacks
- private var flashReady_Callback:String;
- private var fileDialogStart_Callback:String;
- private var fileQueued_Callback:String;
- private var fileQueueError_Callback:String;
- private var fileDialogComplete_Callback:String;
-
- private var uploadStart_Callback:String;
- private var uploadProgress_Callback:String;
- private var uploadError_Callback:String;
- private var uploadSuccess_Callback:String;
-
- private var uploadComplete_Callback:String;
-
- private var debug_Callback:String;
-
- // Values passed in from the HTML
- private var movieName:String;
- private var uploadURL:String;
- private var filePostName:String;
- private var uploadPostObject:Object;
- private var fileTypes:String;
- private var fileTypesDescription:String;
- private var fileSizeLimit:Number;
- private var fileUploadLimit:Number = 0;
- private var fileQueueLimit:Number = 0;
- private var debugEnabled:Boolean;
-
- // Error code "constants"
- // Size check constants
- private var SIZE_TOO_BIG:Number = 1;
- private var SIZE_ZERO_BYTE:Number = -1;
- private var SIZE_OK:Number = 0;
-
- // Queue errors
- private var ERROR_CODE_QUEUE_LIMIT_EXCEEDED:Number = -100;
- private var ERROR_CODE_FILE_EXCEEDS_SIZE_LIMIT:Number = -110;
- private var ERROR_CODE_ZERO_BYTE_FILE:Number = -120;
- private var ERROR_CODE_INVALID_FILETYPE:Number = -130;
-
- // Upload Errors
- private var ERROR_CODE_HTTP_ERROR:Number = -200;
- private var ERROR_CODE_MISSING_UPLOAD_URL:Number = -210;
- private var ERROR_CODE_IO_ERROR:Number = -220;
- private var ERROR_CODE_SECURITY_ERROR:Number = -230;
- private var ERROR_CODE_UPLOAD_LIMIT_EXCEEDED:Number = -240;
- private var ERROR_CODE_UPLOAD_FAILED:Number = -250;
- private var ERROR_CODE_SPECIFIED_FILE_ID_NOT_FOUND:Number = -260;
- private var ERROR_CODE_FILE_VALIDATION_FAILED:Number = -270;
- private var ERROR_CODE_FILE_CANCELLED:Number = -280;
- private var ERROR_CODE_UPLOAD_STOPPED:Number = -290;
-
- public function SWFUpload() {
- System.security.allowDomain("*"); // Allow uploading to any domain
-
- // Setup file FileReferenceList events
- var fbmListener:Object = {
- onSelect : Delegate.create(this, this.Select_Many_Handler),
- onCancel : Delegate.create(this, this.DialogCancelled_Handler)
- }
- this.fileBrowserMany.addListener(fbmListener);
-
- // Setup the events listner
- this.file_reference_listener = {
- onProgress : Delegate.create(this, this.FileProgress_Handler),
- onIOError : Delegate.create(this, this.IOError_Handler),
- onSecurityError : Delegate.create(this, this.SecurityError_Handler),
- onHTTPError : Delegate.create(this, this.HTTPError_Handler),
- onComplete : Delegate.create(this, this.FileComplete_Handler)
- };
-
- // Get the move name
- this.movieName = _root.movieName;
-
- // **Configure the callbacks**
- // The JavaScript tracks all the instances of SWFUpload on a page. We can access the instance
- // associated with this SWF file using the movieName. Each callback is accessible by making
- // a call directly to it on our instance. There is no error handling for undefined callback functions.
- // A developer would have to deliberately remove the default functions,set the variable to null, or remove
- // it from the init function.
- this.flashReady_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].flashReady";
- this.fileDialogStart_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileDialogStart";
- this.fileQueued_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileQueued";
- this.fileQueueError_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileQueueError";
- this.fileDialogComplete_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileDialogComplete";
-
- this.uploadStart_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].uploadStart";
- this.uploadProgress_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].uploadProgress";
- this.uploadError_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].uploadError";
- this.uploadSuccess_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].uploadSuccess";
-
- this.uploadComplete_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].uploadComplete";
-
- this.debug_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].debug";
-
- // Get the Flash Vars
- this.uploadURL = _root.uploadURL;
- this.filePostName = _root.filePostName;
- this.fileTypes = _root.fileTypes;
- this.fileTypesDescription = _root.fileTypesDescription + " (" + this.fileTypes + ")";
- this.loadPostParams(_root.params);
-
-
- if (!this.filePostName) {
- this.filePostName = "Filedata";
- }
- if (!this.fileTypes) {
- this.fileTypes = "*.*";
- }
- if (!this.fileTypesDescription) {
- this.fileTypesDescription = "All Files";
- }
-
- this.LoadFileExensions(this.fileTypes);
-
- try {
- this.debugEnabled = _root.debugEnabled == "true" ? true : false;
- } catch (ex:Object) {
- this.debugEnabled = false;
- }
-
- try {
- this.fileSizeLimit = Number(_root.fileSizeLimit);
- if (this.fileSizeLimit < 0) this.fileSizeLimit = 0;
- } catch (ex:Object) {
- this.fileSizeLimit = 0;
- }
-
- try {
- this.fileUploadLimit = Number(_root.fileUploadLimit);
- if (this.fileUploadLimit < 0) this.fileUploadLimit = 0;
- } catch (ex:Object) {
- this.fileUploadLimit = 0;
- }
-
- try {
- this.fileQueueLimit = Number(_root.fileQueueLimit);
- if (this.fileQueueLimit < 0) this.fileQueueLimit = 0;
- } catch (ex:Object) {
- this.fileQueueLimit = 0;
- }
-
- // Set the queue limit to match the upload limit when the queue limit is bigger than the upload limit
- if (this.fileQueueLimit > this.fileUploadLimit && this.fileUploadLimit != 0) this.fileQueueLimit = this.fileUploadLimit;
- // The the queue limit is unlimited and the upload limit is not then set the queue limit to the upload limit
- if (this.fileQueueLimit == 0 && this.fileUploadLimit != 0) this.fileQueueLimit = this.fileUploadLimit;
-
- try {
- ExternalInterface.addCallback("SelectFile", this, this.SelectFile);
- ExternalInterface.addCallback("SelectFiles", this, this.SelectFiles);
- ExternalInterface.addCallback("StartUpload", this, this.StartUpload);
- ExternalInterface.addCallback("ReturnUploadStart", this, this.ReturnUploadStart);
- ExternalInterface.addCallback("StopUpload", this, this.StopUpload);
- ExternalInterface.addCallback("CancelUpload", this, this.CancelUpload);
-
- ExternalInterface.addCallback("GetStats", this, this.GetStats);
- ExternalInterface.addCallback("SetStats", this, this.SetStats);
- ExternalInterface.addCallback("GetFile", this, this.GetFile);
- ExternalInterface.addCallback("GetFileByIndex", this, this.GetFileByIndex);
-
- ExternalInterface.addCallback("AddFileParam", this, this.AddFileParam);
- ExternalInterface.addCallback("RemoveFileParam", this, this.RemoveFileParam);
-
- ExternalInterface.addCallback("SetUploadURL", this, this.SetUploadURL);
- ExternalInterface.addCallback("SetPostParams", this, this.SetPostParams);
- ExternalInterface.addCallback("SetFileTypes", this, this.SetFileTypes);
- ExternalInterface.addCallback("SetFileSizeLimit", this, this.SetFileSizeLimit);
- ExternalInterface.addCallback("SetFileUploadLimit", this, this.SetFileUploadLimit);
- ExternalInterface.addCallback("SetFileQueueLimit", this, this.SetFileQueueLimit);
- ExternalInterface.addCallback("SetFilePostName", this, this.SetFilePostName);
- ExternalInterface.addCallback("SetDebugEnabled", this, this.SetDebugEnabled);
- } catch (ex:Error) {
- this.Debug("Callbacks where not set.");
- }
-
- this.Debug("SWFUpload Init Complete");
- this.PrintDebugInfo();
-
- // Do some feature detection
- if (flash.net.FileReferenceList && flash.net.FileReference && flash.external.ExternalInterface && flash.external.ExternalInterface.available) {
- ExternalCall.Simple(this.flashReady_Callback);
- } else {
- this.Debug("Feature Detection Failed");
- }
- }
-
- /* *****************************************
- * FileReference Event Handlers
- * *************************************** */
- private function DialogCancelled_Handler():Void {
- this.Debug("Event: fileDialogComplete: File Dialog window cancelled.");
- ExternalCall.FileDialogComplete(this.fileDialogComplete_Callback, 0);
- }
-
- private function FileProgress_Handler(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void {
- this.Debug("Event: uploadProgress: File ID: " + this.current_file_item.id + ". Bytes: " + bytesLoaded + ". Total: " + bytesTotal);
- ExternalCall.UploadProgress(this.uploadProgress_Callback, this.current_file_item.ToJavaScriptObject(), bytesLoaded, bytesTotal);
- }
-
- private function FileComplete_Handler():Void {
- this.successful_uploads++;
- this.current_file_item.file_status = FileItem.FILE_STATUS_SUCCESS;
-
- this.Debug("Event: uploadSuccess: File ID: " + this.current_file_item.id + " Data: n/a");
- ExternalCall.UploadSuccess(this.uploadSuccess_Callback, this.current_file_item.ToJavaScriptObject());
-
- this.UploadComplete();
-
- }
-
- private function HTTPError_Handler(file:FileReference, httpError:Number):Void {
- this.upload_errors++;
- this.current_file_item.file_status = FileItem.FILE_STATUS_ERROR;
-
- this.Debug("Event: uploadError: HTTP ERROR : File ID: " + this.current_file_item.id + ". HTTP Status: " + httpError + ".");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_HTTP_ERROR, this.current_file_item.ToJavaScriptObject(), httpError.toString());
- this.UploadComplete();
- }
-
- // Note: Flash Player does not support Uploads that require authentication. Attempting this will trigger an
- // IO Error or it will prompt for a username and password and the crash the browser (FireFox/Opera)
- private function IOError_Handler(file:FileReference):Void {
- this.upload_errors++;
- this.current_file_item.file_status = FileItem.FILE_STATUS_ERROR;
-
- if(!this.uploadURL.length) {
- this.Debug("Event: uploadError : IO Error : File ID: " + this.current_file_item.id + ". Upload URL string is empty.");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_MISSING_UPLOAD_URL, this.current_file_item.ToJavaScriptObject(), "IO Error");
- } else {
- this.Debug("Event: uploadError : IO Error : File ID: " + this.current_file_item.id + ". IO Error.");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_IO_ERROR, this.current_file_item.ToJavaScriptObject(), "IO Error");
- }
-
- this.UploadComplete();
- }
-
- private function SecurityError_Handler(file:FileReference, errorString:String):Void {
- this.upload_errors++;
- this.current_file_item.file_status = FileItem.FILE_STATUS_ERROR;
-
- this.Debug("Event: uploadError : Security Error : File Number: " + this.current_file_item.id + ". Error:" + errorString);
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_SECURITY_ERROR, this.current_file_item.ToJavaScriptObject(), errorString);
-
- this.UploadComplete();
- }
-
- private function Select_Many_Handler(frl:FileReferenceList):Void {
- this.Select_Handler(frl.fileList);
- }
- private function Select_One_Handler(file:FileReference):Void {
- var fileArray:Array = new Array(1);
- fileArray[0] = file;
- this.Select_Handler(fileArray);
- }
-
- private function Select_Handler(file_reference_list:Array):Void {
- this.Debug("Select Handler: Files Selected from Dialog. Processing file list");
- this.Debug("Type: " + typeof(this.fileQueueLimit) + " Value:" + this.fileQueueLimit);
- // Determine how many queue slots are remaining (check the unlimited (0) settings, successful uploads and queued uploads)
- var queue_slots_remaining:Number = 0;
- if (this.fileUploadLimit == 0) {
- queue_slots_remaining = (this.fileQueueLimit == 0) ? file_reference_list.length : (this.fileQueueLimit - this.queued_uploads); // If unlimited queue make the allowed size match however many files were selected.
- } else {
- var remaining_uploads:Number = this.fileUploadLimit - this.successful_uploads - this.queued_uploads;
- if (remaining_uploads < 0) remaining_uploads = 0;
- if (this.fileQueueLimit == 0 || this.fileQueueLimit >= remaining_uploads) {
- queue_slots_remaining = remaining_uploads;
- } else if (this.fileQueueLimit < remaining_uploads) {
- queue_slots_remaining = this.fileQueueLimit;
- }
- }
-
- // Check if the number of files selected is greater than the number allowed to queue up.
- if (queue_slots_remaining < file_reference_list.length) {
- this.Debug("Event: fileQueueError : Selected Files (" + file_reference_list.length + ") exceeds remaining Queue size (" + queue_slots_remaining + ").");
- ExternalCall.FileQueueError(this.fileQueueError_Callback, this.ERROR_CODE_QUEUE_LIMIT_EXCEEDED, null, queue_slots_remaining.toString());
- } else {
- // Process each selected file
- for (var i:Number = 0; i < file_reference_list.length; i++) {
- var file_item:FileItem = new FileItem(file_reference_list[i], this.movieName);
-
- // Add the file to the index
- file_item.index = this.file_index.length;
- this.file_index[file_item.index] = file_item;
-
- // The the file to see if it is acceptable
- var size_result:Number = this.CheckFileSize(file_item);
- var is_valid_filetype:Boolean = this.CheckFileType(file_item);
-
- if(size_result == this.SIZE_OK && is_valid_filetype) {
- this.Debug("Event: fileQueued : File ID: " + file_item.id);
- this.file_queue.push(file_item);
- this.queued_uploads++;
- ExternalCall.FileQueued(this.fileQueued_Callback, file_item.ToJavaScriptObject());
- }
- else if (!is_valid_filetype) {
- file_item.file_reference = null; // Cleanup the object
- this.Debug("Event: fileQueueError : File not of a valid type.");
- this.queue_errors++;
- ExternalCall.FileQueueError(this.fileQueueError_Callback, this.ERROR_CODE_INVALID_FILETYPE, file_item.ToJavaScriptObject(), "File is not an allowed file type.");
- }
- else if (size_result == this.SIZE_TOO_BIG) {
- file_item.file_reference = null; // Cleanup the object
- this.Debug("Event: fileQueueError : File exceeds size limit.");
- this.queue_errors++;
- ExternalCall.FileQueueError(this.fileQueueError_Callback, this.ERROR_CODE_FILE_EXCEEDS_SIZE_LIMIT, file_item.ToJavaScriptObject(), "File size exceeds allowed limit.");
- }
- else if (size_result == this.SIZE_ZERO_BYTE) {
- file_item.file_reference = null; // Cleanup the object
- this.Debug("Event: fileQueueError : File is zero bytes.");
- this.queue_errors++;
- ExternalCall.FileQueueError(this.fileQueueError_Callback, this.ERROR_CODE_ZERO_BYTE_FILE, file_item.ToJavaScriptObject(), "File is zero bytes and cannot be uploaded.");
- }
- else {
- file_item.file_reference = null; // Cleanup the object
- this.Debug("Entered an unexpected state checking the file in Select_Handler");
- }
- }
- }
-
- this.Debug("Event: fileDialogComplete : Finished adding files");
- ExternalCall.FileDialogComplete(this.fileDialogComplete_Callback, file_reference_list.length);
- }
-
-
- /* ****************************************************************
- Externally exposed functions
- ****************************************************************** */
- // Opens a file browser dialog that allows one file to be selected.
- private function SelectFile():Void {
- this.fileBrowserOne = new FileReference();
- var fbo_listener:Object = {
- onSelect : Delegate.create(this, this.Select_One_Handler),
- onCancel : Delegate.create(this, this.DialogCancelled_Handler)
- }
- this.fileBrowserOne.addListener(fbo_listener);
-
- // Default file type settings
- var allowed_file_types:String = "*.*";
- var allowed_file_types_description:String = "All Files";
-
- // Get the instance settings
- if (this.fileTypes.length > 0) allowed_file_types = this.fileTypes;
- if (this.fileTypesDescription.length > 0) allowed_file_types_description = this.fileTypesDescription;
-
- this.Debug("Event: fileDialogStart : Browsing files. Single Select. Allowed file types: " + allowed_file_types);
- ExternalCall.Simple(this.fileDialogStart_Callback);
-
- this.fileBrowserOne.browse([{ description : allowed_file_types_description, extension : allowed_file_types }]);
-
- }
-
- // Opens a file browser dialog that allows multiple files to be selected.
- private function SelectFiles():Void {
- var allowed_file_types:String = "*.*";
- var allowed_file_types_description:String = "All Files";
- if (this.fileTypes.length > 0) allowed_file_types = this.fileTypes;
- if (this.fileTypesDescription.length > 0) allowed_file_types_description = this.fileTypesDescription;
-
- this.Debug("Event: fileDialogStart : Browsing files. Multi Select. Allowed file types: " + allowed_file_types);
- ExternalCall.Simple(this.fileDialogStart_Callback);
- this.fileBrowserMany.browse([{ description : allowed_file_types_description, extension : allowed_file_types }]);
- }
-
-
- // Starts uploading. Checks to see if a file is currently uploading and, if not, starts the upload.
- private function StartUpload(file_id:String):Void {
- if (file_id == undefined) file_id = "";
-
- if (this.current_file_item == null) {
- this.Debug("StartUpload(): Starting Upload: " + (file_id ? "File ID:" + file_id : "First file in queue"));
- this.StartFile(file_id);
- } else {
- this.Debug("StartUpload(): Upload run already in progress");
- }
- }
-
- // Cancel the current upload and stops. Doesn't advance the upload pointer. The current file is requeued at the beginning.
- private function StopUpload():Void {
- if (this.current_file_item != null) {
- // Cancel the upload and re-queue the FileItem
- this.current_file_item.file_reference.cancel();
-
- this.current_file_item.file_status = FileItem.FILE_STATUS_QUEUED;
-
- // Remove the event handlers
- this.current_file_item.file_reference.removeListener(this.file_reference_listener);
-
- this.file_queue.unshift(this.current_file_item);
- var js_object:Object = this.current_file_item.ToJavaScriptObject();
- this.current_file_item = null;
-
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_UPLOAD_STOPPED, js_object, "Upload Stopped");
- ExternalCall.UploadComplete(this.uploadComplete_Callback, js_object);
- this.Debug("StopUpload(): upload stopped.");
- } else {
- this.Debug("StopUpload(): Upload run not in progress");
- }
- }
-
- /* Cancels the upload specified by file_id
- * If the file is currently uploading it is cancelled and the uploadComplete
- * event gets called.
- * If the file is not currently uploading then only the uploadCancelled event is fired.
- * */
- private function CancelUpload(file_id:String):Void {
- var file_item:FileItem = null;
- if (file_id == undefined) file_id = "";
-
- // Check the current file item
- if (this.current_file_item != null && (this.current_file_item.id == file_id || !file_id)) {
- this.current_file_item.file_reference.cancel();
- this.current_file_item.file_status = FileItem.FILE_STATUS_CANCELLED;
- this.upload_cancelled++;
-
- this.Debug("Event: fileCancelled: File ID: " + this.current_file_item.id + ". Cancelling current upload");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_FILE_CANCELLED, this.current_file_item.ToJavaScriptObject(), "File Upload Cancelled.");
-
- this.UploadComplete(); // <-- this advanced the upload to the next file
- } else if (file_id) {
- // Find the file in the queue
- var file_index:Number = this.FindIndexInFileQueue(file_id);
- if (file_index >= 0) {
- // Remove the file from the queue
- file_item = FileItem(this.file_queue[file_index]);
- file_item.file_status = FileItem.FILE_STATUS_CANCELLED;
- this.file_queue[file_index] = null;
- this.queued_uploads--;
- this.upload_cancelled++;
-
-
- // Cancel the file (just for good measure) and make the callback
- file_item.file_reference.cancel();
- file_item.file_reference.removeListener(this.file_reference_listener);
- file_item.file_reference = null;
-
- this.Debug("Event: uploadError : " + file_item.id + ". Cancelling queued upload");
- this.Debug("Event: uploadError : " + file_item.id + ". Cancelling queued upload");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_FILE_CANCELLED, file_item.ToJavaScriptObject(), "File Cancelled");
-
- // Get rid of the file object
- file_item = null;
- }
- } else {
- // Get the first file and cancel it
- while (this.file_queue.length > 0 && file_item == null) {
- // Check that File Reference is valid (if not make sure it's deleted and get the next one on the next loop)
- file_item = FileItem(this.file_queue.shift()); // Cast back to a FileItem
- if (typeof(file_item) == "undefined") {
- file_item = null;
- continue;
- }
- }
-
- if (file_item != null) {
- file_item.file_status = FileItem.FILE_STATUS_CANCELLED;
- this.queued_uploads--;
- this.upload_cancelled++;
-
-
- // Cancel the file (just for good measure) and make the callback
- file_item.file_reference.cancel();
- file_item.file_reference.removeListener(this.file_reference_listener);
- file_item.file_reference = null;
-
- this.Debug("Event: uploadError : " + file_item.id + ". Cancelling queued upload");
-
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_FILE_CANCELLED, file_item.ToJavaScriptObject(), "File Cancelled");
-
- // Get rid of the file object
- file_item = null;
- }
-
- }
-
- }
-
- private function GetStats():Object {
- return {
- in_progress : this.current_file_item == null ? 0 : 1,
- files_queued : this.queued_uploads,
- successful_uploads : this.successful_uploads,
- upload_errors : this.upload_errors,
- upload_cancelled : this.upload_cancelled,
- queue_errors : this.queue_errors
- };
- }
- private function SetStats(stats:Object):Void {
- this.successful_uploads = (typeof(stats["successful_uploads"]) === "Number") ? stats["successful_uploads"] : this.successful_uploads;
- this.upload_errors = (typeof(stats["upload_errors"]) === "Number") ? stats["upload_errors"] : this.upload_errors;
- this.upload_cancelled = (typeof(stats["upload_cancelled"]) === "Number") ? stats["upload_cancelled"] : this.upload_cancelled;
- this.queue_errors = (typeof(stats["queue_errors"]) === "Number") ? stats["queue_errors"] : this.queue_errors;
- }
-
- private function GetFile(file_id:String):Object {
- var file:FileItem = null;
- var file_index:Number = this.FindIndexInFileQueue(file_id);
- if (file_index >= 0) {
- file = this.file_queue[file_index];
- } else {
- if (this.current_file_item != null) {
- file = this.current_file_item;
- } else {
- for (var i:Number = 0; i < this.file_queue.length; i++) {
- file = this.file_queue[i];
- if (file != null) break;
- }
- }
- }
-
- if (file == null) {
- return null;
- } else {
- return file.ToJavaScriptObject();
- }
-
- }
- private function GetFileByIndex(index:Number):Object {
- if (index < 0 || index > this.file_index.length - 1) {
- return null;
- } else {
- return this.file_index[index].ToJavaScriptObject();
- }
- }
-
- private function AddFileParam(file_id:String, name:String, value:String):Boolean {
- var file_index:Number = this.FindIndexInFileQueue(file_id);
- if (file_index >= 0) {
- var file_item:FileItem = FileItem(this.file_queue[file_index]);
-
- file_item.AddParam(name, value);
- return true;
- } else {
- return false;
- }
- }
- private function RemoveFileParam(file_id:String, name:String):Boolean {
- var file_index:Number = this.FindIndexInFileQueue(file_id);
- if (file_index >= 0) {
- var file_item:FileItem = FileItem(this.file_queue[file_index]);
- file_item.RemoveParam(name);
- return true;
- } else {
- return false;
- }
- }
-
- private function SetUploadURL(url:String):Void {
- if (typeof(url) !== "undefined" && url !== "") {
- this.uploadURL = url;
- }
- }
-
- private function SetPostParams(post_object:Object):Void {
- if (typeof(post_object) !== "undefined" && post_object !== null) {
- this.uploadPostObject = post_object;
- }
- }
-
- private function SetFileTypes(types:String, description:String):Void {
- this.fileTypes = types;
- this.fileTypesDescription = description;
-
- this.LoadFileExensions(this.fileTypes);
- }
-
- private function SetFileSizeLimit(bytes:Number):Void {
- if (bytes < 0) bytes = 0;
- this.fileSizeLimit = bytes;
- }
-
- private function SetFileUploadLimit(file_upload_limit:Number):Void {
- if (file_upload_limit < 0) file_upload_limit = 0;
- this.fileUploadLimit = file_upload_limit;
- }
-
- private function SetFileQueueLimit(file_queue_limit:Number):Void {
- if (file_queue_limit < 0) file_queue_limit = 0;
- this.fileQueueLimit = file_queue_limit;
- }
-
- private function SetFilePostName(file_post_name:String):Void {
- if (file_post_name != "") {
- this.filePostName = file_post_name;
- }
- }
-
- private function SetDebugEnabled(debug_enabled:Boolean):Void {
- this.debugEnabled = debug_enabled;
- }
-
- /* *************************************************************
- File processing and handling functions
- *************************************************************** */
- //
- private function StartFile(file_id:String):Void {
- if (file_id == undefined) file_id = "";
-
- // Only upload a file uploads are being processed.
- // startFile could be called by a file cancellation even when we aren't currently uploading
- if (this.current_file_item != null) {
- this.Debug("StartFile(): Upload already in progress. Not starting another upload.");
- }
-
- this.Debug("StartFile: " + (file_id ? "File ID: " + file_id : "First file in queue"));
-
- // Check the upload limit
- if (this.successful_uploads >= this.fileUploadLimit && this.fileUploadLimit != 0) {
- this.Debug("Event: uploadError : Upload limit reached. No more files can be uploaded.");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_UPLOAD_LIMIT_EXCEEDED, null, "The upload limit has been reached.");
- this.current_file_item = null;
- return;
- }
-
- // Get the next file to upload
- if (!file_id) {
- while (this.file_queue.length > 0 && this.current_file_item == null) {
- // Check that File Reference is valid (if not make sure it's deleted and get the next one on the next loop)
- this.current_file_item = FileItem(this.file_queue.shift()); // Cast back to a FileItem
- if (typeof(this.current_file_item) == "undefined") {
- this.current_file_item = null;
- continue;
- }
- }
- } else {
- var file_index:Number = this.FindIndexInFileQueue(file_id);
- if (file_index >= 0) {
- // Set the file as the current upload and remove it from the queue
- this.current_file_item = FileItem(this.file_queue[file_index]);
- this.file_queue[file_index] = null;
- } else {
- this.Debug("Event: uploadError : File ID not found in queue: " + file_id);
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_SPECIFIED_FILE_ID_NOT_FOUND, null, "File ID not queued.");
- }
- }
-
-
- // Start the upload if we found an item to upload
- if (this.current_file_item != null) {
- // Begin the upload
- this.Debug("Event: uploadStart : File ID: " + this.current_file_item.id);
- ExternalCall.UploadStart(this.uploadStart_Callback, this.current_file_item.ToJavaScriptObject());
-
- }
- // Otherwise we've would have looped through all the FileItems. This means the queue is empty)
- else {
- this.Debug("startFile(): No File Reference found. There are no files left to upload.\nstartFile(): Ending upload run.");
- }
- }
-
- // This starts the upload when the user returns TRUE from the uploadStart event. Rather than just have the value returned from
- // the function we do a return function call so we can use the setTimeout work-around for Flash/JS circular calls.
- private function ReturnUploadStart(start_upload:Boolean):Void {
- if (this.current_file_item == null) {
- this.Debug("ReturnUploadStart called but file was no longer queued. This is okay if the file was stopped or cancelled.");
- return;
- }
-
- if (start_upload) {
- try {
- // Set the event handlers
- this.current_file_item.file_reference.addListener(this.file_reference_listener);
-
- // Upload the file
- var url:String = this.BuildRequest();
-
- this.Debug("startFile(): File Reference found. File accepted by startUpload event. Starting upload to " + this.uploadURL + " for File ID: " + this.current_file_item.id);
- this.current_file_item.file_reference.upload(url, this.filePostName, false);
- } catch (ex:Error) {
- this.upload_errors++;
- this.current_file_item.file_status = FileItem.FILE_STATUS_ERROR;
- var message:String = ex.name + "\n" + ex.message;
- this.Debug("Event: uploadError(): Unhandled exception: " + message);
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_UPLOAD_FAILED, this.current_file_item.ToJavaScriptObject(), message);
-
- this.UploadComplete();
- }
- this.current_file_item.file_status = FileItem.FILE_STATUS_IN_PROGRESS;
-
- } else {
- this.Debug("Event: uploadError : Call to uploadStart returned false. Not uploading file.");
-
- // Remove the event handlers
- this.current_file_item.file_reference.removeListener(this.file_reference_listener);
-
- // Re-queue the FileItem
- this.current_file_item.file_status = FileItem.FILE_STATUS_QUEUED;
- var js_object:Object = this.current_file_item.ToJavaScriptObject();
- this.file_queue.unshift(this.current_file_item);
- this.current_file_item = null;
-
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_FILE_VALIDATION_FAILED, js_object, "Call to uploadStart return false. Not uploading file.");
- ExternalCall.UploadComplete(this.uploadComplete_Callback, js_object);
- this.Debug("startFile(): upload rejected by startUpload event. File re-queued.");
- }
- }
-
- // Completes the file upload by deleting it's reference, advancing the pointer.
- // Once this event files a new upload can be started.
- private function UploadComplete():Void {
- var jsFileObj:Object = this.current_file_item.ToJavaScriptObject();
-
- this.current_file_item.file_reference.removeListener(this.file_reference_listener);
- this.current_file_item.file_reference = null;
-
- this.current_file_item = null;
- this.queued_uploads--;
-
- this.Debug("Event: uploadComplete : Upload cycle complete.");
- ExternalCall.UploadComplete(this.uploadComplete_Callback, jsFileObj);
- }
-
-
- /* *************************************************************
- Utility Functions
- *************************************************************** */
- // Check the size of the file against the allowed file size.
- private function CheckFileSize(file_item:FileItem):Number {
- if (file_item.file_reference.size == 0) {
- return this.SIZE_ZERO_BYTE;
- } else if (this.fileSizeLimit != 0 && file_item.file_reference.size > (this.fileSizeLimit * 1000)) {
- return this.SIZE_TOO_BIG;
- } else {
- return this.SIZE_OK;
- }
- }
-
- private function CheckFileType(file_item:FileItem):Boolean {
- // If no extensions are defined then a *.* was passed and the check is unnecessary
- if (this.valid_file_extensions.length == 0) {
- return true;
- }
-
- var fileRef:FileReference = file_item.file_reference;
- var last_dot_index:Number = fileRef.name.lastIndexOf(".");
- var extension:String = "";
- if (last_dot_index >= 0) {
- extension = fileRef.name.substr(last_dot_index + 1).toLowerCase();
- }
-
- var is_valid_filetype:Boolean = false;
- for (var i:Number=0; i < this.valid_file_extensions.length; i++) {
- if (String(this.valid_file_extensions[i]) == extension) {
- is_valid_filetype = true;
- break;
- }
- }
-
- return is_valid_filetype;
- }
-
- private function BuildRequest():String {
- // Create the request object
- var file_post:Object = this.current_file_item.GetPostObject();
- var key:String;
-
- var url:String = this.uploadURL;
-
- var pairs:Array = new Array();
- for (key in this.uploadPostObject) {
- this.Debug("Global URL Item: " + key + "=" + this.uploadPostObject[key]);
- if (this.uploadPostObject.hasOwnProperty(key)) {
- pairs.push(key + "=" + this.uploadPostObject[key]);
- }
- }
-
- for (key in file_post) {
- this.Debug("File Post Item: " + key + "=" + this.uploadPostObject[key]);
- if (file_post.hasOwnProperty(key)) {
- pairs.push(escape(key) + "=" + escape(file_post[key]));
- }
- }
-
- url = this.uploadURL + (this.uploadURL.indexOf("?") > -1 ? "&" : "?") + pairs.join("&");
-
- return url;
- }
-
- private function Debug(msg:String):Void {
- if (this.debugEnabled) {
- var lines:Array = msg.split("\n");
- for (var i:Number=0; i < lines.length; i++) {
- lines[i] = "SWF DEBUG: " + lines[i];
- }
- try {
- ExternalCall.Debug(this.debug_Callback, lines.join("\n"));
- } catch (ex:Error) {
- // pretend nothing happened
- }
- }
- }
-
- private function PrintDebugInfo():Void {
- var debug_info:String = "\n----- SWF DEBUG OUTPUT ----\n"
- + "Build Number: " + this.build_number + "\n"
- + "movieName: " + this.movieName + "\n"
- + "Upload URL: " + this.uploadURL + "\n"
- + "File Types String: " + this.fileTypes + "\n"
- + "Parsed File Types: " + this.valid_file_extensions.toString() + "\n"
- + "File Types Description: " + this.fileTypesDescription + "\n"
- + "File Size Limit: " + this.fileSizeLimit + "\n"
- + "File Upload Limit: " + this.fileUploadLimit + "\n"
- + "File Queue Limit: " + this.fileQueueLimit + "\n"
- + "Post Params:\n";
- for (var key:String in this.uploadPostObject) {
- debug_info += " " + key + "=" + this.uploadPostObject[key] + "\n";
- }
- debug_info += "----- END SWF DEBUG OUTPUT ----\n";
-
- this.Debug(debug_info);
- }
-
- private function FindIndexInFileQueue(file_id:String):Number {
- for (var i:Number = 0; i= 0) {
- extension = extension.substr(dot_index + 1).toLowerCase();
- } else {
- extension = extension.toLowerCase();
- }
-
- // If one of the extensions is * then we allow all files
- if (extension == "*") {
- this.valid_file_extensions = new Array();
- break;
- }
-
- this.valid_file_extensions.push(extension);
- }
- }
-
- private function loadPostParams(param_string:String):Void {
- var post_object:Object = {};
-
- if (param_string != null) {
- var name_value_pairs:Array = param_string.split("&");
-
- for (var i:Number = 0; i < name_value_pairs.length; i++) {
- var name_value:String = String(name_value_pairs[i]);
- var index_of_equals:Number = name_value.indexOf("=");
- if (index_of_equals > 0) {
- post_object[unescape(name_value.substring(0, index_of_equals))] = unescape(name_value.substr(index_of_equals + 1));
- }
- }
- }
- this.uploadPostObject = post_object;
- }
-
-}
\ No newline at end of file
diff --git a/thirdparty/swfupload/Flash8/deploy.bat b/thirdparty/swfupload/Flash8/deploy.bat
deleted file mode 100644
index 99512893..00000000
--- a/thirdparty/swfupload/Flash8/deploy.bat
+++ /dev/null
@@ -1,3 +0,0 @@
-@echo off
-copy ..\swfupload.js ..\..\demos\swfupload
-copy swfupload_f8.swf ..\..\demos\swfupload
\ No newline at end of file
diff --git a/thirdparty/swfupload/Flash8/swfupload_f8.swf b/thirdparty/swfupload/Flash8/swfupload_f8.swf
deleted file mode 100644
index b0251286..00000000
Binary files a/thirdparty/swfupload/Flash8/swfupload_f8.swf and /dev/null differ
diff --git a/thirdparty/swfupload/Flash9/ExternalCall.as b/thirdparty/swfupload/Flash9/ExternalCall.as
deleted file mode 100644
index e501ba32..00000000
--- a/thirdparty/swfupload/Flash9/ExternalCall.as
+++ /dev/null
@@ -1,117 +0,0 @@
-package {
- import flash.external.ExternalInterface;
-
- internal class ExternalCall
- {
-
- /*public function ExternalCall()
- {
-
- }
- */
-
- public static function Simple(callback:String):void {
- ExternalInterface.call(callback);
- }
- public static function FileQueued(callback:String, file_object:Object):void {
- ExternalInterface.call(callback, EscapeMessage(file_object));
- }
- public static function FileQueueError(callback:String, error_code:Number, file_object:Object, message:String):void {
-
- ExternalInterface.call(callback, EscapeMessage(file_object), EscapeMessage(error_code), EscapeMessage(message));
-
- }
- public static function FileDialogComplete(callback:String, num_files_selected:Number):void {
-
- ExternalInterface.call(callback, EscapeMessage(num_files_selected));
-
- }
-
- public static function UploadStart(callback:String, file_object:Object):void {
- ExternalInterface.call(callback, EscapeMessage(file_object));
- }
-
- public static function UploadProgress(callback:String, file_object:Object, bytes_loaded:uint, bytes_total:uint):void {
-
- ExternalInterface.call(callback, EscapeMessage(file_object), EscapeMessage(bytes_loaded), EscapeMessage(bytes_total));
-
- }
- public static function UploadSuccess(callback:String, file_object:Object, server_data:String):void {
-
- ExternalInterface.call(callback, EscapeMessage(file_object), EscapeMessage(server_data));
-
- }
- public static function UploadError(callback:String, error_code:Number, file_object:Object, message:String):void {
-
- ExternalInterface.call(callback, EscapeMessage(file_object), EscapeMessage(error_code), EscapeMessage(message));
-
- }
- public static function UploadComplete(callback:String, file_object:Object):void {
-
- ExternalInterface.call(callback, EscapeMessage(file_object));
-
- }
- public static function Debug(callback:String, message:String):void {
-
- ExternalInterface.call(callback, EscapeMessage(message));
-
- }
-
- /* Escapes all the backslashes which are not translated correctly in the Flash -> JavaScript Interface
- *
- * These functions had to be developed because the ExternalInterface has a bug that simply places the
- * value a string in quotes (except for a " which is escaped) in a JavaScript string literal which
- * is executed by the browser. These often results in improperly escaped string literals if your
- * input string has any backslash characters. For example the string:
- * "c:\Program Files\uploadtools\"
- * is placed in a string literal (with quotes escaped) and becomes:
- * var __flash__temp = "\"c:\Program Files\uploadtools\\"";
- * This statement will cause errors when executed by the JavaScript interpreter:
- * 1) The first \" is succesfully transformed to a "
- * 2) \P is translated to P and the \ is lost
- * 3) \u is interpreted as a unicode character and causes an error in IE
- * 4) \\ is translated to \
- * 5) leaving an unescaped " which causes an error
- *
- * I fixed this by escaping \ characters in all outgoing strings. The above escaped string becomes:
- * var __flash__temp = "\"c:\\Program Files\\uploadtools\\\"";
- * which contains the correct string literal.
- *
- * Note: The "var __flash__temp = " portion of the example is part of the ExternalInterface not part of
- * my escaping routine.
- */
- private static function EscapeMessage(message:*):* {
- if (message is String) {
- message = EscapeString(message);
- }
- else if (message is Array) {
- message = EscapeArray(message);
- }
- else if (message is Object) {
- message = EscapeObject(message);
- }
-
- return message;
- }
-
- private static function EscapeString(message:String):String {
- var replacePattern:RegExp = /\\/g; //new RegExp("/\\/", "g");
- return message.replace(replacePattern, "$&$&");
- }
- private static function EscapeArray(message_array:Array):Array {
- var length:uint = message_array.length;
- var i:uint = 0;
- for (i; i < length; i++) {
- message_array[i] = EscapeMessage(message_array[i]);
- }
- return message_array;
- }
- private static function EscapeObject(message_obj:Object):Object {
- for (var name:String in message_obj) {
- message_obj[name] = EscapeMessage(message_obj[name]);
- }
- return message_obj;
- }
-
- }
-}
\ No newline at end of file
diff --git a/thirdparty/swfupload/Flash9/FileItem.as b/thirdparty/swfupload/Flash9/FileItem.as
deleted file mode 100644
index cec92871..00000000
--- a/thirdparty/swfupload/Flash9/FileItem.as
+++ /dev/null
@@ -1,74 +0,0 @@
-package {
- import flash.net.FileReference;
-
- internal class FileItem
- {
- private static var file_id_sequence:Number = 0; // tracks the file id sequence
-
- private var postObject:Object;
- public var file_reference:FileReference;
- public var id:String;
- public var index:Number = -1;
- public var file_status:int = 0;
- private var js_object:Object;
-
- public static var FILE_STATUS_QUEUED:int = -1;
- public static var FILE_STATUS_IN_PROGRESS:int = -2;
- public static var FILE_STATUS_ERROR:int = -3;
- public static var FILE_STATUS_SUCCESS:int = -4;
- public static var FILE_STATUS_CANCELLED:int = -5;
- public static var FILE_STATUS_NEW:int = -6; // This file status should never be sent to JavaScript
-
- public function FileItem(file_reference:FileReference, control_id:String)
- {
- this.postObject = {};
- this.file_reference = file_reference;
- this.id = control_id + "_" + (FileItem.file_id_sequence++);
- this.file_status = FileItem.FILE_STATUS_NEW;
-
- this.js_object = {
- id: this.id,
- index: this.index,
- post: this.GetPostObject()
- };
-
- // Cleanly attempt to retrieve the FileReference info
- // this can fail and so is wrapped in try..catch
- try {
- this.js_object.name = this.file_reference.name;
- this.js_object.size = this.file_reference.size;
- this.js_object.type = this.file_reference.type;
- this.js_object.creationdate = this.file_reference.creationDate;
- this.js_object.modificationdate = this.file_reference.modificationDate;
- } catch (ex:Error) {
- this.file_status = FileItem.FILE_STATUS_ERROR;
- }
-
- this.js_object.filestatus = this.file_status;
- }
-
- public function AddParam(name:String, value:String):void {
- this.postObject[name] = value;
- }
-
- public function RemoveParam(name:String):void {
- delete this.postObject[name];
- }
-
- public function GetPostObject():Object {
- return this.postObject;
- }
-
- // Create the simply file object that is passed to the browser
- public function ToJavaScriptObject():Object {
- this.js_object.file_status = this.file_status;
- this.js_object.post = this.GetPostObject();
-
- return this.js_object;
- }
-
- public function toString():String {
- return "FileItem - ID: " + this.id;
- }
- }
-}
\ No newline at end of file
diff --git a/thirdparty/swfupload/Flash9/SWFUpload v2.as3proj b/thirdparty/swfupload/Flash9/SWFUpload v2.as3proj
deleted file mode 100644
index e904fbdb..00000000
--- a/thirdparty/swfupload/Flash9/SWFUpload v2.as3proj
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- deploy.bat
-
-
-
-
-
-
\ No newline at end of file
diff --git a/thirdparty/swfupload/Flash9/SWFUpload.as b/thirdparty/swfupload/Flash9/SWFUpload.as
deleted file mode 100644
index d4bc27e0..00000000
--- a/thirdparty/swfupload/Flash9/SWFUpload.as
+++ /dev/null
@@ -1,920 +0,0 @@
-package {
- /*
- * Todo:
- * I should look in to using array.splice to remove cancelled files from the array.
- * Add GetFile(file_id) function that returns the FileItem js object for any file (defaults to current or first in queue).
- * */
-
- import flash.display.Stage;
- import flash.display.Sprite;
- import flash.net.FileReferenceList;
- import flash.net.FileReference;
- import flash.net.FileFilter;
- import flash.net.URLRequest;
- import flash.net.URLRequestMethod;
- import flash.net.URLVariables;
- import flash.events.*;
- import flash.external.ExternalInterface;
- import flash.system.Security;
-
- import FileItem;
- import ExternalCall;
-
- public class SWFUpload extends Sprite {
- // Cause SWFUpload to start as soon as the movie starts
- public static function main():void
- {
- var SWFUpload:SWFUpload = new SWFUpload();
- }
-
- private const build_number:String = "SWFUPLOAD 2.0.1 FP9 2007-12-05 0001";
-
- // State tracking variables
- private var fileBrowserMany:FileReferenceList = new FileReferenceList();
- private var fileBrowserOne:FileReference = null; // This isn't set because it can't be reused like the FileReferenceList. It gets setup in the SelectFile method
-
- private var file_queue:Array = new Array(); // holds a list of all items that are to be uploaded.
- private var current_file_item:FileItem = null; // the item that is currently being uploaded.
-
- private var file_index:Array = new Array();
-
- private var successful_uploads:Number = 0; // Tracks the uploads that have been completed
- private var queue_errors:Number = 0; // Tracks files rejected during queueing
- private var upload_errors:Number = 0; // Tracks files that fail upload
- private var upload_cancelled:Number = 0; // Tracks number of cancelled files
- private var queued_uploads:Number = 0; // Tracks the FileItems that are waiting to be uploaded.
-
- private var valid_file_extensions:Array = new Array();// Holds the parsed valid extensions.
-
- // Callbacks
- private var flashReady_Callback:String;
- private var fileDialogStart_Callback:String;
- private var fileQueued_Callback:String;
- private var fileQueueError_Callback:String;
- private var fileDialogComplete_Callback:String;
-
- private var uploadStart_Callback:String;
- private var uploadProgress_Callback:String;
- private var uploadError_Callback:String;
- private var uploadSuccess_Callback:String;
-
- private var uploadComplete_Callback:String;
-
- private var debug_Callback:String;
-
- // Values passed in from the HTML
- private var movieName:String;
- private var uploadURL:String;
- private var filePostName:String;
- private var uploadPostObject:Object;
- private var fileTypes:String;
- private var fileTypesDescription:String;
- private var fileSizeLimit:Number;
- private var fileUploadLimit:Number = 0;
- private var fileQueueLimit:Number = 0;
- private var debugEnabled:Boolean;
-
- // Error code "constants"
- // Size check constants
- private var SIZE_TOO_BIG:Number = 1;
- private var SIZE_ZERO_BYTE:Number = -1;
- private var SIZE_OK:Number = 0;
-
- // Queue errors
- private var ERROR_CODE_QUEUE_LIMIT_EXCEEDED:Number = -100;
- private var ERROR_CODE_FILE_EXCEEDS_SIZE_LIMIT:Number = -110;
- private var ERROR_CODE_ZERO_BYTE_FILE:Number = -120;
- private var ERROR_CODE_INVALID_FILETYPE:Number = -130;
-
- // Upload Errors
- private var ERROR_CODE_HTTP_ERROR:Number = -200;
- private var ERROR_CODE_MISSING_UPLOAD_URL:Number = -210;
- private var ERROR_CODE_IO_ERROR:Number = -220;
- private var ERROR_CODE_SECURITY_ERROR:Number = -230;
- private var ERROR_CODE_UPLOAD_LIMIT_EXCEEDED:Number = -240;
- private var ERROR_CODE_UPLOAD_FAILED:Number = -250;
- private var ERROR_CODE_SPECIFIED_FILE_ID_NOT_FOUND:Number = -260;
- private var ERROR_CODE_FILE_VALIDATION_FAILED:Number = -270;
- private var ERROR_CODE_FILE_CANCELLED:Number = -280;
- private var ERROR_CODE_UPLOAD_STOPPED:Number = -290;
-
- public function SWFUpload() {
- Security.allowDomain("*"); // Allow uploading to any domain
-
- // Keep Flash Player busy so it doesn't show the "flash script is running slowly" error
- var counter:Number = 0;
- root.addEventListener(Event.ENTER_FRAME, function ():void { if (++counter > 100) counter = 100; });
-
- // Setup file FileReferenceList events
- this.fileBrowserMany.addEventListener(Event.SELECT, this.Select_Many_Handler);
- this.fileBrowserMany.addEventListener(Event.CANCEL, this.DialogCancelled_Handler);
-
- // Get the move name
- this.movieName = root.loaderInfo.parameters.movieName;
-
- // **Configure the callbacks**
- // The JavaScript tracks all the instances of SWFUpload on a page. We can access the instance
- // associated with this SWF file using the movieName. Each callback is accessible by making
- // a call directly to it on our instance. There is no error handling for undefined callback functions.
- // A developer would have to deliberately remove the default functions,set the variable to null, or remove
- // it from the init function.
- this.flashReady_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].flashReady";
- this.fileDialogStart_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileDialogStart";
- this.fileQueued_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileQueued";
- this.fileQueueError_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileQueueError";
- this.fileDialogComplete_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileDialogComplete";
-
- this.uploadStart_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].uploadStart";
- this.uploadProgress_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].uploadProgress";
- this.uploadError_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].uploadError";
- this.uploadSuccess_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].uploadSuccess";
-
- this.uploadComplete_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].uploadComplete";
-
- this.debug_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].debug";
-
-
- // Get the Flash Vars
- this.uploadURL = root.loaderInfo.parameters.uploadURL;
- this.filePostName = root.loaderInfo.parameters.filePostName;
- this.fileTypes = root.loaderInfo.parameters.fileTypes;
- this.fileTypesDescription = root.loaderInfo.parameters.fileTypesDescription + " (" + this.fileTypes + ")";
- this.loadPostParams(root.loaderInfo.parameters.params);
-
-
- if (!this.filePostName) {
- this.filePostName = "Filedata";
- }
- if (!this.fileTypes) {
- this.fileTypes = "*.*";
- }
- if (!this.fileTypesDescription) {
- this.fileTypesDescription = "All Files";
- }
-
- this.LoadFileExensions(this.fileTypes);
-
- try {
- this.debugEnabled = root.loaderInfo.parameters.debugEnabled == "true" ? true : false;
- } catch (ex:Object) {
- this.debugEnabled = false;
- }
-
- try {
- this.fileSizeLimit = Number(root.loaderInfo.parameters.fileSizeLimit);
- if (this.fileSizeLimit < 0) this.fileSizeLimit = 0;
- } catch (ex:Object) {
- this.fileSizeLimit = 0;
- }
-
- try {
- this.fileUploadLimit = Number(root.loaderInfo.parameters.fileUploadLimit);
- if (this.fileUploadLimit < 0) this.fileUploadLimit = 0;
- } catch (ex:Object) {
- this.fileUploadLimit = 0;
- }
-
- try {
- this.fileQueueLimit = Number(root.loaderInfo.parameters.fileQueueLimit);
- if (this.fileQueueLimit < 0) this.fileQueueLimit = 0;
- } catch (ex:Object) {
- this.fileQueueLimit = 0;
- }
-
- // Set the queue limit to match the upload limit when the queue limit is bigger than the upload limit
- if (this.fileQueueLimit > this.fileUploadLimit && this.fileUploadLimit != 0) this.fileQueueLimit = this.fileUploadLimit;
- // The the queue limit is unlimited and the upload limit is not then set the queue limit to the upload limit
- if (this.fileQueueLimit == 0 && this.fileUploadLimit != 0) this.fileQueueLimit = this.fileUploadLimit;
-
- try {
- ExternalInterface.addCallback("SelectFile", this.SelectFile);
- ExternalInterface.addCallback("SelectFiles", this.SelectFiles);
- ExternalInterface.addCallback("StartUpload", this.StartUpload);
- ExternalInterface.addCallback("ReturnUploadStart", this.ReturnUploadStart);
- ExternalInterface.addCallback("StopUpload", this.StopUpload);
- ExternalInterface.addCallback("CancelUpload", this.CancelUpload);
-
- ExternalInterface.addCallback("GetStats", this.GetStats);
- ExternalInterface.addCallback("SetStats", this.SetStats);
- ExternalInterface.addCallback("GetFile", this.GetFile);
- ExternalInterface.addCallback("GetFileByIndex", this.GetFileByIndex);
-
- ExternalInterface.addCallback("AddFileParam", this.AddFileParam);
- ExternalInterface.addCallback("RemoveFileParam", this.RemoveFileParam);
-
- ExternalInterface.addCallback("SetUploadURL", this.SetUploadURL);
- ExternalInterface.addCallback("SetPostParams", this.SetPostParams);
- ExternalInterface.addCallback("SetFileTypes", this.SetFileTypes);
- ExternalInterface.addCallback("SetFileSizeLimit", this.SetFileSizeLimit);
- ExternalInterface.addCallback("SetFileUploadLimit", this.SetFileUploadLimit);
- ExternalInterface.addCallback("SetFileQueueLimit", this.SetFileQueueLimit);
- ExternalInterface.addCallback("SetFilePostName", this.SetFilePostName);
- ExternalInterface.addCallback("SetDebugEnabled", this.SetDebugEnabled);
- } catch (ex:Error) {
- this.Debug("Callbacks where not set.");
- }
-
- this.Debug("SWFUpload Init Complete");
- this.PrintDebugInfo();
-
- // Do some feature detection
- if (flash.net.FileReferenceList && flash.net.FileReference && flash.net.URLRequest && flash.external.ExternalInterface && flash.external.ExternalInterface.available && DataEvent.UPLOAD_COMPLETE_DATA) {
- ExternalCall.Simple(this.flashReady_Callback);
- } else {
- this.Debug("Feature Detection Failed");
- }
- }
-
- /* *****************************************
- * FileReference Event Handlers
- * *************************************** */
- private function DialogCancelled_Handler(event:Event):void {
- this.Debug("Event: fileDialogComplete: File Dialog window cancelled.");
- ExternalCall.FileDialogComplete(this.fileDialogComplete_Callback, 0);
- }
-
- private function FileProgress_Handler(event:ProgressEvent):void {
- this.Debug("Event: uploadProgress: File ID: " + this.current_file_item.id + ". Bytes: " + event.bytesLoaded + ". Total: " + event.bytesTotal);
- ExternalCall.UploadProgress(this.uploadProgress_Callback, this.current_file_item.ToJavaScriptObject(), event.bytesLoaded, event.bytesTotal);
- }
-
- private function ServerData_Handler(event:DataEvent):void {
- this.successful_uploads++;
- this.current_file_item.file_status = FileItem.FILE_STATUS_SUCCESS;
-
- this.Debug("Event: uploadSuccess: File ID: " + this.current_file_item.id + " Data: " + event.data);
- ExternalCall.UploadSuccess(this.uploadSuccess_Callback, this.current_file_item.ToJavaScriptObject(), event.data);
-
- this.UploadComplete();
-
- }
-
- private function HTTPError_Handler(event:HTTPStatusEvent):void {
- this.upload_errors++;
- this.current_file_item.file_status = FileItem.FILE_STATUS_ERROR;
-
- this.Debug("Event: uploadError: HTTP ERROR : File ID: " + this.current_file_item.id + ". HTTP Status: " + event.status + ".");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_HTTP_ERROR, this.current_file_item.ToJavaScriptObject(), event.status.toString());
- this.UploadComplete();
- }
-
- // Note: Flash Player does not support Uploads that require authentication. Attempting this will trigger an
- // IO Error or it will prompt for a username and password and the crash the browser (FireFox/Opera)
- private function IOError_Handler(event:IOErrorEvent):void {
- this.upload_errors++;
- this.current_file_item.file_status = FileItem.FILE_STATUS_ERROR;
-
- if(!this.uploadURL.length) {
- this.Debug("Event: uploadError : IO Error : File ID: " + this.current_file_item.id + ". Upload URL string is empty.");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_MISSING_UPLOAD_URL, this.current_file_item.ToJavaScriptObject(), event.text);
- } else {
- this.Debug("Event: uploadError : IO Error : File ID: " + this.current_file_item.id + ". IO Error.");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_IO_ERROR, this.current_file_item.ToJavaScriptObject(), event.text);
- }
-
- this.UploadComplete();
- }
-
- private function SecurityError_Handler(event:SecurityErrorEvent):void {
- this.upload_errors++;
- this.current_file_item.file_status = FileItem.FILE_STATUS_ERROR;
-
- this.Debug("Event: uploadError : Security Error : File Number: " + this.current_file_item.id + ". Error:" + event.text);
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_SECURITY_ERROR, this.current_file_item.ToJavaScriptObject(), event.text);
-
- this.UploadComplete();
- }
-
- private function Select_Many_Handler(event:Event):void {
- this.Select_Handler(this.fileBrowserMany.fileList);
- }
- private function Select_One_Handler(event:Event):void {
- var fileArray:Array = new Array(1);
- fileArray[0] = this.fileBrowserOne;
- this.Select_Handler(fileArray);
- }
-
- private function Select_Handler(file_reference_list:Array):void {
- this.Debug("Select Handler: Files Selected from Dialog. Processing file list");
-
- // Determine how many queue slots are remaining (check the unlimited (0) settings, successful uploads and queued uploads)
- var queue_slots_remaining:Number = 0;
- if (this.fileUploadLimit == 0) {
- queue_slots_remaining = this.fileQueueLimit == 0 ? file_reference_list.length : (this.fileQueueLimit - this.queued_uploads); // If unlimited queue make the allowed size match however many files were selected.
- } else {
- var remaining_uploads:Number = this.fileUploadLimit - this.successful_uploads - this.queued_uploads;
- if (remaining_uploads < 0) remaining_uploads = 0;
- if (this.fileQueueLimit == 0 || this.fileQueueLimit >= remaining_uploads) {
- queue_slots_remaining = remaining_uploads;
- } else if (this.fileQueueLimit < remaining_uploads) {
- queue_slots_remaining = this.fileQueueLimit;
- }
- }
-
- // Check if the number of files selected is greater than the number allowed to queue up.
- if (queue_slots_remaining < file_reference_list.length) {
- this.Debug("Event: fileQueueError : Selected Files (" + file_reference_list.length + ") exceeds remaining Queue size (" + queue_slots_remaining + ").");
- ExternalCall.FileQueueError(this.fileQueueError_Callback, this.ERROR_CODE_QUEUE_LIMIT_EXCEEDED, null, queue_slots_remaining.toString());
- } else {
- // Process each selected file
- for (var i:Number = 0; i < file_reference_list.length; i++) {
- var file_item:FileItem = new FileItem(file_reference_list[i], this.movieName);
-
- // Add the file to the index
- file_item.index = this.file_index.length;
- this.file_index[file_item.index] = file_item;
-
- // Verify that the file is accessible. Zero byte files and possibly other conditions can cause a file to be inaccessible.
- var jsFileObj:Object = file_item.ToJavaScriptObject();
- var is_valid_file_reference:Boolean = (jsFileObj.filestatus !== FileItem.FILE_STATUS_ERROR);
-
- if (is_valid_file_reference) {
- // Check the size, if it's within the limit add it to the upload list.
- var size_result:Number = this.CheckFileSize(file_item);
- var is_valid_filetype:Boolean = this.CheckFileType(file_item);
- if(size_result == this.SIZE_OK && is_valid_filetype) {
- this.Debug("Event: fileQueued : File ID: " + file_item.id);
- file_item.file_status = FileItem.FILE_STATUS_QUEUED;
- this.file_queue.push(file_item);
- this.queued_uploads++;
- ExternalCall.FileQueued(this.fileQueued_Callback, file_item.ToJavaScriptObject());
- }
- else if (!is_valid_filetype) {
- file_item.file_reference = null; // Cleanup the object
- this.Debug("Event: fileQueueError : File not of a valid type.");
- this.queue_errors++;
- ExternalCall.FileQueueError(this.fileQueueError_Callback, this.ERROR_CODE_INVALID_FILETYPE, file_item.ToJavaScriptObject(), "File is not an allowed file type.");
- }
- else if (size_result == this.SIZE_TOO_BIG) {
- file_item.file_reference = null; // Cleanup the object
- this.Debug("Event: fileQueueError : File exceeds size limit.");
- this.queue_errors++;
- ExternalCall.FileQueueError(this.fileQueueError_Callback, this.ERROR_CODE_FILE_EXCEEDS_SIZE_LIMIT, file_item.ToJavaScriptObject(), "File size exceeds allowed limit.");
- } else if (size_result == this.SIZE_ZERO_BYTE) {
- file_item.file_reference = null; // Cleanup the object
- this.Debug("Event: fileQueueError : File is zero bytes.");
- this.queue_errors++;
- ExternalCall.FileQueueError(this.fileQueueError_Callback, this.ERROR_CODE_ZERO_BYTE_FILE, file_item.ToJavaScriptObject(), "File is zero bytes and cannot be uploaded.");
- }
- } else {
- file_item.file_reference = null; // Cleanup the object
- this.Debug("Event: fileQueueError : File is zero bytes or FileReference is invalid.");
- this.queue_errors++;
- ExternalCall.FileQueueError(this.fileQueueError_Callback, this.ERROR_CODE_ZERO_BYTE_FILE, file_item.ToJavaScriptObject(), "File is zero bytes or cannot be accessed and cannot be uploaded.");
- }
- }
- }
-
- this.Debug("Event: fileDialogComplete : Finished adding files");
- ExternalCall.FileDialogComplete(this.fileDialogComplete_Callback, file_reference_list.length);
- }
-
-
- /* ****************************************************************
- Externally exposed functions
- ****************************************************************** */
- // Opens a file browser dialog that allows one file to be selected.
- private function SelectFile():void {
- this.fileBrowserOne = new FileReference();
- this.fileBrowserOne.addEventListener(Event.SELECT, this.Select_One_Handler);
- this.fileBrowserOne.addEventListener(Event.CANCEL, this.DialogCancelled_Handler);
-
- // Default file type settings
- var allowed_file_types:String = "*.*";
- var allowed_file_types_description:String = "All Files";
-
- // Get the instance settings
- if (this.fileTypes.length > 0) allowed_file_types = this.fileTypes;
- if (this.fileTypesDescription.length > 0) allowed_file_types_description = this.fileTypesDescription;
-
- this.Debug("Event: fileDialogStart : Browsing files. Single Select. Allowed file types: " + allowed_file_types);
- ExternalCall.Simple(this.fileDialogStart_Callback);
-
- this.fileBrowserOne.browse([new FileFilter(allowed_file_types_description, allowed_file_types)]);
-
- }
-
- // Opens a file browser dialog that allows multiple files to be selected.
- private function SelectFiles():void {
- var allowed_file_types:String = "*.*";
- var allowed_file_types_description:String = "All Files";
- if (this.fileTypes.length > 0) allowed_file_types = this.fileTypes;
- if (this.fileTypesDescription.length > 0) allowed_file_types_description = this.fileTypesDescription;
-
- this.Debug("Event: fileDialogStart : Browsing files. Multi Select. Allowed file types: " + allowed_file_types);
- ExternalCall.Simple(this.fileDialogStart_Callback);
- this.fileBrowserMany.browse([new FileFilter(allowed_file_types_description, allowed_file_types)]);
- }
-
-
- // Starts uploading. Checks to see if a file is currently uploading and, if not, starts the upload.
- private function StartUpload(file_id:String = ""):void {
- if (this.current_file_item == null) {
- this.Debug("StartUpload(): Starting Upload: " + (file_id ? "File ID:" + file_id : "First file in queue"));
- this.StartFile(file_id);
- } else {
- this.Debug("StartUpload(): Upload run already in progress");
- }
- }
-
- // Cancel the current upload and stops. Doesn't advance the upload pointer. The current file is requeued at the beginning.
- private function StopUpload():void {
- if (this.current_file_item != null) {
- // Cancel the upload and re-queue the FileItem
- this.current_file_item.file_reference.cancel();
-
- this.current_file_item.file_status = FileItem.FILE_STATUS_QUEUED;
-
- // Remove the event handlers
- this.removeFileReferenceEventListeners(this.current_file_item);
-
- this.file_queue.unshift(this.current_file_item);
- var js_object:Object = this.current_file_item.ToJavaScriptObject();
- this.current_file_item = null;
-
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_UPLOAD_STOPPED, js_object, "Upload Stopped");
- ExternalCall.UploadComplete(this.uploadComplete_Callback, js_object);
- this.Debug("StopUpload(): upload stopped.");
- } else {
- this.Debug("StopUpload(): Upload run not in progress");
- }
- }
-
- /* Cancels the upload specified by file_id
- * If the file is currently uploading it is cancelled and the uploadComplete
- * event gets called.
- * If the file is not currently uploading then only the uploadCancelled event is fired.
- * */
- private function CancelUpload(file_id:String):void {
- var file_item:FileItem = null;
-
- // Check the current file item
- if (this.current_file_item != null && (this.current_file_item.id == file_id || !file_id)) {
- this.current_file_item.file_reference.cancel();
- this.current_file_item.file_status = FileItem.FILE_STATUS_CANCELLED;
- this.upload_cancelled++;
-
- this.Debug("Event: fileCancelled: File ID: " + this.current_file_item.id + ". Cancelling current upload");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_FILE_CANCELLED, this.current_file_item.ToJavaScriptObject(), "File Upload Cancelled.");
-
- this.UploadComplete(); // <-- this advanced the upload to the next file
- } else if (file_id) {
- // Find the file in the queue
- var file_index:Number = this.FindIndexInFileQueue(file_id);
- if (file_index >= 0) {
- // Remove the file from the queue
- file_item = FileItem(this.file_queue[file_index]);
- file_item.file_status = FileItem.FILE_STATUS_CANCELLED;
- this.file_queue[file_index] = null;
- this.queued_uploads--;
- this.upload_cancelled++;
-
-
- // Cancel the file (just for good measure) and make the callback
- file_item.file_reference.cancel();
- this.removeFileReferenceEventListeners(file_item);
- file_item.file_reference = null;
-
-
- this.Debug("Event: uploadError : " + file_item.id + ". Cancelling queued upload");
- this.Debug("Event: uploadError : " + file_item.id + ". Cancelling queued upload");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_FILE_CANCELLED, file_item.ToJavaScriptObject(), "File Cancelled");
-
- // Get rid of the file object
- file_item = null;
- }
- } else {
- // Get the first file and cancel it
- while (this.file_queue.length > 0 && file_item == null) {
- // Check that File Reference is valid (if not make sure it's deleted and get the next one on the next loop)
- file_item = FileItem(this.file_queue.shift()); // Cast back to a FileItem
- if (typeof(file_item) == "undefined") {
- file_item = null;
- continue;
- }
- }
-
- if (file_item != null) {
- file_item.file_status = FileItem.FILE_STATUS_CANCELLED;
- this.queued_uploads--;
- this.upload_cancelled++;
-
-
- // Cancel the file (just for good measure) and make the callback
- file_item.file_reference.cancel();
- this.removeFileReferenceEventListeners(file_item);
- file_item.file_reference = null;
-
- this.Debug("Event: uploadError : " + file_item.id + ". Cancelling queued upload");
-
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_FILE_CANCELLED, file_item.ToJavaScriptObject(), "File Cancelled");
-
- // Get rid of the file object
- file_item = null;
- }
-
- }
-
- }
-
- private function GetStats():Object {
- return {
- in_progress : this.current_file_item == null ? 0 : 1,
- files_queued : this.queued_uploads,
- successful_uploads : this.successful_uploads,
- upload_errors : this.upload_errors,
- upload_cancelled : this.upload_cancelled,
- queue_errors : this.queue_errors
- };
- }
- private function SetStats(stats:Object):void {
- this.successful_uploads = typeof(stats["successful_uploads"]) === "Number" ? stats["successful_uploads"] : this.successful_uploads;
- this.upload_errors = typeof(stats["upload_errors"]) === "Number" ? stats["upload_errors"] : this.upload_errors;
- this.upload_cancelled = typeof(stats["upload_cancelled"]) === "Number" ? stats["upload_cancelled"] : this.upload_cancelled;
- this.queue_errors = typeof(stats["queue_errors"]) === "Number" ? stats["queue_errors"] : this.queue_errors;
- }
-
- private function GetFile(file_id:String):Object {
- var file_index:Number = this.FindIndexInFileQueue(file_id);
- if (file_index >= 0) {
- var file:FileItem = this.file_queue[file_index];
- } else {
- if (this.current_file_item != null) {
- file = this.current_file_item;
- } else {
- for (var i:Number = 0; i < this.file_queue.length; i++) {
- file = this.file_queue[i];
- if (file != null) break;
- }
- }
- }
-
- if (file == null) {
- return null;
- } else {
- return file.ToJavaScriptObject();
- }
-
- }
-
- private function GetFileByIndex(index:Number):Object {
- if (index < 0 || index > this.file_index.length - 1) {
- return null;
- } else {
- return this.file_index[index].ToJavaScriptObject();
- }
- }
-
- private function AddFileParam(file_id:String, name:String, value:String):Boolean {
- var file_index:Number = this.FindIndexInFileQueue(file_id);
- if (file_index >= 0) {
- var file_item:FileItem = FileItem(this.file_queue[file_index]);
-
- file_item.AddParam(name, value);
- return true;
- } else {
- return false;
- }
- }
- private function RemoveFileParam(file_id:String, name:String):Boolean {
- var file_index:Number = this.FindIndexInFileQueue(file_id);
- if (file_index >= 0) {
- var file_item:FileItem = FileItem(this.file_queue[file_index]);
- file_item.RemoveParam(name);
- return true;
- } else {
- return false;
- }
- }
-
- private function SetUploadURL(url:String):void {
- if (typeof(url) !== "undefined" && url !== "") {
- this.uploadURL = url;
- }
- }
-
- private function SetPostParams(post_object:Object):void {
- if (typeof(post_object) !== "undefined" && post_object !== null) {
- this.uploadPostObject = post_object;
- }
- }
-
- private function SetFileTypes(types:String, description:String):void {
- this.fileTypes = types;
- this.fileTypesDescription = description;
-
- this.LoadFileExensions(this.fileTypes);
- }
-
- private function SetFileSizeLimit(bytes:Number):void {
- if (bytes < 0) bytes = 0;
- this.fileSizeLimit = bytes;
- }
-
- private function SetFileUploadLimit(file_upload_limit:Number):void {
- if (file_upload_limit < 0) file_upload_limit = 0;
- this.fileUploadLimit = file_upload_limit;
- }
-
- private function SetFileQueueLimit(file_queue_limit:Number):void {
- if (file_queue_limit < 0) file_queue_limit = 0;
- this.fileQueueLimit = file_queue_limit;
- }
-
- private function SetFilePostName(file_post_name:String):void {
- if (file_post_name != "") {
- this.filePostName = file_post_name;
- }
- }
-
- private function SetDebugEnabled(debug_enabled:Boolean):void {
- this.debugEnabled = debug_enabled;
- }
-
- /* *************************************************************
- File processing and handling functions
- *************************************************************** */
- //
- private function StartFile(file_id:String = ""):void {
- // Only upload a file uploads are being processed.
- // startFile could be called by a file cancellation even when we aren't currently uploading
- if (this.current_file_item != null) {
- this.Debug("StartFile(): Upload already in progress. Not starting another upload.");
- }
-
- this.Debug("StartFile: " + (file_id ? "File ID: " + file_id : "First file in queue"));
-
- // Check the upload limit
- if (this.successful_uploads >= this.fileUploadLimit && this.fileUploadLimit != 0) {
- this.Debug("Event: uploadError : Upload limit reached. No more files can be uploaded.");
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_UPLOAD_LIMIT_EXCEEDED, null, "The upload limit has been reached.");
- this.current_file_item = null;
- return;
- }
-
- // Get the next file to upload
- if (!file_id) {
- while (this.file_queue.length > 0 && this.current_file_item == null) {
- // Check that File Reference is valid (if not make sure it's deleted and get the next one on the next loop)
- this.current_file_item = FileItem(this.file_queue.shift()); // Cast back to a FileItem
- if (typeof(this.current_file_item) == "undefined") {
- this.current_file_item = null;
- continue;
- }
- }
- } else {
- var file_index:Number = this.FindIndexInFileQueue(file_id);
- if (file_index >= 0) {
- // Set the file as the current upload and remove it from the queue
- this.current_file_item = FileItem(this.file_queue[file_index]);
- this.file_queue[file_index] = null;
- } else {
- this.Debug("Event: uploadError : File ID not found in queue: " + file_id);
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_SPECIFIED_FILE_ID_NOT_FOUND, null, "File ID not queued.");
- }
- }
-
-
- // Start the upload if we found an item to upload
- if (this.current_file_item != null) {
- // Begin the upload
- this.Debug("Event: uploadStart : File ID: " + this.current_file_item.id);
- ExternalCall.UploadStart(this.uploadStart_Callback, this.current_file_item.ToJavaScriptObject());
-
- }
- // Otherwise we've would have looped through all the FileItems. This means the queue is empty)
- else {
- this.Debug("startFile(): No File Reference found. There are no files left to upload.\nstartFile(): Ending upload run.");
- }
- }
-
- // This starts the upload when the user returns TRUE from the uploadStart event. Rather than just have the value returned from
- // the function we do a return function call so we can use the setTimeout work-around for Flash/JS circular calls.
- private function ReturnUploadStart(start_upload:Boolean):void {
- if (this.current_file_item == null) {
- this.Debug("ReturnUploadStart called but file was no longer queued. This is okay if the file was stopped or cancelled.");
- return;
- }
-
- if (start_upload) {
- try {
- // Set the event handlers
- this.current_file_item.file_reference.addEventListener(ProgressEvent.PROGRESS, this.FileProgress_Handler);
- this.current_file_item.file_reference.addEventListener(IOErrorEvent.IO_ERROR, this.IOError_Handler);
- this.current_file_item.file_reference.addEventListener(SecurityErrorEvent.SECURITY_ERROR, this.SecurityError_Handler);
- this.current_file_item.file_reference.addEventListener(HTTPStatusEvent.HTTP_STATUS, this.HTTPError_Handler);
- this.current_file_item.file_reference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, this.ServerData_Handler);
-
- // Upload the file
- var request:URLRequest = this.BuildRequest();
-
- this.Debug("startFile(): File Reference found. File accepted by startUpload event. Starting upload to " + request.url + " for File ID: " + this.current_file_item.id);
- this.current_file_item.file_reference.upload(request, this.filePostName, false);
- } catch (ex:Error) {
- this.upload_errors++;
- this.current_file_item.file_status = FileItem.FILE_STATUS_ERROR;
- var message:String = ex.errorID + "\n" + ex.name + "\n" + ex.message + "\n" + ex.getStackTrace();
- this.Debug("Event: uploadError(): Unhandled exception: " + message);
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_UPLOAD_FAILED, this.current_file_item.ToJavaScriptObject(), message);
-
- this.UploadComplete();
- }
- this.current_file_item.file_status = FileItem.FILE_STATUS_IN_PROGRESS;
-
- } else {
- this.Debug("Event: uploadError : Call to uploadStart returned false. Not uploading file.");
-
- // Remove the event handlers
- this.removeFileReferenceEventListeners(this.current_file_item);
-
- // Re-queue the FileItem
- this.current_file_item.file_status = FileItem.FILE_STATUS_QUEUED;
- var js_object:Object = this.current_file_item.ToJavaScriptObject();
- this.file_queue.unshift(this.current_file_item);
- this.current_file_item = null;
-
- ExternalCall.UploadError(this.uploadError_Callback, this.ERROR_CODE_FILE_VALIDATION_FAILED, js_object, "Call to uploadStart return false. Not uploading file.");
- ExternalCall.UploadComplete(this.uploadComplete_Callback, js_object);
- this.Debug("startFile(): upload rejected by startUpload event. File re-queued.");
- }
- }
-
- // Completes the file upload by deleting it's reference, advancing the pointer.
- // Once this event files a new upload can be started.
- private function UploadComplete():void {
- var jsFileObj:Object = this.current_file_item.ToJavaScriptObject();
-
- this.removeFileReferenceEventListeners(this.current_file_item);
- this.current_file_item.file_reference = null;
- this.current_file_item = null;
- this.queued_uploads--;
-
- this.Debug("Event: uploadComplete : Upload cycle complete.");
- ExternalCall.UploadComplete(this.uploadComplete_Callback, jsFileObj);
- }
-
-
- /* *************************************************************
- Utility Functions
- *************************************************************** */
- // Check the size of the file against the allowed file size. If it is less the return TRUE. If it is too large return FALSE
- private function CheckFileSize(file_item:FileItem):Number {
- if (file_item.file_reference.size == 0) {
- return this.SIZE_ZERO_BYTE;
- } else if (this.fileSizeLimit != 0 && file_item.file_reference.size > (this.fileSizeLimit * 1000)) {
- return this.SIZE_TOO_BIG;
- } else {
- return this.SIZE_OK;
- }
- }
-
- private function CheckFileType(file_item:FileItem):Boolean {
- // If no extensions are defined then a *.* was passed and the check is unnecessary
- if (this.valid_file_extensions.length == 0) {
- return true;
- }
-
- var fileRef:FileReference = file_item.file_reference;
- var last_dot_index:Number = fileRef.name.lastIndexOf(".");
- var extension:String = "";
- if (last_dot_index >= 0) {
- extension = fileRef.name.substr(last_dot_index + 1).toLowerCase();
- }
-
- var is_valid_filetype:Boolean = false;
- for (var i:Number=0; i < this.valid_file_extensions.length; i++) {
- if (String(this.valid_file_extensions[i]) == extension) {
- is_valid_filetype = true;
- break;
- }
- }
-
- return is_valid_filetype;
- }
-
- private function BuildRequest():URLRequest {
- // Create the request object
- var request:URLRequest = new URLRequest();
- request.method = URLRequestMethod.POST;
- request.url = this.uploadURL;
-
- var file_post:Object = this.current_file_item.GetPostObject();
- var key:String;
- var post:URLVariables = new URLVariables();
- for (key in this.uploadPostObject) {
- this.Debug("Global Post Item: " + key + "=" + this.uploadPostObject[key]);
- if (this.uploadPostObject.hasOwnProperty(key)) {
- post[key] = this.uploadPostObject[key];
- }
- }
-
- for (key in file_post) {
- this.Debug("File Post Item: " + key + "=" + this.uploadPostObject[key]);
- if (file_post.hasOwnProperty(key)) {
- post[key] = file_post[key];
- }
- }
-
- request.data = post;
-
- return request;
- }
-
- private function Debug(msg:String):void {
- if (this.debugEnabled) {
- var lines:Array = msg.split("\n");
- for (var i:Number=0; i < lines.length; i++) {
- lines[i] = "SWF DEBUG: " + lines[i];
- }
- try {
- ExternalCall.Debug(this.debug_Callback, lines.join("\n"));
- } catch (ex:Error) {
- // pretend nothing happened
- }
- }
- }
-
- private function PrintDebugInfo():void {
- var debug_info:String = "\n----- SWF DEBUG OUTPUT ----\n";
- debug_info += "Build Number: " + this.build_number + "\n";
- debug_info += "movieName: " + this.movieName + "\n";
- debug_info += "Upload URL: " + this.uploadURL + "\n";
- debug_info += "File Types String: " + this.fileTypes + "\n";
- debug_info += "Parsed File Types: " + this.valid_file_extensions.toString() + "\n";
- debug_info += "File Types Description: " + this.fileTypesDescription + "\n";
- debug_info += "File Size Limit: " + this.fileSizeLimit + "\n";
- debug_info += "File Upload Limit: " + this.fileUploadLimit + "\n";
- debug_info += "File Queue Limit: " + this.fileQueueLimit + "\n";
- debug_info += "Post Params:\n";
- for (var key:String in this.uploadPostObject) {
- debug_info += " " + key + "=" + this.uploadPostObject[key] + "\n";
- }
- debug_info += "----- END SWF DEBUG OUTPUT ----\n";
-
- this.Debug(debug_info);
- }
-
- private function FindIndexInFileQueue(file_id:String):Number {
- for (var i:Number = 0; i= 0) {
- extension = extension.substr(dot_index + 1).toLowerCase();
- } else {
- extension = extension.toLowerCase();
- }
-
- // If one of the extensions is * then we allow all files
- if (extension == "*") {
- this.valid_file_extensions = new Array();
- break;
- }
-
- this.valid_file_extensions.push(extension);
- }
- }
-
- private function loadPostParams(param_string:String):void {
- var post_object:Object = {};
-
- if (param_string != null) {
- var name_value_pairs:Array = param_string.split("&");
-
- for (var i:Number = 0; i < name_value_pairs.length; i++) {
- var name_value:String = String(name_value_pairs[i]);
- var index_of_equals:Number = name_value.indexOf("=");
- if (index_of_equals > 0) {
- post_object[decodeURIComponent(name_value.substring(0, index_of_equals))] = decodeURIComponent(name_value.substr(index_of_equals + 1));
- }
- }
- }
- this.uploadPostObject = post_object;
- }
-
- private function removeFileReferenceEventListeners(file_item:FileItem):void {
- if (file_item != null && file_item.file_reference != null) {
- file_item.file_reference.removeEventListener(ProgressEvent.PROGRESS, this.FileProgress_Handler);
- file_item.file_reference.removeEventListener(IOErrorEvent.IO_ERROR, this.IOError_Handler);
- file_item.file_reference.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, this.SecurityError_Handler);
- file_item.file_reference.removeEventListener(HTTPStatusEvent.HTTP_STATUS, this.HTTPError_Handler);
- file_item.file_reference.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA, this.ServerData_Handler);
- }
- }
-
- }
-}
diff --git a/thirdparty/swfupload/Flash9/deploy.bat b/thirdparty/swfupload/Flash9/deploy.bat
deleted file mode 100644
index 81a82c53..00000000
--- a/thirdparty/swfupload/Flash9/deploy.bat
+++ /dev/null
@@ -1,3 +0,0 @@
-@echo off
-copy ..\swfupload.js ..\..\demos\swfupload
-copy swfupload_f9.swf ..\..\demos\swfupload
\ No newline at end of file
diff --git a/thirdparty/swfupload/Flash9/swfupload_f9.swf b/thirdparty/swfupload/Flash9/swfupload_f9.swf
deleted file mode 100644
index 7f714561..00000000
Binary files a/thirdparty/swfupload/Flash9/swfupload_f9.swf and /dev/null differ
diff --git a/thirdparty/swfupload/license.txt b/thirdparty/swfupload/license.txt
deleted file mode 100644
index dd26171a..00000000
--- a/thirdparty/swfupload/license.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/
- *
- * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License:
- * http://www.opensource.org/licenses/mit-license.php
- *
- *
- * SWFUpload Revision 7.0 is (c) 2007 Jake Roberts and is released under the MIT License:
- * http://www.opensource.org/licenses/mit-license.php
- *
- */
\ No newline at end of file
diff --git a/thirdparty/swfupload/plugins/swfupload.cookies.js b/thirdparty/swfupload/plugins/swfupload.cookies.js
deleted file mode 100644
index 7c6fcbbc..00000000
--- a/thirdparty/swfupload/plugins/swfupload.cookies.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- Cookie Plug-in
-
- This plug in automatically gets all the cookies for this site and adds them to the post_params.
- Cookies are loaded only on initialization. The refreshCookies function can be called to update the post_params.
- The cookies will override any other post params with the same name.
-*/
-
-var SWFUpload;
-if (typeof(SWFUpload) === "function") {
- SWFUpload.prototype.initSettings = function (old_initSettings) {
- return function (init_settings) {
- if (typeof(old_initSettings) === "function") {
- old_initSettings.call(this, init_settings);
- }
-
- this.refreshCookies(false); // The false parameter must be sent since SWFUpload has not initialzed at this point
- };
- }(SWFUpload.prototype.initSettings);
-
- // refreshes the post_params and updates SWFUpload. The send_to_flash parameters is optional and defaults to True
- SWFUpload.prototype.refreshCookies = function (send_to_flash) {
- if (send_to_flash !== false) send_to_flash = true;
-
- // Get the post_params object
- var post_params = this.getSetting("post_params");
-
- // Get the cookies
- var i, cookie_array = document.cookie.split(';'), ca_length = cookie_array.length, c, eq_index, name, value;
- for(i = 0; i < ca_length; i++) {
- c = cookie_array[i];
-
- // Left Trim spaces
- while (c.charAt(0) == " ") {
- c = c.substring(1, c.length);
- }
- eq_index = c.indexOf("=");
- if (eq_index > 0) {
- name = c.substring(0, eq_index);
- value = c.substring(eq_index+1);
- post_params[name] = value;
- }
- }
-
- if (send_to_flash) {
- this.setPostParams(post_params);
- }
- };
-
-}
diff --git a/thirdparty/swfupload/plugins/swfupload.detectionkit.js b/thirdparty/swfupload/plugins/swfupload.detectionkit.js
deleted file mode 100644
index e69de29b..00000000
diff --git a/thirdparty/swfupload/plugins/swfupload.documentready.js b/thirdparty/swfupload/plugins/swfupload.documentready.js
deleted file mode 100644
index dc8e35c3..00000000
--- a/thirdparty/swfupload/plugins/swfupload.documentready.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- DocumentReady Plug-in
-
- This plugin loads SWFUpload as soon as the document is ready. You should not load SWFUpload inside window.onload using this plugin.
- You can also chain other functions by calling SWFUpload.DocumentReady(your function).
-
- Warning: Embedded Ads or other scripts that overwrite window.onload or use their own document ready functions may interfer with this plugin. You
- should not set window.onload when using this plugin.
-
- Usage Example:
-
- var swfu = new SWFUpload(your settings object);
- SWFUpload.DocumentReady(function () { alert('Document Ready!'; });
-
-*/
-
-var SWFUpload;
-if (typeof(SWFUpload) === "function") {
- // Override iniSWFUpload so SWFUpload gets inited when the document is ready rather than immediately
- SWFUpload.prototype.initSWFUpload = function (old_initSWFUpload) {
- return function (init_settings) {
- var self = this;
- if (typeof(old_initSWFUpload) === "function") {
- SWFUpload.DocumentReady(function () {
- old_initSWFUpload.call(self, init_settings);
- });
- }
- }
-
- }(SWFUpload.prototype.initSWFUpload);
-
-
- // The DocumentReady function adds the passed in function to
- // the functions that will be executed when the document is ready/loaded
- SWFUpload.DocumentReady = function (fn) {
- // Add the function to the chain
- SWFUpload.DocumentReady.InternalOnloadChain = function (previous_link_fn) {
- return function () {
- if (typeof(previous_link_fn) === "function") {
- previous_link_fn();
- }
- fn();
- };
- }(SWFUpload.DocumentReady.InternalOnloadChain);
- };
- SWFUpload.DocumentReady.InternalOnloadChain = null;
- SWFUpload.DocumentReady.Onload = function () {
- // Execute the onload function chain
- if (typeof(SWFUpload.DocumentReady.InternalOnloadChain) === "function") {
- SWFUpload.DocumentReady.InternalOnloadChain();
- }
- };
- SWFUpload.DocumentReady.SetupComplete = false;
-
-
- /* ********************************************
- This portion of the code gets executed as soon it is loaded.
- It binds the proper event for executing JavaScript is
- early as possible. This is a per browser function and so
- some browser sniffing is used.
-
- This solution still has the "exposed" issue (See the Global Delegation section at http://peter.michaux.ca/article/553 )
-
- Base solution from http://dean.edwards.name/weblog/2006/06/again/ and http://dean.edwards.name/weblog/2005/09/busted/
- ******************************************** */
- if (!SWFUpload.DocumentReady.SetupComplete) {
- // for Internet Explorer (using conditional comments)
- /*@cc_on @*/
- /*@if (@_win32)
- document.write("