
// calculateMinimumInstallment()
// -----------------------------------------------------------------------------------------------------
// Laskee ja palauttaa pienimmän kuukausierän (vähintään 17e), joka kattaa korot
// Ei ota kantaa onko luoton määrä liian pieni tai suuri
// -----------------------------------------------------------------------------------------------------
// double amount			- luoton määrä
// double interest			- viitekorko
// double margin			- marginaaliprosentti
// double monthlyFee		- tilinhoitomaksu/kk
function calculateMinimumInstallment(amount, interest, margin, monthlyFee) {
	installment = 17;  	// alhaisin mahdollinen kuukausierä, koska alhaisin mahdollinen luotto on 200e
	
	while (1) {
		if (installment <= 2 * (amount * (interest+margin) / 1200) + (2 * monthlyFee)) {
			installment++;
		}
		else {
			break;
		}
	}
	
	return installment;
}

function calculateInstallment(amount, interest, margin, monthlyFee) {
	
	var total_amount = amount * (interest+margin) / 1200;
	total_amount += monthlyFee * 12;
	total_amount += amount;

	return Math.round(total_amount / 11);
}

// calculateEstimation()
// ---------------------------------------------------------------------------------------------------------
// Laskee laina-ajan, tilinhoitomaksut, korot, luottokustannukset, luottohinnan ja todellisen vuosikoron
// kuukausierän, tuotteen hinnan, viitekoron, marginaalin ja tilinhoitomaksun perusteella
// ilman lyhennysvapaita kuukausia. Palauttaa arvot html-taulukossa.
// Kuukausierän on katettava korot.
// Tuotteen hinnan on oltava välillä 200-10000e
// Laina-ajan on oltava välillä 6-120kk
// ---------------------------------------------------------------------------------------------------------
// double loanAmountMonth	- kuukausierä
// double amount			- tuotteen hinta
// double interest			- viitekorko
// double margin			- marginaaliprosentti
// double monthlyFee		- tilinhoitomaksu/kk		
function calculateEstimation(loanAmountMonth, amount, interest, margin, monthlyFee) {
	loanPeriod = 0; 			// laina-aika, kuukausina
	saldo = amount;				// maksettavaa jäljellä, euroina
	totalInterest = 0;			// kokonaiskorko, euroina
	transactions = [];			// lyhennyserät todellisen vuosikoron laskemista varten
	transactions[0] = amount;   // tuotteen hinta todellisen vuosikoron laskemista varten

	if (amount < 200) {
		return "<table><tr><td>Luoton minimimäärä on 200&euro;.</td></tr></table>";
	}
	else if (amount > 10000) {
		return "<table><tr><td>Luoton maksimimäärä on 10.000&euro;.</td></tr></table>";
	}
	
	// kuukausierä on pienempi kuin korko
	if (loanAmountMonth <= 2 * (saldo * (interest+margin) / 1200) + (2 * monthlyFee)) {
		return "<table><tr><td>Valitse suurempi kuukausierä.</td></tr></table>";
	}
	
	while (saldo > loanAmountMonth) {											
		interestPaid = saldo * (interest+margin) / 1200;  				// kuukauden korko				
		installment = loanAmountMonth - monthlyFee - interestPaid;		// lyhennyksen osuus kuukausierästä
		saldo -= installment;											// maksettavaa jäljellä
		totalInterest += interestPaid;									// korot tähän mennessä
		loanPeriod ++;													// laina-aika tähän mennessä
		transactions[loanPeriod] = "-"+loanAmountMonth;					// lyhennyserä todellisen vuosikoron laskua varten
	}
	
	interestPaid = saldo * (interest+margin) / 1200;					// viimeisen kuukauden korko
	totalInterest += interestPaid;										// lopullinen kokonaiskorko
	loanPeriod ++;														// lopullinen laina-aika				
	transactions[loanPeriod] = "-"+(saldo+interestPaid+monthlyFee);		// lyhennyserä todellisen vuosikoron laskua varten
	
	if (loanPeriod < 6) {
		return "<table><tr><td>Valitse pienempi kuukausierä.</td></tr></table>";
	}
	else if (loanPeriod > 120) {
		return "<table><tr><td>Valitse suurempi kuukausierä.</td></tr></table>";
	}

	return "<strong>" + loanAmountMonth + ",-/kk</strong>"
		+ "Laina-aika <b>" + loanPeriod + " kk</b><br />"
		+ "Tilinhoitomaksut <b>" + loanPeriod * monthlyFee + " &euro;</b><br />"
		+ "Luottohinta <b>" + ((loanPeriod * monthlyFee) + totalInterest + amount).toFixed(0) + " &euro;</b><br />";
}

// calculateActualInterestRate()
// ---------------------------------------------------------------------------------------------------------
// Laskee ja palauttaa todellisen vuosikoron ilman lyhennysvapaita kuukausia.
// CalculateEstimation():in apufunktio.
// ---------------------------------------------------------------------------------------------------------
// array transactions	- tuotteen hinta ja lyhennykset, esim. [200, -25, -25, -25, -25, -25, -25, -25, -25, -25, -16.23]
// double interest		- korko				
function calculateActualInterestRate (transactions, interest) {
	d = 1;
	j = 0;
	x = 1 + interest / 100;
	error = false;
	
	date = new Date();
	year = date.getFullYear();									// kuluva vuosi
	month = date.getMonth();									// kuluva kuukausi
	theLastYear = year + parseInt(((transactions.length)/12));  // viimeisen lyhennyserän vuosi
	remainderMonths = (transactions.length) % 12;				// viimeisen lyhennyserän kuukausi
	
	if (month + remainderMonths > 12) {
		theLastYear ++;
		theLastMonth = (month + remainderMonths) - 12;
	}
	else {
		theLastMonth = month + remainderMonths;
	}
	
	theLastDate = new Date(theLastYear, theLastMonth, 15);		// viimeisen lyhennyserän päivämäärä
		
	do {
		prev_d = d;						
		sum1 = 0;
		sum2 = 0;
		transactionMonth = month;
		transactionYear = year;
		
		for (k = 0; k < transactions.length; k++) {			
			transactionDate = new Date(transactionYear, transactionMonth, 15);	// tämän lyhennyserän päivämäärä							
			days  = Math.abs(theLastDate - transactionDate) / (1000 * 60 * 60 * 24);						
			years = days / 365.25;
			
			xPowSum1 = Math.pow(x, years);
			xPowSum2 = Math.pow(x, years-1);					

			sum1 += transactions[k] * xPowSum1;
			sum2 += transactions[k] * years * xPowSum2;
					
			if (transactionMonth < 11) {
				transactionMonth ++;			// seuraavan lyhennyserän kuukausi
			}
			else {
				transactionMonth = 0;			// seuraavan lyhennyserän kuukausi
				transactionYear ++;				// seuraavan lyhennyserän vuosi
			}
		}

		if (sum2) {
			d = sum1/sum2;
			x -= d;
		} 
		else {
			error = true;				
		}

		j++;					
	} while (Math.abs(d) >= 0.0001 && j < 100 && Math.abs(d) < Math.abs(prev_d) && sum2 != 0.0 );

	if ((j < 100) && !error) {					
		return (x - 1) * 100;
	}

	return 0;
}

function show(id) {
	document.getElementById(id).style.visibility = "visible";
}

function hide(id) {
	document.getElementById(id).style.visibility = "hidden";
}