/*
	Info unter:
	http://www.bundesfinanzministerium.de/Service/Interaktiver-Steuerrechner-.577.htm
	Programmablaufplan für die maschinelle Berechnung der vom Arbeitslohn
	einzubehaltenden Lohnsteuer, des Solidaritätszuschlags und der
	Maßstabsteuer für die Kirchenlohnsteuer in 2004 und 2005
*/

var ZKF, LZZ;
var KRV=0;
var KZTAB;
var STKL=4;
var LSTLZZ=0;
var ST, SOLZLZZ;
var RE4U;
var RE4O;
var VSPO,VSPVOR;
var HEY1=0;
var HEY2=1;
var HEY3=22;
var ZTABFB=0;
var KFB=0;
var BK=0;
var JFREIB=0
var VSPMAX1,VSPMAX2;
var RE4LZZV=0;
var ZRE4VP=0;
var ZRE4=0;
var ARBGRENZ_A;
var ARBGRENZ_N;
var ARB;
var ARBGRENZ;
var KPGRENZ;
var RV;
var KV=13.7;
var PV;

var PFZ=true;
var kindervorhanden=false;
var ALV;
var steuerjahr;
var faktor=1;
var tflag=0;
var LBGR_W=120000;
var GVDGR=75;

var VSP1;
var VSP2;
var VSPN;
var VHP;
var zflag=1;

var ALUST=0;
var ALUBRUTTO=0;
var BULAND=1;

/*----------------------------------------------------------------------------------------*/
function steuer2005(form)
{
	tflag=0;
	steuerjahr=2005;
	form.jahr.value=steuerjahr;
	ARBGRENZ_A=5200;
	ARBGRENZ_N=4400;
	KPGRENZ=3525;
	RV=19.5;
	ALV=6.5;
	PV=1.7;
	PV23=0.5;
	pfz_status(form);
	berechne(form);
}

/*----------------------------------------------------------------------------------------*/
function steuer2006(form)
{
tflag=0;
steuerjahr=2006;
form.jahr.value=steuerjahr;
ARBGRENZ_A=5250;
ARBGRENZ_N=4400;
KPGRENZ=3562.5;
RV=19.5;
ALV=6.5;
PV=1.7;
PV23=0.5;
pfz_status(form);
berechne(form);
}


/*----------------------------------------------------------------------------------------*/
function steuer2007(form)
{
tflag=0;
steuerjahr=2007;
form.jahr.value=steuerjahr;
ARBGRENZ_A=5250;
ARBGRENZ_N=4550;
KPGRENZ=3562.5;
RV=19.90001;
ALV=4.2;
PV=1.7;
PV23=0.5;
pfz_status(form);
berechne(form);
}


/*----------------------------------------------------------------------------------------*/
function steuer2008(form)
{
tflag=0;
steuerjahr=2008;
form.jahr.value=steuerjahr;
ARBGRENZ_A=5250;
ARBGRENZ_N=4550;
KPGRENZ=3562.5;
RV=19.90001;
ALV=4.2;
PV=1.7;
PV23=0.5;
pfz_status(form);
berechne(form);
}



/*----------------------------------------------------------------------------------------*/
function pfz_status(form)
{
	// ------ Sonderfall für Sachsen Erhöhte Pflegeversicherung --------------------
	if (form.bundesland.selectedIndex==12) PV=2.7;
	// -----------------------------------------------------------------------------------------------------

	x=auslesen(form.jahrgang.value);
	form.jahrgang.value=x;
	jg=eval(form.jahrgang.value);

	if(jg>1990)
	{
		alert("Jahrgang ist f&uuml;r eine Gehaltsberechnung nicht realistisch!"+"\n"+"Achten Sie auch auf eine vierstellige Eingabe.");
		form.jahrgang.focus();
		return;
	}

	if(jg<1906)
	{
		alert("Jahrgang ist f&uuml;r eine Gehaltsberechnung nicht realistisch!"+"\n"+"Achten Sie auch auf eine vierstellige Eingabe.");
		form.jahrgang.focus();
		return;
	}
	
	if ((steuerjahr-jg)>23)PFZ=true;else PFZ=false;

	if(kindervorhanden==true)PFZ=false;
	if (jg<=1940)PFZ=false;
	if (PFZ==true) PV=PV+PV23;else PV=PV;
}


/*----------------------------------------------------------------------------------------*/
function kv_status(form)
{
if (form.kv.checked==false)clear_1(form);
}




/*----------------------------------------------------------------------------------------*/
function teilzeit_einstellen(form)
{
form.verlust.value="";
form.nt2.value="";
berechne_faktor(form);
form.teilzeit.value=Math.round(faktor*form.bt1.value);
}

/*----------------------------------------------------------------------------------------*/
function teilzeit_rechnen(form)
{
if (form.bt1.value==0)
{
alert ("Reihenfolge einhalten !! Zuerst mit dem Gehaltsrechner das normale Monatseinkommen (Vollzeit) berechnen!");
return;
}
form.lohn.value=form.teilzeit.value;
steuerjahr=eval(form.jahr.value);
tflag=1;
berechne(form);
form.nt2.value=Math.round(form.netto.value);
form.verlust.value=Math.round(eval(form.nt1.value)-eval(form.nt2.value));
}

/*----------------------------------------------------------------------------------------*/

function clear_1(form)
{
	form.lohnst.value="";
	form.soli.value="";
	form.kist.value="";
	form.krank.value="";
	form.pfleg.value="";
	form.rent.value="";
	form.arblo.value="";
	form.netto.value="";
	form.summeab.value="";
	form.verlust.value="";
	form.alu.value="";
	form.teilzeit.value="";
	form.bt1.value="";
	form.nt1.value="";
	form.nt2.value="";

	if (form.kija[1].checked)
	{
		form.selectKind.disabled=true;
		kindervorhanden=false;
		form.selectKind.selectedIndex=0;
	} else
	{
		form.selectKind.disabled=false;
		kindervorhanden=true;
	}
}


/*----------------------------------------------------------------------------------------*/

function berechne(form)
{
	var RE4LZZ;
	var SAF=22;
	var LSTJAHR;
	var RE4;
	var SICHER;

	HEY1=0;
	/*if (document.links.length !=HEY3) return;*/

	RE4=auslesen(form.lohn.value);
	form.lohn.value=RE4;
	RE4=RE4*100;// mit Cent weiterrechnen
	JFREIB=Math.round(auslesen(form.frei.value));
	form.frei.value=JFREIB;
	JFREIB=JFREIB*100;

	if(form.krv.checked) KRV=0; else KRV=1;
	
	/*if(document.links.length !=SAF) return;*/
	
	if (form.alv.checked) alv=0; else alv=1;if (form.plv.checked) plv=0; else plv=1;if (form.kv.checked) kv=0; else kv=1;

	ZKF=(form.selectKind.selectedIndex) / 2;

	LZZ=2;
	STKL=form.selectstkl.selectedIndex + 1;
	BULAND=form.bundesland.selectedIndex + 1;


	switch(BULAND)
	{
		case 1:ARBGRENZ=ARBGRENZ_A;KISTEU=0.08;break;
		case 2:ARBGRENZ=ARBGRENZ_A;KISTEU=0.08;break;
		case 3:ARBGRENZ=ARBGRENZ_A;KISTEU=0.09;break;
		case 4:ARBGRENZ=ARBGRENZ_N;KISTEU=0.09;break;
		case 5:ARBGRENZ=ARBGRENZ_A;KISTEU=0.09;break;
		case 6:ARBGRENZ=ARBGRENZ_A;KISTEU=0.09;break;
		case 7:ARBGRENZ=ARBGRENZ_A;KISTEU=0.09;break;
		case 8:ARBGRENZ=ARBGRENZ_N;KISTEU=0.09;break;
		case 9:ARBGRENZ=ARBGRENZ_A;KISTEU=0.09;break;
		case 10:ARBGRENZ=ARBGRENZ_A;KISTEU=0.09;break;
		case 11:ARBGRENZ=ARBGRENZ_A;KISTEU=0.09;break;
		case 12:ARBGRENZ=ARBGRENZ_A;KISTEU=0.09;break;
		case 13:ARBGRENZ=ARBGRENZ_N;KISTEU=0.09;break;
		case 14:ARBGRENZ=ARBGRENZ_N;KISTEU=0.09;break;
		case 15:ARBGRENZ=ARBGRENZ_A;KISTEU=0.09;break;
		case 16:ARBGRENZ=ARBGRENZ_N;KISTEU=0.09;break;
	}

	if(form.kistja[1].checked)KISTEU=0;


	RE4LZZ=MRE4LZZ(RE4);
	RE4U=MRE4(RE4LZZ);
	VSP=MVSP(form);
	MZTABFB(form);
	MLSTJAHR(form);
	LSTJAHR=Math.floor(ST);
	LSTLZZ=Math.floor(LSTJAHR*100/12);

	if (ZKF > 0)
	{
		ZTABFB = ZTABFB + KFB;
		MLSTJAHR(form);
		MSOLZ(ST);
	} else
	{
		MSOLZ(LSTJAHR);
	}

	form.soli.value=Math.floor(SOLZLZZ)/100;
	form.lohnst.value=Math.floor(LSTLZZ)/100;
	form.kist.value=Math.floor(BK*KISTEU)/100;
	sozab(form);
}

/*----------------------------------------------------------------------------------------*/
function auslesen(wert)
{
	wert=wert.replace(/,/,".");
	wert=parseFloat(wert);
	if (isNaN(wert)) wert=0;
	return Math.abs(wert);
}

/*----------------------------------------------------------------------------------------*/
//Ermittlung der Freibetrags und des massgeblichen Arbeitslohnes für die LZZ-Tabelle
// RE4=steuerpflichtiger Arbeitslohn vor Berücksichtigung der Freibeträge

/*----------------------------------------------------------------------------------------*/
function MRE4LZZ(RE4)
{
	RE4LZZV=RE4;
	return RE4 - JFREIB;
}


/*----------------------------------------------------------------------------------------*/
// Maßgeblicher Arbeitslohn für die Jahreslohnsteuer
/*----------------------------------------------------------------------------------------*/
function MRE4(RE4LZZ){
var rund;
ZRE4 = Math.floor((RE4LZZ + 0.67) * 0.12*100)/100;
ZRE4VP = Math.floor((RE4LZZV + 0.67) * 0.12*100)/100;
RE4U=ZRE4;
RE4O=ZRE4VP;
return RE4U;
}

/*----------------------------------------------------------------------------------------*/
// Ermittlung der festen Tabellenfreibeträge (ohne Vorsorgepauschale)
/*----------------------------------------------------------------------------------------*/
function MZTABFB(form)
{
	var SAP, ANP, HFB, RB;
	var Kinderfreibetrag = 5808;
	KZTAB = 1;SAP = 0;ANP = 0;HFB = 0;

	switch(STKL)
	{
	case 1:
	ANP = 920;SAP = 36;KFB = ZKF * Kinderfreibetrag;
	break;
	case 2:
	HFB = 1308;ANP = 920;SAP = 36;KFB = ZKF * Kinderfreibetrag;
	break;
	case 3:
	KZTAB = 2;ANP = 920;SAP = 72;KFB = ZKF * Kinderfreibetrag;
	break;
	case 4:
	ANP = 920;SAP = 36;KFB = ZKF * Kinderfreibetrag / 2;
	break;
	case 5:
	ANP = 920;KFB = 0;
	break;
	case 6:
	KFB = 0;
	break;
}
ZTABFB = HFB + ANP + SAP;
}


/*----------------------------------------------------------------------------------------*/
// Ermittlung der Jahreslohnsteuer
/*----------------------------------------------------------------------------------------*/
function MLSTJAHR(form)
{
	var ZVE, VSP, x, rund;
if (STKL < 5)  VSP=MVSP(form);else VSP = 0;

if (steuerjahr>=2005)
{
if (STKL < 5)  VSP=UPEVP(form);else VSP = 0;
}
	ZVE = ZRE4 - ZTABFB - VSP;
	if (ZVE < 1)
		{ZVE = 0;x = 0;}
	else
		{
		rund = ZVE / KZTAB;
		x=Math.floor(rund);
		HEY1=x;
	}
if (STKL < 5) ST=steuerberechnung(x);
else
ST=mst5_6(x);
ST=ST*KZTAB;

//---------------- Steuer ohne Freibetrag für ALU  Rechnung wiederholen---------------------------------------

if (STKL < 5)  VSP=UPEVP(form);else VSP = 0;

ALUBR=eval(form.lohn.value);

if (ALUBR>ARBGRENZ)ALUBR=ARBGRENZ;

	ZVE = ALUBR*12- ZTABFB -VSP;

	if (ZVE < 1)
		{ZVE = 0;x = 0;}
	else
		{
		rund = ZVE / KZTAB;
		x=Math.floor(rund);
		HEY1=x;
	}
if (STKL < 5) ALUST=steuerberechnung(x)/12;
else
ALUST=mst5_6(x)/12;
ALUST=ALUST*KZTAB;
}

/*----------------------------------------------------------------------------------------*/
//  Vorsorgepauschale Vergleichsberechnung für Günstigerprüfung
/*----------------------------------------------------------------------------------------*/
function MVSP(form)
{
var VSPKURZ;
var VSP;
VSPO=Math.floor(ZRE4VP*0.2*100)/100;
VSPVOR = 3068 * KZTAB;
VSPMAX1=1334*KZTAB;
VSPMAX2=667*KZTAB;
VSPKURZ = 1134 * KZTAB;
if (KRV == 1){if (VSPO > VSPKURZ)VSP = VSPKURZ;else VSP = VSPO;}else VSP=UMVSP(form);

return Math.floor(VSP);
}


/*----------------------------------------------------------------------------------------*/
// Vorsorgepauschale (Â§39b Abs.2  Satz 6 Nr. 3 EStG) nach Alterseinkünftegesetz
/*----------------------------------------------------------------------------------------*/
function UPEVP()
{
if (KRV==1) VSP1=0;
else
{
if (ZRE4VP>ARBGRENZ_A*12)
{
ZRE4VP=ARBGRENZ_A*12;
}

VSP1=Math.floor(0.2*ZRE4VP*100)/100;
if (steuerjahr==2006) VSP1=Math.floor(0.24*ZRE4VP*100)/100;
if (steuerjahr==2007) VSP1=Math.floor(0.28*ZRE4VP*100)/100;
if (steuerjahr==2008) VSP1=Math.floor(0.32*ZRE4VP*100)/100;

VSP1=Math.floor(VSP1*RV/2)/100;


}
VSP2=Math.floor(0.11*ZRE4VP*100)/100;
VHB=1500*KZTAB;
if (VSP2>VHB) VSP2=VHB;
VSPN=Math.ceil(VSP1+VSP2);
VSP=MVSP();
if (VSPN>VSP) VSP=VSPN;
return VSP;
}

/*----------------------------------------------------------------------------------------*/
// Vorsorgepauschale
/*----------------------------------------------------------------------------------------*/

function UMVSP(form)
{
//Entscheidung KENNZ=<>1  und Entscheidung KRV <>1

var VSPREST;
var VSP;

VSPVOR =Math.floor((VSPVOR - ZRE4VP*0.16)*100)/100;

if (VSPVOR < 0) VSPVOR = 0;

if (VSPO > VSPVOR)
	{
	VSP = Math.floor(VSPVOR*100)/100;
	VSPREST = Math.floor((VSPO-VSPVOR)*100)/100;

	if (VSPREST > VSPMAX1)
		{
		VSP = VSP + VSPMAX1;
		VSPREST = Math.ceil((VSPREST - VSPMAX1) / 2*100)/100;
		if (VSPREST > VSPMAX2)	 VSP = VSP + VSPMAX2;
		else VSP = VSP + VSPREST;
		}
	else VSP = VSP + VSPREST;
	}
else VSP = VSPO;
return VSP;
}

/*----------------------------------------------------------------------------------------*/
// Lohnsteuer für die Steuerklassen V und VI
/*----------------------------------------------------------------------------------------*/

function mst5_6(x)
{

	var ZZX,ZX,ST,VERGL,HOCH;
	ZZX = x;
	if (ZZX > 25812)
		{
		ZX = 25812;
		HEY1=ZX;
		ST=UP56(ZX);
		if (steuerjahr<=2006)ST = Math.floor(ST + (ZZX - 25812) * 0.42);

	if (steuerjahr>=2007)
	{
		ST = Math.floor(ST + (Math.min(ZZX,200000) - 25812) * 0.42);
		ST = Math.floor(ST + Math.max(ZZX-200000,0) * 0.45);
	}

		}
	else
	{

		ZX = ZZX;
		ST=UP56(ZX);
		if (ZZX > 9144)
		{
			  VERGL = ST;
			  ZX = 9144;
			  HEY1=ZX;
			  ST=UP56(ZX);
			  HOCH = Math.floor(ST + (ZZX -9144) * 0.42);
			  if (HOCH < VERGL)
			  	ST = HOCH;
			  else
			  	ST = VERGL;
		}
	}

	return ST;


}

//----------------- Sonderfall Klasse V und VI ---------------------------------
function UP56(ZX)
{
var ST,ST1,ST2,x,MIST,diff;


	x = ZX * 1.25;
	ST=steuerberechnung(x);
	ST1 = ST;
	x = ZX * 0.75;
	ST=steuerberechnung(x);
	ST2 = ST;
	diff = (ST1 - ST2) * 2;
	MIST = Math.floor(HEY1 * 0.15);
	if (MIST > diff)
		ST = MIST;
	else
		ST = diff;
	return ST;
}


/*----------------------------------------------------------------------------------------*/
// Solidaritätszuschlag
/*----------------------------------------------------------------------------------------*/
function MSOLZ(JBMG)

{
var JW, SOLZFREI;
var SOLZJ, SOLZMIN;

	SOLZFREI = 972 * KZTAB;

	if (JBMG > SOLZFREI)
	{
	SOLZJ =Math.floor(JBMG * 5.5)/100;
	SOLZMIN = (JBMG - SOLZFREI) * 20 / 100;

	if (SOLZMIN < SOLZJ) SOLZJ = SOLZMIN;
	JW = SOLZJ * 100;

	JW=Math.round(JW);

	SOLZLZZ=Math.floor(JW/12);
	}
	else SOLZLZZ = 0;

	if (HEY2 > 0)
	{
	JW = JBMG * 100;
	BK=Math.floor(JW/12);
	}
	else BK = 0;
}

/*----------------------------------------------------------------------------------------*/
// Tarifliche Einkommensteuer
/*----------------------------------------------------------------------------------------*/
function steuerberechnung(x)
{
var ST,Y,RW;

if (steuerjahr<=2006)
{

	if (x < 7665)
	ST = 0;
	else if (x < 12740)
	{
		Y = (x - 7664) / 10000;
		RW = Y * 883.74;
		RW = RW + 1500;
		ST = RW * Y;
	}
	else if (x < 52152)
	{
	Y = (x - 12739) / 10000;
		RW = Y * 228.74;
		RW = RW + 2397;
		RW = RW * Y;
		ST = RW + 989;
	}

	else
		ST = x * 0.42 - 7914;

	return Math.floor(ST);
}

if (steuerjahr>=2007)
{

	if (x < 7665)
	ST = 0;
	else if (x < 12740)
	{
		Y = (x - 7664) / 10000;
		RW = Y * 883.74;
		RW = RW + 1500;
		ST = RW * Y;
	}
	else if (x < 52152)
	{
	Y = (x - 12739) / 10000;
		RW = Y * 228.74;
		RW = RW + 2397;
		RW = RW * Y;
		ST = RW + 989;
	}

	else if (x < 250001)
		ST = x * 0.42 - 7914;

	else
		ST = x * 0.45 - 15414;

	return Math.floor(ST);
}




}


//----------------- Sozialabgaben und Ausgabe ---------------------------------
function sozab(form)
{
var summeab=0;
var rw=0;

brutto=form.lohn.value;
KV=auslesen(form.krankvers.value);
form.krankvers.value=KV;

rw=brutto;
if (brutto>KPGRENZ)rw=KPGRENZ;
if (brutto<=400)rw=0;
ALGKV=rw*7.14/100;
ALGPV=rw*PV/2/100;

if (kv==0)form.krank.value=Math.floor(Math.round(rw*(KV/2+0.9)))/100;else form.krank.value=0;
if (plv==0)form.pfleg.value=Math.floor(Math.round(rw*PV/2))/100;else form.pfleg.value=0;

rw=brutto;
if (brutto>ARBGRENZ)rw=ARBGRENZ;
if (brutto<=400)rw=0;
ALGRV=rw*RV/200;
ALGBA=rw*ALV/200;


if (KRV==0)form.rent.value=Math.floor(Math.round(rw*RV/2))/100;else form.rent.value=0;
if (alv==0)form.arblo.value=Math.floor(Math.round(rw*ALV/2))/100;else form.arblo.value=0;


summeab=eval(form.lohnst.value)+eval(form.soli.value)+eval(form.krank.value)+eval(form.pfleg.value)+eval(form.rent.value)+eval(form.arblo.value)+eval(form.kist.value);

form.summeab.value=Math.round(100*summeab)/100;
form.netto.value=Math.round((brutto-summeab)*100)/100;


//--------------------------------------- ALU berechnen anfang-------------------------------------------------------------------
ALUBRUTTO=eval(form.lohn.value);
if (ALUBRUTTO>ARBGRENZ)ALUBRUTTO=ARBGRENZ;




if (ZKF==0)
alu=Math.round(0.138*(ALUBRUTTO-ALUBRUTTO*0.21-ALUST-ALUST*0.055-ALUST*0.08))+ " Euro";
else
alu=Math.round(0.154*(ALUBRUTTO-ALUBRUTTO*0.21-ALUST-ALUST*0.055-ALUST*0.08))+ " Euro";
form.alu.value=alu;

//--------------------------------------- ALU berechnen ende -------------------------------------------------------------------

if (tflag==0)
{
form.bt1.value=Math.round(form.lohn.value);
form.nt1.value=Math.round(form.netto.value);
teilzeit_einstellen(form);
tflag=1;
}
}

/*---------------------------------------------------------------------------------*/
function berechne_faktor(form)
//Teilzeitfaktor berechnen
{

for(i=0;i<form.vollzeit.length;++i)
	if(form.vollzeit.options[i].selected == true)
 	voll=(form.vollzeit.options[i].value);

for(i=0;i<form.ruhezeit.length;++i)
	if(form.ruhezeit.options[i].selected == true)
 	ruhe=(form.ruhezeit.options[i].value);

faktor=voll/(parseInt(voll)+parseInt(ruhe));
return faktor;
}