// Copyright 2007 Christian Davén

// sök efter "Skatteavdrag enligt tabell med ADB 2009" för att hitta information hos Skatteverket

function clearMessages()
{
	document.getElementById("resultsp").style.display = "none";
	document.getElementById("msg_salary").firstChild.nodeValue = "";
	document.getElementById("msg_parish").firstChild.nodeValue = "";
}

function getGrundavdrag(pbb, yearlyPay)
{
	var grundavdrag = 0;
	if(yearlyPay <= 0.99 * pbb)
		grundavdrag = 0.423 * pbb;
	else if (yearlyPay <= 2.72 * pbb)
		grundavdrag = 0.423 * pbb + 0.2 * (yearlyPay - 0.99 * pbb);
	else if (yearlyPay <= 3.11 * pbb)
		grundavdrag = 0.77 * pbb;
	else if (yearlyPay <= 7.88 * pbb)
		grundavdrag = 0.77 * pbb - 0.1 * (yearlyPay - 3.11 * pbb);
	else
		grundavdrag = 0.293 * pbb;
		
	// avrundas till närmast högre hundratal
	return 100 * Math.ceil(grundavdrag / 100);
}

function getPBB(year)
{ // prisbasbelopp
	var pbb = 0;

	switch(year)
	{
		case 2006: pbb = 39700; break;
		case 2007: pbb = 40300; break;
		case 2008: pbb = 41000; break;
		case 2009: pbb = 42800; break;
		case 2010: pbb = 42400; break;
	}
	
	return pbb;
}

function getBrytpunkter(year)
{ // skiktgränser (ej brytpunkter!)
	var bp = [0,0];

	switch(year)
	{
		case 2006: bp = [306000, 460600]; break;
		case 2007: bp = [316700, 476700]; break;
		case 2008: bp = [328800, 495000]; break;
		case 2009: bp = [367600, 526200]; break;
		case 2010: bp = [372100, 532700]; break;
	}
	
	return bp;
}

function getArbetsgivaravg(year)
{
	return 0.3142;
}

function getJobbavdrag(year, yearlyPay, kommunalskattesats)
{
	var avdrag = 0;
	var pbb = getPBB(year);
	var grundavdrag = getGrundavdrag(pbb, yearlyPay);

	switch(year)
	{
		case 2007:
			if(yearlyPay > 2.72 * pbb)
				avdrag = kommunalskattesats * (1.176 * pbb - grundavdrag);
			break;
		case 2008:
			if(yearlyPay > 7 * pbb)
				avdrag = kommunalskattesats * (1.413 * pbb - grundavdrag);
			else if(yearlyPay > 2.72 * pbb)
				avdrag = kommunalskattesats * (1.272 * pbb - grundavdrag + 0.033 * (yearlyPay - 2.72 * pbb));
			break;
		case 2009:
			if(yearlyPay > 7 * pbb)
				avdrag = kommunalskattesats * (1.642 * pbb - grundavdrag);
			else if(yearlyPay > 2.72 * pbb)
				avdrag = kommunalskattesats * (1.363 * pbb - grundavdrag + 0.065 * (yearlyPay - 2.72 * pbb));
			break;
		case 2010:
			if(yearlyPay > 7 * pbb)
				avdrag = kommunalskattesats * (1.868 * pbb - grundavdrag);
			else if(yearlyPay > 2.72 * pbb)
				avdrag = kommunalskattesats * (1.461 * pbb - grundavdrag + 0.095 * (yearlyPay - 2.72 * pbb));
			break;
	}
	
	return Math.round(avdrag);
}

function getTax(year, parish)
{
	var tax;
	
	var parishtaxyears = taxes[parish];
	if(parishtaxyears == undefined)
		return -1;
	
	tax = parishtaxyears[year];
	if(tax == undefined)
		return -2;
	
	return tax;
}

function calculate()
{
	var ok = 1;
	var today = new Date();

	clearMessages();
	
	document.getElementById("results_chart").src = "";

	var salary = getAndParseString("salary");
	if(salary == -999) ok = 0;
	var parish = getString("parish").toUpperCase();
	var incomeYear = parseInt(document.getElementById("in_year").value);

	if(!ok) return;

	var yearlyPay = 12 * salary;
	var prisbasbelopp = getPBB(incomeYear);
	var grundavdrag = getGrundavdrag(prisbasbelopp, yearlyPay);

	if(salary == 0)
	{
		showMessage("Fyll i månadslön", "msg_salary")
		return;
	}
	if(yearlyPay < grundavdrag)
	{
		showMessage("Månadslönen är för liten", "msg_salary")
		return;
	}
	tax = getTax(incomeYear, parish);
	if(tax == -1)
	{
		showMessage("Välj en giltig församling", "msg_parish")
		return;
	}
	else if(tax == -2)
	{
		showMessage("Församlingen fanns inte det valda året", "msg_parish")
		return;
	}

	document.body.style.cursor = "wait";
	
	var kommunalskattesats = (tax.kommun + tax.landsting) / 100;
	var kyrkoavgift = tax.kyrka / 100;
	if(!document.getElementById("in_church").checked) kyrkoavgift = 0;
	var begravningsavgift = tax.begravning / 100;

	var kommunalskatt = (yearlyPay - grundavdrag) * (kommunalskattesats + begravningsavgift + kyrkoavgift);

	// beräkna vilken skattetabell som borde användas	
	var skattesats = kommunalskattesats + begravningsavgift + kyrkoavgift;
	var skattetabell = Math.floor(100 * skattesats);
	if(Math.floor((10000 * skattesats) % 100) > 50)
		skattetabell += 1;
		
	var brytpunkter = getBrytpunkter(incomeYear);
		
	// beräkna statlig skatt
	var skatt_stat = 0;
	if(yearlyPay - grundavdrag > brytpunkter[0]) // statlig skatt à 20%
		skatt_stat = ((yearlyPay - grundavdrag) - brytpunkter[0]) * 0.2;
	if(yearlyPay - grundavdrag > brytpunkter[1]) // förhöjd statlig skatt, ytterligare 5%
		skatt_stat += ((yearlyPay - grundavdrag) - brytpunkter[1]) * 0.05;

	// beräkna jobbskatteavdrag
	jobbavdrag = getJobbavdrag(incomeYear, yearlyPay, kommunalskattesats);

	// dra bort alla skatter från lönen
	var salaryAfterTax = (yearlyPay - kommunalskatt - skatt_stat + jobbavdrag) / 12;

	showResults("Du får " + FormatNumberBy3(salaryAfterTax.toFixed(0), ".", " ") + " kr i månaden efter skatt");
	
	var skatt_kommun = (yearlyPay - grundavdrag) * tax.kommun / 100;
	var skatt_landsting = (yearlyPay - grundavdrag) * tax.landsting / 100;
	var skatt_kyrka = (yearlyPay - grundavdrag) * (kyrkoavgift + begravningsavgift);
	
	document.getElementById("results_kommunal").firstChild.nodeValue = FormatNumberBy3((skatt_kommun / 12).toFixed(0), ".", " ") + " kr";
	document.getElementById("results_landsting").firstChild.nodeValue = FormatNumberBy3((skatt_landsting / 12).toFixed(0), ".", " ") + " kr";
	document.getElementById("results_kyrka").firstChild.nodeValue = FormatNumberBy3((skatt_kyrka / 12).toFixed(0), ".", " ") + " kr";
	document.getElementById("results_statlig").firstChild.nodeValue = FormatNumberBy3((skatt_stat / 12).toFixed(0), ".", " ") + " kr";
	document.getElementById("results_avdrag").firstChild.nodeValue = FormatNumberBy3((-1 * jobbavdrag / 12).toFixed(0), ".", " ") + " kr";
	document.getElementById("results_totalskatt").firstChild.nodeValue = FormatNumberBy3((100 * (salary - salaryAfterTax) / salary).toFixed(1), ".", " ") + "%";
	// document.getElementById("results_tabell").firstChild.nodeValue = skattetabell;

	// var arbAvg = yearlyPay * getArbetsgivaravg(incomeYear);
	// yearlyPay += arbAvg;
	
	var chartKommun = (100 * (skatt_kommun - jobbavdrag) / yearlyPay).toFixed(2); 
	var chartLandsting = (100 * skatt_landsting / yearlyPay).toFixed(2); 
	var chartKyrka = (100 * skatt_kyrka / yearlyPay).toFixed(2); 
	var chartStat = (100 * skatt_stat / yearlyPay).toFixed(2);
	// var chartArbavg = (100 * arbAvg / yearlyPay).toFixed(2);
	var chartLeft = (100 * (yearlyPay - skatt_kommun - skatt_landsting - skatt_stat - skatt_kyrka + jobbavdrag) / yearlyPay).toFixed(2); 

	var chl = new Array();
	var chco = new Array();
	var chd = new Array();

	if(chartKommun > 0)
	{
		chl.push("Kommun");
		chco.push("995C00");
		chd.push(chartKommun);
	}
	if(chartLandsting > 0)
	{
		chl.push("Landsting");
		chco.push("991F00");
		chd.push(chartLandsting);
	}
	if(chartKyrka > 0)
	{
		chl.push("Kyrka");
		chco.push("E6ECFF");
		chd.push(chartKyrka);
	}
	if(chartStat > 0)
	{
		chl.push("Stat");
		chco.push("0033CC");
		chd.push(chartStat);
	}
	/*if(chartArbavg > 0)
	{
		chl.push("Arb.avg.");
		chco.push("ffffff");
		chd.push(chartArbavg);
	}*/
	
	chl.push("Behållning");
	chco.push("00B366");
	chd.push(chartLeft);

//		chartHref += "&chl=Kommun|Landsting|Stat|Kyrka|Behållning&chco=991F00,995C00,0033CC,E6ECFF,00B366";
//		chartHref += "&chd=t:" + chartKommun + "," + chartLandsting + "," + chartStat + "," + chartKyrka + "," + chartLeft;

	var chartHref = "http://chart.apis.google.com/chart?chs=400x175&cht=p3&chl=" + chl.join("|") + "&chd=t:" + chd.join(",") + "&chco=" + chco.join(",");
	document.getElementById("results_chart").src = chartHref;  

	document.body.style.cursor = "default";
}
