function addProgressBar(taskID, text)
{
	var progressID = "Transfer"+taskID;
	var progressTable = document.getElementById("progress");
	
	if (progressTable===null) {
		return;
	}
	
	var progressRow = progressTable.insertRow(0);
	progressRow.id = progressID + "-row";
	
	var textCell = progressRow.insertCell(0);
	textCell.className = "progressText";
	textCell.id = progressID + "-text";
	textCell.appendChild(document.createTextNode(text));
//	textCell.innerHTML = text + " <a href=\"javascript:cancelTransfer();\"><img src=\"images/stop.png\" border=0></a>";
	
	var barCell = progressRow.insertCell(1);
	barCell.width = "100%";
	
	var barTable = barCell.appendChild(document.createElement("table"));
	barTable.className = "progressBar";
	barTable.id = progressID + "-bar";
	
	var barRow = barTable.insertRow(0);
	
	var leftBarCell = barRow.insertCell(0);
	leftBarCell.className = "progressBarFilled";
	leftBarCell.id = progressID + "-left";
	leftBarCell.style.width = "0%";
	
	var rightBarCell = barRow.insertCell(1);
	rightBarCell.className = "progressBarUnfilled";
	rightBarCell.id = progressID + "-right";
	rightBarCell.style.width = "100%";
		
	var cancelCell = progressRow.insertCell(2);
	var cancelLink = cancelCell.appendChild(document.createElement("a"));
	cancelLink.id = progressID + "-cancelLink";
	cancelLink.href = "javascript:cancelTransfer(" + taskID + ");";
	
	var cancelImage = cancelLink.appendChild(document.createElement("img"));
	cancelImage.id = progressID + "-cancelImage";
	cancelImage.border = "0px";
	cancelImage.src = "images/stop.png";
	
	return progressRow;
}

function setProgress(taskID, percentage)
{
	var progressID = "Transfer" + taskID;
	
	var barTable = document.getElementById(progressID+"-bar");
	if (barTable===null)
		return;
	
	var leftBarCell = document.getElementById(progressID+"-left");
	leftBarCell.style.width = percentage + "%";
	
	var rightBarCell = document.getElementById(progressID+"-right");
	rightBarCell.style.width = (100-percentage) + "%";
}

function completeProgressBar(taskID, success, text, errorMessage)
{
	var progressID = "Transfer" + taskID;
	var progressTable = document.getElementById("progress");
	
	if (progressTable===null)
		return;
		
	var barTable = document.getElementById(progressID+"-bar");
	var progressRow = document.getElementById(progressID + "-row");
	var textCell = document.getElementById(progressID + "-text");
	var progressBar = document.getElementById(progressID + "-left");
	var cancelImage = document.getElementById(progressID + "-cancelImage");
	var cancelLink = document.getElementById(progressID + "-cancelLink");

	// complete progress bar	
	barTable.rows[0].deleteCell(1);
	if (success) {
		cancelImage.src = "images/accept.png";
		cancelLink.href = "javascript:ftp.alert(\"Transfer complete.\")";
		progressBar.className = "progressBarFilled progressBarSucceeded";
	} else {
		cancelImage.src = "images/exclamation.png";
		var safeErrorMessage = escape(errorMessage.replace(/\\/g,"\\\\"));
		cancelLink.href = "javascript:ftp.alert(\"Transfer failed!    " + safeErrorMessage + ".\")";
		progressBar.className = "progressBarFilled progressBarFailed";
	}
	
	// change text
	var textNode = textCell.childNodes[0];
	textNode.parentNode.replaceChild(document.createTextNode(text), textNode);
	
	// reorder rows
	var rowIndex = -1;
	var lastActive = -1;
	for (var i=0; i<progressTable.rows.length; i++) {
		var r = progressTable.rows[i];
		if (r.id==progressRow.id)
			rowIndex = i;
		var t = getTaskIDFromRowID(r.id);
		if (transfers.find("taskID", t)===null)
			break;
		lastActive = i;
	}
	if (lastActive===rowIndex)
		return;
	var clonedRow = progressRow.cloneNode(true);
	progressTable.deleteRow(rowIndex);
	var newRow = progressTable.insertRow(lastActive);
	newRow.parentNode.replaceChild(clonedRow, newRow);
}

function getTaskIDFromRowID(rowID) 
{
	var s = rowID.substring("Transfer".length);
	return parseInt(s);
}

function removeProgressBar(progressID)
{
	var progressTable = document.getElementById("progress");
	
	if (progressTable===null) {
		return;
	}
	for (var i=0; i<progressTable.rows.length; i++) {
		if (progressTable.rows[i].id==progressID) {
			break;
		}
	}
	if (i<progressTable.rows.length) {
		progressTable.deleteRow(i);
	}
}

function removeAllProgressBars()
{
	var progressTable = document.getElementById("progress");
	if (progressTable!==null)
		while (progressTable.rows.length>0)
			progressTable.deleteRow(0);
}

function removeInactiveProgressBars()
{
	var progressTable = document.getElementById("progress");
	if (progressTable!==null) {
		for (var i=0; i<progressTable.rows.length; ) {
		var r = progressTable.rows[i];
			var t = getTaskIDFromRowID(r.id);
			if (transfers.find("taskID", t)===null)
				progressTable.deleteRow(i);
			else
				i++;
		}
	}
}

function cancelTransfer(taskID)
{
	ftp.cancelTransfer(taskID);
}

