XE 기본 파일 업로더인 SWF Upload 2.2.0.1 로 업데이트 및 업로드 버튼이 가려지는 문제 수정

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6200 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2009-04-27 03:05:17 +00:00
parent fb55fedd9f
commit 1bc5754cbc
3 changed files with 203 additions and 111 deletions

View file

@ -15,10 +15,13 @@
/* ******************* */ /* ******************* */
/* Constructor & Init */ /* Constructor & Init */
/* ******************* */ /* ******************* */
var SWFUpload;
var SWFUpload = function (settings) { if (SWFUpload == undefined) {
this.initSWFUpload(settings); SWFUpload = function (settings) {
}; this.initSWFUpload(settings);
};
}
SWFUpload.prototype.initSWFUpload = function (settings) { SWFUpload.prototype.initSWFUpload = function (settings) {
try { try {
@ -28,6 +31,7 @@ SWFUpload.prototype.initSWFUpload = function (settings) {
this.movieName = "SWFUpload_" + SWFUpload.movieCount++; this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
this.movieElement = null; this.movieElement = null;
// Setup global control tracking // Setup global control tracking
SWFUpload.instances[this.movieName] = this; SWFUpload.instances[this.movieName] = this;
@ -46,7 +50,7 @@ SWFUpload.prototype.initSWFUpload = function (settings) {
/* *************** */ /* *************** */
SWFUpload.instances = {}; SWFUpload.instances = {};
SWFUpload.movieCount = 0; SWFUpload.movieCount = 0;
SWFUpload.version = "2.2.0 Alpha"; SWFUpload.version = "2.2.0 2009-03-25";
SWFUpload.QUEUE_ERROR = { SWFUpload.QUEUE_ERROR = {
QUEUE_LIMIT_EXCEEDED : -100, QUEUE_LIMIT_EXCEEDED : -100,
FILE_EXCEEDS_SIZE_LIMIT : -110, FILE_EXCEEDS_SIZE_LIMIT : -110,
@ -77,6 +81,36 @@ SWFUpload.BUTTON_ACTION = {
SELECT_FILES : -110, SELECT_FILES : -110,
START_UPLOAD : -120 START_UPLOAD : -120
}; };
SWFUpload.CURSOR = {
ARROW : -1,
HAND : -2
};
SWFUpload.WINDOW_MODE = {
WINDOW : "window",
TRANSPARENT : "transparent",
OPAQUE : "opaque"
};
// Private: takes a URL, determines if it is relative and converts to an absolute URL
// using the current site. Only processes the URL if it can, otherwise returns the URL untouched
SWFUpload.completeURL = function(url) {
if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) {
return url;
}
var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : "");
var indexSlash = window.location.pathname.lastIndexOf("/");
if (indexSlash <= 0) {
path = "/";
} else {
path = window.location.pathname.substr(0, indexSlash) + "/";
}
return /*currentURL +*/ path + url;
};
/* ******************** */ /* ******************** */
/* Instance Members */ /* Instance Members */
@ -91,10 +125,13 @@ SWFUpload.prototype.initSettings = function () {
// Upload backend settings // Upload backend settings
this.ensureDefault("upload_url", ""); this.ensureDefault("upload_url", "");
this.ensureDefault("preserve_relative_urls", false);
this.ensureDefault("file_post_name", "Filedata"); this.ensureDefault("file_post_name", "Filedata");
this.ensureDefault("post_params", {}); this.ensureDefault("post_params", {});
this.ensureDefault("use_query_string", false); this.ensureDefault("use_query_string", false);
this.ensureDefault("requeue_on_error", false); this.ensureDefault("requeue_on_error", false);
this.ensureDefault("http_success", []);
this.ensureDefault("assume_success_timeout", 0);
// File Settings // File Settings
this.ensureDefault("file_types", "*.*"); this.ensureDefault("file_types", "*.*");
@ -117,7 +154,10 @@ SWFUpload.prototype.initSettings = function () {
this.ensureDefault("button_text_left_padding", 0); this.ensureDefault("button_text_left_padding", 0);
this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES); this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES);
this.ensureDefault("button_disabled", false); this.ensureDefault("button_disabled", false);
this.ensureDefault("button_placeholder_id", null); this.ensureDefault("button_placeholder_id", "");
this.ensureDefault("button_placeholder", null);
this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW);
this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW);
// Debug Settings // Debug Settings
this.ensureDefault("debug", false); this.ensureDefault("debug", false);
@ -145,50 +185,21 @@ SWFUpload.prototype.initSettings = function () {
this.customSettings = this.settings.custom_settings; this.customSettings = this.settings.custom_settings;
// Update the flash url if needed // Update the flash url if needed
if (this.settings.prevent_swf_caching) { if (!!this.settings.prevent_swf_caching) {
this.settings.flash_url = this.settings.flash_url + "?swfuploadrnd=" + Math.floor(Math.random() * 999999999); this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime();
}
if (!this.settings.preserve_relative_urls) {
//this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url); // Don't need to do this one since flash doesn't look at it
this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url);
this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url);
} }
delete this.ensureDefault; delete this.ensureDefault;
}; };
// Private: loadFlash replaces the button_placeholder element with the flash movie.
SWFUpload.prototype.loadFlash = function () { SWFUpload.prototype.loadFlash = function () {
if (this.settings.button_placeholder_id !== "") {
this.replaceWithFlash();
} else {
this.appendFlash();
}
};
// Private: appendFlash gets the HTML tag for the Flash
// It then appends the flash to the body
SWFUpload.prototype.appendFlash = function () {
var targetElement, container;
// Make sure an element with the ID we are going to use doesn't already exist
if (document.getElementById(this.movieName) !== null) {
throw "ID " + this.movieName + " is already in use. The Flash Object could not be added";
}
// Get the body tag where we will be adding the flash movie
targetElement = document.getElementsByTagName("body")[0];
if (targetElement == undefined) {
throw "Could not find the 'body' element.";
}
// Append the container and load the flash
container = document.createElement("div");
container.style.width = "1px";
container.style.height = "1px";
container.style.overflow = "hidden";
targetElement.appendChild(container);
container.innerHTML = this.getFlashHTML(); // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
};
// Private: replaceWithFlash replaces the button_placeholder element with the flash movie.
SWFUpload.prototype.replaceWithFlash = function () {
var targetElement, tempParent; var targetElement, tempParent;
// Make sure an element with the ID we are going to use doesn't already exist // Make sure an element with the ID we are going to use doesn't already exist
@ -197,10 +208,10 @@ SWFUpload.prototype.replaceWithFlash = function () {
} }
// Get the element where we will be placing the flash movie // Get the element where we will be placing the flash movie
targetElement = document.getElementById(this.settings.button_placeholder_id); targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;
if (targetElement == undefined) { if (targetElement == undefined) {
throw "Could not find the placeholder element."; throw "Could not find the placeholder element: " + this.settings.button_placeholder_id;
} }
// Append the container and load the flash // Append the container and load the flash
@ -208,15 +219,18 @@ SWFUpload.prototype.replaceWithFlash = function () {
tempParent.innerHTML = this.getFlashHTML(); // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers) tempParent.innerHTML = this.getFlashHTML(); // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement); targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement);
// Fix IE Flash/Form bug
if (window[this.movieName] == undefined) {
window[this.movieName] = this.getMovieElement();
}
}; };
// Private: getFlashHTML generates the object tag needed to embed the flash in to the document // Private: getFlashHTML generates the object tag needed to embed the flash in to the document
SWFUpload.prototype.getFlashHTML = function () { SWFUpload.prototype.getFlashHTML = function () {
var transparent = this.settings.button_image_url === "" ? true : false;
// Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay // Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay
return ['<object id="', this.movieName, '" type="application/x-shockwave-flash" data="', this.settings.flash_url, '" width="', this.settings.button_width, '" height="', this.settings.button_height, '" class="swfupload">', return ['<object id="', this.movieName, '" type="application/x-shockwave-flash" data="', this.settings.flash_url, '" width="', this.settings.button_width, '" height="', this.settings.button_height, '" class="swfupload">',
'<param name="wmode" value="', transparent ? "transparent" : "window", '" />', '<param name="wmode" value="', this.settings.button_window_mode, '" />',
'<param name="movie" value="', this.settings.flash_url, '" />', '<param name="movie" value="', this.settings.flash_url, '" />',
'<param name="quality" value="high" />', '<param name="quality" value="high" />',
'<param name="menu" value="false" />', '<param name="menu" value="false" />',
@ -230,12 +244,15 @@ SWFUpload.prototype.getFlashHTML = function () {
SWFUpload.prototype.getFlashVars = function () { SWFUpload.prototype.getFlashVars = function () {
// Build a string from the post param object // Build a string from the post param object
var paramString = this.buildParamString(); var paramString = this.buildParamString();
var httpSuccessString = this.settings.http_success.join(",");
// Build the parameter string // Build the parameter string
return ["movieName=", encodeURIComponent(this.movieName), return ["movieName=", encodeURIComponent(this.movieName),
"&amp;uploadURL=", encodeURIComponent(this.settings.upload_url), "&amp;uploadURL=", encodeURIComponent(this.settings.upload_url),
"&amp;useQueryString=", encodeURIComponent(this.settings.use_query_string), "&amp;useQueryString=", encodeURIComponent(this.settings.use_query_string),
"&amp;requeueOnError=", encodeURIComponent(this.settings.requeue_on_error), "&amp;requeueOnError=", encodeURIComponent(this.settings.requeue_on_error),
"&amp;httpSuccess=", encodeURIComponent(httpSuccessString),
"&amp;assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout),
"&amp;params=", encodeURIComponent(paramString), "&amp;params=", encodeURIComponent(paramString),
"&amp;filePostName=", encodeURIComponent(this.settings.file_post_name), "&amp;filePostName=", encodeURIComponent(this.settings.file_post_name),
"&amp;fileTypes=", encodeURIComponent(this.settings.file_types), "&amp;fileTypes=", encodeURIComponent(this.settings.file_types),
@ -252,7 +269,8 @@ SWFUpload.prototype.getFlashVars = function () {
"&amp;buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding), "&amp;buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding),
"&amp;buttonTextStyle=", encodeURIComponent(this.settings.button_text_style), "&amp;buttonTextStyle=", encodeURIComponent(this.settings.button_text_style),
"&amp;buttonAction=", encodeURIComponent(this.settings.button_action), "&amp;buttonAction=", encodeURIComponent(this.settings.button_action),
"&amp;buttonDisabled=", encodeURIComponent(this.settings.button_disabled) "&amp;buttonDisabled=", encodeURIComponent(this.settings.button_disabled),
"&amp;buttonCursor=", encodeURIComponent(this.settings.button_cursor)
].join(""); ].join("");
}; };
@ -290,46 +308,54 @@ SWFUpload.prototype.buildParamString = function () {
// Public: Used to remove a SWFUpload instance from the page. This method strives to remove // Public: Used to remove a SWFUpload instance from the page. This method strives to remove
// all references to the SWF, and other objects so memory is properly freed. // all references to the SWF, and other objects so memory is properly freed.
// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state. // Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state.
// Credits: Major improvements provided by steffen
SWFUpload.prototype.destroy = function () { SWFUpload.prototype.destroy = function () {
try { try {
// Make sure Flash is done before we try to remove it // Make sure Flash is done before we try to remove it
this.stopUpload(); this.cancelUpload(null, false);
// Remove the SWFUpload DOM nodes // Remove the SWFUpload DOM nodes
var movieElement = null; var movieElement = null;
try { movieElement = this.getMovieElement();
movieElement = this.getMovieElement();
} catch (ex) {
}
if (movieElement != undefined && movieElement.parentNode != undefined && typeof movieElement.parentNode.removeChild === "function") { if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
var container = movieElement.parentNode; // Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround)
if (container != undefined) { for (var i in movieElement) {
container.removeChild(movieElement); try {
if (container.parentNode != undefined && typeof container.parentNode.removeChild === "function") { if (typeof(movieElement[i]) === "function") {
container.parentNode.removeChild(container); movieElement[i] = null;
} }
} catch (ex1) {}
} }
// Remove the Movie Element from the page
try {
movieElement.parentNode.removeChild(movieElement);
} catch (ex) {}
} }
// Destroy references // Remove IE form fix reference
window[this.movieName] = null;
// Destroy other references
SWFUpload.instances[this.movieName] = null; SWFUpload.instances[this.movieName] = null;
delete SWFUpload.instances[this.movieName]; delete SWFUpload.instances[this.movieName];
delete this.movieElement; this.movieElement = null;
delete this.settings; this.settings = null;
delete this.customSettings; this.customSettings = null;
delete this.eventQueue; this.eventQueue = null;
delete this.movieName; this.movieName = null;
delete window[this.movieName];
return true; return true;
} catch (ex1) { } catch (ex2) {
return false; return false;
} }
}; };
// Public: displayDebugInfo prints out settings and configuration // Public: displayDebugInfo prints out settings and configuration
// information about this SWFUpload instance. // information about this SWFUpload instance.
// This function (and any references to it) can be deleted when placing // This function (and any references to it) can be deleted when placing
@ -344,6 +370,9 @@ SWFUpload.prototype.displayDebugInfo = function () {
"\t", "upload_url: ", this.settings.upload_url, "\n", "\t", "upload_url: ", this.settings.upload_url, "\n",
"\t", "flash_url: ", this.settings.flash_url, "\n", "\t", "flash_url: ", this.settings.flash_url, "\n",
"\t", "use_query_string: ", this.settings.use_query_string.toString(), "\n", "\t", "use_query_string: ", this.settings.use_query_string.toString(), "\n",
"\t", "requeue_on_error: ", this.settings.requeue_on_error.toString(), "\n",
"\t", "http_success: ", this.settings.http_success.join(", "), "\n",
"\t", "assume_success_timeout: ", this.settings.assume_success_timeout, "\n",
"\t", "file_post_name: ", this.settings.file_post_name, "\n", "\t", "file_post_name: ", this.settings.file_post_name, "\n",
"\t", "post_params: ", this.settings.post_params.toString(), "\n", "\t", "post_params: ", this.settings.post_params.toString(), "\n",
"\t", "file_types: ", this.settings.file_types, "\n", "\t", "file_types: ", this.settings.file_types, "\n",
@ -356,6 +385,7 @@ SWFUpload.prototype.displayDebugInfo = function () {
"\t", "prevent_swf_caching: ", this.settings.prevent_swf_caching.toString(), "\n", "\t", "prevent_swf_caching: ", this.settings.prevent_swf_caching.toString(), "\n",
"\t", "button_placeholder_id: ", this.settings.button_placeholder_id.toString(), "\n", "\t", "button_placeholder_id: ", this.settings.button_placeholder_id.toString(), "\n",
"\t", "button_placeholder: ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n",
"\t", "button_image_url: ", this.settings.button_image_url.toString(), "\n", "\t", "button_image_url: ", this.settings.button_image_url.toString(), "\n",
"\t", "button_width: ", this.settings.button_width.toString(), "\n", "\t", "button_width: ", this.settings.button_width.toString(), "\n",
"\t", "button_height: ", this.settings.button_height.toString(), "\n", "\t", "button_height: ", this.settings.button_height.toString(), "\n",
@ -412,33 +442,23 @@ SWFUpload.prototype.callFlash = function (functionName, argumentArray) {
argumentArray = argumentArray || []; argumentArray = argumentArray || [];
var movieElement = this.getMovieElement(); var movieElement = this.getMovieElement();
var returnValue; var returnValue, returnString;
if (typeof movieElement[functionName] === "function") { // Flash's method if calling ExternalInterface methods (code adapted from MooTools).
// We have to go through all this if/else stuff because the Flash functions don't have apply() and only accept the exact number of arguments. try {
if (argumentArray.length === 0) { returnString = movieElement.CallFunction('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>');
returnValue = movieElement[functionName](); returnValue = eval(returnString);
} else if (argumentArray.length === 1) { } catch (ex) {
returnValue = movieElement[functionName](argumentArray[0]); throw "Call to " + functionName + " failed";
} else if (argumentArray.length === 2) { }
returnValue = movieElement[functionName](argumentArray[0], argumentArray[1]);
} else if (argumentArray.length === 3) { // Unescape file post param values
returnValue = movieElement[functionName](argumentArray[0], argumentArray[1], argumentArray[2]); if (returnValue != undefined && typeof returnValue.post === "object") {
} else { returnValue = this.unescapeFilePostParams(returnValue);
throw "Too many arguments";
}
// Unescape file post param values
if (returnValue != undefined && typeof returnValue.post === "object") {
returnValue = this.unescapeFilePostParams(returnValue);
}
return returnValue;
} else {
throw "Invalid function name: " + functionName;
} }
};
return returnValue;
};
/* ***************************** /* *****************************
-- Flash control methods -- -- Flash control methods --
@ -446,17 +466,19 @@ SWFUpload.prototype.callFlash = function (functionName, argumentArray) {
to operate SWFUpload to operate SWFUpload
***************************** */ ***************************** */
// WARNING: this function does not work in Flash Player 10
// Public: selectFile causes a File Selection Dialog window to appear. This // Public: selectFile causes a File Selection Dialog window to appear. This
// dialog only allows 1 file to be selected. WARNING: this function does not work in Flash Player 10 // dialog only allows 1 file to be selected.
SWFUpload.prototype.selectFile = function () { SWFUpload.prototype.selectFile = function () {
this.callFlash("SelectFile"); this.callFlash("SelectFile");
}; };
// WARNING: this function does not work in Flash Player 10
// Public: selectFiles causes a File Selection Dialog window to appear/ This // Public: selectFiles causes a File Selection Dialog window to appear/ This
// dialog allows the user to select any number of files // dialog allows the user to select any number of files
// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names. // Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names.
// If the selection name length is too long the dialog will fail in an unpredictable manner. There is no work-around // If the selection name length is too long the dialog will fail in an unpredictable manner. There is no work-around
// for this bug. WARNING: this function does not work in Flash Player 10 // for this bug.
SWFUpload.prototype.selectFiles = function () { SWFUpload.prototype.selectFiles = function () {
this.callFlash("SelectFiles"); this.callFlash("SelectFiles");
}; };
@ -468,11 +490,14 @@ SWFUpload.prototype.startUpload = function (fileID) {
this.callFlash("StartUpload", [fileID]); this.callFlash("StartUpload", [fileID]);
}; };
/* Cancels a the file upload. You must specify a file_id */ // Public: cancelUpload cancels any queued file. The fileID parameter may be the file ID or index.
// Public: cancelUpload cancels any queued file. The fileID parameter // If you do not specify a fileID the current uploading file or first file in the queue is cancelled.
// must be specified. // If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter.
SWFUpload.prototype.cancelUpload = function (fileID) { SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) {
this.callFlash("CancelUpload", [fileID]); if (triggerErrorEvent !== false) {
triggerErrorEvent = true;
}
this.callFlash("CancelUpload", [fileID, triggerErrorEvent]);
}; };
// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue. // Public: stopUpload stops the current upload and requeues the file at the beginning of the queue.
@ -592,6 +617,22 @@ SWFUpload.prototype.setRequeueOnError = function (requeueOnError) {
this.callFlash("SetRequeueOnError", [requeueOnError]); this.callFlash("SetRequeueOnError", [requeueOnError]);
}; };
// Public: setHTTPSuccess changes the http_success setting
SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) {
if (typeof http_status_codes === "string") {
http_status_codes = http_status_codes.replace(" ", "").split(",");
}
this.settings.http_success = http_status_codes;
this.callFlash("SetHTTPSuccess", [http_status_codes]);
};
// Public: setHTTPSuccess changes the http_success setting
SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) {
this.settings.assume_success_timeout = timeout_seconds;
this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]);
};
// Public: setDebugEnabled changes the debug_enabled setting // Public: setDebugEnabled changes the debug_enabled setting
SWFUpload.prototype.setDebugEnabled = function (debugEnabled) { SWFUpload.prototype.setDebugEnabled = function (debugEnabled) {
this.settings.debug_enabled = debugEnabled; this.settings.debug_enabled = debugEnabled;
@ -649,6 +690,12 @@ SWFUpload.prototype.setButtonAction = function (buttonAction) {
this.callFlash("SetButtonAction", [buttonAction]); this.callFlash("SetButtonAction", [buttonAction]);
}; };
// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button
SWFUpload.prototype.setButtonCursor = function (cursor) {
this.settings.button_cursor = cursor;
this.callFlash("SetButtonCursor", [cursor]);
};
/* ******************************* /* *******************************
Flash Event Interfaces Flash Event Interfaces
These functions are used by Flash to trigger the various These functions are used by Flash to trigger the various
@ -725,21 +772,65 @@ SWFUpload.prototype.unescapeFilePostParams = function (file) {
return file; return file;
}; };
// Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working)
SWFUpload.prototype.testExternalInterface = function () {
try {
return this.callFlash("TestExternalInterface");
} catch (ex) {
return false;
}
};
// Private: This event is called by Flash when it has finished loading. Don't modify this.
// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded.
SWFUpload.prototype.flashReady = function () { SWFUpload.prototype.flashReady = function () {
// Check that the movie element is loaded correctly with its ExternalInterface methods defined // Check that the movie element is loaded correctly with its ExternalInterface methods defined
var movieElement = this.getMovieElement(); var movieElement = this.getMovieElement();
if (typeof movieElement.StartUpload !== "function") {
throw "ExternalInterface methods failed to initialize."; if (!movieElement) {
this.debug("Flash called back ready but the flash movie can't be found.");
return;
} }
// Fix IE Flash/Form bug this.cleanUp(movieElement);
if (window[this.movieName] == undefined) {
window[this.movieName] = movieElement;
}
this.queueEvent("swfupload_loaded_handler"); this.queueEvent("swfupload_loaded_handler");
}; };
// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE.
// This function is called by Flash each time the ExternalInterface functions are created.
SWFUpload.prototype.cleanUp = function (movieElement) {
// Pro-actively unhook all the Flash functions
try {
if (this.movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");
for (var key in movieElement) {
try {
if (typeof(movieElement[key]) === "function") {
movieElement[key] = null;
}
} catch (ex) {
}
}
}
} catch (ex1) {
}
// Fix Flashes own cleanup code so if the SWFMovie was removed from the page
// it doesn't display errors.
window["__flash__removeCallback"] = function (instance, name) {
try {
if (instance) {
instance[name] = null;
}
} catch (flashEx) {
}
};
};
/* This is a chance to do something before the browse window opens */ /* This is a chance to do something before the browse window opens */
SWFUpload.prototype.fileDialogStart = function () { SWFUpload.prototype.fileDialogStart = function () {
@ -762,8 +853,8 @@ SWFUpload.prototype.fileQueueError = function (file, errorCode, message) {
/* Called after the file dialog has closed and the selected files have been queued. /* Called after the file dialog has closed and the selected files have been queued.
You could call startUpload here if you want the queued files to begin uploading immediately. */ You could call startUpload here if you want the queued files to begin uploading immediately. */
SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued) { SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) {
this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued]); this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]);
}; };
SWFUpload.prototype.uploadStart = function (file) { SWFUpload.prototype.uploadStart = function (file) {
@ -803,9 +894,9 @@ SWFUpload.prototype.uploadError = function (file, errorCode, message) {
this.queueEvent("upload_error_handler", [file, errorCode, message]); this.queueEvent("upload_error_handler", [file, errorCode, message]);
}; };
SWFUpload.prototype.uploadSuccess = function (file, serverData) { SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) {
file = this.unescapeFilePostParams(file); file = this.unescapeFilePostParams(file);
this.queueEvent("upload_success_handler", [file, serverData]); this.queueEvent("upload_success_handler", [file, serverData, responseReceived]);
}; };
SWFUpload.prototype.uploadComplete = function (file) { SWFUpload.prototype.uploadComplete = function (file) {

View file

@ -57,6 +57,7 @@ function XEUploaderStart(obj) {
debug: false, debug: false,
// Button settings // Button settings
button_window_mode: 'transparent',
button_placeholder_id: dummy.id, button_placeholder_id: dummy.id,
button_text: null, button_text: null,
button_image_url: "", button_image_url: "",