/* Version history 1.0.2 - row 86 - added "escape" to the querystring to keep all the parameters intact */ function SWFUpload(settings) { // Remove background flicker in IE try { document.execCommand('BackgroundImageCache', false, true); } catch(e) {} // Generate the tags ID this.movieName = "SWFUpload_" + SWFUpload.movieCount++; // Load the settings. Load the Flash movie. this.init(settings); this.loadFlash(); if (this.debug) this.debugSettings(); } SWFUpload.movieCount = 0; // Default error handling. SWFUpload.handleErrors = function(errcode, file, msg) { switch(errcode) { case -10: // HTTP error alert("Error Code: HTTP Error, File name: " + file.name + ", Message: " + msg); break; case -20: // No upload script specified alert("Error Code: No upload script, File name: " + file.name + ", Message: " + msg); break; case -30: // IOError alert("Error Code: IO Error, File name: " + file.name + ", Message: " + msg); break; case -40: // Security error alert("Error Code: Security Error, File name: " + file.name + ", Message: " + msg); break; case -50: // Filesize too big alert("Error Code: Filesize exceeds limit, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg); break; } }; SWFUpload.prototype.init = function(settings) { this.settings = []; this.addSetting("debug", settings["debug"], false); // Turn debugging on/off // UI settings this.addSetting("target", settings["target"], ""); // Target for auto-generated upload/browse links this.addSetting("create_ui", settings["create_ui"], false); // Auto-generate UI this.addSetting("browse_link_class", settings["browse_link_class"], "SWFBrowseLink"); // CSS-class given to auto-generated browse link this.addSetting("upload_link_class", settings["upload_link_class"], "SWFUploadLink"); // CSS-class given to auto-generated upload link this.addSetting("browse_link_innerhtml", settings["browse_link_innerhtml"], "Browse..."); // innerHTML for generated browse link, default surround with span for easy css-styling this.addSetting("upload_link_innerhtml", settings["upload_link_innerhtml"], "Upload"); // innerHTML for generated upload link, default surround with span for easy css-styling // Callbacks this.addSetting("flash_loaded_callback", settings["flash_loaded_callback"], "SWFUpload.flashLoaded"); // Invoked when the flash is loaded this.addSetting("upload_file_queued_callback", settings["upload_file_queued_callback"], ""); // Invoked when each file is added to the queue this.addSetting("upload_file_start_callback", settings["upload_file_start_callback"], ""); // Invoked when upload starts this.addSetting("upload_file_complete_callback", settings["upload_file_complete_callback"], ""); // Invoked when each file is completed this.addSetting("upload_queue_complete_callback", settings["upload_queue_complete_callback"], ""); // Invoked when upload queue is complete this.addSetting("upload_progress_callback", settings["upload_progress_callback"], ""); // Called with regular updates on progress.. this.addSetting("upload_dialog_cancel_callback", settings["upload_dialog_cancel_callback"], ""); // Invoked when cancel btn in dialog is clicked this.addSetting("upload_file_error_callback", settings["upload_file_error_callback"], "SWFUpload.handleErrors"); // Invoked on error this.addSetting("upload_file_cancel_callback", settings["upload_file_cancel_callback"], ""); // Invoked when a file upload is cancelled this.addSetting("upload_queue_cancel_callback", settings["upload_queue_cancel_callback"], ""); // Invoked when upload queue is cancelled // SWF Settings this.addSetting("upload_script", escape(settings["upload_script"], "")); // The file that recieves the uploaded files from flash this.addSetting("auto_upload", settings["auto_upload"], false); // Start upload directly or require upload button. this.addSetting("allowed_filetypes", settings["allowed_filetypes"], "*.*"); // List of allowed filetypes this.addSetting("allowed_filetypes_description", settings["allowed_filetypes_description"], "All files"); // Description for allowed filetypes this.addSetting("allowed_filesize", settings["allowed_filesize"], 1024); // Max allowed filesize this.addSetting("flash_path", settings["flash_path"], "jscripts/SWFUpload/SWFUpload.swf"); // Path to flash-file this.addSetting("flash_target", settings["flash_target"], ""); // Where to output the flash (not used) this.addSetting("flash_width", settings["flash_width"], "1px"); // Flash width this.addSetting("flash_height", settings["flash_height"], "1px"); // Flash height this.addSetting("flash_color", settings["flash_color"], "#000000"); // Flash color this.debug = this.getSetting("debug"); // Set debug }; SWFUpload.prototype.loadFlash = function() { var html = ""; var sb = new stringBuilder(); // Create Mozilla Embed HTML if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { // Build the basic embed html sb.append(''); // Create IE Object HTML } else { // Build the basic Object tag sb.append(''); sb.append(''); sb.append(''); sb.append(''); sb.append(''); sb.append(''); sb.append(''); sb.append(''); } // Build the DOM nodes to hold the flash; var container = document.createElement("div"); container.style.width = "0px"; container.style.height = "0px"; container.style.position = "absolute"; container.style.top = "0px"; container.style.left = "0px"; var target_element = document.getElementsByTagName("body")[0]; if (typeof(target_element) == "undefined" || target_element == null) return false; var html = sb.toString(); target_element.appendChild(container); container.innerHTML = html; this.movieElement = document.getElementById(this.movieName); }; SWFUpload.prototype._getFlashVars = function() { var sb = new stringBuilder(); sb.append("uploadScript=" + this.getSetting("upload_script")); sb.append("&allowedFiletypesDescription=" + this.getSetting("allowed_filetypes_description")) sb.append("&flashLoadedCallback=" + this.getSetting("flash_loaded_callback")); sb.append("&uploadFileQueuedCallback=" + this.getSetting("upload_file_queued_callback")); sb.append("&uploadFileStartCallback=" + this.getSetting("upload_file_start_callback")); sb.append("&uploadProgressCallback=" + this.getSetting("upload_progress_callback")); sb.append("&uploadFileCompleteCallback=" + this.getSetting("upload_file_complete_callback")); sb.append("&uploadQueueCompleteCallback=" + this.getSetting("upload_queue_complete_callback")); sb.append("&uploadDialogCancelCallback=" + this.getSetting("upload_dialog_cancel_callback")); sb.append("&uploadFileErrorCallback=" + this.getSetting("upload_file_error_callback")); sb.append("&uploadFileCancelCallback=" + this.getSetting("upload_file_cancel_callback")); sb.append("&uploadQueueCompleteCallback=" + this.getSetting("upload_queue_complete_callback")); sb.append("&autoUpload=" + this.getSetting("auto_upload")); sb.append("&allowedFiletypes=" + this.getSetting("allowed_filetypes")); sb.append("&maximumFilesize=" + this.getSetting("allowed_filesize")); return sb.toString(); } // The callback method that the Flash movie will call when it has been loaded. // This should Load the UI parts. SWFUpload.prototype.flashLoaded = function(bool) { this.loadUI(); if (this.debug) SWFUpload.debug("Flash called home and is ready."); }; // Load the UI elements. Show the UI Target, build the "link" according to the settings, and hide the Degraded Target SWFUpload.prototype.loadUI = function() { if(this.getSetting("target") != "" && this.getSetting("target") != "fileinputs") { var instance = this; var target = document.getElementById(this.getSetting("target")); // Create the link for uploading var browselink = document.createElement("a"); browselink.className = this.getSetting("browse_link_class"); browselink.id = this.movieName + "BrowseBtn"; browselink.href = "javascript:void(0);"; browselink.onclick = function() { instance.browse(); return false; } browselink.innerHTML = this.getSetting("browse_link_innerhtml"); target.innerHTML = ""; target.appendChild(browselink); // Add upload btn if auto upload not used if(this.getSetting("auto_upload") == false) { // Create the link for uploading var uploadlink = document.createElement("a"); uploadlink.className = this.getSetting("upload_link_class"); uploadlink.id = this.movieName + "UploadBtn"; uploadlink.href = "#"; uploadlink.onclick = function() { instance.upload(); return false; } uploadlink.innerHTML = this.getSetting("upload_link_innerhtml"); target.appendChild(uploadlink); } } }; SWFUpload.debug = function(value) { if (window.console) console.log(value); else alert(value); } SWFUpload.prototype.addSetting = function(name, value, default_value) { return this.settings[name] = (typeof(value) == "undefined" || value == null) ? default_value : value; }; SWFUpload.prototype.getSetting = function(name) { return (typeof(this.settings[name]) == "undefined") ? null : this.settings[name]; }; SWFUpload.prototype.browse = function() { this.movieElement.browse(); }; SWFUpload.prototype.upload = function() { this.movieElement.upload(); } SWFUpload.prototype.cancelFile = function(file_id) { this.movieElement.cancelFile(file_id); }; SWFUpload.prototype.cancelQueue = function() { this.movieElement.cancelQueue(); }; SWFUpload.prototype.debugSettings = function() { var sb = new stringBuilder(); sb.append("----- DEBUG SETTINGS START ----\n"); sb.append("ID: " + this.movieElement.id + "\n"); for (var key in this.settings) sb.append(key + ": " + this.settings[key] + "\n"); sb.append("----- DEBUG SETTINGS END ----\n"); sb.append("\n"); var res = sb.toString(); SWFUpload.debug(res); }; /* UTILS */ function stringBuilder(join) { this._strings = new Array; this._join = (typeof join == "undefined") ? "" : join; stringBuilder.prototype.append = function(str) { this._strings.push(str); }; stringBuilder.prototype.toString = function() { return this._strings.join(this._join); }; };