
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;
}

// format for ',' and '$'
function formatNumber(x, bDollarSign)
{
    bStartLooking = false;
    place = 0;
    sgn = (x < 0);
    x = Math.abs(x);
    x = Math.floor((x * 100) + .5);

    i = 3;
    y = "";
    while(((i--) > 0) || (x > 0))
        {
            y = (x % 10) + y;
            x = Math.floor(x / 10);

            // if it's the thirds place, and there are numbers left,
            // put in a comma
            if (place == 3 && x != 0)
            {
                y = "," + y;
                place = 0;
            }

            if(i == 1)
            {
                y = "." + y;
                bStartLooking = true;
            }

            // monitor number going by starting at the '.'
            if (bStartLooking == true)
            {
                place++;
            }
        }
    if(sgn)
    {
        y = "-" + y;
    }

    // input fields don't need the dollar sign
    if (bDollarSign)
        return("$"+y);
    else
    {
        var outStr = y.substring(0, (y.length-3));
        return(outStr)
    }
}

// removes any ',' and '.' from edit fields
function scrubInput(input)
{
  var str = input.value;
  var outStr = "";

  for (var i = 0; i < str.length; i++)
  {
    var ch = str.substring(i, i + 1);
    if ((ch < "0" || ch > "9") && ch != '.')
    {
      continue;
    }

    // we're done when we hit the fractional part
    if (ch == '.')
        break;

    outStr = outStr + str.substring(i, i + 1);
  }

  return outStr;
}

function computeForm(form) {

    if (validateForm(form))
    {
        var curRetSavings = form.savNow.value
        var yearsTo = form.yearsTo.value;
        var yearsLive = form.yearsLive.value;

        var rateOfReturn = form.RateOfReturn.value / 100.0;
        var inflationRate = form.InflationRate.value / 100.0;
        var desiredIncome = form.desInc.value;

        // Present Value of Desired Annual Income
        var PVDAI = 0.0;
        var requiredAnnualCont = 0.0;

        if (rateOfReturn == inflationRate) {
            PVDAI = desiredIncome * yearsLive;
            requiredAnnualCont = (PVDAI - curRetSavings) / yearsTo;
        }
        else {
            var calc = (1/(1+(rateOfReturn-inflationRate)));
            var numerator = (1 - Math.pow(calc, yearsLive));
            var denominator = rateOfReturn - inflationRate;

            PVDAI = desiredIncome * (numerator / denominator);

            numerator = PVDAI - (curRetSavings * (Math.pow((1 + (rateOfReturn-inflationRate)), yearsTo)));
            denominator = (Math.pow((1 + (rateOfReturn - inflationRate)), yearsTo) - 1) /
                                ((rateOfReturn-inflationRate) / (1+(rateOfReturn-inflationRate)));
            requiredAnnualCont = numerator / denominator;
        }

        // display answer
        form.deposit.value = formatNumber(requiredAnnualCont, true);

        if (rateOfReturn == 0) {
            var estSavingsGoal = requiredAnnualCont * yearsTo;
        }
        else {
            numerator = requiredAnnualCont * (Math.pow((1 + rateOfReturn), yearsTo)-1);
            denominator = rateOfReturn / (1+rateOfReturn)
            var estSavingsGoal = (numerator / denominator) + (curRetSavings*(Math.pow((1 + rateOfReturn), yearsTo)));
        }

        form.nestegg.value = formatNumber(estSavingsGoal, true);

        // also reformat the input fields
        form.savNow.value = formatNumber(form.savNow.value, false);
        form.desInc.value = formatNumber(form.desInc.value, false);
    }
}

function clearForm(form) {
    form.savNow.value = "0";
    form.yearsTo.value = "25";
    form.yearsLive.value = "30";
    form.InflationRate.value = "4.00";
    form.RateOfReturn.value = "9.00";
    form.desInc.value = "40000";
    form.nestegg.value = "";
    form.deposit.value = "";
}

function validateForm(form)
{
    // remove ',' if need be
    form.savNow.value = scrubInput(form.savNow);
    form.desInc.value = scrubInput(form.desInc);

    if (!checkNumber(form.InflationRate, 0.0, 20.0, "Inflation Rate ") ||
        !checkNumber(form.RateOfReturn, 0.0, 12.0, "Rate of Return "))
        {
            return false;
        }

  return true;
}


