
// **************************** //
// (c) http://kalendar.beda.cz  // 
// **************************** //

// pokud je nazev obrazku prazdny, vraci false
function jeTamNeco(id)
{
     if (document.getElementById(id).value == '')
     {
          alert('Nejdříve musíte zadat obrázek z Vašeho počítače!');
          return(false);
     }     return(true);
}
// nastavuje barvu pro rocni kalendar I
function nastavBarvuObrKal1(color)
{
     document.getElementById('obrkal1').value = color;
     return(false);
}
// jednoducha kontrola na korektni datum
function datumOK(den,mesic,rok)
{
     var dm = [0,31,28,31,30,31,30,31,31,30,31,30,31];
     if (rok/4 == parseInt(rok/4))
		dm[2] = 29;
     if (den > dm[mesic])
     {
          alert('Chybně zadané datum '+den+"."+mesic+"."+rok+"!");
          return(false);
     }
     return(true);
}

// funguje pro datumy od 1.1.-4137
// do 1582 Juliansky kalendar, pak Gregoriansky
var ted = new Date();
var denTed = ted.getDate();
var mesicTed = ted.getMonth()+1;
var rokTed = ted.getFullYear();

var denKopie = denTed;
var mesicKopie = mesicTed;
var rokKopie = rokTed; 

function J2D(jd)
{
     jd = parseInt(jd);
     if (jd < 2299161)
     {
          var a = jd;
     }
     else
     {
          var alfa = parseInt(((jd-1867216)-0.25)/36524.25);
          var a = parseInt(jd)+1+alfa-parseInt(alfa/4);
     }
     var b = a+1524;
     var c = parseInt((b-122.1)/365.25);
     var x = parseInt(365.25*c);
     var e = parseInt((b-x)/30.6001);

     var den = b-x-parseInt(30.6001*e);
     if (e <= 13)
          var mesic = e-1;
     else
          var mesic = e-13;
     if (mesic <= 2)
          var rok = c-4715;
     else
          var rok = c-4716;
     
     if (jd < 1721424)
          rok -= 1;
     // den tydne
     var dt = ["Po","Út","St","Čt","Pá","So","Ne"];

     return{den: den, mesic: mesic, rok: rok, dt: dt[jd%7]};
}

function D2J(den,mesic,rok)
{
     var den = parseInt(den);
     var mesic = parseInt(mesic);
     var rok = parseInt(rok);

     if (mesic < 3)
     {
          var y = rok-1;
          var m = mesic+12;
     }
     else
     {
          var y = rok;
          var m = mesic;
     }
     var b = 0;
     if ((rok > 1582) || (rok == 1582 && mesic > 10) || (rok == 1582 && mesic == 10 && den >= 15))
     {
          var a = parseInt(y/100);
          var b = 2 - a + parseInt(a/4);
     }
     var c = 0;
     if (rok < 1)
     {
          y = y + 1;
          if ((rok%4 == -1 && mesic < 3) || rok%4 == -2 || rok%4 == -3 ||(rok%4 == 0 && mesic > 2))
               c = 1;
     }
     var jd = parseInt(365.25*y)+parseInt(30.6001*(m+1))+den+1720995+b-c;
     return(jd);
}

function testRok5()
{
     var rok = document.getElementById('rok5').value;
     if (rok >= 1583 && rok <= 9999)
     {
          return(true);
     }
     alert("Chybný rok: "+rok+" !");
     return(false);
}

function maxChar(max, id)
{
     var zbyva = max-document.getElementById(id).value.length;
     var text = "";
     if (zbyva > 4)
          text = "zbývá " + zbyva + " znaků";
     else if (zbyva > 1)
          text = "zbývají " + zbyva + " znaky";     
     else if (zbyva > 0)
          text = "zbývá 1 znak";
     else if (zbyva == 0)
          text = "nic už nezbývá";         
     else
          text = "<span style='background-color:red;color:white;font-weight:bold;'>zkraťte text!</span>";
     document.getElementById(id+"_info").innerHTML = text;
     return(true);
}

function kontrola(den,mesic,rok)
{
     var datum = J2D(D2J(den,mesic,rok));
     if (rok == datum.rok && mesic == datum.mesic && den == datum.den)
     {
          return(true);
     }
     alert("Chybné datum: "+den+"."+mesic+"." +rok+" !");
     return(false);
}

function rozdil(den1,mesic1,rok1,den2,mesic2,rok2,pad)
{
     if (!kontrola(den1,mesic1,rok1))
     {
          return("?");
     }
     if (!kontrola(den2,mesic2,rok2))
     {
          return("?");
     }

     var jd1 = D2J(den1,mesic1,rok1);
     var jd2 = D2J(den2,mesic2,rok2);
     var r = jd1-jd2;
     if (pad)
     {
          if (Math.abs(r) == 1)
               return(r+" den");
          else if (Math.abs(r) > 1 && Math.abs(r) < 5)
               return(r+" dny");
          return(r+" dnů");
     }
     return(r);
}

function soucet(den1,mesic1,rok1,dni)
{
     if (!kontrola(den1,mesic1,rok1))
     {
          return("?");
     }
     var re = new RegExp("^-?[0-9]+$");
     var m = re.exec(dni);
     if (m == null)
     {
          alert("Pocet dnu neni cislo !");
          return("?");     
     }
     var dni = parseInt(dni);     
     var jd1 = D2J(den1,mesic1,rok1);
     var jd2 = jd1 + dni;
     if (jd2 < 0)
     {
          alert("Vysledne datum je pred rokem -4713 !");
          return("?");
     }
     var datum = J2D(jd2);
     return(datum.den+"."+i2mesic(datum.mesic)+" "+datum.rok+" "+datum.dt);
}

function klikNaRozdil()
{
     document.getElementById('DKrozdilVysledek').value = rozdil(document.getElementById('DKden1').value, document.getElementById('DKmesic1').value, document.getElementById('DKrok1').value, document.getElementById('DKden2').value, document.getElementById('DKmesic2').value, document.getElementById('DKrok2').value, true);
}

function klikNaSoucet()
{
     document.getElementById('DKsoucetVysledek').value = soucet(document.getElementById('DKden3').value, document.getElementById('DKmesic3').value, document.getElementById('DKrok3').value, document.getElementById('DKdni').value);
}

function i2mesic(i)
{
     var m = ["?", "Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"];
     return(m[i]);
}

function nastavKolacek()
{
     datum = document.getElementById('DKden2').value+"."+document.getElementById('DKmesic2').value+"."+document.getElementById('DKrok2').value;
     document.cookie = "kalendar_dakal_datum="+datum+";expires=Thu, 31 Dec 2030 22:59:59";
}

function doKopie(id)
{
     var x; 
     switch (id) {
     case "DKrok1":
          x = 1
          break;
     case "DKrok2":
          x = 2;
          break;
     case "DKrok3":
          x = 3;
          break;
     default:          
          return;
     }     
     denKopie = document.getElementById('DKden'+x).value;
     mesicKopie = document.getElementById('DKmesic'+x).value;
     rokKopie = document.getElementById('DKrok'+x).value;
}

function zKopie(id)
{
     var x;
     switch (id) {
     case "DKrok1":
          x = 1;
          break;
     case "DKrok2":
          x = 2;
          break;
     case "DKrok3":
          x = 3;
          break;
     default:
          return;
     }     
     document.getElementById('DKden'+x).value = denKopie;
     document.getElementById('DKmesic'+x).value = mesicKopie;
     document.getElementById('DKrok'+x).value = rokKopie;
}

function zTed(id)
{
     var x;
     switch (id) {
     case "DKrok1":
          x = 1;
          break;
     case "DKrok2":
          x = 2;
          break;
     case "DKrok3":
          x = 3;
          break;
     default:
          return;
     }     
     
     var ted = new Date();
     var denTed = ted.getDate();
     var mesicTed = ted.getMonth()+1;
     var rokTed = ted.getFullYear();

     document.getElementById('DKden'+x).value = denTed;
     document.getElementById('DKmesic'+x).value = mesicTed;
     document.getElementById('DKrok'+x).value = rokTed;
}

function DKpouzeCifry(e, id)
{
     var klavesa = 0;
     var znak;

     if (window.event)   //IE
          klavesa = e.keyCode;
     else if (e.which)
          klavesa = e.which;

     if (klavesa < 32)
          return(true);
 
     znak = String.fromCharCode(klavesa);

     if (/[-|\d]/.test(znak))
          return(true);
     else if (/[c|C]/.test(znak))
          doKopie(id);
     else if (/[v|V]/.test(znak))
          zKopie(id);
     else if (/[t|T]/.test(znak))
          zTed(id);

     return(false);
}

function DKinit()
{
     var den = 1;
     var mesic = 1;
     var rok = rokTed;

     var kolacek = document.cookie;
     var re = new RegExp("kalendar_dakal_datum=([0-9]+\.[0-9]+\.-?[0-9]+)");
     var m = re.exec(kolacek);
     if (m != null)
     {     
          var datum = m[1].split(".", 3);
          den = datum[0];
          mesic = datum[1];
          rok = datum[2];
     }

     document.getElementById('DKden1').value = denTed;
     document.getElementById('DKmesic1').value = mesicTed;
     document.getElementById('DKrok1').value = rokTed;
     document.getElementById('DKden2').value = den;
     document.getElementById('DKmesic2').value = mesic;
     document.getElementById('DKrok2').value = rok;
     klikNaRozdil();
     document.getElementById('DKden3').value = denTed;
     document.getElementById('DKmesic3').value = mesicTed;
     document.getElementById('DKrok3').value = rokTed;
     document.getElementById('DKdni').value = rozdil(31,12,rokTed,denTed,mesicTed,rokTed,false);
     klikNaSoucet();
}

var MIN_YEAR = 2001;
var MAX_YEAR = 2020;

var holidays = new Array();
holidays["1.1"] = "-";
holidays["24.3"] = "2008";
holidays["28.3"] = "2005,2016";
holidays["29.3"] = "2027";
holidays["1.4"] = "2002,2013,2024";
holidays["2.4"] = "2018,2029";
holidays["5.4"] = "2010,2021";
holidays["6.4"] = "2015,2026";
holidays["9.4"] = "2007,2012";
holidays["10.4"] = "2023";
holidays["12.4"] = "2004";
holidays["13.4"] = "2009,2020";
holidays["16.4"] = "2001";
holidays["17.4"] = "2006,2017,2028";
holidays["18.4"] = "2022";
holidays["21.4"] = "2003,2014,2025";
holidays["22.4"] = "2019,2030";
holidays["25.4"] = "2011";
holidays["1.5"] = "-";
holidays["8.5"] = "-";
holidays["5.7"] = "-";
holidays["6.7"] = "-";
holidays["28.9"] = "-";
holidays["28.10"] = "-";
holidays["17.11"] = "-";
holidays["24.12"] = "-";
holidays["25.12"] = "-";
holidays["26.12"] = "-";

function strTok(text, c)
{
     text = text+c;
     var a = Array();
     var index = 0;
     
     var i = 0;
     var j = text.indexOf(",", i);
     while (j > -1)
     {
          a[index] = text.substr(i, j-i);
          i = j+1;
          index++;
          j = text.indexOf(",", i);     
     }
     return(a);
}

function isYearInInterval(year, interval)
{
     if (interval == "-")
          return(true);
     
     var token = strTok(interval, ",");
     for (var i = 0; i < token.length; i++)
          if (token[i] == year)
               return(true);
     
     return(false);
}

function isWorkDay(day, month, year)
{
     var date = new Date(year, month-1, day);
     var dow = date.getDay();
     
     if (dow == 0 || dow == 6)
          return(false);

     var key = day + "." + month;
     if (holidays[key] && isYearInInterval(year, holidays[key]))
          return(false);
          
     return(true);
}

function addDays(day, month, year, days)
{
     var date = new Date(year, month-1, day+days);
     return{day:date.getDate(), month:date.getMonth()+1, year:date.getFullYear()};
}

function addWorkDays(day, month, year, workDays)
{
     if (year < MIN_YEAR || year > MAX_YEAR)
          return(false);
     if (workDays == 0)
          return{day:day, month:month, year:year};     

     var shft = 0;
     var date;
     var dayFirstWork = day;
     var monthFirstWork = month;
     var yearFirstWork = year;
     while (!isWorkDay(dayFirstWork, monthFirstWork, yearFirstWork))
     {
          date = addDays(day, month, year, shft);
          dayFirstWork = date.day;
          monthFirstWork = date.month;
          yearFirstWork = date.year;
          (workDays > 0 ? shft++ : shft--);
     }

     var counterWorkDays = 0;
     var counterDays = 0;
     var dayCurrent = dayFirstWork;
     var monthCurrent = monthFirstWork;
     var yearCurrent = yearFirstWork;
     while (counterWorkDays < Math.abs(workDays))
     {
          date = addDays(dayFirstWork, monthFirstWork, yearFirstWork, counterDays);
          dayCurrent = date.day;
          monthCurrent = date.month;
          yearCurrent = date.year;
          if (yearCurrent < MIN_YEAR || yearCurrent > MAX_YEAR)
               return(false);
          if (isWorkDay(dayCurrent, monthCurrent, yearCurrent))
               counterWorkDays++;
          (workDays > 0 ? counterDays++ : counterDays--);
     }
     return{day:dayCurrent, month:monthCurrent, year:yearCurrent};     
}


function diffWorkDays(day1, month1, year1, day2, month2, year2)
{
     if (day1 == day2 && month1 == month2 && year1 == year2)
          if (isWorkDay(day1, month1, year1))
               return(1);
          else
               return(0);

     var forward = (new Date(year1, month1-1, day1).getTime() > new Date(year2, month2-1, day2).getTime() ? true : false);    
     var date;
     var day = day2;
     var month = month2;
     var year = year2;
     var counterDays = 0;
     var counterWorkDays = 0;
     while (!(day == day1 && month == month1 && year == year1))
     {
          if (isWorkDay(day, month, year))
               counterWorkDays++;
          (forward ? counterDays++ : counterDays--);
          date = addDays(day2, month2, year2, counterDays);
          day = date.day;
          month = date.month;
          year = date.year;
          if (year < MIN_YEAR || year > MAX_YEAR)
               return(false);
     }
     if (isWorkDay(day, month, year))
          counterWorkDays++;
     
     return(counterWorkDays);
}

function pracRozdil(den1,mesic1,rok1,den2,mesic2,rok2,pad)
{
     if (!kontrola(den1,mesic1,rok1))
     {
          return("?");
     }
     if (!kontrola(den2,mesic2,rok2))
     {
          return("?");
     }
     
     var r = diffWorkDays(parseInt(den1),parseInt(mesic1),parseInt(rok1),parseInt(den2),parseInt(mesic2),parseInt(rok2));
     if (pad)
     {
          if (Math.abs(r) == 1)
               return(r+" pr.den");
          else if (Math.abs(r) > 1 && Math.abs(r) < 5)
               return(r+" pr.dny");
          return(r+" pr.dnů");
     }
     return(r);
}

function pracSoucet(den1,mesic1,rok1,dni)
{
     if (!kontrola(den1,mesic1,rok1))
     {
          return("?");
     }
     var re = new RegExp("^-?[0-9]+$");
     var m = re.exec(dni);
     if (m == null)
     {
          alert("Pocet dnu neni cislo !");
          return("?");     
     }
     var datum;
     datum = addWorkDays(parseInt(den1), parseInt(mesic1), parseInt(rok1), parseInt(dni));
     if (!(datum))
          return "?";
     var d = new Date(datum.year, datum.month-1, datum.day);
     dt = ["Ne","Po","Út","St","Čt","Pá","So"];
     return(datum.day+"."+i2mesic(datum.month)+" "+datum.year+" "+dt[d.getDay()]);
}

function pracKlikNaRozdil()
{
     document.getElementById('PDKrozdilVysledek').value = pracRozdil(document.getElementById('PDKden1').value, document.getElementById('PDKmesic1').value, document.getElementById('PDKrok1').value, document.getElementById('PDKden2').value, document.getElementById('PDKmesic2').value, document.getElementById('PDKrok2').value, true);
}

function pracKlikNaSoucet()
{
     document.getElementById('PDKsoucetVysledek').value = pracSoucet(document.getElementById('PDKden3').value, document.getElementById('PDKmesic3').value, document.getElementById('PDKrok3').value, document.getElementById('PDKdni').value);
}

function PDKinit()
{
     var den = 1;
     var mesic = 1;
     var rok = rokTed;

     document.getElementById('PDKden1').value = denTed;
     document.getElementById('PDKmesic1').value = mesicTed;
     document.getElementById('PDKrok1').value = rokTed;
     document.getElementById('PDKden2').value = den;
     document.getElementById('PDKmesic2').value = mesic;
     document.getElementById('PDKrok2').value = rok;
     pracKlikNaRozdil();
     document.getElementById('PDKden3').value = denTed;
     document.getElementById('PDKmesic3').value = mesicTed;
     document.getElementById('PDKrok3').value = rokTed;
     document.getElementById('PDKdni').value = pracRozdil(31,12,rokTed,denTed,mesicTed,rokTed,false);
     pracKlikNaSoucet();
}

