/* Calculator Object
	filename: mortgageCalc.js
		08/09/2007		initially coded - brad street

 This script uses the mootools framework for various functions, and at a minimum requires:
	Core.js
	Class.js
	Class.Extras.js
	Number.js
*/

function MortgageCalculator(sentLoanAmount, sentApr, sentYrs, sentDownPayment, sentUpfrontPoints, sentDiscountPoints) 
{
		var min_APR = 0.00;						// do NOT set lower than 0
		var max_APR = 9.00;						
		var min_downPayment = 0.00;				// do NOT set lower than 0
												// max down payment is set to amount of loan
		var min_upfrontPoints = 0.00;			// do NOT set lower than 0
		var max_upfrontPoints = 9.00;
		var min_discountPoints = 0.00;			// do NOT set lower than 0
												// max discount points is set to apr
		
		// Setup default values							**  Properties of this.  **
		//this.loanAmount = 200000.00;			// loanAmount = 			default amount of loan used in loan calculations
												// originalLoanAmount =		original amount of this loan
		//this.apr = 7.00;						// apr = 					default annual percentage rate used in loan calculations
												// originalAPR	=			original APR of loan
		var termYears = 30;					// termYears =				default term of loan in years
												// termMonths = 			term of loan in months
		//this.downPayment = 0.00;				// downPayment = 			amount of down payment
		//this.upfrontPoints = 0.00;				// upfrontPoints = 			number of points to be paid at start of loan
		//this.discountPoints = 0.00;				// discountPoints = 		number of points discounted from APR for length of loan
												// upfrontPointsCost =		total cost of discount points at start of loan
												// discountPointsSavings = 	total savings by discounting points
												// paymentTotal = 			total of all payments (principal & interest)
												// paymentMonthly =			monthly payment amount
												// interestTotal =			total of interest payments
												// interestMonthly =		monthly interest rate
												// interestFactor =			factor used to compute monthly payments
												
												/*        **     Methods of this.    **
												   getInerestFactor(term of loan in months, monthly interest)
												   		private function called by this.calculate()
												   		returns : monthly factor that, when divided into loan amount, will tell monthly payment
												   		
												   	calculate()
												   		public function - given the properties of the calculator object, calculates totals
												   		returns: object containing the totals and such
												 */
		var loanAmount = sentLoanAmount;
		var apr = sentApr;
		var yrs = sentYrs;
		var downPayment = sentDownPayment;
		var upfrontPoints = sentUpfrontPoints;
		var discountPoints = sentDiscountPoints;
		
		//Do some validation and set the properties
		if(loanAmount != undefined)
		{ 
			//this.loanAmount = parseFloat(loanAmount).limit(1000,50000000).toFixed(0);
			loanAmount = parseFloat(loanAmount).toFixed(0);  
		}
		var originalLoanAmount = sentLoanAmount;
		
		if(apr != undefined)
		{ 
			//this.apr = apr.toFloat().limit(min_APR,max_APR).toFixed(4); 
			apr = parseFloat(apr).toFixed(4);
		}
		var originalAPR = sentApr;

		if(yrs != undefined && (yrs == 15) || (yrs == 30))
		{ 
			termYears = parseInt(yrs); 
		}
		var termMonths = termYears * 12;
		
		if(downPayment != undefined)
		{ 
			//this.downPayment = parseFloat(downPayment).limit(0,this.loanAmount).toFixed(0); 
			downPayment = parseFloat(downPayment).toFixed(0);
		}

		if(downPayment > 0)
		{
			loanAmount = (loanAmount - downPayment).toFixed(0);
		}
		
		if(upfrontPoints != undefined)
		{ 
			//this.upfrontPoints = parseFloat(upfrontPoints).limit(min_upfrontPoints, max_upfrontPoints).round(4).toFixed(4);
			upfrontPoints = parseFloat(upfrontPoints).toFixed(4);  
		}
		
		var upfrontPointsCost = 0.00;
		if(upfrontPoints > 0 )
		{
			upfrontPointsCost = (upfrontPoints / 100) * loanAmount;
			upfrontPointsCost = upfrontPointsCost.toFixed(0);
		}

		if(discountPoints != undefined)
		{ 
			discountPoints = parseFloat(discountPoints).toFixed(4); 
		}
		
		if(discountPoints > 0 && (discountPoints <= apr))
		{ 
			apr = (apr - discountPoints).toFixed(4); 
		}
		
		var interestMonthly = apr / 1200;
		var interestTotal = 0;
		var interestFactor = 0;
		var paymentMonthly = 0;
		var paymentTotal = 0;
		var discountPointsSavings = 0;
		
		return {
			getInterestFactor: function(termmonths, monthlyinterest)
			{
				var factor = 0;
				var base_rate = 1 + monthlyinterest;
				var denominator = base_rate;
				for (var i=0; i < termmonths; i++)
				{
					factor += (1 / denominator);
					denominator *= base_rate;
			    }
			    return factor;
			},
			calculate: function()
			{
				interestFactor = this.getInterestFactor(termMonths, interestMonthly);

				if(loanAmount > 0)
				{
					paymentMonthly = (loanAmount / interestFactor).toFixed(0);
				}
				else
				{
					paymentMonthly = 0.00;
				}
				
				paymentTotal = (paymentMonthly * termMonths).toFixed(0);
				
				if (paymentTotal == 0)
				{
					interestTotal = 0.00;
				}
				else
				{
					interestTotal = (paymentTotal - loanAmount).toFixed(0);
				}
				
				if(discountPoints > 0 && discountPoints <= originalAPR)
				{
					var temp = getInterestFactor(termMonths,(discountPoints / 1200));
					discountPointsSavings = ((loanAmount / temp).round(2).toFixed(2) * termMonths - loanAmount).toFixed(0);
				}
				else
				{
					discountPointsSavings = 0.00;
				}
			},
			getPaymentMonthly: function()
			{
				return paymentMonthly;
			},
			getPaymentTotal: function()
			{
				return paymentTotal;
			},
			getOriginalAPR: function()
			{
				return originalAPR;
			},
			getInterestTotal: function()
			{
				return interestTotal;
			},
			getLoanAmount: function()
			{
				return loanAmount;
			},
			getOriginalLoanAmount: function()
			{
				return originalLoanAmount;
			},
			getDownPayment: function()
			{
				return downPayment;
			},
			getUpfrontPoints: function()
			{
				return upfrontPoints;
			},
			getDiscountPointsSavings: function()
			{
				return discountPointsSavings;
			},
			getUpfrontPointsCost: function()
			{
				return upfrontPointsCost;
			},
			getInterestMonthly: function()
			{
				return interestMonthly;
			},
			getTermMonths: function()
			{
				return termMonths;
			},
			getApr: function()
			{
				return apr;
			}
		}
}

/*  Sample usage:

var cal = new MortgageCalculator(225000,18,30,2000,2,1);
calc.calculate();
alert('Total of all payments: $'+calc.paymentTotal+'\nTotal Interest: $'+calc.interestTotal+'\nLoan Amount: $'+calc.loanAmount+'\nOriginal Loan: $'+calc.originalLoanAmount+'\nDown Payment: $'+calc.downPayment);

Result:
	Total of all payments: $589064.40 
	Total Interest: $366064.4 
	Loan Amount: $223000 
	Original Loan: $225000.00 
	Down Payment: $2000.00
*/

//var calc = new MortgageCalculator(225000,7,30,0,2,7);
//calc.calculate();
//alert('Total of all payments: $'+calc.paymentTotal+'\nTotal Interest: $'+calc.interestTotal+'\nLoan Amount: $'+calc.loanAmount+'\nOriginal Loan: $'+calc.originalLoanAmount+
//'\nDown Payment: $'+calc.downPayment+'\n\nOriginal APR: '+calc.originalAPR+'\nDiscount Points: '+calc.discountPoints+'\nAPR: '+calc.apr+'\n\n Upfront Points: '+calc.upfrontPoints+
//'\nCost of Upfront Points: '+calc.upfrontPointsCost+'\n\nDiscount Points Savings: '+calc.discountPointsSavings+'\n\nMonthly Payment: $'+calc.paymentMonthly);
