//*******************************************
//DO NOT REMOVE THIS COPYWRITE INFO!
//Debt Consolidation Calculator V3
//2003 Daniel C. Peterson ALL RIGHTS RESERVED
//Created: 10/09/2003
//Last Modified: 10/09/2003
//This script may not be copied, edited, distributed or reproduced
//without express written permission from
//Daniel C. Peterson of Web Winder Website Services
//For commercial use rates, contact:
//Dan Peterson:
//Web Winder Website Services
//P.O. Box 11
//Bemidji, MN  56619
//dan@webwinder.com
//http://www.webwinder.com
//Commercial User Licence #:5114-1170-111-1128
//Commercial Licence Date:2007-12-22
//*******************************************



function stripNum(num) {

   num=num.toString();


   var len = num.length;
   var rnum = "";
   var test = "";
   var j = 0;

   var b = num.substring(0,1);
   if(b == "-") {
      rnum = "-";
   }

   for(i = 0; i <= len; i++) {

      b = num.substring(i,i+1);

      if(b == "0" || b == "1" || b == "2" || b == "3" || b == "4" || b == "5" || b == "6" || b == "7" || b == "8" || b == "9" || b == ".") {
         rnum = rnum + "" + b;

      }

   }

   if(rnum == "" || rnum == "-") {
      rnum = 0;
   }

   rnum = Number(rnum);

   return rnum;

}



function computeMonthlyPayment(prin, numPmts, intRate) {

var pmtAmt = 0;

if(intRate == 0) {
   pmtAmt = prin / numPmts;
} else {
   
   if (intRate >= 1.0) {
     intRate = intRate / 100.0;
   }
   intRate /= 12;

   var pow = 1;
   for (var j = 0; j < numPmts; j++)
      pow = pow * (1 + intRate);

   pmtAmt = (prin * pow * intRate) / (pow - 1);

}

return pmtAmt;

}




function computeFixedInterestCost(principal, intRate, pmtAmt) { 

   var i = eval(intRate);
   if(i >= 1) {
   i /= 100;
   }
   i /= 12;

   var prin = eval(principal);
   var intPort = 0;
   var accumInt = 0;
   var prinPort = 0;
   var pmtCount = 0;
   var testForLast = 0;


   //CYCLES THROUGH EACH PAYMENT OF GIVEN DEBT
   while(prin > 0) {

      testForLast = (prin * (1 + i));

      if(pmtAmt < testForLast) {
         intPort = prin * i;
         accumInt = eval(accumInt) + eval(intPort);
         prinPort = eval(pmtAmt) - eval(intPort);
         prin = eval(prin) - eval(prinPort);
      } else {
      //DETERMINE FINAL PAYMENT AMOUNT
      intPort = prin * i;
      accumInt = eval(accumInt) + eval(intPort);
      prinPort = prin;
      prin = 0;
      }

      pmtCount = eval(pmtCount) + eval(1);

      if(pmtCount > 1000 || accumInt > 1000000000) {
         prin = 0;
      }

   }

return accumInt;

}




function formatNumberDec(num, places, comma) {

var isNeg=0;

    if(num < 0) {
       num=num*-1;
       isNeg=1;
    }

    var myDecFact = 1;
    var myPlaces = 0;
    var myZeros = "";
    while(myPlaces < places) {
       myDecFact = myDecFact * 10;
       myPlaces = eval(myPlaces) + eval(1);
       myZeros = myZeros + "0";
    }
    
	onum=Math.round(num*myDecFact)/myDecFact;
		
	integer=Math.floor(onum);

	if (Math.ceil(onum) == integer) {
		decimal=myZeros;
	} else{
		decimal=Math.round((onum-integer)* myDecFact)
	}
	decimal=decimal.toString();
	if (decimal.length<places) {
        fillZeroes = places - decimal.length;
	   for (z=0;z<fillZeroes;z++) {
        decimal="0"+decimal;
        }
     }

   if(places > 0) {
      decimal = "." + decimal;
   }

   if(comma == 1) {
	integer=integer.toString();
	var tmpnum="";
	var tmpinteger="";
	var y=0;

	for (x=integer.length;x>0;x--) {
		tmpnum=tmpnum+integer.charAt(x-1);
		y=y+1;
		if (y==3 & x>1) {
			tmpnum=tmpnum+",";
			y=0;
		}
	}

	for (x=tmpnum.length;x>0;x--) {
		tmpinteger=tmpinteger+tmpnum.charAt(x-1);
	}


	finNum=tmpinteger+""+decimal;
   } else {
      finNum=integer+""+decimal;
   }

    if(isNeg == 1) {
       finNum = "-" + finNum;
    }

	return finNum;
}




function computeNPR(principal, intRate, pmtAmt) {

   var i = eval(intRate);
   if(i >= 1) {
   i /= 100;
   }
   i /= 12;

   var prin = eval(principal);
   var intPort = 0;
   var accumInt = 0;
   var prinPort = 0;
   var pmtCount = 0;
   var testForLast = 0;


   //CYCLES THROUGH EACH PAYMENT OF GIVEN DEBT
   while(prin > 0) {

      testForLast = (prin * (1 + i));

      if(pmtAmt < testForLast) {
         intPort = prin * i;
         accumInt = eval(accumInt) + eval(intPort);
         prinPort = eval(pmtAmt) - eval(intPort);
         prin = eval(prin) - eval(prinPort);
      } else {
      //DETERMINE FINAL PAYMENT AMOUNT
      intPort = prin * i;
      accumInt = eval(accumInt) + eval(intPort);
      prinPort = prin;
      prin = 0;
      }

      pmtCount = eval(pmtCount) + eval(1);

      if(pmtCount > 1000 || accumInt > 1000000) {
         prin = 0;
      }

   }

return pmtCount;

}


function computeForm(form, lang) {

    var VtaxRate = stripNum(form.incomeTax.value);
    if(VtaxRate >= 1) {
       VtaxRate /= 100;
    }

    var accumTotBal = 0;
    var accumRate = 0;
    var accumTotPmt = 0;
    var accumCount = 0;
    var accumTotFees = 0;

    var VloanType = 0;
    var Vprincipal = 0;
    var Vpayment = 0;
    var Vrate = 0;
    var VAnnFees = 0;
    var VbeforeTaxInt = 0;
    var VbeforeTaxInt = 0;
    var accumBeforeTaxInt = 0;
    var accumAfterTaxInt = 0;

    var maxConsumerRate = 0;

    var i = 0;

    while(i < 10) {

       i += 1;

       eval("Vprincipal = stripNum(document.calc.prin" + i + ".value);");
       eval("Vpayment = stripNum(document.calc.pmt" + i + ".value);");
       eval("Vrate = stripNum(document.calc.intRate" + i + ".value);");
       eval("VannFees = stripNum(document.calc.annFees" + i + ".value);");

       if(Vprincipal > 0 && Vrate > 0) {

          eval("VloanType = document.calc.debt" + i + ".options[document.calc.debt"+ i + ".selectedIndex].value;");

          if(Vrate >= 1) {
             Vrate /= 100;
          }
          if(maxConsumerRate < Vrate) {
             maxConsumerRate = Vrate;
          }
          Vrate /= 12;

          VbeforeTaxInt = Vprincipal * Vrate;
          if(VloanType == 1) {
             VafterTaxInt = VbeforeTaxInt * (1 - VtaxRate);
          } else {
             VafterTaxInt = VbeforeTaxInt;
          }

          accumCount = eval(accumCount) + eval(1);
          accumRate = eval(accumRate) + eval(Vrate);
          accumTotBal = eval(accumTotBal) + eval(Vprincipal);
          accumTotPmt = eval(accumTotPmt) + eval(Vpayment);
          accumTotFees = eval(accumTotFees) + eval(VannFees);
          accumBeforeTaxInt = eval(accumBeforeTaxInt) + eval(VbeforeTaxInt);
          accumAfterTaxInt = eval(accumAfterTaxInt) + eval(VafterTaxInt);

       }



    }

if(accumTotBal <= 0) {
	if (lang==null || lang == "en") {
   	alert("Please enter at least one debt before computing the form.");
	} else if (lang=="es") {
   	alert("Por favor, escriba al menos una deuda antes de calcular el formulario.");
	}
   form.prin1.focus();
} else {

    var VcashOut = stripNum(form.cashOut.value);
    if(maxConsumerRate >= 1) {
       maxConsumerRate /= 100;
    }
    maxConsumerRate /= 12;

    VbeforeTaxInt = VcashOut * maxConsumerRate;
    VafterTaxInt = VbeforeTaxInt;
    accumBeforeTaxInt = eval(accumBeforeTaxInt) + eval(VbeforeTaxInt);
    accumAfterTaxInt = eval(accumAfterTaxInt) + eval(VafterTaxInt);
    

//TOTALS

var VtotCur = eval(accumTotBal) + eval(VcashOut);
form.totCur.value = "$" + formatNumberDec(VtotCur,2,1);

var VcloseCost = stripNum(form.closeCost.value);
var VtotProp = eval(VtotCur) + eval(VcloseCost); 
form.totProp.value =  "$" + formatNumberDec(VtotProp,2,1);

var VeffRateCur = accumBeforeTaxInt / VtotCur * 12 * 100;
form.effRateCur.value = formatNumberDec(VeffRateCur,2,0) + "%";

var VnewRate = stripNum(form.newRate.value);
var VeffRateProp = VnewRate;
form.effRateProp.value = formatNumberDec(VeffRateProp,2,0) + "%";

var VeffRateCurTax = accumAfterTaxInt / VtotCur * 12 * 100;
form.effRateCurTax.value = formatNumberDec(VeffRateCurTax,2,0) + "%";

var VeffRatePropTax = VeffRateProp * (1 - VtaxRate);
form.effRatePropTax.value = formatNumberDec(VeffRatePropTax,2,0) + "%";

var VtotPmtCur = accumTotPmt + (accumTotFees / 12);
form.totPmtCur.value = "$" + formatNumberDec(VtotPmtCur,2,1);

var VnewTerm = form.newTerm.options[form.newTerm.selectedIndex].value;
var VtotPmtProp = computeMonthlyPayment(VtotProp, VnewTerm, VnewRate)
form.totPmtProp.value = "$" + formatNumberDec(VtotPmtProp,2,1);

if(VtotPmtCur < VtotPmtProp) { //If new payment less than old one

   form.moSave.value = "N/A";
   form.annSave.value = "N/A";
   form.fiveYrSave.value = "N/A";
   form.ultYearsSaved.value = "N/A";
   form.ultTotYears.value = "N/A";
   form.ultIntSaved.value = "N/A";

} else { //If new payment greater than old one

   var VmoSave = VtotPmtCur - VtotPmtProp;
   form.moSave.value= "$" + formatNumberDec(VmoSave,2,1);

   var VannSave = VmoSave * 12;
   form.annSave.value = "$" + formatNumberDec(VannSave,2,1);

   var VfiveYrSave = VannSave * 5;
   form.fiveYrSave.value = "$" + formatNumberDec(VfiveYrSave,2,1);

   //ULTIMATE SAVINGS REPORT
   var oldNumPmtsLeft = computeNPR(VtotProp, VnewRate, VtotPmtCur);
   var oldYearsLeft = oldNumPmtsLeft / 12;
   form.ultTotYears.value = formatNumberDec(oldYearsLeft,1,0);

   var newTotYears = VnewTerm / 12;
   var VultYearsSaved = newTotYears - oldYearsLeft;
   form.ultYearsSaved.value = formatNumberDec(VultYearsSaved,1,0);

   var oldLoanInterest = computeFixedInterestCost(VtotProp, VnewRate, VtotPmtCur)
   var newLoanInterest = computeFixedInterestCost(VtotProp, VnewRate, VtotPmtProp)
   var VultIntSaved = newLoanInterest - oldLoanInterest;
   form.ultIntSaved.value = "$" + formatNumberDec(VultIntSaved,2,1);
}

}
}

function clearResults(form) {

form.totCur.value = "";
form.totProp.value = "";
form.effRateCur.value = "";
form.effRateProp.value = "";
form.effRateCurTax.value = "";
form.effRatePropTax.value = "";
form.totPmtCur.value = "";
form.totPmtProp.value = "";
form.moSave.value = "";
form.annSave.value = "";
form.fiveYrSave.value = "";
form.ultYearsSaved.value = "";
form.ultTotYears.value = "";
form.ultIntSaved.value = "";

}
