/*
  Deze file maaktonderdeel uit van de functie kalender() versie 1.22
  kalender.html, kalender.css, kalender.js, kalenderitems.js, feesdagen.js
*/



/*
  Let op!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:
  januari=00 februari=01 etc
  MAAR .. de gebruikte functies verwachten soms januari=1 februari=2 etc !
  Zondag=1, maandag=2, .... zaterdag=7
*/

var gehad="";
function addFeestdagen(Hjr){
  Vjr=String(Hjr+"-");
  if (gehad.indexOf(Vjr)==-1){
    gehad+=Vjr;
    var n=0;
    var lastItem=Speciaal.length;
    
//  Vanaf hier kunt u jaarlijks op dezelfde datum voorkomende feestdagen (zoals verjaardagen) toevoegen.
    /*Speciaal[lastItem+n] =new info(NfullYear(Hjr,00,05),"-test Jarig-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,00,29),"-test jarig-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,06,11),"-test jarig-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,00,15),"-test jarig-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,03,06),"-test jarig-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,02,18),"-test  jarig-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,04,28),"-test jarig-","Speciaal");n++;*/
    
    
    
    

//  Nederlandse feestdagen met een vaste datum:
    /*Speciaal[lastItem+n] =new info(NfullYear(Hjr,00,01),"-Nieuwjaarsdag-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,01,14),"-Valentijnsdag-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,03,01),"-Oppassen met grapjassen-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,03,30),"-Koninginnedag-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,04,04),"-Dodenherdenking-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,04,05),"-Bevrijdingsdag-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,09,04),"-Dierendag-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,11,05),"-Sinterklaas-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,11,25),"-Kerstmis-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,11,26),"-Kerstmis-","Speciaal");n++;
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,11,31),"-Oudjaarsdag-","Speciaal");n++;*/



//  Feestdagen zoals: de derde dinsdag in september
//  ----------------------------------------------
//  Moederdag (de tweede zondag van mei) 
    /*Speciaal[lastItem+n] =new info(NfullYear(Hjr,04,NthDOW(2, 1, 5, Hjr)),"-Moederdag-","Speciaal");n++;*/
//  Vaderdag (de derde zondag van juni)
    /*Speciaal[lastItem+n] =new info(NfullYear(Hjr,05,NthDOW(3, 1, 6, Hjr)),"-Vaderdag-","Speciaal");n++;*/
//  Prinsjesdag (de derde dinsdag van september)
    /*Speciaal[lastItem+n] =new info(NfullYear(Hjr,08,NthDOW(3, 3, 9, Hjr)),"-Prinsjesdag-","Speciaal");n++;*/

//  Feestdagen op de laatste .x.dag van de maand
//  --------------------------------------------
//  Begin zomertijd (laatste zondag van maart)
    /*Speciaal[lastItem+n] =new info(NfullYear(Hjr,02,LastDayXofMnth(Hjr,3,1)),"-Begin Zomertijd-","Speciaal");n++;*/
//  Eind zomertijd (laatste zondag van oktober)
    /*Speciaal[lastItem+n] =new info(NfullYear(Hjr,09,LastDayXofMnth(Hjr,10,1)),"-Eind Zomertijd-","Speciaal");n++;*/

//  Feestdagen afhankelijk van de maanstand (pasen, pinksteren, hemelvaart, goede vrijdag, carnaval)    
//  ------------------------------------------------------------------------------------------------
//  Pasen (afhankelijk van de maanstand)
    /*var Paasdag1=Pasen(Hjr);
    Speciaal[lastItem+n] =new info(NfullYear(Hjr,Paasdag1[1],Paasdag1[2]),"-Pasen-","Speciaal");n++;
    var Paasdag2=addDays(Hjr,Paasdag1[1],Paasdag1[2],1);
    Speciaal[lastItem+n] =new info(NfullYear(Paasdag2[1],Paasdag2[2],Paasdag2[3]),"-Pasen-","Speciaal");n++;
//  Goede vrijdag (de vrijdag voor pasen)
    var Gvrijdag=addDays(Hjr,Paasdag1[1],Paasdag1[2],-2);
    Speciaal[lastItem+n] =new info(NfullYear(Gvrijdag[1],Gvrijdag[2],Gvrijdag[3]),"-Goede vrijdag-","Speciaal");n++;
//  Hemelvaart (de donderdag veertig dagen na pasen )
    var Hemelv=addDays(Hjr,Paasdag1[1],Paasdag1[2],39);
    Speciaal[lastItem+n] =new info(NfullYear(Hemelv[1],Hemelv[2],Hemelv[3]),"-Hemelvaart-","Speciaal");n++;
//  Pinksteren (de zondag zeven weken na pasen)
    var Pinkster1=addDays(Hjr,Paasdag1[1],Paasdag1[2],49);
    Speciaal[lastItem+n] =new info(NfullYear(Pinkster1[1],Pinkster1[2],Pinkster1[3]),"-Pinksteren-","Speciaal");n++;
    var Pinkster2=addDays(Hjr,Pinkster1[2],Pinkster1[3],1);
    Speciaal[lastItem+n] =new info(NfullYear(Pinkster2[1],Pinkster2[2],Pinkster2[3]),"-Pinksteren-","Speciaal");n++;
//  Carnaval (drie dagen voor het vasten wat weer begint op 40 dagen voor pasen)
    var Carnaval1=addDays(Hjr,Paasdag1[1],Paasdag1[2],-42);*/
    
  }
}


// -----------------------
// Hieronder niet wijzigen
// -----------------------


// -- Functies voor het bereken van de datum op "x dagen na een datum"
	function addDays(year,month,day,addition) {
    var accumulate    = new Array(0,31, 59, 90,120,151,181,212,243,273,304,334);
    var accumulateLY  = new Array(0,31, 60, 91,121,152,182,213,244,274,305,335);

    if (leap(year)) var number = day + accumulateLY[month] + addition;
	    else          var number = day + accumulate[month]   + addition;
	    var days = daysinyear(year);
	   
	    while (number > days) {
	        number -= days;
	        days = daysinyear(++year);
	    }
	
	    while (number < 1) {
	        days = daysinyear(--year);
	        number += days;
	    }
	
	    month = 0;
	
	    if (leap(year)) {
	        while (number > accumulateLY[month]) { month++; }
	        day = number - accumulateLY[--month];
	    }
	    else {
	        while (number > accumulate[month]) { month++; }
	        day = number - accumulate[--month];
	    }
    var Aret=new Object()
    Aret[1]=year;
    Aret[2]=month;
    Aret[3]=day;
		return Aret
	}

// -- functies voor het berekenen van pasen (afh. van maanstand) --
// -- gebaseerd op het algorithme van Oudin
function Pasen(pY) {
    var pC = Math.floor(pY / 100);
    var pN = pY - 19 * Math.floor(pY / 19);
    var pK = Math.floor((pC - 17) / 25);
    var pI = pC - Math.floor(pC / 4) - Math.floor((pC - pK) / 3) + 19 * pN + 15;
    pI = pI - 30*Math.floor((pI / 30));
    pI = pI - Math.floor(pI / 28) * (1 - Math.floor(pI / 28) * Math.floor(29 / (pI + 1)) * Math.floor((21 - pN) / 11));
    var pJ = pY + Math.floor(pY / 4) + pI + 2 - pC + Math.floor(pC / 4);
    pJ = pJ - 7 * Math.floor(pJ / 7);
    var pL = pI - pJ;
    var pM = 3 + Math.floor((pL + 40) / 44);
    var pD = pL + 28 - 31 * Math.floor(pM / 4);

	var ret = new Object();
	ret[1] = pM-1; // -1 ivm tellen vanaf 0 voor januari
	ret[2] = pD;
	return ret;
}

// -- Functies voor het berekenen van de datum op de n-de van de x-te weekdag in de y-de maand van een jaar
// -- ie tweede zondag in mei
// -- zo=1, ma=2 .. za=7
// -- Let op jan=1, febr=2 .. etc.
function NthDOW(nth,weekday,month,year) {
	if (nth > 0)
		return (nth - 1) * 7 + 1 + (7 + weekday - DOW((nth - 1) * 7 + 1, month, year)) % 7;
	var days = daysInMonth(month, year);
	return days - (DOW(days, month, year) - weekday + 7) % 7;
}

// -- functie voor het berekenen van laatste weekdag (maandag, dinsdag etc) van de maand
// -- ie laatste zondag van december
// -- Let op jan=1, febr=2 .. etc.
// -- zo=1, ma=2 .. za=7
function LastDayXofMnth(year,month,day){
  year = parseInt(year);
  month= parseInt(month);
  day  = parseInt(day); 
  var laatstedag=daysInMonth(month, year);
  var laatstedagnm=DOW(laatstedag,month,year);
  var dag=laatstedag-((7+(laatstedagnm-day))%7);
  return dag;
}

// -- Algemene functies --
// -- Functie voor het maken van een nummerieke representatie van de datum (jjjjmmdd)
function NfullYear (Njr, Nmaand, Ndag){
  Nmaand = String(Nmaand);if(Nmaand.length < 2){Nmaand="0"+Nmaand};
  Ndag   = String(Ndag);  if(Ndag.length   < 2){Ndag  ="0"+Ndag};
  Njaar  = String(Njr);
  var numDay = Number(Njaar+Nmaand+Ndag);
  return numDay
}
// -- Functie voor het bepalen van de dag van de week
function DOW(day,month,year) {
	var a = Math.floor((14 - month)/12);
	var y = year - a;
	var m = month + 12*a - 2;
	var d = (day + y + Math.floor(y/4) - Math.floor(y/100) +
			Math.floor(y/400) + Math.floor((31*m)/12)) % 7;
	return d + 1;
}
// -- Functie voor het bepalen van het aantal dagen in een jaar.
function daysinyear(year) { 
  return 365+leap(year);
}

/* deze functies staan ook in kalender.js 
   om gemaksredenen hier als commentaar laten staan

function daysInMonth(month, year) {
	if(month == 2)
		return 28 + leap(year);
	else if(month == 4 || month == 6 || month == 9 || month == 11)
	   return 30;
	else
		return 31;
}
function leap(y) {
	return ((y % 400 == 0) || (y % 100 != 0 && y % 4 == 0));
}
*/
