function arrowKeyNavigate(control) {
	if (control==null) return;
	try {
		switch (event.keyCode) {
			case 37:
				var cell = getCell(control);
				if (cell.cellIndex==0) return;
				for (var x=cell.cellIndex-1; x>=0; x--) {
					var findCell = cell.parentElement.cells[x];
					var findInput = getCellInput(findCell);
					if (findInput!=null) { findInput.focus(); return true; break; }
				}
				return true;
				break;
			case 38:
				var cell = getCell(control);
				var row = cell.parentElement;
				if (row.rowIndex == 0) return;
				for (var y=row.rowIndex-1; y>=0; y--) {
					var findRow = row.parentElement.rows[y];
					var findInput = getRowInput(findRow, cell);
					if (findInput!=null) { findInput.focus(); return true; break; }
				}
				return true;
				break;
			case 39:
				var cell = getCell(control);
				if (cell.cellIndex==cell.parentElement.cells.length) return;
				for (var x=cell.cellIndex+1; x<=(cell.parentElement.cells.length-1); x++) {
					var findCell = cell.parentElement.cells[x];
					var findInput = getCellInput(findCell);
					if (findInput!=null) { findInput.focus(); return true; break; }
				}
				return true;
				break;
			case 40:
				var cell = getCell(control);
				var row = cell.parentElement;
				if (row.rowIndex == row.parentElement.rows.length) return;
				for (var y=row.rowIndex+1; y<=(row.parentElement.rows.length-1); y++) {
					var findRow = row.parentElement.rows[y];
					var findInput = getRowInput(findRow, cell);
					if (findInput!=null) { findInput.focus(); return true; break; }
				}
				return true;
				break;
			default:
				return true;
		}
	}
	catch (e) { return true; }
}

function getCell(control) {
	var elem = control;
	for (var x=0; x<10; x++) {
		var cell = elem.parentElement;
		if (cell.tagName=="TD") return cell;
		elem = cell;
	}
	return null;
}

function getCellInput(cell) {
	var input = cell.getElementsByTagName("input");
	if (input.length>0) return input[0];
	input = cell.getElementsByTagName("textarea");
	if (input.length>0) return input[0];
	input = cell.getElementsByTagName("select");
	if (input.length>0) return input[0];
	return null;
}

function getRowInput(row, cell) {
	var targetCellIndex = adjustedTargetCellIndex(cell);
	var cellIndex = adjustedCellIndex(row, targetCellIndex);
	var input = row.cells[cellIndex].getElementsByTagName("input");
	if (input.length>0) return input[0];
	input = row.cells[cellIndex].getElementsByTagName("textarea");
	if (input.length>0) return input[0];
	input = row.cells[cellIndex].getElementsByTagName("select");
	if (input.length>0) return input[0];
	return null;
}

function adjustedTargetCellIndex (cell) {
	if (cell.parentElement.length==1) return 0;
	var cellIndex = cell.cellIndex;
	try {
		for (var x=0; x<cell.cellIndex; x++) {
			var tempCell=cell.parentElement.cells[x];
			if (tempCell==null) break;
			if (tempCell.colSpan>1) { cellIndex += (tempCell.colSpan-1); }
		}
		return cellIndex;
	}
	catch(e) { return cellIndex; }
}

function adjustedCellIndex (row, cellIndex) {
	if (row.cells.length==1) return 0;
	try {
		for (var x=0; x<cellIndex; x++) {
			var cell=row.cells[x];
			if (cell==null) break;
			if (cell.colSpan>1) { cellIndex -= (cell.colSpan-1); }
		}
		return cellIndex;
	}
	catch(e) { return cellIndex; }
}
