function isFloatNumber(field, errorMsg) {
    str = String(field.value);

    if (str.length == 0) {
        alert(errorMsg);
        return false;
    }

    refString="1234567890.";

    pointCount = 0;
    for (i = 0; i < str.length; i++)  {
        tempChar = str.substring(i, i + 1);
        if (refString.indexOf(tempChar) == -1) {
            alert(errorMsg);
            return false;
        } else
          if (tempChar == '.') {
            pointCount++;
            if (pointCount > 1) {
              alert(errorMsg);
              return false;
            }
          } 
        
    }
    return true;
}


function calculate(button, what) {

  form = button.form;

if (what != 'payment') {
  if(!isFloatNumber(form.payment, "Please specify correct value for payment")) return false;
  payment = eval(form.payment.value);
}
if (what != 'amount') {
  if(!isFloatNumber(form.amount, "Please specify correct value for amount")) return false;
  amount = eval(form.amount.value);
}
if (what != 'rate') {
  if(!isFloatNumber(form.rate, "Please specify correct value for rate")) return false;
  rate = eval(form.rate.value);
  j = rate / 12 / 100;
}
if (what != 'years') {
  if(!isFloatNumber(form.years, "Please specify correct period")) return false;
  years  = eval(form.years.value);
}

 
if (what == 'payment') {
  payment =
      amount * j / (1 - Math.pow(1 + j, - years * 12));
  form.payment.value = format(payment);
} else
if (what == 'years') {

  years = - 1 / 12 * (Math.log(1 - (amount / payment) * j)) /
    Math.log(1 + j);
  form.years.value = format(years);
} else
if (what == 'amount') {

  amount = payment / (j / (1 - Math.pow(1 + j, - years * 12)));
  form.amount.value = format(amount);
} else
if (what == 'rate') {
  rate = findRate(amount, payment, years);
  form.rate.value = format(rate);
}
}

function findRate(amount, payment, years) {
  div = amount / payment;
  j = 0.00833;
  step = -0.00833;
  value =  (1 - Math.pow(1 + j, - years * 12)) / j;
  difference = div - value;

  if (difference > 0) {
    step = -0.000833 * 2;
    plus = true;
  }
  else {
    step = 0.000833 * 2;
    plus = false;
  }
      
  sDif = "";
  iteration = 0;

  while ((iteration < 40) && (Math.abs(difference) > 0.00001)) {
    value = (1 - Math.pow(1 + j, - years * 12)) / j;
    difference = div - value;
//    sDif += " " + iteration + " diff=" + difference + " step=" + step;
//    sDif += " div=" + div + " value=" + value;
    if (difference == 0) break;
    if (((difference > 0) && (!plus)) || ((difference < 0) && (plus))) {
         step *= -0.5;
         plus = !plus;
    }
    j += step;

    iteration++;
  }
//  document.forms[0].debug.value = sDif;
  return j * 100 * 12;
}

function format(number) {
  number = Math.round(number * 100) / 100;

  str = new String(number);
  i = str.indexOf(".");
  if (i == -1)
    return str + ".00";


  len = str.length;
  if (len - i < 3)
    str += "0";

  return str;

}
