//####################################################################################################################################
//	Credit
//####################################################################################################################################

function Credit() {
	
	this.interest = 11.4;
	
	var laufzeit;
	var barkaufpreis;
	var anzahlung;
	var nomZins;
	var effZins;
	
	var hasRSV;
	
	var PPIRate;
	var PPITotal;
	var rate;
	var totalKosten;
	var zinsKosten;
	
	var maxBarkaufpreis = 250000;
	var minBarkaufpreis = 1000;
	
	function checkMindestLaufzeit () {
		return (laufzeit != undefined && laufzeit != "" && laufzeit > 5);
	}
	
	function checkBarkaufpreis () {
		return (barkaufpreis != undefined && barkaufpreis <= maxBarkaufpreis && barkaufpreis >= minBarkaufpreis);
	}
	
	function MWST () {
		return 0.076;
	}
	
	function Runden (a_value) {
		var rappen = Math.round(a_value*100);
		// Runden auf 5 Rappen
		var mod = rappen%5;
		(mod > 2.5) ? rappen += (5-mod) : rappen -= mod;
		var betrag = rappen / 100;
		return betrag;
	}
	
	function CalcEffZins (a_nomZins) {
		return (Math.pow(((a_nomZins / 1200) + 1) , 12) - 1) * 100;
	}
	
	function CalcNomZins (a_effZins) {
		return ((Math.pow((a_effZins / 100 + 1),(1 / 12)) - 1) * 12) * 100;
	}
	
	function CalcPPI ()
	{
		var rsv;
		
		if (laufzeit < 7) rsv = 0.27279;
		else if (laufzeit < 13) rsv = 1.53825;
		else if (laufzeit < 19) rsv = 2.57019;
		else if (laufzeit < 25) rsv = 3.21027;
		else if (laufzeit < 31) rsv = 3.60528;
		else if (laufzeit < 37) rsv = 3.86484;
		else if (laufzeit < 43) rsv = 4.06014;
		else if (laufzeit < 49) rsv = 4.20756;
		else if (laufzeit < 55) rsv = 4.32348;
		else rsv = 4.41861;
		return rsv/100;
	}
	
	function CalcRatePPI ()	{
		return CalcTotalPPI() / laufzeit;
	}
	
	function CalcTotalPPI () {
		var rate = CalcClassic(barkaufpreis, nomZins / 1200, laufzeit);
		var tmpRate = (rate >= 2000) ? 2000 : rate;
		return (CalcPPI(laufzeit) * laufzeit * tmpRate);
	}
	
	function CalcClassic (a_barkaufpreis, a_zinssatz, a_laufzeit) {
		var PMT = (a_barkaufpreis * a_zinssatz) / (1 - Math.pow(1 + a_zinssatz, -a_laufzeit));
		return Runden(PMT);		
	}
	
	function CalcTotal () {
		return (laufzeit * rate) + anzahlung;
	}
	
	function CalcZins () {
		/*CalcRatePPI() * laufzeit*/
		//return (rate * laufzeit - ((barkaufpreis - anzahlung) + Runden(PPITotal))) / laufzeit * 12;
		return (rate * laufzeit - ((barkaufpreis - anzahlung) + Runden(PPITotal)));
	}
	
	
	
	this.calculate = function (a_barkaufpreis, a_laufzeit, a_hasRSV, a_anzahlung) {
		
		laufzeit = Number(a_laufzeit);
		barkaufpreis = Number(a_barkaufpreis);
		hasRSV = a_hasRSV;
		anzahlung = Number(a_anzahlung);
		effZins = this.interest;
		nomZins = CalcNomZins(effZins);		
		
		if (!checkBarkaufpreis()) {
			handleCreditError(minBarkaufpreis, maxBarkaufpreis);
			return false;
		}
		
		if (!checkMindestLaufzeit()) {
			handleRuntimeError ();
			return false;
		}
	
		PPITotal = (hasRSV) ? CalcTotalPPI(): 0;
		PPIRate = (hasRSV) ? CalcRatePPI(): 0;
		rate = CalcClassic(barkaufpreis + PPITotal, nomZins / 1200, laufzeit);
		
		totalKosten = CalcTotal();
		zinsKosten = CalcZins();
		
		var out = {
				rate: 			Runden(rate).toFixed(2),
				rsv: 			Runden(PPIRate).toFixed(2),
				zinsKosten: 	Runden(zinsKosten).toFixed(2),
				totalKosten:	Runden(totalKosten).toFixed(2)
		};
				
		return out;
	}	
}


function handleRuntimeError () {
	message.error(messages['title']['Ungueltige_oder_fehlende_Angaben'], messages['error']['Laufzeit_waehlen']);
}
	
function handleCreditError (a_minBarkaufpreis, a_maxBarkaufpreis) {
	message.error(messages['title']['Ungueltige_oder_fehlende_Angaben'], messages['error']['Wunschkredit_Fehler_1']+" "+a_minBarkaufpreis.toFixed(2)+" "+messages['error']['Wunschkredit_Fehler_2']+" "+a_maxBarkaufpreis.toFixed(2)+".");
}

var credit = new Credit();