//kalender voor vrijdansen en evenementen
//wordt gebruikt voor de kalenders op de Nederlandse en Engelse site
//wordt gebruikt bij de evenementenplanner in het linker frame en bij het menu item "vrijdansen"

function buildCal(thism, thisy, cM, cH, cH1, cW, cDW, cD, dD, brdr, eD){
//thism			De huidige maand die wordt getoond in het midden, waar 1=januari, en 12=december.
//thisy 		Het huidige jaar dat wordt getoond.
//cM 			Naam van de CSS class "main" om de stijl van de tabel van elke kalender te bepalen. 
//cH 			Naam van de CSS class "month" om de stijl van de maand/jaar kop te bepalen. 
//cH1 			Naam van de CSS class "monthtoday" om de stijl van de huidige maand/jaar kop te bepalen. 
//cW 			Naam van de CSS class "daysofweek" om de stijl van de weekdagen kop te bepalen. 
//cDW 			Naam van de CSS class "week" om de stijl van de weekaanduiding kolom te bepalen. 
//cD 			Naam van de CSS class "days" om de stijl van de dagaanduiding cellen te bepalen. 
//dD 			Naam van de CSS class "dancedays" om de stijl van de dagaanduiding cellen te bepalen.
//dD2 			Naam van de CSS class "dancedays2" om de stijl van de dagaanduiding cellen te bepalen.
//eD 			Naam van de CSS class "eventdays" om de stijl van de dagaanduiding cellen te bepalen.
//brdr 			De dikte van de rand tussen alle cellen. 0=no border.

var oD = new Date(thisy, thism, 1);
oD.od=oD.getDay(); //om kalender met zondag te laten beginnen +1 toevoegen, (dus: oD.od=oD.getDay()+1;)

var todaydate=new Date()
var scanfortoday=(thisy==todaydate.getFullYear() && thism==todaydate.getMonth())? todaydate.getDate() : 0

var MonthLength = new Array(31,29,31,30,31,30,31,31,30,31,30,31);
	MonthLength[1] = CheckLeap(thisy);

var WeekOne = 0;        
WeekOne = weeknummer(thisy,thism,1)
brdr=0;
// a wordt als correctie gebruikt indien de eerste van de maand een zondag (waarde 0) is en de kalender met maandag moet beginnen.
// De eerste van de maand moet dan in cel 7 komen.
a=0;
a=(oD.od==0)? 7 : 0;
// start schrijven kalender
var t='<div class=\"'+cM+'\"><table class=\"'+cM+'\" cols=\"8\" cellpadding=\"0\" border=\"'+brdr+'\" cellspacing=\"0\"><tr align=\"center\">';
// maanden en jaar schrijven
if (thisy==todaydate.getFullYear() && thism==todaydate.getMonth()){
// indien de maand deze maand en jaar is, met aangepaste opmaak schrijven
 	t+='<td colspan=\"8\" align=\"center\" class=\"'+cH1+'\">'+longmonths[thism]+' - '+thisy+'</td></tr><tr align=\"center\">';}
// overige maanden en jaar met standaard opmaak schrijven
 	else {t+='<td colspan=\"8\" align=\"center\" class=\"'+cH+'\">'+longmonths[thism]+' - '+thisy+'</td></tr><tr align=\"center\">';}
	t+='<td class=\"'+cDW+'\">'+'wk'+'</td>'
// naam weekdagen schrijven op nieuwe regel
for(s=0;s<7;s++)t+='<td class=\"'+cDW+'\">'+dayname[s]+'</td>';
// nieuwe regel
	t+='</tr><tr align=\"center\">';
// eerste weeknr van de nieuwe maand schrijven in eerste cel op die nieuwe regel
	t+='<td class=\"'+cW+'\">'+ (WeekOne) +'</td>';
for(i=1;i<=42;i++)
{
	var x=0
// datumcellen schrijven
// lege cellen voor en na datum schrijven
	x=((i-a-oD.od>=0)&&(i-a-oD.od<MonthLength[thism]))? i-a-oD.od+1 : '&nbsp;';
//opmaak voor speciale datumcellen schrijven
//indien er een event is, datum met event opmaak schrijven
 	if (isEvent(x, thism, thisy) == true){
			t+='<td class=\"'+eD+'\">'+ '<a href="' + datalink_2 + '" target= "' + linkdoel_2 + '" title="'+ text_2 +'" >'}
//indien er vrijdansen op woensdag (even weken) is, datum met vrijdans opmaak schrijven
 	else if ((isVrijdans(x, thism, thisy) == true) && (i-oD.od>=0) && (i-oD.od<MonthLength[thism]) && ((i+2)%7==0) && (isEven(weeknummer(thisy,thism,x)) == true) && (isStartstop_w(x, thism, thisy) == true)){
			t+='<td class=\"'+dD+'\">'+ '<a href="' + datalink_1 + '" target= "' + linkdoel_1 + '" title="'+ text_1 +'" >'}
//indien er vrijdansen op zaterdag (oneven weken) is, datum met vrijdans opmaak schrijven
 	else if ((isVrijdans(x, thism, thisy) == true) && (i-oD.od>=0) && (i-oD.od<MonthLength[thism]) && ((i-6)%7==0) && (isEven(weeknummer(thisy,thism,x)) == false) && (isStartstop_z(x, thism, thisy) == true)){
			t+='<td class=\"'+dD+'\">'+ '<a href="' + datalink_1 + '" target= "' + linkdoel_1 + '" title="'+ text_1 +'" >' }
// anders datum met standaard opmaak schrijven
 	else {t+='<td class=\"'+cD+'\">'}
//datum vandaag opmaken; blink werkt niet in IE
 	if (x==scanfortoday){
		x='<blink><span id=\"today\">'+x+'</span></blink>'}
//opmaak datumcel afronden
	t+=x+'</td>';
//nieuwe rij schrijven
 	if (((i)%7==0)&&(i<36)){
		t+='</tr><tr align=\"center\">';
// bepaal of de eerstvolgende datumcel in de nieuwe rij leeg zal zijn
		if ((i-oD.od>=0)&&(i-oD.od-a+1<MonthLength[thism])){
// indien de eerstvolgende datumcel niet leeg zal zijn, bepaal en schrijf het nieuwe weeknummer 
			WeekOne = (oD.od==0) ? weeknummer(thisy,thism,(i-oD.od+1)) : weeknummer(thisy,thism,(i-oD.od+2));
			t+='<td class=\"'+cW+'\">'+ (WeekOne) +'</td>';}
// indien de eerstvolgende datumcel in de nieuwe rij leeg zal zijn, schrijf lege cel
		else {t+='<td class=\"'+cW+'\">'+'&nbsp;'+'</td>';}
	}
}
return t+='</tr></table></div>';
}


// schrikkeljaar bepalen en daarmee het aantal dagen in de maand februari
function CheckLeap(yy)
{
if ((yy % 100 != 0 && yy % 4 == 0) || (yy % 400 == 0)) { return 29; }
else { return 28; }
}

// bepalen of een week even (Even) of oneven (Odd)is; even = "true" - oneven is "false"
function isEven(w) { return (w%2)?false:true;}

// bepalen of een vrijdansavond uitvalt
function isVrijdans(d, m, j) {
n=0
while (n<novrijdans.length)
{
// als voldaan wordt aan de tabel met uitzonderingsdata wordt de celopmaak overgeslagen.
if ((d==novrijdans[n][0] && m==novrijdans[n][1] && j==novrijdans[n][2])){
 	return false;
	break;}
	else {n++;}
if (n==novrijdans.length) {return true;}
}
}

// bepalen of de vrijdansperiode voor de woensdagen geldig is
function isStartstop_w(d, m, j) {
n=0
while (n<startstopw.length)
{
if (new Date(j,m,d) > new Date(startstopw[n][2],startstopw[n][1],startstopw[n][0]) && new Date(j,m,d) < new Date(startstopw[n][5],startstopw[n][4],startstopw[n][3])){
 	return true;
	break;}
	else {n++;}
if (n==startstopw.length) {return false;}
}
}

// bepalen of de vrijdansperiode voor de zaterdagen geldig is
function isStartstop_z(d, m, j) {
n=0
while (n<startstopz.length)
{
if (new Date(j,m,d) > new Date(startstopz[n][2],startstopz[n][1],startstopz[n][0]) && new Date(j,m,d) < new Date(startstopz[n][5],startstopz[n][4],startstopz[n][3])){
 	return true;
	break;}
	else {n++;}
if (n==startstopz.length) {return false;}
}
}

// weeknummer bepalen volgens NEN 2772: (Nederlandse Norm)
// de eerste week van het jaar heeft 4 of meer dagen in dat jaar,
// een week begint op een maandag.
function weeknummer(jaar,maand,dag,terug) {
    var datum = new Date(jaar,maand,dag);
    var jaartal = datum.getFullYear() - (terug ? 1 : 0);
    var nieuwjaarsdag = new Date(jaartal,0,1);
    var dagen = Math.round((datum.getTime() - nieuwjaarsdag.getTime()) / 864e5);
    var nen = [6,7,8,9,10,4,5][nieuwjaarsdag.getDay()];
    var nummer = Math.floor((dagen + nen) / 7);
    if (nummer == 0) nummer = weeknummer(jaar,maand,dag,true);
    return nummer;
 };

