//*******************************************
//DO NOT REMOVE THIS COPYWRITE INFO!
//Bi-Weekly Mortgage Calculator V3
//2003 Daniel C. Peterson ALL RIGHTS RESERVED
//Created: 09/15/2003
//Last Modified: 09/15/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 #:4519-1056-110-1019
//Commercial Licence Date:2007-04-09
//*******************************************



function stripNum(num) {

var iPercent
var iDollar
var iSpace
var iComma
var numLength = num.length

//lalalla Line #114

if(numLength > 0) {

   num=num.toString();

   iPercent = num.indexOf("%");
   if(iPercent >= 0) {
      num=num.substring(0,iPercent) + "" + num.substring(iPercent + 1,numLength);
      numLength=num.length;
      }
   iDollar = num.indexOf("$");
   if(iDollar >= 0) {
      num=num.substring(0,iDollar) + "" + num.substring(iDollar + 1,numLength);
      numLength=num.length;
      }
   iSpace = num.indexOf(" ");
   if(iSpace >= 0) {
      num=num.substring(0,iSpace) + "" + num.substring(iSpace + 1,numLength);
      numLength=num.length;
      }
   iComma = num.indexOf(",");
   if(iComma >= 0) {
      while(iComma >=1) {
         num=num.substring(0,iComma) + "" + num.substring(iComma + 1,numLength);
         numLength=num.length;
         iComma = num.indexOf(",");
      }
      }

      num = eval(num);


} else {

num = 0;

}

return num;

}




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 computeIntRate(myNumPmts, myPrin, myPmtAmt, myGuess) {

var myDecRate = 0;

if(myGuess.length == 0 || myGuess == 0) {
   var myDecGuess = 10;
   } else {
   var myDecGuess = myGuess;
   if(myDecGuess >= 1) {
      myDecGuess = myDecGuess /100;
      }
   }

var myDecRate = myDecGuess / 12;
var myNewPmtAmt = 0;
var pow = 1;
var j = 0;

for (j = 0; j < myNumPmts; j++) {
   pow = pow * (eval(1) + eval(myDecRate));
}

myNewPmtAmt = (myPrin * pow * myDecRate) / (pow - 1);

//2 DEC PLACE AMOUNT
var decPlace2Rate = (eval(myDecGuess) + eval(.01)) / 12;
var decPlace2Amt = 0;
pow = 1;
j=0;
for (j = 0; j < myNumPmts; j++) {
   pow = pow * (eval(1) + eval(decPlace2Rate));
}
var decPlace2PmtAmt = (myPrin * pow * decPlace2Rate) / (pow - 1);
decPlace2Amt = eval(decPlace2PmtAmt) - eval(myNewPmtAmt);

//3 DEC PLACE AMOUNT
var decPlace3Rate = (eval(myDecGuess) + eval(.001)) / 12;
var decPlace3Amt = 0;
pow = 1;
j=0;
for (j = 0; j < myNumPmts; j++) {
   pow = pow * (eval(1) + eval(decPlace3Rate));
}
var decPlace3PmtAmt = (myPrin * pow * decPlace3Rate) / (pow - 1);
decPlace3Amt = eval(decPlace3PmtAmt) - eval(myNewPmtAmt);

//4 DEC PLACE AMOUNT
var decPlace4Rate = (eval(myDecGuess) + eval(.0001)) / 12;
var decPlace4Amt = 0;
pow = 1;
j=0;
for (j = 0; j < myNumPmts; j++) {
   pow = pow * (eval(1) + eval(decPlace4Rate));
}
var decPlace4PmtAmt = (myPrin * pow * decPlace4Rate) / (pow - 1);
decPlace4Amt = eval(decPlace4PmtAmt) - eval(myNewPmtAmt);

//5 DEC PLACE AMOUNT
var decPlace5Rate = (eval(myDecGuess) + eval(.00001)) / 12;
var decPlace5Amt = 0;
pow = 1;
j=0;
for (j = 0; j < myNumPmts; j++) {
   pow = pow * (eval(1) + eval(decPlace5Rate));
}
var decPlace5PmtAmt = (myPrin * pow * decPlace5Rate) / (pow - 1);
decPlace5Amt = eval(decPlace5PmtAmt) - eval(myNewPmtAmt);

var myPmtDiff = 0;

if(myNewPmtAmt < myPmtAmt) {

   while(myNewPmtAmt < myPmtAmt) {

      myPmtDiff = eval(myPmtAmt) - eval(myNewPmtAmt);
      if(myPmtDiff > decPlace2Amt) {
         myDecRate = eval(myDecRate) + eval(.01 / 12);
      } else
      if(myPmtDiff > decPlace3Amt) {
         myDecRate = eval(myDecRate) + eval(.001 / 12);
      } else
      if(myPmtDiff > decPlace4Amt) {
         myDecRate = eval(myDecRate) + eval(.0001 / 12);
      } else
      if(myPmtDiff > decPlace5Amt) {
         myDecRate = eval(myDecRate) + eval(.00001 / 12);
      } else {
         myDecRate = eval(myDecRate) + eval(.000001 / 12);
      }

      pow = 1
      j = 0;
      
      for (j = 0; j < myNumPmts; j++) {
         pow = pow * (eval(1) + eval(myDecRate));
      }
      myNewPmtAmt = (myPrin * pow * myDecRate) / (pow - 1);
   }

} else {


   while(myNewPmtAmt > myPmtAmt) {

      myPmtDiff = eval(myNewPmtAmt) - eval(myPmtAmt);
      if(myPmtDiff > decPlace2Amt) {
         myDecRate = eval(myDecRate) - eval(.01 / 12);
      } else
      if(myPmtDiff > decPlace3Amt) {
         myDecRate = eval(myDecRate) - eval(.001 / 12);
      } else
      if(myPmtDiff > decPlace4Amt) {
         myDecRate = eval(myDecRate) - eval(.0001 / 12);
      } else
      if(myPmtDiff > decPlace5Amt) {
         myDecRate = eval(myDecRate) - eval(.00001 / 12);
      } else {
         myDecRate = eval(myDecRate) - eval(.000001 / 12);
      }

      pow = 1
      j = 0;
      
      for (j = 0; j < myNumPmts; j++) {
         pow = pow * (eval(1) + eval(myDecRate));
      }
      myNewPmtAmt = (myPrin * pow * myDecRate) / (pow - 1);
   }


}

myDecRate = myDecRate * 12 * 100;

return myDecRate;

}

function computeForm(form) {

if(form.principal.value == "") {
   alert("Please enter the dollar amount of your mortgage.");
   form.principal.focus();
} else 
if(form.intRate.value == "") {
   alert("Please enter the percentage rate of your mortgage.");
   form.intRate.focus();
} else
if(form.months.value == "") {
   alert("Please enter the term of your mortgage in months.");
   form.months.focus();
} else {

    var Vprincipal = stripNum(form.principal.value);
    var VintRate = stripNum(form.intRate.value);
    var Vmonths = stripNum(form.months.value);
    var Vpayment = stripNum(form.payment.value);
    if(Vpayment == 0) {
       Vpayment = computeMonthlyPayment(Vprincipal, Vmonths, VintRate);
    }


    var VpmtsMade = stripNum(form.pmtsMade.value);


//COMPUTE CURRENT MORTGAGE
   form.curPrincipal.value = "$" + formatNumberDec(Vprincipal,2,1);
   form.curRate.value = formatNumberDec(VintRate,2,1) + "%";
   form.curPmt.value = "$" + formatNumberDec(Vpayment,2,1);

   var VcurIntPaid = computeFixedInterestCost(Vprincipal, VintRate, Vpayment);
   form.curIntPaid.value = "$" + formatNumberDec(VcurIntPaid,0,1);
   
   var VcurPayoff = Vmonths / 12;
   form.curPayoff.value = formatNumberDec(VcurPayoff,1,0) + " Years";

//COMPUTE REMAINING BALANCE OF ORIGINAL MORTGAGE
   var VpmtsMade = stripNum(form.pmtsMade.value);

   var prinLeft = Vprincipal;
   var pmtsPrinPort = 0;
   var pmtsIntPort = 0;
   var pmtsAccumInt = 0;
   var pmtsMadeCnt = 0;

   var pmtsMadeRate = VintRate;
   if(pmtsMadeRate >= 1) {
      pmtsMadeRate /= 100;
   }
   pmtsMadeRate /= 12;

   while(pmtsMadeCnt < VpmtsMade) {

      pmtsIntPort = prinLeft * pmtsMadeRate;
      pmtsAccumInt = pmtsAccumInt + pmtsIntPort;
      pmtsPrinPort = Vpayment - pmtsIntPort;
      prinLeft = prinLeft - pmtsPrinPort;
      pmtsMadeCnt += 1;

      if(pmtsMadeCnt > 600) {
         break;
      } else {
         continue;
      }


   }

//COMPUTE BIWEEKLY PLAN

   var VbiWeekPmt = Vpayment / 2;
   form.biWeekPmt.value = "$" + formatNumberDec(VbiWeekPmt,2,1);

   var VbiWeekIntPaid = computeBiWeekInt(prinLeft,Vpayment,VintRate,0,1);
   VbiWeekIntPaid = VbiWeekIntPaid + pmtsAccumInt;
   form.biWeekIntPaid.value = "$" + formatNumberDec(VbiWeekIntPaid,0,1);

   var VbiWeekIntSaved = VcurIntPaid - VbiWeekIntPaid;
   form.biWeekIntSaved.value = "$" + formatNumberDec(VbiWeekIntSaved,0,1);

   var VbiWeekNPRs = computeBiWeekInt(prinLeft,Vpayment,VintRate,0,2);
   VbiWeekNPRs = VbiWeekNPRs + pmtsMadeCnt;
   var VbiWeekPayOff = VbiWeekNPRs / 12;
   form.biWeekPayOff.value = formatNumberDec(VbiWeekPayOff,1,1) + " Years";

   var VbiWeekPmtsSaved = Vmonths - (VbiWeekNPRs);
   form.biWeekPmtsSaved.value = formatNumberDec(VbiWeekPmtsSaved,0,0);

   var VbiWeekMonths = VbiWeekNPRs;

   var VbiWeekTotPaid = prinLeft + VbiWeekIntPaid;
   var VbiWeekEquivPmt = VbiWeekTotPaid / Vmonths;

   var VbiWeekEquivRate = computeIntRate(Vmonths, prinLeft, VbiWeekEquivPmt, VintRate);
   form.biWeekEquivRate.value = formatNumberDec(VbiWeekEquivRate,2,0) + "%";

var Vsummary = ("You could save $" + formatNumberDec(VbiWeekIntSaved,0,1) + " and have " + formatNumberDec(VbiWeekPmtsSaved,0,1) + " fewer payments by using the Bi-Weekly Mortgage plan!");
form.summary.value = Vsummary;


//COMPUTE BIWEEKLY PLAN - PLUS $25

   var VbiWeek25Pmt = (Vpayment / 2) + 25;
   form.biWeek25Pmt.value = "$" + formatNumberDec(VbiWeek25Pmt,2,1);

   var VbiWeek25IntPaid = computeBiWeekInt(prinLeft,Vpayment,VintRate,25,1);
   VbiWeek25IntPaid = VbiWeek25IntPaid + pmtsAccumInt;
   form.biWeek25IntPaid.value = "$" + formatNumberDec(VbiWeek25IntPaid,0,1);

   var VbiWeek25IntSaved = VcurIntPaid - VbiWeek25IntPaid;
   form.biWeek25IntSaved.value = "$" + formatNumberDec(VbiWeek25IntSaved,0,1);

   var VbiWeek25NPRs = computeBiWeekInt(prinLeft,Vpayment,VintRate,25,2);
   VbiWeek25NPRs = VbiWeek25NPRs + pmtsMadeCnt;
   var VbiWeek25PayOff = VbiWeek25NPRs / 12;
   form.biWeek25PayOff.value = formatNumberDec(VbiWeek25PayOff,1,1) + " Years";

   var VbiWeek25PmtsSaved = Vmonths - (VbiWeek25NPRs);
   form.biWeek25PmtsSaved.value = formatNumberDec(VbiWeek25PmtsSaved,0,0);

   var VbiWeek25Months = VbiWeek25NPRs;

   var VbiWeek25TotPaid = prinLeft + VbiWeek25IntPaid;
   var VbiWeek25EquivPmt = VbiWeek25TotPaid / Vmonths;

   var VbiWeek25EquivRate = computeIntRate(Vmonths, prinLeft, VbiWeek25EquivPmt, VintRate);
   form.biWeek25EquivRate.value = formatNumberDec(VbiWeek25EquivRate,2,0) + "%";


//COMPUTE BIWEEKLY PLAN - PLUS $50

   var VbiWeek50Pmt = (Vpayment / 2) + 50;
   form.biWeek50Pmt.value = "$" + formatNumberDec(VbiWeek50Pmt,2,1);

   var VbiWeek50IntPaid = computeBiWeekInt(prinLeft,Vpayment,VintRate,50,1);
   VbiWeek50IntPaid = VbiWeek50IntPaid + pmtsAccumInt;
   form.biWeek50IntPaid.value = "$" + formatNumberDec(VbiWeek50IntPaid,0,1);

   var VbiWeek50IntSaved = VcurIntPaid - VbiWeek50IntPaid;
   form.biWeek50IntSaved.value = "$" + formatNumberDec(VbiWeek50IntSaved,0,1);

   var VbiWeek50NPRs = computeBiWeekInt(prinLeft,Vpayment,VintRate,50,2);
   VbiWeek50NPRs = VbiWeek50NPRs + pmtsMadeCnt;
   var VbiWeek50PayOff = VbiWeek50NPRs / 12;
   form.biWeek50PayOff.value = formatNumberDec(VbiWeek50PayOff,1,1) + " Years";

   var VbiWeek50PmtsSaved = Vmonths - (VbiWeek50NPRs);
   form.biWeek50PmtsSaved.value = formatNumberDec(VbiWeek50PmtsSaved,0,0);

   var VbiWeek50Months = VbiWeek50NPRs;

   var VbiWeek50TotPaid = prinLeft + VbiWeek50IntPaid;
   var VbiWeek50EquivPmt = VbiWeek50TotPaid / Vmonths;

   var VbiWeek50EquivRate = computeIntRate(Vmonths, prinLeft, VbiWeek50EquivPmt, VintRate);
   form.biWeek50EquivRate.value = formatNumberDec(VbiWeek50EquivRate,2,0) + "%";

   
   }
		
}

function computeBiWeekInt(bwPrin,bwOrigPmt,bwRate,bwPmtAdd,retVar) {

var FbwPrin = bwPrin - (bwPmtAdd * 5);
var FbwPmt = bwOrigPmt / 2;
var FbwRate = bwRate;
if(FbwRate >= 1) {
   FbwRate /= 100;
}
FbwRate /= 12;

var FbwIntPort = 0;
var FbwPrinPort = 0;
var FbwAccumInt = 0;
var FbwNPR = 0;
var FbwMoEscrowAmt = (FbwPmt / 6) + (bwPmtAdd * 26 / 12);
var FbwAccumEscrow = 0;


while(FbwPrin > 0) {

   FbwAccumEscrow += FbwMoEscrowAmt;

if(FbwPrin > ((bwOrigPmt - (FbwPrin * FbwRate)) + FbwMoEscrowAmt)) {
   FbwIntPort = FbwPrin * FbwRate;
   FbwAccumInt = FbwAccumInt + FbwIntPort;
   FbwPrinPort = bwOrigPmt - FbwIntPort;
   FbwPrin = FbwPrin - FbwPrinPort;
   FbwNPR += 1;
} else {
   FbwIntPort = FbwPrin * FbwRate;
   FbwAccumInt = FbwAccumInt + FbwIntPort;
   FbwPrin = 0;
   FbwNPR += 1;
}

   if(FbwNPR % 6 == 0) {
      FbwPrin = FbwPrin - FbwAccumEscrow;
      FbwAccumEscrow = 0;
    }



   if(FbwNPR > 600) {
      break;
   } else {
      continue;
   }

}

if(retVar == 1) {
   return FbwAccumInt;
} else
if(retVar == 2) {
   return FbwNPR;
}

}

function calcMonths(form) {

   var VnumMonths = form.getMonths.options[form.getMonths.selectedIndex].value;
   form.months.value = VnumMonths;

}
