// JavaScript library

/************** Globale variabelen **************/

var start_weekdag; // date
var re_datum = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[2][0]\d{2})$|^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[2][0]\d{2}\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$/;
//var re_integer = /^[-+]?[0-9]*\.?[0-9]*$/; //geheel getal
var re_integer = /^[0-9]+[0-9]*$/; //geheel getal
 

/************** DOM functies **************/

function leegNode(objNode) {
	/* verwijdert alle inhoud/children van een Node
	@ objNode: node, verplicht, de node die geleegd wordt
	*/
	while (objNode.hasChildNodes()) {
		objNode.removeChild(objNode.firstChild);
	}
	
}
//--------------------------------
function zoekParent(n, strE) {
/*
returnt de eerstvolgende parentNode van een bepaald elementtype

@n: startnode van wie de parent gezocht wordt
@strE: string elementtype, vb "TR"

@return Node/null
*/
	while(n=n.parentNode) {//zolang dit lukt nemen we onmiddellijk de parentNode
		if(n.nodeName.toLowerCase()==strE.toLowerCase()) {return n;}
	}
	return null;	
}
//--------------------------------
function getElementsByClassName(classname) {
/*
Zoekt elementen van een bepaalde CSS class
@classname: string
*/
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = document.getElementsByTagName("*");
	var j = els.length;
	for(i=0;i<j;i++) {
		if(re.test(els[i].className)) {a.push(els[i]);}	
	}
	return a;
}


/************** Mathematische functies **************/

function isGetal(waarde) {
	//return((waarde != "") && !isNaN(waarde));
	var re_eengetal = /[-+]?[0-9]*\.?[0-9]+/; //Regular expression voor een floating point number
	return waarde.match(re_eengetal);
}

function isInteger(waarde) {
/*
valideert een geheel getal

@waarde: string te testen
@return: boolean
*/
	return re_integer.test(waarde); //integer
}


/************** Cookies functies **************/

function setCookie(naam, waarde, dagen) {
	/*plaatst een cookie
	@ naam: cookienaam
	@ waarde: de inhoude van het cookie
	@ dagen: optioneel, het aantal dagen dat het cookie geldig blijft vanaf nu
		indien afwezig wordt het een session cookie
	*/
	var verval = "";
	if (dagen) {
		var vandaag = new Date();
		var vervalDatum = new Date(vandaag.getTime()+dagen*24*60*60*1000);
		verval = vervalDatum.toUTCString();
	}
	document.cookie = naam + "=" + waarde + ";expires=" + verval;
}
//--------------------------------
function getCookie(naam) {
	/*leest een cookie
	
	@naam: cookienaam
	*/
	var zoek = naam + "=";
	if (document.cookie.length>0) {
		var begin = document.cookie.indexOf(zoek);
		if (begin!=-1) {
			begin += zoek.length;
			var einde = document.cookie.indexOf(";", begin);
			if (einde==-1) {
				einde = document.cookie.length;	
			}
			return document.cookie.substring(begin,einde);
		}
	}
}
//--------------------------------
function clearCookie(naam) {
	/*
	verwijdert een cookie
	
	@naam: cookienaam
	*/
	setCookie(naam,"",-1);
}


/************** Datum, tijd functies **************/

//globale datum objecten
var vandaag = new Date();

function getVandaagStr() {
	//returnt een lokale datumtijdstring
	var strNu = "Momenteel: " + vandaag.toLocaleDateString() + ", ";
	strNu += vandaag.toLocaleTimeString();
	return strNu;
}
//--------------------------------
function isSchrikkeljaar(jaar) {
	/*test voor schrikkeljaar
	@ jaar: number, verplicht
	return: boolean
	*/
	var eindwaarde = false;
	
	if (!isNaN(jaar)) {
		if (jaar%4===0) {
			eindwaarde = true;
			if (jaar%100===0) {
				eindwaarde = false;
				if (jaar%400===0) {
					eindwaarde = true;
				}
			}
		}
	}
	return eindwaarde;
}
//--------------------------------
function maakJaarKalender(jaar) {
	/*
	voegt via innerHTML een volledige jaarkalender toe van maandtabelletjes, als left 
	floats. Gebruikt css
	@ jaar: integer, 4-digit getal
	*/
	var strKalender = "";
	var start_datum = new Date('Jan 1, ' + jaar);
	start_weekdag = start_datum.getDay(); 
	//als getDay() 0 als return waarde heeft, dan is 't zondag
	
	for (var i=0;i<12;i++) {
		var eindDag = arrMaanden[i][1]; //gebruikt array arrMaanden
		if ((i==1) && (isSchrikkeljaar(jaar))) {
			eindDag = 29;
		}
		strKalender += maakMaandTabel(jaar,i,eindDag);
	}
	divKalender.innerHTML = strKalender;
}
//--------------------------------
function maakMaandTabel(kalenderJaar, maandIndex, eindDag) {
	/*
	Return: string, voor innerHTML: een tabelletje met een maandoverzicht
	
	@ kalenderJaar: integer, 4 digit jaar
	@ maandIndex: integer, start met 0
	@ eindDag: integer, max aantal dagen vr die maand
	*/
	
	var strMaandTabel = "<table class='kalender'>\n";
	
	//titelrij
	strMaandTabel += "<tr><th colspan='7'>" + arrMaanden[maandIndex][0] + " ";
	strMaandTabel += kalenderJaar + "</th></tr>\n";
	
	//dagtitels
	strMaandTabel += "<tr>";
	
	for (var i=0;i<7;i++) {
		strMaandTabel += "<td>" + arrWeekdagen[i].substr(0,2).toUpperCase() + "</td>";	
	}
	strMaandTabel += "</tr>\n";
	
	//weekrijen
	var dag = 1;
	var teller = 0;
	
	while (dag <=eindDag) {
		strMaandTabel += "<tr>";
		
		for (var i=0; i<=6;i++) {
			//teken cellen, met of zonder dag ingevuld
			var strId = ''; //eventueel id samengesteld uit maandIndex en dagnummer
			var strDagNummer = ''; //het dagnummer
			//schrijf de dagen
			if ((teller>=start_weekdag) && (dag<=eindDag)) {
				strDagNummer = dag;
				strId = "id='" + maandIndex + "_" + dag + "'";
				dag++;
				//met welke weekdag begint de volgende maand?
				start_weekdag = i+1;
				//lege rij in de volgende maand verwijderen als deze maand eindigt op een zaterdag
				if (start_weekdag == 7) {
					start_weekdag = 0;
				}
			}
			
			//schrijf de cel
			strMaandTabel += "<td " + strId + ">" + strDagNummer + "</td>";
			
			teller++;
		}
		strMaandTabel += "</tr>\n";
	}
	strMaandTabel += "</table>\n";
	
	return strMaandTabel;
}
//--------------------------------
//geeft een visuele aanduiding van een dag in de kalender
function dagAanduiden(oDatum, CSS_Class) {
	/*
	nodig: CSS Class in stylesheet
		   Id in element
	@ oDatum: Datum object nodig om id te construeren
	@ CSS_Class: CSS class dient aanwezig te zijn
	*/
	if(divKalender.hasChildNodes()) {
		//welke dag en maand?
		 var dDag = oDatum.getDate();
		 var dMaand = oDatum.getMonth();
		 
		 //welke id heeft deze cel?
		 var strId = dMaand + "_" + dDag;
		 var dCel = document.getElementById(strId);
		 if (dCel) {
			dCel.className = CSS_Class;		 
		 }
	}
}
//--------------------------------
//leest een geboortedatum 
function toonVerjaardag() {
	//lees de geboortedatum
	var bDatum = document.getElementById('geboortedatum').value;
	
	//validatie
	if (bDatum != "") {
		var arrGeboren = bDatum.split('/');	
		var geboorteDag = parseInt(arrGeboren[0],10);
		var geboorteMaand = parseInt(arrGeboren[1],10) - 1;
		var geboorteJaar = parseInt(arrGeboren[2]);
		
		//construeer een datumobject
		var geboorteDatum = new Date(geboorteJaar,geboorteMaand,geboorteDag);
		//alert(geboorteDatum.toLocaleString()); //debug: toon de LocalString
		
		//Datum object voor verjaardag dit jaar
		var verjaardag = new Date(geboorteDatum);
		verjaardag.setFullYear(vandaag.getFullYear());
		//alert(verjaardag.toLocaleString()); //debug: toon de LocalString
		
		//verjaardag in de kalender aanduiden
		dagAanduiden(verjaardag, 'verjaardag');
	}
	else {
		alert('Een geldige datum (dd/mm/jjjj) ingeven aub.');
	}
}
//--------------------------------
function isDatum(c, re) {
/*
test voor datumformaten

@c: elementNode INPUT/TEXTAREA control
@re: regular expression
*/
	if ((c.nodeName.toLowerCase() == "textarea") || 
		((c.nodeName.toLowerCase() == "input") && (c.type == "text"))) {
		
		return re.test(c.value);
	}
	else {
		throw new Error(c.nodeName + ": verkeerd formulier element");	
		return false;
	}
}

//--------------- datum arrays ---------------

//dagen volgens getDay() volgorde
var arrWeekdagen = new Array('zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag',
		'vrijdag', 'zaterdag');

//vervang feb dagen voor een schrikkeljaar
var arrMaanden = new Array(['januari',31],['februari',28],['maart',31],['april',30],
		['mei',31],['juni',30],['juli',31],['augustus',31],['september',30],
		['oktober',31],['november',30],['december',31]);
