function registerFTPEvents(ftp) {
    ftp.onInitialize = ftp_onInitialize;
    ftp.onConnect = ftp_onConnect;
    ftp.onDisconnect = ftp_onDisconnect;
    ftp.onChangeDirectory = ftp_onChangeDirectory;
    ftp.onCreateDirectory = ftp_onCreateDirectory;
    ftp.onDirectoryList = ftp_onDirectoryList;
    ftp.onDownloadFile = ftp_onDownloadFile;
    ftp.onUploadFile = ftp_onUploadFile;
    ftp.onError = ftp_onError;
    ftp.onDeleteFile = ftp_onDeleteFile;
    ftp.onDeleteDirectory = ftp_onDeleteDirectory;
    ftp.onRename = ftp_onRename;
    ftp.onTransferProgress = ftp_onTransferProgress;
    ftp.onLocalDirectoryList = ftp_onLocalDirectoryList;
    ftp.onLocalDeleteFile = ftp_onLocalDeleteFile;
    ftp.onLocalRename = ftp_onLocalRename;
    ftp.onLocalCreateDirectory = ftp_onLocalCreateDirectory;
}

function ftp_onInitialize(status) {
    connectButton.disabled = false;
    if (status.success) {
        localPreviousValidDir = ""; //ftp.getLocalHomeDirectory();
        if (localDirTextBox !== null && localDirTextBox.value.trim() !== "") {
            localWorkDir = localDirTextBox.value.trim();
        } else {
            localWorkDir = localPreviousValidDir;
        }
        localDirRefresh(localWorkDir);
        registerMimeTypes();

        connectButton.value = "Connect";
        setStatus("Initialization complete.  Getting local file-list...", false);

        // ftp.setLogLevel("ALL");
        ftp.setTemplateURLs(getURLBase() + "/localview.html", getURLBase() + "/localtexteditor.html",
			getURLBase() + "/localhtmleditor.html", getURLBase() + "/remoteview.html",
			getURLBase() + "/remotetexteditor.html", getURLBase() + "/remotehtmleditor.html");
        ftp.setConnectMode("passive");

        connect_clicked();
    } else {
        connectButton.value = initialConnectButtonText;
        setStatus("Could not initialize FTP client!", false, true, true);
    }
}

function registerMimeTypes() {
    ftp.registerMimeType("txt", "text/plain");
    ftp.registerMimeType("php", "text/plain");
    ftp.registerMimeType("pl", "text/plain");
    ftp.registerMimeType("py", "text/plain");
    ftp.registerMimeType("html", "text/html");
    ftp.registerMimeType("htm", "text/html");
    ftp.registerMimeType("js", "text/javascript");
    ftp.registerMimeType("css", "text/css");
    ftp.registerMimeType("jpg", "image/jpeg");
    ftp.registerMimeType("gif", "image/gif");
    ftp.registerMimeType("png", "image/png");
    if (navigator.mimeTypes) {
        for (var i = 0; i < navigator.mimeTypes.length; i++) {
            var type = navigator.mimeTypes[i].type;
            var extensions = navigator.mimeTypes[i].suffixes;
            if (extensions !== null && extensions !== undefined) {
                var extArray = extensions.split(',');
                for (var j = 0; j < extArray.length; j++) {
                    if (extArray[j] != "*" && extArray[j].length > 0) {
                        ftp.registerMimeType(extArray[j], type);
                    }
                }
            }
        }
    }
}

function ftp_onConnect(status) {
    if (status.success) {
        connectButton.value = "Disconnect";
        initialRemoteDir = ""; //ftp.getWorkingDirectory();
        remoteDirRefresh();
        setStatus("Connected to " + ftp.remoteHost + ".", false);
    } else {
        connectButton.value = "Connect";
        setStatus("Could not connect to " + ftp.remoteHost, false, true, true);
    }
    connectButton.disabled = false;
}

function ftp_onDisconnect(status, reasonCode, reasonMessage) {
    remoteEnabled(false);
    connectButton.value = "Connect";
    if (reasonCode === 0) {
        setStatus("Disconnected from " + ftp.remoteHost, true);
    } else {
        setStatus("Disconnected: " + reasonMessage, false, true);
    }
    removeAllProgressBars();
    connectButton.disabled = false;
}

function ftp_onChangeDirectory(status, directory) {
    if (status.success) {
        if (remoteDirTextBox !== null) {
            remoteDirTextBox.value = directory;
        }
        remoteDirRefresh();
        setStatus("Changed server folder to " + directory + ".", false);
    } else {
        remoteDirRefresh();
        setStatus("Could not change server folder to " + directory, false, true, true);
    }
}

function ftp_onCreateDirectory(status, directory) {
    if (status.success) {
        remoteDirRefresh();
        setStatus("Created server folder " + directory + ".", false);
    } else {
        setStatus("Could not create server folder: " + directory, false, true, true);
    }
}

function ftp_onDirectoryList(status, dirPath, files) {
    if (status.success) {
        remoteEnabled(true);

        remoteFileList = files;
        remotePreviousValidDir = remoteWorkDir = dirPath;
        if (remoteDirTextBox !== null) {
            remoteDirTextBox.value = remoteWorkDir;
        }

        if (remoteFrame !== null) {
            remoteRenderFileListFrame(files);
        } else if (remoteListBox !== null) {
            renderFileListBox(remoteListBox, files);
            setStatus("Server:" + remoteWorkDir, false, false);
            isChangingRemoteDirectory = false;
        }

    } else if (remotePreviousValidDir !== null) {
        remoteChangeDirectory(remotePreviousValidDir);
    }
}

function ftp_onDownloadFile(status, fileName) {
    var transfer = null;
    var needRefresh = true;
    var statusText = null;
    transfer = transfers.find("taskID", status.taskID);
    if (status.success) {
        statusText = transfer.fileName + " downloaded";
    } else {
        ftp.localDeleteFile(transfer.filePath);
        statusText = transfer.fileName + " download aborted";
    }
    activeDownloads--;
    if (needRefresh && activeDownloads === 0) {
        localDirRefresh(localWorkDir);
        setStatus(statusText + "", true, !status.success, !status.success);
    } else {
        setStatus(statusText, true, !status.success, !status.success);
    }
    completeProgressBar(status.taskID, status.success, statusText, status.errorMessage);
    transfers.remove("taskID", status.taskID);
}

function ftp_onUploadFile(status, fileName) {
    var statusText = null;
    var transfer = transfers.find("taskID", status.taskID);
    if (status.success) {
        statusText = transfer.fileName + " uploaded";
    } else {
        ftp.deleteFile(transfer.fileName);
        statusText = transfer.fileName + " upload aborted";
    }
    activeUploads--;
    if (activeUploads === 0) {
        remoteDirRefresh();
        setStatus(statusText + "", true, !status.success, !status.success);
    } else {
        setStatus(statusText, true, !status.success, !status.success);
    }
    completeProgressBar(status.taskID, status.success, statusText, status.errorMessage);
    transfers.remove("taskID", status.taskID);
}

function ftp_onTransferProgress(status, fileName, count) {
    if (status.success) {
        var transfer = transfers.find("taskID", status.taskID);
        if (transfer !== null) {
            setProgress(status.taskID, Math.floor((transfer.offset + count) * 100 / transfer.size));
        }
    }
}

function ftp_onRename(status, fromFileName, toFileName) {
    if (status.success) {
        remoteDirRefresh();
        setStatus("Renamed " + fromFileName + " to " + toFileName + ".", false);
    } else {
        setStatus("Could not rename " + fromFileName, false, true, true);
    }
}

function ftp_onDeleteFile(status, fileName) {
    if (status.success) {
        var shouldUpdateDirList = status.tag;
        if (shouldUpdateDirList) {
            remoteDirRefresh();
        }
        setStatus("Deleted " + fileName + ".", false);
    } else {
        setStatus("Could not delete " + fileName, false, true, true);
    }
}

function ftp_onDeleteDirectory(status, fileName) {
    if (status.success) {
        var shouldUpdateDirList = status.tag;
        if (shouldUpdateDirList) {
            remoteDirRefresh();
        }
        setStatus("Deleted " + fileName + ".", false);
    } else {
        setStatus("Could not delete " + fileName, false, true, true);
    }
}

function ftp_onLocalDirectoryList(status, path, files) {
    if (status.success) {
        localEnabled(true);

        localFileList = files;
        if (localDirTextBox !== null) {
            localDirTextBox.value = path;
        }
        localPreviousValidDir = localWorkDir = path;

        if (localFrame !== null) {
            localRenderFileListFrame(files);
        } else if (localListBox !== null) {
            renderFileListBox(localListBox, files);
            setStatus("Local:" + localWorkDir, false);
            isChangingLocalDirectory = false;
        }
    } else {
        if (localPreviousValidDir !== null) {
            localChangeDirectory(localPreviousValidDir);
        }
    }
}

function ftp_onLocalRename(status, fromFileName, toFileName) {
    if (status.success) {
        localDirRefresh(localWorkDir);
        setStatus("Renamed " + fromFileName + " to " + toFileName + ".", false);
    } else {
        setStatus("Could not rename " + fromFileName, false, true, true);
    }
}

function ftp_onLocalDeleteFile(status, fileName) {
    if (status.success) {
        var shouldUpdateDirList = status.tag;
        if (shouldUpdateDirList) {
            localDirRefresh(localWorkDir);
        }
        setStatus("Deleted " + fileName + ".", false);
    } else {
        setStatus("Could not delete " + fileName, false, true, true);
    }
}

function ftp_onLocalCreateDirectory(status, directoryPath) {
    if (status.success) {
        localDirRefresh(localWorkDir);
        setStatus("Created local folder " + directoryPath + ".", false);
    } else {
        setStatus("Could not create local folder: " + directoryPath, false, true, true);
    }
}

function ftp_onError(status) {
    setStatus("Error: " + status.errorMessage, false, true);
    //	error(status.errorMessage);
    //	alert(status.errorMessage);
}

