var lastCalc = 0; 
function fv(p, pmt, n, i) 
{ 
  if (i > 0) 
    return p * Math.pow(1 + i, n) + pmt * (Math.pow(1 + i, n) - 1) / i; 
  else 
    return p + n * pmt; 
} 

function nper(p, pmt, i, F) 
{ 
  if (i > 0) 
    return Math.log((F + pmt / i) / (p + pmt / i)) / Math.log(1 + i); 
  else 
    return pmt > 0 ? (F - p) / pmt : 0; 
} 

function calcTerm(form) 
{ 
  var p = parseFloat(form.StartAmt.value); 
  var pmt = parseFloat(form.AddOn.value); 
  var w = form.AddOnFreq.options[form.AddOnFreq.selectedIndex].value; 
  var i = parseFloat(form.rate.value) / 100; 
  var m = form.Compounded.options[form.Compounded.selectedIndex].value; 
  var F = parseFloat(form.accum.value); 
  var y = form.TermLength.options[form.TermLength.selectedIndex].value; 
  if (m > 0) 
    form.term.value = nper(p, pmt * w / m, i / m, F) * y / m; 
  lastCalc = 1; 
  return 0; 
} 

function calcEndAmt(form) 
{ 
  var p = parseFloat(form.StartAmt.value); 
  var pmt = parseFloat(form.AddOn.value); 
  var w = form.AddOnFreq.options[form.AddOnFreq.selectedIndex].value; 
  var i = parseFloat(form.rate.value) / 100; 
  var m = form.Compounded.options[form.Compounded.selectedIndex].value; 
  var n = parseFloat(form.Term.value); 
  var y = form.TermLength.options[form.TermLength.selectedIndex].value; 
 
  if (m > 0 && y > 0) 
    var end = fv(p, pmt * w / m, n * m / y, i / m); 
    form.EndAmt.value = Math.floor(end * 100)/100; 
  lastCalc = 0; 
  return 0; 
} 

function calc(form) 
{ 
  return lastCalc ? calcTerm(form) : calcEndAmt(form); 
}
