// JavaScript-Programm nach dem Programmablaufplan für die maschinelle Berechnung
// der vom Arbeitslohn einzubehaltenden Lohnsteuer, des Solidrätätszuschlags und
// der Maßstabsteuer für die Kirchenlohnsteuer 2010
// Version 12.1.2010
// Der Programmablaufplan 2010 findet sich auf den Internetseiten des BMF zum
// Herunterladen unter        http://www.bundesfinanzministerium.de/nn_290/DE/BMF__Startseite/Aktuelles/BMF__Schreiben/Veroffentlichungen__zu__Steuerarten/lohnsteuer/041__a,templateId=raw,property=publicationFile.pdf

    werte()

function werte() {   // Interne Felder, PAP 2010, S. 6ff.

    ajahr = 0
    alte = 0
    anp = 0
    anteil1 = 0
    anteil2 = 0
    bmg = 0
    diff = 0
    efa = 0
    fvb = 0
    fvbso = 0
    fvbz = 0
    fvbzso = 0
    hbalte = 0
    hfvb = 0
    hfvbz = 0
    hfvbzso = 0
    hoch = 0
    j = 0
    jmbg = 0
    jlfreib = 0
    jlhinzu = 0
    jw = 0
    k = 0
    kennvmt = 0
    kfb = 0
    kvsatzag = 0
    kvsatzan = 0
    kztab = 0
    lstjahr = 0
    lst1 = 0
    lst2 =0
    lst3 = 0
    lstoso = 0
    lstso = 0
    mist = 0
    pvsatzag = 0
    pvsatzan = 0
    rw = 0
    sap = 0
    solzfrei = 0
    solzj = 0
    solzmin = 0
    st = 0
    st1 = 0
    st2 = 0
    stovmt = 0
    // definition tab1 usw. s. unten
    vbezb = 0
    vbezbso = 0
    vergl = 0
    vhb = 0
    vsp = 0
    vspn = 0
    vsp1 = 0
    vsp2 = 0
    x = 0
    y = 0
    zre4 = 0
    zre4j = 0
    zre4vp = 0
    ztabfb = 0
    zvbez = 0
    zvbezj = 0
    zmvb = 0
    zve = 0
    zx = 0
    zzx = 0

    tab1 = Array (0, 0.4, 0.384, 0.368, 0.352, 0.336, 0.32, 0.304, 0.288, 0.272, 0.256, 0.24, 0.224, 0.208, 0.192, 0.176, 0.16, 0.152, 0.144, 0.136, 0.128, 0.12, 0.112, 0.104, 0.096, 0.088, 0.08, 0.072, 0.064, 0.056, 0.048, 0.04, 0.032, 0.024, 0.016, 0.008, 0)
    tab2 = Array (0, 3000, 2880, 2760, 2640, 2520, 2400, 2280, 2160, 2040, 1920, 1800, 1680, 1560, 1440, 1320, 1200, 1140, 1080, 1020, 960, 900, 840, 780, 720, 660, 600, 540, 480, 420, 360, 300, 240, 180, 120, 60, 0)
    tab3= Array (0, 900, 864, 828, 792, 756, 720, 684, 648, 612, 576, 540, 504, 468, 432, 396, 360, 342, 324, 306, 288, 270, 252, 234, 216, 198, 180, 162, 144, 126, 108, 90, 72, 54, 36, 18, 0)
    tab4 = tab1
    tab5 = Array (0,1900, 1824, 1748, 1672, 1596, 1520, 1444, 1368, 1292, 1216, 1140, 1064, 988, 912, 836, 760, 722, 684, 646, 608, 570, 532, 494, 456, 418, 380, 342, 304, 266, 228, 190, 152, 114, 76, 38, 0)

    // --- Eingangsparameter  PAP 2010, S. 3ff.

    af = 0
    ajahr = 0
    alter1 = 0  //unnötige Konstante, da Alter mit ajahr bestimmt ist
    entsch = 0
    f = 1
    jfreib = 0
    jhinzu = 0
    jre4 = 0
    jvbez = 0
    krv = 0
    lzz = 1
    lzzfreib = 0
    lzzhinzu = 0
    pkpv = 0
    pvs = 0
    pvz = 0
    r = 0
    re4 = 0
    sonstb = 0
    sterbe = 0
    stkl = 1
    vbez = 0
    vbezm = 0
    vbezs = 0
    vbs = 0
    vjahr = 2006
    vkapa = 0
    vmt = 0
    zkf = 0
    zvmb = 0
    jsonstb = 0

    // --- eigene Parameter
    gebj = 0  // Geburtsjahr
    kist = 0  // Kirchensteuersatz
    jre4soz = 0
    vspkv = 0

    // --- Ausgangsparameter, PAP 2010, S. 6

    bk = 0
    bks = 0
    bkv = 0
    lstlzz = 0
    solzlzz = 0
    solzs = 0
    solzv = 0
    sts = 0
    stv = 0
}


  function lst2010() {  //Programmablaufplan 2010, Steuerung S.10
    mre4jl()
    vbezbso = 0
    kennvmt = 0
    mre4()
    mre4abz()
    mztabfb()
    mlstjahr()
    lstjahr = Math.floor(st * f)
    jw = lstjahr * 100
    upanteil()
    lstlzz = anteil1
    if (zkf > 0) {
       ztabfb = ztabfb + kfb
       mre4abz()
       mlstjahr()
       jbmg = Math.floor(st * f)
     }
     else
    jbmg = lstjahr
    msolz()
    msonst()
    mvmt()
  }

  function mre4jl() {
 //Ermittlung des Jahresarbeitslohns und der Freibeträge, PAP 2010, S. 11

      jlfreib = lzzfreib /100        //ggfalls ändern
      jlhinzu = lzzhinzu / 100       //
      jfreib = jlfreib * 100         //für mosonst()
      jhinzu = jlhinzu * 100         //

    if (lzz == 1) {
       zre4j = re4 / 100
       zvbezj = vbez / 100
       //jlfreib = lzzfreib /100
       //jlhinzu = lzzhinzu / 100
    }
    if (lzz == 2) {
       zre4j = (re4 * 12) /100
       zvbezj = (vbez * 12) /100
       //jlfreib = (lzzfreib * 12) /100
       //jlhinzu = (lzzhinzu * 12) / 100
    }
    if (lzz == 3) {
       zre4j = (re4 * 360 / 7) /100
       zvbezj = (vbez * 360 / 7) /100
       //jlfreib = (lzzfreib * 360 / 7) /100
       //jlhinzu = (lzzhinzu * 360 / 7) / 100
    }
    if (lzz == 4) {
       zre4j = (re4 * 360) /100
       zvbezj = (vbez * 360) /100
       //jlfreib = (lzzfreib * 360) /100
       //jlhinzu = (lzzhinzu * 360) / 100
    }
    if (zre4j < 0)             // nicht im PAP
        zre4j = 0

    if (zvbezj <=0 || vbez<=0)
        zvbezj = 0

    if(af==0)
        f=1
}

  function mre4() {
  // //Freibetraege fuer Versorgungsbezuege, Altersentlastungsbetrag (§39b Abs. 2 Satz 3 EStG) PAP Seite 12

    if (zvbezj == 0) {
       fvbz = 0
       fvb = 0
       fvbzso = 0
       fvbso = 0
       }
      else {
       if (vjahr < 2006)
          j = 1
        else {
          if (vjahr < 2040)
             j = vjahr - 2004
          else
             j = 36
        }
       }
       if (lzz == 1) {
             vbezb = vbezm * zmvb + vbezs
             hfvb = (tab2[j] / 12) * zmvb
             fvbz = Math.ceil((tab3[j] / 12) * zmvb)
          }
       else {
             vbezb = vbezm * 12 + vbezs
             hfvb = tab2[j]
             fvbz = tab3[j]
          }

       fvb = Math.ceil(Math.floor(vbezb * tab1[j]*100))/10000

       if (fvb > hfvb)
          fvb = hfvb

       fvbso = fvb + Math.ceil(Math.floor(vbezbso * tab1[j]*100))/10000

        if (fvbso > tab2[j])
        fvbso = tab2[j]

       hfvbzso = (vbezb + vbezbso) /100 - fvbso
       fvbzso = Math.ceil(fvbz + vbezbso/100)

       if(fvbzso > hfvbzso)
        fvbzso = Math.ceil(hfvbzso)

       if (hfvbzso > tab3[j])
         fvbzso = Math.ceil(hfvbzso)

       if( fvbzso > tab3[j])
         fvbzso = tab3[j]

         hfvbz = vbezb / 100 - fvb

         if(fvbz > hfvbz)
           fvbz = Math.ceil(hfvbz)

    // mre4alte  Altersentlastungsbetrag

    if (alter1 == 0)
       alte = 0
    else {
       if (ajahr < 2006)
          k = 1
       else {
          if (ajahr < 2040)
             k = ajahr - 2004
          else
             k = 36
      }
     }
       bmg = zre4j - zvbezj
       alte = Math.ceil(bmg * tab4[k])
       hbalte = tab5[k]

       if (alte > hbalte)
          alte = hbalte
 }

  function mre4abz() {
   // Ermittlung des Jahresarbeitslohns nach Abzug der Freibeträge, PAP 2010, S. 15
   zre4 = zre4j - fvb - alte - jlfreib + jlhinzu
   if(zre4 < 0)
     zre4 = 0
   zre4vp = zre4j

   if(kennvmt == 2)
    zre4vp = zre4vp - entsch/100

   zvbez = zvbezj - fvb

   if(zvbez < 0)
    zvbez = 0

   }

   function mztabfb() {
  //Ermittlung der festen Tabellenfreibetraege (ohne Vorsorgepauschale) PAP Seite 16

    anp = 0
    if (zvbez >= 0) {
       if (zvbez < fvbz)
          fvbz = Math.floor(zvbez)
    }

    if (stkl < 6) {
       if (zvbez > 0) {
          if (zvbez - fvbz < 102)
             anp = Math.ceil(zvbez - fvbz)
            else
             anp = 102
       }
    }
    else {
     fvbz = 0
     fvbzso = 0
    }

    if (stkl < 6) {
       if (zre4 > zvbez) {
          if (zre4 - zvbez < 920)
             anp = Math.ceil(anp + zre4 - zvbez)
            else
             anp = anp + 920
       }
    }

       kztab = 1
   if (stkl == 1) {
       sap = 36
       kfb = zkf * 7008
    }

    if (stkl == 2) {
       efa = 1308
       sap = 36
       kfb = zkf * 7008
    }
    if (stkl == 3) {
       kztab = 2
       sap = 36
       kfb = zkf * 7008
   }
    if (stkl == 4) {
       sap = 36
       kfb = zkf * 3504
    }
    if (stkl == 5){
       sap = 36
       kfb = 0
    }
    if (stkl == 6)
       kfb = 0

    ztabfb = efa + anp + sap + fvbz
 }

   function mlstjahr() { //Ermittlung der Jahreslohnsteuer, PAP S. 17

     upevp()


    if(kennvmt != 1){
       zve = zre4 - ztabfb - vsp
       upmlst()
      }
    else {
        zve = zre4 - ztabfb - vsp - vmt/100 - vkapa/100

      if(zve < 0){
       zve = (zve + vmt/100 + vkapa/100) / 5
       upmlst()
       st = st*5
      }
      else {
       upmlst()
       stovmt = st
       zve = zve + (vmt + vkapa) / 500
       upmlst()
       st = (st - stovmt) * 5 + stovmt
      }
    }
 }

  function upmlst() {    // neu PAP 2010 S. 18

  if (zve < 1) {
       zve = 0
       x = 0
     }
     else
       x = Math.floor(zve / kztab)  // auf Euro abrunden

     if (stkl < 5)
       uptab10()
     else
       mst5_6()
  }

  function upevp() {
  // Vorsorgepauschale (§39b Abs. 2 Satz 5 Nr 3 EStG), PAP Seite 19

    if (krv > 1)
         vsp1 = 0

     else {
      if(krv == 0){
        if (zre4vp > 66000)
            zre4vp = 66000
      }
     else {
        if(zre4vp > 55800)
          zre4vp = 55800
    }
       vsp1 = 0.4 * zre4vp
       vsp1 = Math.floor(vsp1 * 9.95)/100
    }

    vsp2 = Math.floor(12 * zre4vp)/100
    if(stkl==3)
     vhb = 3000
    else
     vhb = 1900
    if (vsp2 > vhb)
       vsp2 = vhb
    vspn = Math.ceil(vsp1 + vsp2)  //auf Euro aufrunden
    mvsp()
    if (vspn > vsp)
       vsp = vspn
}

 function mvsp() {
 //Vorsorgepauschale (§39b Abs. 2 Satz 5 Nr 3 EStG) Vergleichsberechnung
 //fuer Guenstigerpruefung, PAP Seite 20

    if(zre4vp > 45000)
     zre4vp = 45000

    if(pkv > 0){

     if(stkl==6)
      vsp=0
    else {
     vsp = pkpv * 12 / 100
     if(pkv == 2) {
       kvsatzag = 0.067
     if(pvs == 1)
       pvsatzag = 0.00475
     else
       pvsatzag = 0.00975
     tagz = zre4vp * (kvsatzag + pvsatzag)
     // if(pkpv > 0 )                           //nicht im PAP; AN-Zuschuss max 1/2 PKV-Prämie
     // tagz = Math.min(tagz,pkpv*6/100)        // - Ende
     vsp = vsp - tagz
    }
   }
  }
    else {
     kvsatzan = 0.076
    if(pvs == 1)
     pvsatzan = 0.01475
    else
     pvsatzan = 0.00975
    if(pvz == 1)
     pvsatzan = pvsatzan + 0.0025
    vsp = zre4vp * (kvsatzan + pvsatzan)
    vspkv = vsp; // nur f. Anzeige
    }
    vsp = Math.ceil(vsp + vsp1)
  }

     function mst5_6() {
    // Lohnsteuer fuer die Steuerklassen V und VI (§ 39b Abs. 2 Satz 7 EStG) PAP Seite 21

    zzx = x
    if (zzx > 26441) {
       zx = 26441
       up5_6()
       if (zzx > 200584){
       st = st + (200584 - 26441) * 0.42;
       st = Math.floor(st + (zzx - 200584) * 0.45);
       }
       else
       st = Math. floor(st + (zzx - 26441)* 0.42);
     }
     else {
       zx = zzx
       up5_6()
       if (zzx > 9429) {
          vergl = st
          zx = 9429
          up5_6()
          hoch = Math.floor(st + (zzx - 9429) * 0.42)
          if (hoch < vergl)
             st = hoch
          else
             st = vergl
        }
     }
  }


  function up5_6() {
    x = zx * 1.25
    uptab10()
    st1 = st
    x = zx * 0.75
    uptab10()
    st2 = st
    diff = (st1 - st2) * 2
    mist = Math.floor(zx * 0.14)
    if (mist > diff)
       st = mist
     else
       st = diff
 }

 function msolz() {   // Solidaritätszuschlag, PAP S. 22
    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
       upanteil()
       solzlzz = anteil1
     }
     else
       solzlzz = 0

     if (r > 0){
       jw = jbmg * 100
       upanteil()
       bk = anteil1
       }
     else
       bk = 0
    }


 function upanteil() {  // Anteil der Jahresbeiträge für einen LZZ
                        // PAP 2010, S. 23
                        // Anteil1 abrunden, Anteil2 aufrunden (nicht gebraucht)
    if (lzz == 1) {
       anteil1 = jw
       anteil2 = jw
    }
    if (lzz == 2) {
       anteil1 = Math.floor(Math.round(jw * 100 / 12)/100)
       anteil2 = Math.ceil(jw / 12)
    }
    if (lzz == 3) {
       anteil1 = Math.floor(Math.round(jw * 700 / 360)/100)
       anteil2 = Math.ceil(jw * 7 / 360)
    }
    if (lzz == 4) {
       anteil1 = Math.floor(Math.round(jw / 36000)/100)
       anteil2 = Math.ceil(jw / 360)
    }
  }

   function msonst() {  // Berechnung sonstiger Bezüge, PAP 2010, S. 24

    lzz = 1
    if(zmvb == 0)
      zmvb = 12
    if (sonstb == 0) {
       lstso = 0
       sts = 0
       solzs = 0
       bks = 0
    }
     else {
       mosonst()
       zre4j = (jre4 + sonstb) / 100
       zvbezj = (jvbez + vbs) / 100
       vbezbso = sterbe
       mre4sonst()
       mlstjahr()
       lstso = st * 100
       sts = Math.floor((lstso - lstoso) * f)
       if(sts < 0)
         sts=0
       solzs = Math.floor(sts * 5.5) / 100
       if (r > 0)
          bks = sts
        else
          bks = 0
    }
   }

  function mvmt() {  // Berechnung der Vergütung für mehrjährige Tätigkeit
                   // PAP 2010, S. 25
    if(vkapa<0)
       vkapa=0
    if (vmt + vkapa > 0) {
       if(lstso == 0) {
         mosonst()
         lst1 = lstoso
       }
       else
         lst1 = lstso

     vbezbso = sterbe + vkapa
     zre4j = (jre4 + sonstb + vmt + vkapa) / 100
     zvbezj = (jvbez + vbs + vkapa) / 100
     kennvmt = 2
     mre4sonst()
     mlstjahr()
     lst3 = st * 100
     mre4abz()
     kennvmt=1
     mlstjahr()
     lst2 = st * 100
     stv = lst2 - lst1
     lst3 = lst3 - lst1

       if (lst3 < stv)
          stv = lst3
       if (stv < 0)
          stv = 0
       else
         stv = Math.floor(stv * f)

       solzv = Math.floor(stv * 5.5)/ 100
       if (r > 0)
          bkv = stv
        else
          bkv = 0
     }
     else {
       stv = 0
       solzv = 0
       bkv = 0
    }
 }

 function mosonst() {
    // Sonderberechnung ohne sonstige Bezüge für Berechnung sonstige Bezüge/Vergütung
    // mehrjährige Tätigkeit. PAP 2010, S. 26

    zre4j = jre4 / 100
    zvbezj = jvbez / 100
    jlfreib = jfreib / 100
    jlhinzu = jhinzu / 100
    mre4()
    mre4abz()
    mztabfb()
    mlstjahr()
    lstoso = st * 100
  }

  function mre4sonst() {
   // Sonderberechnung mit sonstigen Bezüge für Berechnung sonstige Bezüge/Vergütung
    // mehrjährige Tätigkeit. PAP 2010, S. 26

    mre4()
    fvb = fvbso
    mre4abz()
    fvbz =fvbzso
    mztabfb()

 }

 function uptab10() {  //Tarifliche Einkommensteuer, PAP 2010, S. 27

    if (x < 8005)
          st = 0
        else {
        if (x < 13470) {
           y = (x - 8004) / 10000
           rw = y * 912.17
           rw = Math.floor(rw * 1000) / 1000
           rw = rw + 1400
           st = Math.floor(rw * y)
         }
         else {
           if (x < 52882) {
              y = (x - 13469) / 10000
              rw = y * 228.74
              rw = Math.floor(rw * 1000) / 1000
              rw = rw + 2397
              rw = rw * y
              st = Math.floor(rw + 1038)
            }
         else {
            if( x < 250731)
                st = Math.floor(x * 0.42 - 8172)
           else
                st = Math.floor(x*0.45 - 15694)
               }
           }
       }
   st = st * kztab
 }

 function jahranteil() {  // eigene Funktion zum Hochrechnen auf Jahreswerte

    if (lzz == 1)
       anteilj = jw

    if (lzz == 2)
       anteilj = Math.floor(jw * 12);

    if (lzz == 3)
       anteilj = Math.floor(jw * 360 / 7);

    if (lzz == 4)
       anteilj = Math.floor(jw * 360);
  }