function calculateAfterTaxes(suffix)
{
	var sutartinis = parseValue('Sutartis');
	var vaiku = parseValue('Vaikai');
	var tevu = parseRadioValue('Tevai');
	
	var values = calculateIRankas(sutartinis, getPNPD(vaiku, tevu));
	
	setValue('IRankas', round(values.iRankas), suffix);
	
	setPassiveValues(values, suffix);
}

function calculateBeforeTaxes(suffix)
{
	var iRankas = parseValue('IRankas');
	var vaiku = parseValue('Vaikai');
	var tevu = parseRadioValue('Tevai');
	
	var values = calculateSutartinis(iRankas, getPNPD(vaiku, tevu));
	
	setValue('Sutartis', round(values.sutartinis), suffix);
	
	setPassiveValues(values, suffix);
}

function calculateIRankas(sutartinis, pnpd)
{
	var taxValues = calculateTaxes(sutartinis, pnpd);
	
	return {
		sutartinis: sutartinis,
		pnpd: pnpd,
		npd: taxValues.npd,
		pajamuMok: taxValues.pajamuMok,
		psd: taxValues.psd,
		sodra3: taxValues.sodra3,
		iRankas: sutartinis - taxValues.pajamuMok - taxValues.psd - taxValues.sodra3
	};
}

function calculateSutartinis(iRankas, pnpd)
{
	var sutartinis = getSutartinis(iRankas, pnpd);
	var taxValues = calculateTaxes(sutartinis, pnpd);
	
	return {
		sutartinis: sutartinis,
		pnpd: pnpd,
		npd: taxValues.npd,
		pajamuMok: taxValues.pajamuMok,
		psd: taxValues.psd,
		sodra3: taxValues.sodra3,
		iRankas: iRankas
	};
}

function calculateTaxes(sutartinis, pnpd)
{
	var npd = getNPD(sutartinis);
	var pajamuMok = round((sutartinis - npd - pnpd)*0.15);
	var psd = sutartinis*0.06;
	var sodra3 = sutartinis*0.03;
	
	return {
		npd: npd,
		pajamuMok: pajamuMok,
		psd: psd,
		sodra3: sodra3
	};
}

function setPassiveValues(values, suffix)
{
	var garantinis = values.sutartinis*0.001;
	var sodra31 = values.sutartinis*0.3098;
	var visaKaina = values.sutartinis + sodra31 + garantinis;
	
	setPassiveValue('Npd', round(values.npd), suffix);
	setPassiveValue('Pnpd', round(values.pnpd), suffix);
	setPassiveValue('PajamuMok', values.pajamuMok, suffix);
	setPassiveValue('SveikatosMok', round(values.psd), suffix);
	setPassiveValue('Sodra3', round(values.sodra3), suffix);
	setPassiveValue('Sodra31', round(sodra31), suffix);
	setPassiveValue('Garantinis', round(garantinis), suffix);
	setPassiveValue('VisaKaina', round(visaKaina), suffix);
}

function recalculate(suffix)
{
	if (isInteger(parseValue('Sutartis')) || !isInteger(parseValue('IRankas')))
		calculateAfterTaxes(suffix);
	else
		calculateBeforeTaxes(suffix);
}

function getSutartinis(iRankas, Pnpd)
{
	if (isNaN(iRankas) || isNaN(Pnpd))
		return Number.NaN;
	
	var ir = round(iRankas);
	var p = round(Pnpd);
	if (ir < 427.7 + 0.91*p)
		return 100.0*ir/91.0;
	else if (ir < 678.5 + 0.15*p)
		return (100.0*ir - 7050.0 - 15.0*p)/76.0;
	else if (ir < 2394.0 + 0.15*p)
		return (100.0*ir - 9450.0 - 15.0*p)/73.0;
	else
		return (100.0*ir - 15.0*p)/76.0;
}

function getNPD(sutartinis)
{
	return isNaN(sutartinis)?
		       Number.NaN : sutartinis < 800 ?
		           470 : sutartinis > 3150 ?
			           0 : 630 - sutartinis/5.0;
}

function getPNPD(vaiku, tevu)
{
	return isNaN(vaiku) ?
		       Number.NaN : vaiku <= 0 ?
		           0 : (100 + 200*(vaiku - 1))/tevu;
}

function isInteger(x)
{
	return Math.floor(x) == Math.ceil(x);
}

function get(name)
{
	return $('form[name=converter]').find('input[name=' + name + ']');
}

function parseValue(name)
{
	return parseFloat(get(name).val());
}

function parseRadioValue(name)
{
	var radios = get(name);
	for (var i = 0; i < radios.size(); i++)
		if (radios[i].checked)
			return parseFloat(radios[i].value);
	return Number.NaN;
}

function setValue(name, value, suffix)
{
	get(name).val(con(value, suffix));
}

function setPassiveValue(id, value, suffix)
{
	$('#' + id).val(con(value, suffix));
}

function con(value, suffix)
{
	if (suffix == null || suffix == '')
		return isNaN(value) ? '' : value;
	else
		return (isNaN(value) ? '' : value) + ' ' + suffix;
}

function round(value)
{
	return value < 0 ? 0 : Math.round(value*100)/100
}
