﻿/*
 * Copyright (C) 2007 GE Money
 * http://www.gemoney.lv
 * Unauthorized redistribution is strictly prohibited.
 * This product (software and/or documentation) is furnished under a License/Purchase Agreement
 * and may be used only in accordance with the terms of such agreement.
 * JS Created by VIG
 * JS edited by Sandis Kampe
 */

function DFE_Calculation()
{

	this.log10 = function (x)
	{
		  return Math.log(x)/Math.log(10)
	}

	this.pow_ed = function ($a, $b)
	{
		if ($a == 0) {
			if ($b == 0) {
				return false;
			} else {
				return 0;
			}
		}
		if ($b == 0) {
			return 1;
		}
		if (Math.round($b) == $b) {
			$r = 1;
			for ($i = 0; $i < $b; $i++) {
				$r *= $a;
			}
			for ($i = 0; $i < -$b; $i++) {
				$r /= $a;
			}
		} else if ($a < 0) {
			return false;
		} else {
			if (Math.abs($b) > .5) {
				return this.pow_ed($a, Math.round($b)) * this.pow_ed($a, $b - Math.round($b));
			}
			$r = 1;
			$mult = Math.log($a) * $b;
			$prod = 1;
			for ($i = 1; $i < 100; $i++) {
				$prod *= $mult / $i;
				$r += $prod;
				if ($i > 100 || this.log10(Math.abs($prod)) < -10) {
					break;
				}
			}
		}
		return $r;
	}

	this.paymentSchedule = function ($price, $month, $apr_year, $downpayment_value, $residual_value, $monthly_payment)
	{
		$monthly_payment = Math.round($monthly_payment*100)/100;

		if ((typeof $apr_year != 'object') || (typeof $apr_year != 'array'))
		{
			$tmp_apr = $apr_year;
			$apr_year = [];
			for ($i = 0; $i < 72; $i++) {
				$apr_year[$i] = $tmp_apr;
			}
		}

		$apr = [];
		for ($i = 0; $i < $apr_year.length; $i++) {
			$apr[$i] = $apr_year[$i] / 1200;
		}

		$loan = $principal_sum = Math.round($price*100)/100 - Math.round($downpayment_value*100)/100 - Math.round($residual_value*100)/100;

		$_credit = $price - $downpayment_value;

		$cond_type = 0;

		while (($apr_year[$cond_type]) && $apr_year[$cond_type] == 0) {
			$cond_type++;
		}

		if ($apr_year[$cond_type]) {
			$month_prc = $apr_year[$cond_type] / 100;
			$apr_average = $apr_year[$cond_type];
		} else {
			$month_prc = 0;
			$apr_average = 0;
		}

		if ($month_prc > 0) {
			if ($cond_type == 0) {
				$month_sum = $_credit * ($month_prc / 12 / (1 - this.pow_ed((1 + $month_prc / 12), - $month)));
			} else {
				if ($month <= $cond_type) {
					$month_sum = $_credit / $month;
				} else {
					$b_13 = this.pow_ed(1 + ($month_prc / 12), $month - $cond_type);
					$month_sum = Math.ceil($b_13 * $_credit / (($b_13 - 1) / ($month_prc / 12) + $b_13 * $cond_type) * 100) / 100;
				}
			}
		} else {
			$month_sum = $_credit / $month;
		}

		$pmt_1 = Math.round($month_sum*100)/100;

		if (!$monthly_payment || $monthly_payment == $pmt_1) {
			/**
			 * Fixed term
			 */
			$monthly_payment = $pmt_1;
			$creditas = $_credit - $month_sum * $cond_type;

			if ($creditas <= 0) {
				$m24 = $_credit / $month_sum;

			} else {

				if (1 - $month_prc / 12 * $creditas / $month_sum > 0) {
					$m24 = $cond_type + ( - Math.log(1 - $month_prc / 12 * $creditas / $month_sum) / Math.log(1 + $month_prc / 12));
				} else {
					$m24 = $_credit / $month_sum;
				}
			}
			$m24 = Math.round($m24);

			$month_prec = $m24;
			$g4 = $month_sum * $m24;
		} else {
			/**
			 * Fixed payment
			 */
			$creditas = $_credit - $monthly_payment * $cond_type;
			if ($creditas <= 0) {
				$term = $_credit / $monthly_payment;
			} else {
				if (1 - $month_prc / 12 * $creditas / $monthly_payment > 0) {
					$term = $cond_type + ( - this.log10(1 - $month_prc / 12 * $creditas / $monthly_payment) / this.log10(1 + $month_prc / 12));
				} else {
					$term = $_credit / $monthly_payment;
				}
			}
			$month_prec = $term;

			$g4 = $term * $monthly_payment;
			$month = Math.ceil($term);
		}

		$monSum = Math.round($g4*100)/100;

		$monthly_payment_final = $monSum - ($month - 1) * $monthly_payment;

		$interest = [];
		$principal = [];
		$principal_remaining = [];


		for ($x = 0; $x < $month - 1; $x++) {
			$interest[$x] = Math.round((($principal_sum + $residual_value) * $apr[$x])*100)/100;
			$principal[$x] = $monthly_payment - $interest[$x];
			$principal_remaining[$x] = $principal_sum;
			$principal_sum -= $principal[$x];
		}

		$interest[$month - 1] = Math.round(($monthly_payment_final - $principal_sum)*100)/100;
		$principal[$month - 1] = $principal_sum;
		$principal_remaining[$month - 1] = $principal_sum;

		$total = [Math.round($loan*100)/100,Math.round(($monSum - $loan)*100)/100,Math.round($monSum*100)/100];

		$item = [];

		for ($x = 0; $x < $month; $x++) {
			if ($x == $month - 1) {
				$item.push({'class': ($x % 2 ? 'even' : 'odd'), 'td1': $x + 1, 'td2': Math.round($principal_remaining[$x]*100)/100, 'td3': Math.round($principal[$x]*100)/100, 'td4': Math.round($interest[$x]*100)/100, 'td5': Math.round($monthly_payment_final*100)/100});
			} else {
				$item.push({'class': ($x % 2 ? 'even' : 'odd'), 'td1': $x + 1, 'td2': Math.round($principal_remaining[$x]*100)/100, 'td3': Math.round($principal[$x]*100)/100, 'td4': Math.round($interest[$x]*100)/100, 'td5': Math.round($monthly_payment*100)/100});
			}
		}

		$percentArray = {'0': Math.round(($total[1] / $total[0] * 100 / $month_prec)*100)/100, '1': Math.round(($total[1] / $total[0] * 100 / $month_prec * 12)*100)/100, '2': Math.round($apr_average*100)/100};
		$re = {'summa': Math.round($loan*100)/100, 'items': $item, 'total': $total,'percent': $percentArray};
		return $re;
	}

	this.aprc = function aprc($_CREDIT, $_TERM_MONTH, $_COMM_SUM, $_INV_DATE, $_M_DAT, $_M_SUM, $_DELIVE_SUM)
	{
		$s = 0;
		$time_intervals = [];

		$_INV_DATE = -1;

		for($trm = 1; $trm <= $_TERM_MONTH; $trm++) {

			$_M_DAT[$trm] = new Date($_M_DAT[$trm].getYear(), $_M_DAT[$trm].getMonth(), $_M_DAT[$trm].getDate(), 0, 0, 0);
			$time_intervals[$trm] = Math.round(($_M_DAT[$trm].getTime() - $_INV_DATE) / 86400 / 1000) / 365;
			$s += $_M_SUM[$trm];
		}

		if ($s > $_CREDIT - $_DELIVE_SUM || $_COMM_SUM > 0) {
			$m_aprc = $m_aprc1 = $m_aprc2 = $m_xpsum = $m_xpsum1 = $m_xpsum2 = 0;
			$m_aprcnew = 1;
			$m_delta = .1;
			$m_i = 0;
			while (true) {

				$m_xpsum = $_COMM_SUM + $_DELIVE_SUM;

				for ($trm = 1; $trm <= $_TERM_MONTH; $trm++) {
					$m_xpsum += $_M_SUM[$trm] / this.pow_ed(1 + $m_aprc, $time_intervals[$trm]);
				}
				switch (true) {
					case $m_i == 0:
					    $m_xpsum1 = $m_xpsum;
					    $m_aprc1 = $m_aprc;
					    $m_aprc = $m_aprc+$m_delta;
					    break;
					  case $m_i == 1:
					    $m_xpsum2 = $m_xpsum;
						$m_aprc2 = $m_aprc;
						$m_aprc = $m_aprc1 + $m_delta * ($_CREDIT - $m_xpsum1) / ($m_xpsum2 - $m_xpsum1);
						break;
					  default:
					    $m_aprcnew = $m_aprc2 + ($_CREDIT - $m_xpsum2) / (($m_xpsum - $m_xpsum1) / ($m_aprc - $m_aprc1));
					    $m_aprc1 = $m_aprc2;
					    $m_xpsum1 = $m_xpsum2;
					    $m_aprc2 = $m_aprc;
						$m_xpsum2 = $m_xpsum;
						$m_aprc = $m_aprcnew;
				}
				if (Math.round($m_aprcnew*1000000)/1000000 == Math.round($m_aprc2*1000000)/1000000 || $m_i > 10) {
					$m_aprc = $m_aprcnew;
					  break;
				}
				$m_i = $m_i + 1;
			}
			$_aprc  = $m_aprc * 100;
		} else {
				$_aprc  = 0;
		}
		return $_aprc ;
	}


	this.gpl = function ($sum, $term, $dwn, $comm, $apr)
	{
		$dwn = parseFloat($dwn);
		$comm = parseFloat($comm);
		$schedule = this.paymentSchedule($sum, $term, $apr, $dwn, 0, false);

		$payments = [];
		$dates = [];
		$date = 0;
		$i = 1;
		$month = 365.2425*24*60*60*1000/12;
		for(k in $schedule['items']) {
			$payments[$i] = $schedule['items'][k]['td5'];
			$date += $month;
			$dates[$i] = new Date(parseInt($date));
			$i++;
		}
		$gpl = this.aprc($sum - $dwn, $term, $comm, 0, $dates, $payments, 0);
		$gpl = Math.round($gpl*100)/100;
		return {'gpl': $gpl, 'payment': $schedule['items'][0]['td5']};
	}
}




function addCents(d)
{
	d = d.toString();
	i = d.indexOf('.');
	if(i == -1)
		return d + '.00';
	else
		if(d.length - i == 2)
			return d + '0';
		else
			return d;
}


function dfeCalc()
{
	var tarif = document.getElementById('dfeTarif').value;
	var price = document.getElementById('dfePrice').value;
	var term = document.getElementById('dfeTerm').value;
	var dwn = document.getElementById('dfeDwn').value;
	var commission = 0;
	var apr = 0;

	price = price.replace(',','.');
	price = parseInt(price);
	price = isNaN(price) ? 49 : price;
	document.getElementById('dfePrice').value = price;

	tarif = parseInt(tarif);
	tarif = isNaN(tarif) ? 0 : tarif;
	document.getElementById('dfeTarif').value = tarif;

	term = parseInt(term);
	term = isNaN(term) ? 1 : term;
	document.getElementById('dfeTerm').value = term;

	dwn = dwn.replace(',','.');
	dwn = parseFloat(dwn);
	dwn = isNaN(dwn) ? 0 : dwn;
	document.getElementById('dfeDwn').value = dwn;

	if((dwn < 0) || (dwn > 100)) {
		dwn = dwn < 0 ? 0 : 100;
		alert("Minimālais avanss ir 0%! \nMaximālais avanss ir 100%!");
		document.getElementById('dfeDwn').value = dwn;
	}

	if(price < 49) {
		price = 49;
		alert("Kredīta summa nevar būt mazākā par 49 Ls");
		document.getElementById('dfePrice').value = price;
	}

	if(price > 10000) {
		price = 10000;
		//alert("Kredīta summa nevar pārsniegt 10000 Ls");
		document.getElementById('dfePrice').value = price;
	}

	if((term < 1) || (term > 60)) {
		term = term < 1 ? 1 : 60;
		document.getElementById('dfeTerm').value = term;
	}

	switch(tarif) {
		//1-4. pirkumi
		case 0:
			//49-499
			if((price >= 49) && (price <= 499)) {
				if(dwn == 0)
				{
					commission = 0;
					apr = 24.50;
				} else {
					commission = 0;
					if(dwn < 5) {
						dwn = 5;
						alert("Minimālais avanss ir 5% vai 0%");
					} else {
						dwn = dwn - commission;
					}
					apr = 24.50;
				}
			//500-2500
			} else if ((price >= 500) && (price <= 2500)) {
				if(dwn == 0)
				{
					commission = 0;
					apr = 23.50;
				} else {
					commission = 0;
					if(dwn < 5) {
						dwn = 5;
						alert("Minimālais avanss ir 5% vai 0%");
					} else {
						dwn = dwn - commission;
					}
					apr = 23.50;
				}
			//2501-10000
			} else if ((price >= 2501) && (price <= 10000)) {
				commission = 0;
				dwn = dwn;
				apr = 17.50;
			}
			break;
		//2-4. pirkumi
		case 1:
			//49-499
			if((price >= 49) && (price <= 499)) {
				if(dwn == 0)
				{
					commission = 0;
					apr = 24.00;
				} else {
					commission = 0;
					if(dwn < 5) {
						dwn = 5;
						alert("Minimālais avanss ir 5% vai 0%");
					} else {
						dwn = dwn - commission;
					}
					apr = 24.00;
				}
			//500-2500
			} else if ((price >= 500) && (price <= 2500)) {
				if(dwn == 0)
				{
					commission = 0;
					apr = 23.00;
				} else {
					commission = 0;
					if(dwn < 5) {
						dwn = 5;
						alert("Minimālais avanss ir 5% vai 0%");
					} else {
						dwn = dwn - commission;
					}
					apr = 23.00;
				}
			//2501-10000
			} else if ((price >= 2501) && (price <= 10000)) {
				commission = 0;
				dwn = dwn;
				apr = 17.00;
			}
			break;
		//4 un vairāk pirkumi
		case 2:
			//49-499
			if((price >= 49) && (price <= 499)) {
				if(dwn == 0)
				{
					commission = 0;
					apr = 21.00;
				} else {
					commission = 0;
					if(dwn < 5) {
						dwn = 5;
						alert("Minimālais avanss ir 5% vai 0%");
					} else {
						dwn = dwn - commission;
					}
					apr = 21.00;
				}
			//500-2500
			} else if ((price >= 500) && (price <= 2500)) {
				if(dwn == 0)
				{
					commission = 0;
					apr = 20.00;
				} else {
					commission = 0;
					if(dwn < 5) {
						dwn = 5;
						alert("Minimālais avanss ir 5% vai 0%");
					} else {
						dwn = dwn - commission;
					}
					apr = 20.00;
				}
			//2501-10000
			} else if ((price >= 2501) && (price <= 10000)) {
				commission = 0;
				dwn = dwn;
				apr = 16.50;
			}
			break;

	}


	var dwnPercent = dwn;
	dwn = price / 100 * dwn;

	dfeCalculator = new DFE_Calculation;
	res = dfeCalculator.gpl(price, term, dwn, commission, apr);

	document.getElementById('firstPay').value = addCents(Math.round((dwn + price / 100 * commission)*100)/100);
	document.getElementById('monthPay').value = addCents(res['payment']);
	//document.getElementById('comm').value = addCents(Math.round((price / 100 * commission)*100)/100);
	//document.getElementById('dwn').value = addCents(Math.round((dwn)*100)/100);
	//month
	//document.getElementById('apr').value = Math.round((apr / 12)*100)/100;
}
