// 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 2009
// Version 16.7.2010
// Der Programmablaufplan 2009 findet sich auf den Internetseiten des BMF zum
// Herunterladen unter http://www.bundesfinanzministerium.de/nn_304/DE/BMF__Startseite/Aktuelles/BMF__Schreiben/Veroffentlichungen__zu__Steuerarten/lohnsteuer/015__c,templateId=raw,property=publicationFile.pdf

    werte()

function werte() {   // Interne Felder, PAP 2008, S. 5ff.

    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
    j = 0
    jmbg = 0
    jlfreib = 0
    jlhinzu = 0
    jfreib = 0
    jhinzu = 0
    jw = 0
    k = 0
    kennvmt = 0
    kfb = 0
    kztab = 0
    lstjahr = 0
    lst1 = 0
    lst2 =0
    lst3 = 0
    lstoso = 0
    lstso = 0
    mist = 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
    vhb = 0
    vsp = 0
    vspn = 0
    vsp1 = 0
    vsp2 = 0
    vspkurz = 0
    vspmax1 = 0
    vspmax2 = 0
    vspo = 0
    vsprest = 0
    vspvor = 0
    x = 0
    y = 0
    zre4 = 0
    zre4j = 0
    zre4vp = 0
    zre4vp1 = 0
    ztabfb = 0
    zvbez = 0
    zvbezj = 0
    zmvb = 0
    zve = 0
    zx = 0
    zzx = 0
    hoch = 0
    vergl = 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 2009, S. 3ff.

    ajahr = 0
    alter1 = 0  //unnötige Konstante, da Alter mit ajahr bestimmt ist
    jfreib = 0
    jhinzu = 0
    jre4 = 0
    jvbez = 0
    krv = 0
    lzz = 1
    lzzfreib = 0
    lzzhinzu = 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

    // --- Ausgangsparameter, PAP 2008, S. 5

    bk = 0
    bks = 0
    bkv = 0
    lstlzz = 0
    solzlzz = 0
    solzs = 0
    solzv = 0
    sts = 0
    stv = 0
}


  function lst2009() {  //Programmablaufplan 2009, Steuerung S.10
    mre4jl()
    vbezbso = 0
    mre4()
    mre4abz()
    mztabfb()
    kennvmt=0
    mlstjahr()
    lstjahr = st
    jw = lstjahr * 100
    upanteil()
    lstlzz = anteil1
    if (zkf > 0) {
       ztabfb = ztabfb + kfb
       mlstjahr()
       jbmg = st
     }
     else
       jbmg = lstjahr
    msolz()
    msonst()
    mvmt()
  }

  function mre4jl() {
 //Ermittlung des Jahresarbeitslohns und der Freibeträge, PAP 2009, 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
}

  function mre4() {
  // //Freibetraege fuer Versorgungsbezuege, Altersentlastungsbetrag (§39b Abs. 2 Satz 2 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] * 100) / 100
       hbalte = tab5[k]

       if (alte > hbalte)
          alte = hbalte
 }

  function mre4abz() {
   // Ermittlung des Jahresarbeitslohns nach Abzug der Freibeträge, PAP 2009, S. 15
   zre4 = zre4j - fvb - alte - jlfreib + jlhinzu
   if(zre4 < 0)
     zre4 = 0
   zre4vp = zre4j - fvb - alte
   if(zre4vp < 0)
     zre4vp = 0
   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.floor(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 * 6024
    }
    if (stkl == 2) {
       efa = 1308
       sap = 36
       kfb = zkf * 6024
    }
    if (stkl == 3) {
       kztab = 2
       sap = 72
       kfb = zkf * 6024
   }
    if (stkl == 4) {
       sap = 36
       kfb = zkf * 3012
    }
    if (stkl == 5)
       kfb = 0

    if (stkl == 6)
       kfb = 0

    ztabfb = efa + anp + sap + fvbz
 }

   function mlstjahr() { //Ermittlung der Jahreslohnsteuer, PAP S. 17

    if (stkl < 5)
       upevp()
     else
       vsp = 0

    if(kennvmt == 0){
       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 2009 S. 18

  if (zve < 1) {
       zve = 0
       x = 0
     }
     else
       x = Math.floor(zve / kztab)  // auf Euro abrunden

     if (stkl < 5)
       uptab07()
     else
       mst5_6()
  }

  function upevp() {
  // Vorsorgepauschale (§39b Abs. 2 Satz 6 Nr 3 EStG), PAP Seite 19

    if (krv > 0)
         vsp1 = 0
     else {
       if (zre4vp > 64800)
            zre4vp = 64800
       vsp1 = 0.36 * zre4vp
       vsp1 = vsp1 * 0.0995
    }
    vsp2 = 0.11 * zre4vp
    vhb = 1500 * kztab
    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 6 Nr 3 EStG) Vergleichsberechnung
 //fuer Guenstigerpruefung, PAP Seite 20

    vspo = zre4vp * 0.2
    vspvor = 3068 * kztab
    vspmax1 = 1334 * kztab
    vspmax2 = 667 * kztab
    vspkurz = 1134 * kztab
    if (krv == 1) {
       if (vspo > vspkurz)
          vsp = vspkurz
        else
          vsp = Math.floor(vspo)  // auf Euro abrunden
       }
    else
       umvsp()
 }


  function umvsp() {  //Vorsorgepauschale, PAP 2009, S. 21

     vspvor = vspvor - zre4vp * 0.16

    if (vspvor < 0)
       vspvor = 0

    if (vspo > vspvor) {
       vsp = vspvor
       vsprest = vspo - vspvor

       if (vsprest > vspmax1) {
          vsp = vsp + vspmax1
          vsprest = Math.ceil((vsprest - vspmax1)*100) / 200   //auf Cent aufrunden
       if (vsprest > vspmax2)
          vsp = Math.floor(vsp + vspmax2) //auf Euro abrunden
       else
          vsp = Math.floor(vsp + vsprest) //auf Euro abrunden
        }
        else
            vsp = Math.floor(vsp + vsprest) //auf Euro abrunden
     }
     else
         vsp = Math.floor(vspo) // auf Euro abrunden
 }

    function mst5_6() {
    // Lohnsteuer fuer die Steuerklassen V und VI (§ 39b Abs. 2 Satz 8 EStG) PAP Seite 22

    zzx = x
    if(document.eingabe.abjuli.checked==false){

    if (zzx > 25812) {
       zx = 25812
       up5_6()
       if (zzx > 200000){
       st = st + (200000 - 25812) * 0.42;
       st = Math.floor(st + (zzx -200000) * 0.45);
       }
       else
       st = Math. floor(st + (zzx - 25812)* 0.42);
     }
     else {
       zx = Math.min(zzx,200000)
       up5_6()
       if (zzx > 9144) {
          vergl = st
          zx = 9144
          up5_6()
          hoch = Math.floor(st + (zzx - 9144) * 0.42)
          if (hoch < vergl)
             st = hoch
           else
             st = vergl
        }
     }
  }

    else {

    if (zzx > 26276) {
       zx = 26276
       up5_6()
       if (zzx > 200320){
       st = st + (200320 - 26276) * 0.42;
       st = Math.floor(st + (zzx -200320) * 0.45);
       }
       else
       st = Math. floor(st + (zzx - 26276)* 0.42);
     }
     else {
       zx = zzx
       up5_6()
       if (zzx > 9225) {
          vergl = st
          zx = 9225
          up5_6()
          hoch = Math.floor(st + (zzx - 9225) * 0.42)
          if (hoch < vergl)
             st = hoch
           else
             st = vergl
        }
     }
  }
}

  function up5_6() {
    x = zx * 1.25
    uptab07()
    st1 = st
    x = zx * 0.75
    uptab07()
    st2 = st
    diff = (st1 - st2) * 2
    if(document.eingabe.abjuli.checked)
    mist = Math.floor(zx * 0.14)
    else
    mist = Math.floor(zx * 0.15)
    if (mist > diff)
       st = mist
     else
       st = diff
 }

 function msolz() {   // Solidaritätszuschlag, PAP S. 23
    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 2009, S. 24
                        // Anteil1 abrunden, Anteil2 aufrunden
    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 * 100/ 360)/100)
       anteil2 = Math.ceil(jw / 360)
    }
  }

   function msonst() {  // Berechnung sonstiger Bezüge, PAP 2009, S. 25

    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 = lstso - lstoso
       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 2009, S. 26
    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
     mre4sonst()
     mlstjahr()
     lst3 = st * 100

     kennvmt=1
     mlstjahr()
     lst2 = st * 100
     stv = lst2 - lst1
     lst3 = lst3 - lst1

        if (lst3 < stv)
          stv = lst3
       if (stv < 0)
          stv = 0
       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 2009, S. 27

    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 2009, S. 27

    mre4()
    fvb = fvbso
    mre4abz()
    fvbz =fvbzso
    mztabfb()

 }

 function uptab07() {  //Tarifliche Einkommensteuer, PAP 2009, S. 28

  if(document.eingabe.abjuli.checked==false){

        if (x < 7665)
          st = 0
        else {
        if (x < 12740) {
           y = (x - 7664) / 10000
           rw = y * 883.74
           rw = Math.floor(rw * 1000) / 1000
           rw = rw + 1500
           st = Math.floor(rw * y)
         }
         else {
           if (x < 52152) {
              y = (x - 12739) / 10000
              rw = y * 228.74
              rw = Math.floor(rw * 1000) / 1000
              rw = rw + 2397
              rw = rw * y
              st = Math.floor(rw + 989)
            }
         else {
            if( x < 250001)
                st = Math.floor(x * 0.42 - 7914)
         else
                st = Math.floor(x*0.45 - 15414)
               }
           }
       }
   }

    else  {  // neue tarifliche Einkommensteuer durch Konjunkturpaket II

    if (x < 7835)
          st = 0
        else {
        if (x < 13140) {
           y = (x - 7834) / 10000
           rw = y * 939.68
           rw = Math.floor(rw * 1000) / 1000
           rw = rw + 1400
           st = Math.floor(rw * y)
         }
         else {
           if (x < 52552) {
              y = (x - 13139) / 10000
              rw = y * 228.74
              rw = Math.floor(rw * 1000) / 1000
              rw = rw + 2397
              rw = rw * y
              st = Math.floor(rw + 1007)
            }
         else {
            if( x < 250401)
                st = Math.floor(x * 0.42 - 8064)
         else
                st = Math.floor(x*0.45 - 15576)
               }
           }
       }
   }
    st = st * kztab
  }
