function update_number(input)
{
  var temp;

  if (input.value != null && input.value.length != 0)
	if (isNaN(strip_commas(input.value)))
		input.value = "";
	else
  	 	input.value = "" + strip_commas(input.value);
  else
    input.value = "";
}

function strip_commas(input) {
        var newnum;
        var ch;
        newnum ="";
        for(var i=0; i<input.length; i++) {
                ch = input.charAt(i);
                if(ch != ",") {
                        newnum += ch;
        }}
        return parseFloat(newnum);
}

function put_commas(input) {
    var result, len;
    input += "";
    len = input.indexOf(".");
    if(len == -1) {
        len = input.length;
        result = "";
    }
    else {
        result = input.substring(len, input.length);
    }
    while(len > 3) {
        result = input.substring(len-3, len) + result;
        result = "," + result;
        len -= 3;
    }
    result = input.substring(0, len) + result;
    return result;
}

function binomial(a, n)
{
  var i;
  var sum, pow, term, cof;

  if(n < 0)
    return 1.0 / binomial(a, -n);

  sum = 1.0;
  pow = n;
  term = 1;
  cof = 1.0
  for(i = 1; i < 10; i++) {
    cof = cof * pow / i;
    pow = pow - 1.0;
    term = term * a;
    sum = sum + cof * term;
  }

  return sum;
}

function error(P, I, N, Y, M)
{
  var value;

  value = P - M * (1.0 - binomial(I / Y, -N)) / (I / Y);
  return value;
}



function compute_loan(form)
{
  var P, I, N, Y, M;

  if((document.Calculator.loan.value.length == 0) ||
     (document.Calculator.num.value.length == 0) ||
     (document.Calculator.amount.value.length == 0) ||
	 (document.Calculator.loan.value == 0 && document.Calculator.num.value == 0 && document.Calculator.amount.value == 0)) {
    document.Calculator.rate.value = "";
	document.Calculator.total.value = "";
	alert("Not enough information.") }
  else {

  if (document.Calculator.dpayment.value == "") {
			  d = 0
			  document.Calculator.dpayment.value = "0"
			} else {
			    if (document.Calculator.dpaymenttype.options[0].selected) {
				  d=(document.Calculator.dpayment.value)
				} else {
				    if (document.Calculator.dpayment.value >= 0 && document.Calculator.dpayment.value <= 100) {
						if (document.Calculator.loan.value == "") {
							document.Calculator.dpaymenttype.options[0].selected = true;
							document.Calculator.dpayment.select();
	 						document.Calculator.dpayment.focus();
							alert("When calculating purchase price, use $ on Down Payment.");
							return (false);		
						} else {
					      	document.Calculator.dpay_hidden.value = eval((document.Calculator.dpayment.value/100) * strip_commas(document.Calculator.loan.value))
						  	d=document.Calculator.dpay_hidden.value
					    }
					} else {
					  document.Calculator.dpaymenttype.options[0].selected = true;
					  document.Calculator.dpayment.select();
					  document.Calculator.dpayment.focus();
					  alert("Please enter a value between 0 and 100 when using % on Down Payment.");						
					  return (false);
			}}}
			
    I = eval(document.Calculator.rate.value) / 100.0;
    N = eval(document.Calculator.num.value);
    Y = eval(document.Calculator.num_annum.value);
    M = eval(document.Calculator.amount.value);

    if(Y == 0.0) {
      P = 0.0; }
    else {
      P = M * (1.0 - binomial(I / Y, -N)) / (I / Y);
      document.Calculator.loan.value = "" + eval(Math.round((P - d) * 100)/100);
	  document.Calculator.total.value = "$" + put_commas(eval(Math.round((document.Calculator.amount.value * N) * 100)/100));
  }}
}






function compute_rate(form)
{
  var P, I, N, Y, M;

  if((document.Calculator.loan.value.length == 0) ||
     (document.Calculator.num.value.length == 0) ||
     (document.Calculator.amount.value.length == 0) ||
	 (document.Calculator.loan.value == 0 && document.Calculator.num.value == 0 && document.Calculator.amount.value == 0)) {
    document.Calculator.rate.value = "";
	document.Calculator.total.value = "";
	alert("Not enough information.") }
  else {
  
  if (document.Calculator.dpayment.value == "") {
			  d = 0
			  document.Calculator.dpayment.value = "0"
			} else {
			    if (document.Calculator.dpaymenttype.options[0].selected) {
				  d=(document.Calculator.dpayment.value)
				} else {
				    if (document.Calculator.dpayment.value >= 0 && document.Calculator.dpayment.value <= 100) {
				      document.Calculator.dpay_hidden.value = eval((document.Calculator.dpayment.value/100) * strip_commas(document.Calculator.loan.value))
					  d=document.Calculator.dpay_hidden.value
					} else {
					  document.Calculator.dpaymenttype.options[0].selected = true;
					  document.Calculator.dpayment.select();
					  document.Calculator.dpayment.focus();
					  alert("Please enter a value between 0 and 100 when using % on Down Payment.");						
					  return (false);
			}}}
  
    P = eval(document.Calculator.loan.value - d);
    N = eval(document.Calculator.num.value);
    Y = eval(document.Calculator.num_annum.value);
    M = eval(document.Calculator.amount.value);

    if(Y == 0) 
      I = 0.0;
    else {
      var low, high, mid, err_mid;
      var count;

      low  = 0.001;
      high = 10.0;

      count = 0;
      while(count < 30) {
        count = count + 1;
        mid = (high + low) / 2.0;
        err_mid = error(P, mid, N, Y, M);
        if(err_mid == 0.0)
          break;
        if(err_mid < 0.0) {
          low = mid;
          continue;
        }
        if(0.0 < err_mid) {
          high = mid;
          continue;
        }
      }
      I = mid * 100.0;
    }

    document.Calculator.rate.value = "" + eval(Math.round(I * 100)/100);
	document.Calculator.total.value = "$" + put_commas(eval(Math.round((document.Calculator.amount.value * N) * 100)/100));
  }
}

function compute_num(form)
{
  var P, I, N, Y, M;

  if((document.Calculator.loan.value.length == 0) ||
     (document.Calculator.rate.value.length == 0) ||
     (document.Calculator.amount.value.length == 0) ||
	 (document.Calculator.loan.value == 0 && document.Calculator.rate.value == 0 && document.Calculator.amount.value == 0)) {
    document.Calculator.num.value = "";
	document.Calculator.total.value = "";
	alert("Not enough information."); }
  else {
  
  if (document.Calculator.dpayment.value == "") {
			  d = 0
			  document.Calculator.dpayment.value = "0"
			} else {
			    if (document.Calculator.dpaymenttype.options[0].selected) {
				  d=(document.Calculator.dpayment.value)
				} else {
				    if (document.Calculator.dpayment.value >= 0 && document.Calculator.dpayment.value <= 100) {
				      document.Calculator.dpay_hidden.value = eval((document.Calculator.dpayment.value/100) * strip_commas(document.Calculator.loan.value))
					  d=document.Calculator.dpay_hidden.value
					} else {
					  document.Calculator.dpaymenttype.options[0].selected = true;
					  document.Calculator.dpayment.select();
					  document.Calculator.dpayment.focus();
					  alert("Please enter a value between 0 and 100 when using % on Down Payment.");						
					  return (false);
			}}}
  
    P = eval(document.Calculator.loan.value - d);
    I = eval(document.Calculator.rate.value) / 100.0;
    Y = eval(document.Calculator.num_annum.value);
    M = eval(document.Calculator.amount.value);

    if(Y == 0) 
      I = 0.0;
    else {
      var low, high, mid, err_mid;
      var count;

      low  = 0;
      high = 1024;

      count = 0;
      while(count < 10) {
        count = count + 1;
        mid = (high + low) / 2.0;
        err_mid = error(P, I, mid, Y, M);
        if(err_mid == 0.0)
          break;
        if(0.0 < err_mid) {
          low = mid;
          continue;
        }
        if(err_mid < 0.0) {
          high = mid;
          continue;
        }
      }
      N = mid;
    }

    document.Calculator.num.value = "" + N;
	document.Calculator.total.value = "$" + put_commas(eval(Math.round((document.Calculator.amount.value * N) * 100)/100));
  }
}

function compute_amount(form)
{
  var P, I, N, Y, M;

  if ((document.Calculator.loan.value.length == 0) ||
     (document.Calculator.rate.value.length == 0) ||
     (document.Calculator.num.value.length == 0) ||
     (document.Calculator.loan.value == 0 && document.Calculator.rate.value == 0 && document.Calculator.amount.value == 0)) {
    document.Calculator.amount.value = ""
	document.Calculator.total.value = "";
	alert("Not enough information."); }
  else {
  
 			if (document.Calculator.dpayment.value == "") {
			  d = 0
			  document.Calculator.dpayment.value = "0"
			} else {
			    if (document.Calculator.dpaymenttype.options[0].selected) {
				  d = (document.Calculator.dpayment.value)
				} else {
				    
				    if (document.Calculator.dpayment.value >= 0 && document.Calculator.dpayment.value <= 100) {
			    	  document.Calculator.dpay_hidden.value = eval((document.Calculator.dpayment.value/100) * strip_commas(document.Calculator.loan.value))
					  d=document.Calculator.dpay_hidden.value
					} else {
					  document.Calculator.dpaymenttype.options[0].selected = true;
					  document.Calculator.dpayment.select();
					  document.Calculator.dpayment.focus();
					  alert("Please enter a value between 0 and 100 when using % on Down Payment.");						
					  return (false);
			}}}
  
    P = eval(document.Calculator.loan.value - d);
    I = eval(document.Calculator.rate.value) / 100.0;
    N = eval(document.Calculator.num.value);
    Y = eval(document.Calculator.num_annum.value);

    if(Y == 0.0)
      M = 0.0;
    else
      M = P * I / Y / (1.0 - binomial(I / Y, -N));
	  if (isNaN(M)) {
		document.Calculator.amount.value = ""
		document.Calculator.total.value = ""
		alert("Not enough information.");
	  } else {
	    document.Calculator.amount.value = "" + eval(Math.round(M * 100)/100)
		document.Calculator.total.value = "$" + put_commas(eval(Math.round((document.Calculator.amount.value * N) * 100)/100));
	  }	
  }
}