function trimInputField(inputField) {
  var strValue = inputField.value;
  inputField.value = strValue.replace (/^\s+/, '').replace (/\s+$/, '');
}

function isInteger(theValue) {
  var flag = true;
  for (var i=0; i < theValue.length; i++) {
    if ((theValue.charAt(i) < "0") || (theValue.charAt(i) > "9"))
      flag = false;
  }
  return flag;
}

function getPrice(priceTDField) {
  var strPrice = priceTDField.firstChild.data;
  var strResult = "";
  for (var i=0; i < strPrice.length; i++) {
    var theChar = strPrice.charAt(i);
    if (((theChar >= "0") &&  (theChar <= "9")) || (theChar == "."))
      strResult = strResult.concat(theChar);
  }
  if (strResult == "")
    return 0;
  else
    return parseFloat(strResult);
}

function getTotalValue(totalTDField) {
  var strValue = totalTDField.firstChild.value;
  if (strValue == "")
    return 0;
  else
    return parseFloat(strValue);
}

function getCell(currTR, cellNum) {
  var currItem = currTR.firstChild;
  while (currItem.tagName != "TD")
    currItem = currItem.nextSibling;
  while (cellNum > 1) {
    cellNum--;
    currItem = currItem.nextSibling;
    while (currItem.tagName != "TD")
      currItem = currItem.nextSibling;
  }
  return currItem;
}

function getNextTR(currTR) {
  do {
    currTR = currTR.nextSibling;
  } while (currTR.tagName != "TR");
  return currTR;
}

function markBadInput(inputField) {
  inputField.style.backgroundColor = "yellow";
}

function markGoodInput(inputField) {
  inputField.style.backgroundColor = "white";
}

function sumColumn() {
  var theSum = 0;
  var currTR = document.getElementById("firstTR");
  var numTDField;
  var totalTDField;
  while (true) {
    numTDField = getCell(currTR,2);
    totalTDField = getCell(currTR,4);
    if (numTDField.firstChild.tagName != "INPUT")
      break;
    theSum += getTotalValue(totalTDField);
    currTR = getNextTR(currTR);
  }
  totalTDField.firstChild.value = theSum.toFixed(2);
}

function calcLine(inputField) {
  trimInputField(inputField);
  var strNum = inputField.value;
  var currTR = inputField.parentNode.parentNode;
  var priceTDField = getCell(currTR,3);
  var price = getPrice(priceTDField);
  var totalTDField = getCell(currTR,4);
  var totalInputField = totalTDField.firstChild;
  markGoodInput(inputField);
  if (strNum == '') {
    totalInputField.value = '';
  } else {
    if (isInteger(strNum)) {
      var intNum = parseInt(strNum);
      if (! isNaN(intNum)) {
        totalInputField.value = (intNum * price).toFixed(2);
      }
    } else {
      markBadInput(inputField);
    }
  }
  sumColumn();
}

function calcTable() {
  var currTR = document.getElementById("firstTR");
  var numTDField;
  var totalTDField;
  var numInputField;
  var strNum;
  var intNum;
  while (true) {
    numTDField = getCell(currTR,2);
    numInputField = numTDField.firstChild;
    if (numInputField.tagName != "INPUT")
      break;
    calcLine(numInputField);      
    currTR = getNextTR(currTR);
  }
  sumColumn();
}
