//Global Variables

/* DBS Rate for Private */
var DBSRate = new Array(DBSRateY1, DBSRateY2, DBSRateY3, DBSRateY4, DBSRateY5, DBSRateY6, DBSRateY7, DBSRateY8, DBSRateY9, DBSRateY10, DBSRateY11);

/* Apollo: this is not used in calculator */
var OtherBankRate = new Array(3.00, 3.00, 3.00);   

/* DBS Rate for HDB */
var DBSRateForHDB = new Array(DBSRateForHDBY1, DBSRateForHDBY2, DBSRateForHDBY3, DBSRateForHDBY4, DBSRateForHDBY5, DBSRateForHDBY6, DBSRateForHDBY7, DBSRateForHDBY8, DBSRateForHDBY9, DBSRateForHDBY10, DBSRateForHDBY11); 
var HDBRate = new Array(3.50, 3.50, 3.50);   /* Apollo: this is not used in calculator */

var CashLineInterest = 7.80; //Used in Question 3

/* Apollo added this definition */
var dayOfMonths = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

/*HDB loan
Year 1: 2.00%
Year 2: 3.00%
Year 3: 3.50%
Year 4: 4%
 
Private loan
Year 1: 2.00%
Year 2: 3.00%
Year 3: 3.50%
Year 4: 4% */

//Start Functions
function PMT(PV, IR, NP) {
  var PMT = (PV * IR) / (1 - Math.pow(1 + IR, -NP))
 
  return round_decimals(PMT, 2)
}

function round_decimals(original_number, decimals) {
  var result1 = original_number * Math.pow(10, decimals)
  //var result2 = Math.round(result1)
  var result2 = Math.ceil(result1) // modified by Gyl on 13 June 2007
  var result3 = result2 / Math.pow(10, decimals)

  return (result3);
  //return (original_number)
}
function CommaFormatted(val) {
	if (1) { // or opera gives syntax error on re
		var re = /(\d+)(\d{3})/;
		while (re.test(val)) {
			val = val.replace(re,"$1,$2");
		}
	}
	return val;
}
function CurrencyFormatted(expr) {
	var decplaces = 0;
	var str = "" + Math.round (eval(expr) * Math.pow(10,decplaces));
	while (str.length <= decplaces) {
		str = "0" + str;
	}
	var decpoint = str.length - decplaces;
	return str.substring(0,decpoint);// + "." + str.substring(decpoint,str.length);
}
function trimCommas(str){
	var tempstr="";
	if(str.indexOf(",") == 0) return str;
	
	for(var i=0; i<str.length; i++) {
		if(str.charAt(i)!=",")
		{
			tempstr=tempstr + str.charAt(i);
		}	
	}	
	return tempstr;
}
//--------------------------------------------------------------------
//1st scheme: Normal Principal & Interest Servicing
// Modified By Gyl (13 June 2007)
//--------------------------------------------------------------------
function calculateInstallment(thebankrate, Period, OutstandingAmt)
{
	//
	var Installment=0;
	var PrincipalPortion=0;
	var OutstandingPrincipal = OutstandingAmt;
	var InterestPortion=0;
	var TotalInstallment=0;
	var TotalInterest=0;
	var InstallmentGrandTotal=0;
	var InterestGrandTotal=0;	
	
	var InstallmentThisYear = new Array(Period/12);
	
	var MthlyInterest = new Array(12); //Store mthly interest paid.
	var yearPrincPaid = 0;
	
	//Looping every year till the ...
	for (curryear=0; curryear<Period/12; curryear++)	
	{ 
		//Yearly Variables
		var Interest;
		
		if (curryear > thebankrate.length-1)
		{
			Interest = thebankrate[thebankrate.length-1]/100;
		}
		else
		{
			Interest = thebankrate[curryear]/100;
		}
	
		// Original
		//InstallmentThisYear[curryear] = Math.ceil(PMT(OutstandingAmt, Interest/12, Period));
		
		// modified by Gyl (04 May 2007)		
		//InstallmentThisYear[curryear] = Math.ceil(PMT(OutstandingAmt, Interest*1/12, Period)*100)/100;
		
		// modified by Gyl (13 June 2007)	
		InstallmentThisYear[curryear] = PMT(OutstandingAmt, Interest*1/12, Period-(12*curryear));
					
		MthlyInterest = calculateSingleYearInterest(Interest, OutstandingAmt, InstallmentThisYear[curryear]);
		
		yearPrincPaid = 0; //Reset yearPrincPaid
		
		// Loop through every month within this year, summ all principal paid.
		for (mthIndex=0; mthIndex<12; mthIndex++)
		{
			OutstandingAmt -= InstallmentThisYear[curryear] - MthlyInterest[mthIndex];
			
			if (OutstandingAmt <= 0)
				break;

		}
		
	}
	
	return InstallmentThisYear;
} //end function 


//--------------------------------------------------------------------
//2nd scheme: Interest Servicing for the 1st 3 years
//--------------------------------------------------------------------

function calculateInterestServicingInstallment(thebankrate, Period, OutstandingAmt) {
	var Period = Period;
	var Installment=0;
	var PrincipalPortion=0;
	var OutstandingPrincipal=OutstandingAmt;
	var InterestPortion=0;
	var TotalInstallment=0;
	var TotalInterest=0;
	var InstallmentGrandTotal=0;
	var InterestGrandTotal=0;
	/* Apollo changed this line
	var InstallmentThisYear = new Array(3);
   */
	var InstallmentThisYear = new Array(thebankrate.length);
	
	//Looping every year till the 5th year
	for (curryear=0; curryear<thebankrate.length; curryear++) { 
		//Yearly Variables
		var Interest = thebankrate[curryear];
		//var InstallmentThisYear=0;

		//effective daily rate for the 1st 3 years
		if((curryear+1) <= 3) { 
			Interest = (Interest*31*12/365); // revert by Gyl (20070607)
			//Interest = (Interest*30/365); // modified by Gyl (2007-05-24)			
		}
		Interest = Interest/100;

		//TEMP document.write("<B>Rate for the " + (curryear+1) + " year: " + thebankrate[curryear] + " percent</B><br>");
		//TEMP document.write("<B>Outstanding Principal Start at the start of " + (curryear+1) + " year: " + OutstandingPrincipal + " </B><br>");
		//TEMP document.write("<B>Interest on the " + (curryear+1) + " year: " + Interest + " </B><br>");
		//TEMP document.write("<B>Period on the " + (curryear+1) + " year: " + Period + " months</B><br>");

		InstallmentThisYear[curryear] = Math.ceil((OutstandingPrincipal*Interest*1/12)*100)/100;		

		//document.write("<B>Installment for this year interest servicing loans " + (curryear+1) + ": " + CommaFormatted(CurrencyFormatted(InstallmentThisYear[curryear])) + "</B><BR><BR>");
		}		
		/*
		//Looping every month
		for (currmonth=1; currmonth<=12; currmonth++) {
			InterestPortion = Interest*OutstandingPrincipal/12;

			if((curryear+1) <=3) 
				Installment = InterestPortion;			
			else 	
				Installment = Math.ceil(InstallmentThisYear);

			//TEMP document.write("Month: " + currmonth + "<BR>");
			//TEMP document.write("OutstandingPrincipal: " + CommaFormatted(CurrencyFormatted(OutstandingPrincipal)) + "<BR>");
			//TEMP document.write("Installment: " + CommaFormatted(CurrencyFormatted(Installment)) + "<BR>");
			//TEMP document.write("InterestPortion: " + round_decimals(InterestPortion,2) + "<BR>");

			PrincipalPortion=Installment-InterestPortion;
			OutstandingPrincipal=OutstandingPrincipal-PrincipalPortion;
			
			TotalInstallment = TotalInstallment + Installment;
			TotalInterest = TotalInterest + InterestPortion;

			//TEMP document.write("PrincipalPortion[AFTER PRINCIPALPORTION]: " + CommaFormatted(CurrencyFormatted(PrincipalPortion)) + "<BR>");
			//TEMP document.write("OutstandingPrincipal[AFTER PRINCIPALPORTION]: " + CommaFormatted(CurrencyFormatted(OutstandingPrincipal)) + "<BR><BR>");
		
			Period = Period - 1;
		} //end month loop
	} //end year loop
	*/
	//InstallmentGrandTotal = parseFloat(TotalInstallment);
	//InterestGrandTotal = parseFloat(TotalInterest);
return InstallmentThisYear;
} //end function

function calculateInterestDebug(thebankrate, Period, OutstandingAmt)
{
	var Period = Period;
	var Installment=0;
	var PrincipalPortion=0;
	var OutstandingPrincipal=OutstandingAmt;
	var InterestPortion=0;
	var TotalInstallment=0;
	var TotalInterest=0;
	var InstallmentGrandTotal=0;
	var InterestGrandTotal=0;	
	
	//Looping every year till the 5th year
	for (curryear=0; curryear<thebankrate.length; curryear++) { 
		document.write("<B>Rate for the " + (curryear+1) + " year: " + thebankrate[curryear] + "</B><br>");
		
		//Yearly Variables
		var Interest = thebankrate[curryear]/100;
		document.write("Interest Rate for the " + (curryear+1) + " year: " + thebankrate[curryear] + "<BR>");
		
		var InstallmentThisYear = Math.ceil(PMT(OutstandingAmt, Interest*1/12, Period)*100)/100;
		document.write("<B>Installment for this year: " + CommaFormatted(CurrencyFormatted(InstallmentThisYear)) + "</B><BR><BR>");
		
		//Looping every month
		for (currmonth=1; currmonth<=12; currmonth++) {
			Installment = InstallmentThisYear;
			InterestPortion = Interest*OutstandingPrincipal*1/12;

			document.write("Month: " + currmonth + "<BR>");
			document.write("OutstandingPrincipal: " + CommaFormatted(CurrencyFormatted(OutstandingPrincipal)) + "<BR>");
			document.write("Installment: " + CommaFormatted(CurrencyFormatted(Installment)) + "<BR>");
			document.write("InterestPortion: " + round_decimals(InterestPortion,2) + "<BR>");
		
			PrincipalPortion=Installment-InterestPortion;
			OutstandingPrincipal=OutstandingPrincipal-PrincipalPortion;
			
			TotalInstallment = TotalInstallment + Installment;
			TotalInterest = TotalInterest + InterestPortion;

			document.write("PrincipalPortion[AFTER PRINCIPALPORTION]: " + CommaFormatted(CurrencyFormatted(PrincipalPortion)) + "<BR>");
			document.write("OutstandingPrincipal[AFTER PRINCIPALPORTION]: " + CommaFormatted(CurrencyFormatted(OutstandingPrincipal)) + "<BR><BR>");
		
		} //end month loop
	} //end year loop
		
	//InstallmentGrandTotal = parseFloat(TotalInstallment);
	InterestGrandTotal = parseFloat(TotalInterest);
	return InterestGrandTotal;
} //end function 

/* Apollo added this function */
function calculateInterest(thebankrate, period, outstandingAmt, installResult)
{
   var interest = new Array(period / 12);

   for(var currentYear = 0; currentYear < period / 12; currentYear++) {
      var rateIndex = currentYear > (thebankrate.length - 1) ? (thebankrate.length - 1) : currentYear;
      
      var rate = thebankrate[rateIndex] / 100;

      var install = installResult[currentYear];
      interest[currentYear] = new Array();
      
      for(var i = 0; i < 12; i++)
      {
         	var interestOneMonth = Math.ceil(outstandingAmt * rate * dayOfMonths[i] / 365 * 100)/100; // ROUND_UP(X*100)/100 modified (08 June 2007)
                  
		//var interestOneMonth = Math.ceil((outstandingAmt * rate * 30/365) * 100)/100; // modified by Gyl (04 May 2007)
		interest[currentYear][i] = interestOneMonth;
		outstandingAmt -= install - interestOneMonth;
		
		if (outstandingAmt <= 0)
			break;
      }      
      	   
   }

   return interest;
}

/* Gyl added on 13 June 2007
 * Purpose: Calculate InterestPaid for Specified Year
 *	
 */
function calculateSingleYearInterest(yearRate, yearOutstandingAmt, yearInstall)
{
   	var interest = new Array(12);
      
	for(var i = 0; i < 12; i++)
	{
		var interestOneMonth = Math.ceil(yearOutstandingAmt * yearRate * dayOfMonths[i] / 365 * 100)/100; // ROUND_UP(X*100)/100 modified (08 June 2007)
		
		interest[i] = interestOneMonth;        
		yearOutstandingAmt -= yearInstall - interestOneMonth;
		
		if (yearOutstandingAmt <= 0)
			break;
	}

   	return interest;
}



