function gpf_round_float(num, decimals) {
	if (isNaN(num))
		return NaN;

	num*= Math.pow(10, decimals);
	num = Math.round(num);
	num/= Math.pow(10, decimals);
	return num;
}

function gpf_number_format(num, decimals, de_sep, th_sep) {
	if (isNaN(num))
		return NaN;

	num = gpf_round_float(num, decimals);

	var a = String(num).split('.');
	var n = a[0];

	var d = '';
	if (a.length > 1)
		d = a[1];

	var re = /(\d+)(\d{3})/;
	while (re.test(n)) {
		n = n.replace(re,'$1'+ th_sep +'$2');
	}
	for (var i=d.length; i<decimals; i++) {
		d += '0';
	}
	if (d.length > 0)
		n += de_sep;
	return n + d;
}

function gpf_float_to_money(num) {
	return gpf_number_format(num, 0,',',' ');
}

function gpf_to_float(str) {
	return parseFloat(str.replace(/\s/g,'').replace(/,/,'.'));
}

function gpf_calculate() {
	if (!document.getElementById) return;

	var DEFAULT_UROK = 3.89;
	var MIN_UROK = 3.89;
	var MAX_UROK = 15;
	var MIN_AKONTACE = 0;
	var MAX_AKONTACE = 90;
	var MIN_SPLATNOST = 5;
	var MAX_SPLATNOST = 40;

	var i_cena = document.getElementById('gpf_cena');
	var s_akontace = document.getElementById('gpf_akontace');
	var i_hypoteka = document.getElementById('gpf_hypoteka');
	var i_urok = document.getElementById('gpf_urok');
	var s_splatnost = document.getElementById('gpf_splatnost');
	var i_splatka = document.getElementById('gpf_splatka');

	if (i_cena && s_akontace && i_hypoteka && i_urok && s_splatnost && i_splatka) {
		var cena = gpf_to_float(i_cena.value);
		if (isNaN(cena)) cena = 0;

		var akontace = parseInt(s_akontace.value);
		if (isNaN(akontace))
			akontace = MIN_AKONTACE;
		else {
			if (akontace < MIN_AKONTACE) akontace = MIN_AKONTACE;
			if (akontace > MAX_AKONTACE) akontace = MAX_AKONTACE;
		}

		var hypoteka = cena - (akontace * (cena / 100));

		var urok = gpf_to_float(i_urok.value);
		if (isNaN(urok))
			urok = DEFAULT_UROK;
		else {
			if (urok < MIN_UROK) urok = MIN_UROK;
			if (urok > MAX_UROK) urok = MAX_UROK;
		}

		var splatnost = parseInt(s_splatnost.value);
		if (isNaN(splatnost))
			splatnost = MAX_SPLATNOST;
		else if (splatnost < MIN_SPLATNOST || splatnost > MAX_SPLATNOST)
			splatnost = MAX_SPLATNOST;

		// pocet mesicu za ktere ma byt uver splacen
		var n = splatnost * 12;
		// p je bezrozmerna mesicni urokova sazba (urok je rocni v %)
		var p = urok / (12.0 * 100.0);
		// vypocet vyse mesicni anuitni splatky
		var splatka = hypoteka * ((Math.pow(1 + p, n) * p) / (Math.pow(1 + p, n) - 1));

		i_cena.value = gpf_float_to_money(cena);
		s_akontace.value = akontace;
		i_hypoteka.value = gpf_float_to_money(hypoteka);
		i_urok.value = urok;
		s_splatnost.value = splatnost;
		i_splatka.value = gpf_float_to_money(splatka);
	}
}
