function SWFUpload(settings) {
    try {
        document.execCommand('BackgroundImageCache', false, true);
    }
    catch(e) {}
    this.movieName = "SWFUpload_" + SWFUpload.movieCount ++ ;
    this.init(settings);
    this.loadFlash();
    if (this.debug)
        this.debugSettings();
}
SWFUpload.movieCount = 0;
SWFUpload.handleErrors = function(errcode, file, msg) {
    switch(errcode) {
        case - 10: alert("Error Code: HTTP Error, File name: " + file.name + ", Message: " + msg);
        break;
        case - 20: alert("Error Code: No upload script, File name: " + file.name + ", Message: " + msg);
        break;
        case - 30: alert("Error Code: IO Error, File name: " + file.name + ", Message: " + msg);
        break;
        case - 40: alert("Error Code: Security Error, File name: " + file.name + ", Message: " + msg);
        break;
        case - 50: 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);
    this.addSetting("target", settings["target"], "");
    this.addSetting("create_ui", settings["create_ui"], false);
    this.addSetting("browse_link_class", settings["browse_link_class"], "SWFBrowseLink");
    this.addSetting("upload_link_class", settings["upload_link_class"], "SWFUploadLink");
    this.addSetting("browse_link_innerhtml", settings["browse_link_innerhtml"], "<span>Browse...</span>");
    this.addSetting("upload_link_innerhtml", settings["upload_link_innerhtml"], "<span>Upload</span>");
    this.addSetting("flash_loaded_callback", settings["flash_loaded_callback"], "SWFUpload.flashLoaded");
    this.addSetting("upload_file_queued_callback", settings["upload_file_queued_callback"], "");
    this.addSetting("upload_file_start_callback", settings["upload_file_start_callback"], "");
    this.addSetting("upload_file_complete_callback", settings["upload_file_complete_callback"], "");
    this.addSetting("upload_queue_complete_callback", settings["upload_queue_complete_callback"], "");
    this.addSetting("upload_progress_callback", settings["upload_progress_callback"], "");
    this.addSetting("upload_dialog_cancel_callback", settings["upload_dialog_cancel_callback"], "");
    this.addSetting("upload_file_error_callback", settings["upload_file_error_callback"], "SWFUpload.handleErrors");
    this.addSetting("upload_file_cancel_callback", settings["upload_file_cancel_callback"], "");
    this.addSetting("upload_queue_cancel_callback", settings["upload_queue_cancel_callback"], "");
    this.addSetting("upload_script", escape(settings["upload_script"], ""));
    this.addSetting("auto_upload", settings["auto_upload"], true);
    this.addSetting("allowed_filetypes", settings["allowed_filetypes"], "*.*");
    this.addSetting("allowed_filetypes_description", settings["allowed_filetypes_description"], "All files");
    this.addSetting("allowed_filesize", settings["allowed_filesize"], 1024);
    this.addSetting("flash_path", settings["flash_path"], "jscripts/SWFUpload/SWFUpload.swf");
    this.addSetting("flash_target", settings["flash_target"], "");
    this.addSetting("flash_width", settings["flash_width"], "1px");
    this.addSetting("flash_height", settings["flash_height"], "1px");
    this.addSetting("flash_color", settings["flash_color"], "#000000");
    this.debug = this.getSetting("debug");
};
SWFUpload.prototype.loadFlash = function() {
    var html = "";
    var sb = new stringBuilder();
    if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) {
        sb.append('<embed type="application/x-shockwave-flash" src="' + this.getSetting("flash_path") + '" width="' + this.getSetting("flash_width") + '" height="' + this.getSetting("flash_height") + '"');
        sb.append(' id="' + this.movieName + '" name="' + this.movieName + '" ');
        sb.append('bgcolor="' + this.getSetting["flash_color"] + '" quality="high" wmode="transparent" menu="false" flashvars="');
        sb.append(this._getFlashVars());
        sb.append('" />');
    } else {
        sb.append('<object id="' + this.movieName + '" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + this.getSetting("flash_width") + '" height="' + this.getSetting("flash_height") + '">');
        sb.append('<param name="movie" value="' + this.getSetting("flash_path") + '" />');
        sb.append('<param name="bgcolor" value="' + this.getSetting["flash_color"] + '" />');
        sb.append('<param name="quality" value="high" />');
        sb.append('<param name="wmode" value="transparent" />');
        sb.append('<param name="menu" value="false" />');
        sb.append('<param name="flashvars" value="' + this._getFlashVars() + '" />');
        sb.append('</object>');
    }
    var container = document.createElement("div");
    container.style.width = "1px";
    container.style.height = "1px";
    container.style.position = "relative";
    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();
}
SWFUpload.prototype.flashLoaded = function(bool) {
    this.loadUI();
    if (this.debug)
        SWFUpload.debug("Flash called home and is ready.");
};
SWFUpload.prototype.loadUI = function() {
    if (this.getSetting("target") != "" && this.getSetting("target") != "fileinputs") {
        var instance = this;
        var target = document.getElementById(this.getSetting("target"));
        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);
        if (this.getSetting("auto_upload") == false) {
            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);
};
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);
    };
};
