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";
		if (remoteDirTextBox.value==null || remoteDirTextBox.value=="") {
    		initialRemoteDir = "";//ftp.getWorkingDirectory();
    		remoteDirRefresh();
    	} else {
    	   ftp.changeDirectory(remoteDirTextBox.value);
    	}
		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);
}
