// $BVista: apps/kalkulator.js,v 1.3 2003/05/14 14:33:48 costra Exp $
// upravy Sob@HIsoft 2004-2005

function objGet(o) {
  if (typeof o != 'string') return o;
  else if (document.getElementById) return document.getElementById(o);
  else return null;
}

// zaokrouhli x na n desetinnych mist smerem d (0 = standardne, 1 = nahoru, 2 = dolu)
function round(x, n, d) {
  var a = Math.pow(10, n);
  // nahoru
  if (1 == d) {
    x = Math.ceil(x * a);
  // dolu
  } else if (2 == d) {
    x = Math.ceil(x * a) - 1;
  // standardne
  } else {
    x = Math.round(x * a);
  }
  return x / a;
}

function radioNumGet(buttonGroup) {
   // returns the array number of the selected radio button or -1 if no button is selected
   if (buttonGroup[0]) { // if the button group is an array (one button is not an array)
      for (var i=0; i<buttonGroup.length; i++) {
         if (buttonGroup[i].checked) {
            return i
         }
      }
   } else {
      if (buttonGroup.checked) { return 0; } // if the one button is checked, return zero
   }
   // if we get to this point, no radio button is selected
   return -1;
}

function radioGet(buttonGroup) {
   // returns the value of the selected radio button or "" if no button is selected
   var i = radioNumGet(buttonGroup);
   if (i == -1) {
      return "";
   } else {
      if (buttonGroup[i]) { // Make sure the button group is an array (not just one button)
         return buttonGroup[i].value;
      } else { // The button group is just the one button, and it is checked
         return buttonGroup.value;
      }
   }
}

function checkNumGet(buttonGroup) {
   // Go through all the check boxes. return an array of all the ones
   // that are selected (their position numbers). if no boxes were checked,
   // returned array will be empty (length will be zero)
   var retArr = new Array();
   var lastElement = 0;
   if (buttonGroup[0]) { // if the button group is an array (one check box is not an array)
      for (var i=0; i<buttonGroup.length; i++) {
         if (buttonGroup[i].checked) {
            retArr.length = lastElement;
            retArr[lastElement] = i;
            lastElement++;
         }
      }
   } else { // There is only one check box (it's not an array)
      if (buttonGroup.checked) { // if the one check box is checked
         retArr.length = lastElement;
         retArr[lastElement] = 0; // return zero as the only array value
      }
   }
   return retArr;
}

function checkGet(buttonGroup) {
   // return an array of values selected in the check box group. if no boxes
   // were checked, returned array will be empty (length will be zero)
   var retArr = new Array(); // set up empty array for the return values
   var selectedItems = checkNumGet(buttonGroup);
   if (selectedItems.length != 0) { // if there was something selected
      retArr.length = selectedItems.length;
      for (var i=0; i<selectedItems.length; i++) {
         if (buttonGroup[selectedItems[i]]) { // Make sure it's an array
            retArr[i] = buttonGroup[selectedItems[i]].value;
         } else { // It's not an array (there's just one check box and it's selected)
            retArr[i] = buttonGroup.value;// return that value
         }
      }
   }
   return retArr;
}

function numberFormat(num) {
  var nf = new NumberFormat();
  nf.setNumber(num);
  nf.setPlaces(0);
  nf.setCurrency(true);
  nf.setCurrencyPrefix(' Kč');
  nf.setCurrencyPosition(nf.RIGHT_INSIDE);
	nf.setSeparators(true, ' ', nf.PERIOD)
  return nf.toFormatted();
}

// procenta zdravnotniho a socialniho pojisteni (_ch = chlebodarce, _za = zamestnanec
var poj_zdravotni_za = 4.5;
var poj_socialni_za = 6.5;
var poj_zdravotni_ch = 9;
var poj_socialni_ch = 25;

var odecit_polozky = {};
odecit_polozky['mesic'] = {
  'poplatnik':    2070,
  'dite':          890,
  'manzelka':        0,
  'cast_iduchod':  210,
  'plny_iduchod':  420,
  'postizeny':    1345,
  'student':       335
}
var sazba_dane = 15;

function run() {
  
  var odpocet_deti = 0;
  var bonus = 0;
  var sleva_na_dani = 0;

  hruba_mzda   = parseInt(objGet('hruba_mzda').value);
  
  if (1 > hruba_mzda || isNaN(hruba_mzda)) {
    alert('Nejprve musíte zadat hrubou mzdu.');
    document.forms.kalkulator.hruba_mzda.focus();
    return false;
  }
  
  dan_socialni_ch = hruba_mzda * (poj_socialni_ch / 100);
  dan_zdravotni_ch = hruba_mzda *(poj_zdravotni_ch / 100);
  super_hruba_mzda   = hruba_mzda + dan_socialni_ch + dan_zdravotni_ch;
  // pokud bude mzda nizsi jak 5000 tak se nezaokrouhluje
  if(hruba_mzda > 5000) super_hruba_mzda   = round(super_hruba_mzda, -2, 1);
  
  pocet_deti   = parseInt(objGet('pocet_deti').value);
  
  
  invalidita = objGet('invalidita').value;
  
  dan_socialni_za = hruba_mzda * (poj_socialni_za / 100);
  dan_zdravotni_za = hruba_mzda *(poj_zdravotni_za / 100);
  dan_mzdova = super_hruba_mzda * (sazba_dane / 100);
  
  prohlaseni = objGet('prohlaseni').checked;
  rezident = objGet('rezident').checked;
  
  // zjisteni, jestli je to danovy rezident v CR a jestli podepsal DP. Pokud ne, nepocita se se slevou na poplatnika
  if(!rezident && prohlaseni) {
    sleva_na_dani = odecit_polozky['mesic']['poplatnik'];
    dan_vysledna = dan_mzdova - sleva_na_dani;
    odpocet_deti = pocet_deti * odecit_polozky['mesic']['dite'];
  } else {
    dan_vysledna = dan_mzdova;
  }
  // zapocitani odpoctu na invaliditu
  if(invalidita != 'ne' && !rezident && prohlaseni) {
    sleva_na_dani += odecit_polozky['mesic'][invalidita];
    dan_vysledna -= odecit_polozky['mesic'][invalidita];
  }
  
  // zapocitani odpoctu na studenta
  if(objGet('student').checked && prohlaseni) {
    sleva_na_dani += odecit_polozky['mesic']['student'];
    dan_vysledna -= odecit_polozky['mesic']['student'];
  }
  
  if(dan_vysledna < 0) dan_vysledna = 0;
  
  // zapocitani odpoctu na deti
  if(odpocet_deti > 0 && hruba_mzda >= 8000 && !rezident && prohlaseni) {
     dan_vysledna -= odpocet_deti;
  }
  
  if(dan_vysledna < -4350) dan_vysledna = -4350;
  
  
  // vypocet ciste mzdy
  cista_mzda = hruba_mzda - dan_socialni_za - dan_zdravotni_za - dan_vysledna;
  //alert (hruba_mzda +" - "+ dan_socialni_za +" - "+ dan_zdravotni_za+" - "+ dan_vysledna +" + "+ bonus);
  // obraz {{{
  buff = '<h3>Tabulka odvodů a daní ze mzdy</h3>';
  //buff += '<p>Za období: ' + (('mesic' == obdobi) ? 'měsíc' : 'rok') + '</p>';
  buff += '<table class="kalkulatortable">';
  
  buff += '<tr><th>odvody</th><th>zaměstnanec</th><th>zaměstnavatel</th></tr>';

  buff += '<tr>';
  buff += '<td>Zdravotní pojištění</td>';
  buff += '<td class="right">' + numberFormat(dan_zdravotni_za) + '</td>';
  buff += '<td class="right">' + numberFormat(dan_zdravotni_ch) + '</td>';
  buff += '</tr>';

  buff += '<tr>';
  buff += '<td>Sociální pojištění</td>';
  buff += '<td class="right"> ' + numberFormat(dan_socialni_za) + '</td>';
  buff += '<td class="right">' + numberFormat(dan_socialni_ch) + '</td>';
  buff += '</tr>';

  buff += '<tr>';
  buff += '<th>Celkem odvody za SP a ZP</th>';
  buff += '<th class="right"> ' + numberFormat(dan_socialni_za + dan_zdravotni_za) + '</th>';
  buff += '<th class="right">' + numberFormat(dan_socialni_ch + dan_zdravotni_ch) + '</th>';
  buff += '</tr>';

  buff += '<tr>';
  buff += '<td>Superhrubá mzda</td>';
  buff += '<td class="right">' + numberFormat(super_hruba_mzda) + '</td>';
  buff += '</tr>';
  
  buff += '<tr>';
  buff += '<td>Daň</td>';
  buff += '<td class="right">' + numberFormat(dan_mzdova) + '</td>';
  buff += '</tr>';
  
  buff += '<tr>';
  buff += '<td>Sleva na dani</td>';
  buff += '<td class="right">' + numberFormat(sleva_na_dani) + '</td>';
  buff += '</tr>';
  
  buff += '<tr>';
  buff += '<td>Daňový bonus na děti</td>';
  buff += '<td class="right">' + numberFormat((hruba_mzda >= 8000 ? odpocet_deti : 0)) + '</td>';
  buff += '</tr>';
  
	buff += '<tr>';
  buff += '<td>Daň po slevách</td>';
  buff += '<td class="right">' + numberFormat(dan_vysledna) + '</td>';
  buff += '</tr>';

  
  
 /* buff += '<tr>';
  buff += '<td>Odvody za zaměstnance celkem</td>';
  buff += '<td class="right">' + numberFormat(dan_vysledna + dan_socialni_za + dan_zdravotni_za - bonus) + '</td>';
  buff += '</tr>';
*/
  buff += '<tr>';
  buff += '<th>Čistá mzda</th>';
  buff += '<th class="right">' + numberFormat(cista_mzda) + '</th>';
  buff += '</tr>';
  buff += '</table>';
  objGet('results').innerHTML = buff;
  // }}}
}

