  function checkNumber(input, min, max, msg) {
    msg = msg + " field has invalid data: " + input.value;
    
    var str = input.value;
    for (var i = 0; i < str.length; i++) {
        var ch = str.substring(i, i + 1)
        if ((ch < "0" || "9" < ch) && ch != '.') {
            alert(msg);
            return false;
        }
    }
    var num = parseFloat(str)
    if (num < min || max < num) {
        alert(msg + " not in range [" + min + ".." + max + "]");
        return false;
    }
    input.value = str;
    return true;
  }
  
  function computeField(input) {
    if (input.value != null && input.value.length != 0)
        input.value = "" + eval(input.value);
    computeForm(input.form);
  }
  
  function computeForm(form) {
    if ((form.txtYears.value == null || form.txtYears.value.length == 0) ||
        (form.txtInt.value == null || form.txtInt.value.length == 0) ||
        (form.txtPrice.value == null || form.txtPrice.value.length == 0)) {
        return;
    }
  
    if (!checkNumber(form.txtYears, 1, 40, "# of years") ||
        !checkNumber(form.txtInt, .001, 99, "Interest") ||
        !checkNumber(form.txtPrice, 100, 10000000, "Loan Amount")) {
        form.txtInstal.value = "Invalid";
        return;
    }
  
    var i = form.txtInt.value / 100.0 / 12;
    //if (i > 1.0) {
    //  i = i / 100.0;
    //}
    //i /= 12;
    var pow = 1;
    for (var j = 0; j < (12*form.txtYears.value); j++)
      pow = pow * (1 + i);
    form.txtInstal.value = Math.round(((form.txtPrice.value - form.txtDPayment.value) * pow * i) / (pow - 1)*100)/100
  }
