// some quick and dirty helper functions:
// - return the element passed in or look it up (el = id)
function getelement(el) {
    if(typeof(el) !== 'object') {
        return document.getElementById(el);
    } else {
        return el;
    }
}
// - show the element el (element or id)
function show(el) {
    el = getelement(el);
    el.style.display = '';
}
// - hide the element el (element or id)
function hide(el) {
    el = getelement(el);
    el.style.display = 'none';
}
// - show or hide target, based on el (el should be a checkbox el or id)
function checkShowHide(el,target) {
    el = getelement(el);
    if(el.checked) {
        show(target);
    } else {
        hide(target);
    }
}
// add a function to window.onload without erasing a previous one
function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    } else {
        window.onload = function() {
            if (oldonload) {
                oldonload();
            }
            func();
        }
    }
}


/* this page was intentionally left blank */

function toggleClassBlock(name) {
    var aryClassElements = getElementsByClassName( name, document.body );
    for ( var i = 0; i < aryClassElements.length; i++ ) {
	var style2 = aryClassElements[i].style;
	style2.display = "block";
    }
}

function getElementsByClassName( strClassName, obj ) {
    var ar = arguments[2] || new Array();
    var re = new RegExp("\\b" + strClassName + "\\b", "g");

    if ( re.test(obj.className) ) {
        ar.push( obj );
    }
    for ( var i = 0; i < obj.childNodes.length; i++ )
        getElementsByClassName( strClassName, obj.childNodes[i], ar );

    return ar;
}

var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i

function checkEmail() {
	var email = document.form.email.value;
	if (!filter.test(email)) {
		window.alert("U moet een valide emailadres invoeren");
		return false;
	}
	return true;
}

function displayUpTo(naam, getal) {
	hideBlock(naam + 1);
	hideBlock(naam + 2);
	hideBlock(naam + 3);
	hideBlock(naam + 4);
	hideBlock(naam + 5);
	hideBlock(naam + 6);

	var counter = 0;
	while (counter < getal) {
		counter++;
		displayBlock(naam + counter);
	}
}


function displayBlock(block) {
	if (document.getElementById) {
		var style2 = document.getElementById(block).style;
		style2.display = "block";
	}
	else if (document.all) {
		var style2 = document.all[block].style;
		style2.display = "block";
	}
	else if (document.layers) {
		var style2 = document.layers[block].style;
		style2.display = "block";
	}
}

function hideBlock(block) {
	if (document.getElementById) {
		var style2 = document.getElementById(block).style;
		style2.display = "none";
	}
	else if (document.all) {
		var style2 = document.all[block].style;
		style2.display = "none";
	}
	else if (document.layers) {
		var style2 = document.layers[block].style;
		style2.display = "none";
	}
}

function toggleBlock(block) {
	if (document.getElementById) {
		var style2 = document.getElementById(block).style;
		style2.display = style2.display? "":"block";
	}
	else if (document.all) {
		var style2 = document.all[block].style;
		style2.display = style2.display? "":"block";
	}
	else if (document.layers) {
		var style2 = document.layers[block].style;
		style2.display = style2.display? "":"block";
	}
}

function explode( delimiter, string, limit )
{
    // http://kevin.vanzonneveld.net
    // +     original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     improved by: kenneth
    // +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     improved by: d3x
    // +     bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)

    var emptyArray = { 0: '' };
    if(arguments.length < 2 || typeof arguments[0] == 'undefined' || typeof arguments[1] == 'undefined')
    {
        return null;
    }
    if(delimiter === '' || delimiter === false || delimiter === null )
    {
        return false;
    }
    if(typeof delimiter == 'function' || typeof delimiter == 'object' || typeof string == 'function' || typeof string == 'object' )
    {
        return emptyArray;
    }
    if(delimiter === true )
    {
        delimiter = '1';
    }
    if (!limit)
    {
        return string.toString().split(delimiter.toString());
    }
    else
    {
        var splitted = string.toString().split(delimiter.toString());
        var partA = splitted.splice(0, limit - 1);
        var partB = splitted.join(delimiter.toString());
        partA.push(partB);
        return partA;
    }
}
function levenshtein( str1, str2 )
{
    // http://kevin.vanzonneveld.net
    // +   original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
    var s, l = (s = str1.split("")).length, t = (str2 = str2.split("")).length, i, j, m, n;
    if(!(l || t)) return Math.max(l, t);
    for(var a = [], i = l + 1; i; a[--i] = [i]);
    for(i = t + 1; a[0][--i] = i;);
    for(i = -1, m = s.length; ++i < m;){
        for(j = -1, n = str2.length; ++j < n;){
            a[(i *= 1) + 1][(j *= 1) + 1] = Math.min(a[i][j + 1] + 1, a[i + 1][j] + 1, a[i][j] + (s[i] != str2[j]));
        }
    }
    return a[l][t];
}

function emailcheck()
{
	// Made by: Robin van der Markt for DGN Publishers B.V.

	// values resetten bij opnieuw callen functie
	laagsteld = '99';
	laagstecheck = '';

	document.getElementById('emailmelding').style.display = 'none';

	// Waarde ophalen
	var v = document.getElementById('premie2009email').value;
	// Alles voor de @ krijgen
	var a = explode('@', v);
	// Lengte van voor de @ berekenen, plus 1 (@ weghalen)
	var lfirst = a[0].length+1;
	// Alles na de @ krijgen.
	var vsecond = v.substring(lfirst);

	// Lijst met waardes die gecheckt moeten worden voor typefouten.
	var checks = new Array();
	checks[0] = 'hotmail.com';
	checks[1] = 'gmail.com';
	checks[2] = 'live.com';
	checks[3] = 'yahoo.com';
	checks[4] = 'wanadoo.nl';
	checks[5] = 'tele2.nl';
	checks[6] = 'tiscali.nl';
	checks[7] = 'hetnet.nl';
	checks[8] = 'xs4all.nl';
	checks[9] = 'zonnet.nl';
	checks[10] = 'hccnet.nl';
	checks[11] = 'chello.nl';
	checks[12] = 'upcmail.nl';
	checks[13] = 'ziggo.nl';

	// Lijst met waardes die sowieso als fout aangegeven kunnen worden..
	var foutenlijst = new Array();
	foutenlijst[0] = 'hotmail.nl';
	foutenlijst[1] = 'gmail.nl';
	foutenlijst[2] = 'yahoo.nl';
	// .. en de voorgestelde correcties.
	var correctie = new Array();
	correctie[0] = 'hotmail.com';
	correctie[1] = 'gmail.com';
	correctie[2] = 'yahoo.com';

	if(typeof(a[1]) == 'undefined' || a[1] == '')
	{
		// Het emailadres klopt niet, de rest kan niet gedaan worden.
		document.getElementById('emailmelding').style.display = ''; // Style naar default zetten
		document.getElementById('emailmelding').textContent = 'Het emailadres is niet goed opgegeven.';
		document.getElementById('emailmelding').innerText = 'Het emailadres is niet goed opgegeven.';
	}
	else
	{
		// Extra waarde resetten.
		document.getElementById('emailmelding').style.display = 'none';

		// Eerst de foutenlijst
		for(var i in foutenlijst)
		{
			if(vsecond == foutenlijst[i])
			{
				// Er is een match gevonden, er is een foute host ingevuld.
				laagsteld = 1;
				laagstecheck = correctie[i];
			}
		}
		if(laagstecheck == '') // Dan is er geen match gevonden hierboven.
		{
			for(var i2 in checks)
			{
                if(typeof(checks[i2]) != 'string') continue;

				// Js-functie van Levenshtein gebruiken.
				var ld = levenshtein(vsecond, checks[i2])

				// Is de waarde kleiner dan de vorige laagste, dan wordt de oude overschreven.
				// ld = Levenshtein difference
				if(ld < laagsteld)
				{
					laagsteld = ld;
					laagstecheck = checks[i2];
				}
			}
		}

		// Als de ld 0 is, was er een exacte match gevonden, hierbij hoeft er dus geen suggestie gegeven te worden
		// Is de ld groter dan 2 is, dan is het verschil te groot en geeft hij ook geen suggestie
		if(laagsteld <= 2 && laagsteld != '0')
		{
			// Suggestie geven
			document.getElementById('emailmelding').style.display = ''; // Style naar default zetten
			document.getElementById('emailmelding').textContent = 'Bedoelde u misschien '+a[0]+'@'+laagstecheck+'?';
			document.getElementById('emailmelding').innerText = 'Bedoelde u misschien '+a[0]+'@'+laagstecheck+'?';
		}
		else
		{
			// Niets aan het handje
			document.getElementById('emailmelding').style.display = 'none';
			document.getElementById('emailmelding').textContent = '';
			document.getElementById('emailmelding').innerText = '';
		}
	}
}

function getAge(Y,M,D)
{
	var now=new Date(),m=now.getMonth()+1,d=now.getDate();
	return now.getFullYear()-Y+(M>m?-1:M==m&&D>d?-1:0);
}

function checkPostcode(postcode, letters)
{
	// Postcode = 1000AA of 1000 AA of 1000 als $letters === false
	postcode = postcode.replace(' ', ''); // Als het goed is, zijn het nu 4 of 6 letters en/of getallen

	if(postcode.length != 6)
	{
		if(letters === true)
		{
			return false; // Postcode moet 6 cijfers zijn
		}
		else if(postcode.length != 4)
		{
			return false;
		}
	}
	if(isNaN(postcode.substr(0, 4)) || postcode.substr(0, 4) < 1000 || postcode.substr(0, 4) > 9999)
	{
		return false; // Postcode moet tussen 1000 en 9999 liggen
	}
	eind = postcode.substr(4, 2);
	if(eind != '' && !eind.match(/[a-z]{2}/i))
	{
		return false; // Het tweede gedeelte moeten letters zijn.
	}
	if(postcode.substr(4, 2) != '' && (postcode.substr(4, 2) == 'SA' || postcode.substr(4, 2) == 'SD', postcode.substr(4, 2) == 'SS'))
	{
		return false; // SA, SD en SS zijn geen valide extenties
	}

	return true; // Jeej!
}

function checkGeboortedatum(datum, voor)
{
	// Dit gaat er vanuit dat de datum in het Nederlandse formaat is ingevoerd. DD-MM-YYYY dus.
	// Dit gaat er vanuit dat $voor = 'aanvrager' || 'partner' || 'kind'
	if(datum.match(/^((30|31|[0-2]?\d))\D*((10|11|12|0?\d))\D*((19|20)?\d{2})\D*$/))
	{
		var date = new Date();
		var jaar = date.getFullYear().toString();
		var jaarkort = parseInt(jaar.substr(2, 2));
		jaar = parseInt(jaar);

		matches = datum.match(/^((30|31|[0-2]?\d))\D*((10|11|12|0?\d))\D*((19|20)?\d{2})\D*$/);

		matches['dag'] = matches['1'];
		matches['maand'] = matches['3'];
		matches['jaar'] = matches['5'];

		// bv 04 veranderen in 4
		matches['dag'] = parseInt(matches['dag']);
		matches['maand'] = parseInt(matches['maand']);

		// Sanity check
		if(matches['jaar'].length != 4 && matches['jaar'].length != 2)
		{
			return false; // Jaar moet 2 of 4 cijfers zijn
		}
		if(matches['jaar'].length == 4 && matches['jaar'] > jaar)
		{
			return false; // jaar kan niet groter dan het huidige jaar zijn
		}
		if(matches['jaar'].length == 2)
		{
			matches['jaar'] = parseInt((voor == 'kind' && matches['jaar'] < jaarkort) ? '20'+matches['jaar'] : '19'+matches['jaar']);
			if(voor == 'kind' && matches['jaar'] > jaar) // Is deze situatie nog mogelijk?
			{
				return false; // jaar kan niet groter dan het huidige jaar zijn (nu met 2 cijfers)
			}
		}
		if(matches['dag'] == '0') // TODO: Kan in de RegEx ingebouwd worden, ik weet alleen niet hoe.
		{
			return false; // Dag mag niet 0 zijn
		}
		if(matches['maand'] == '2' && ((matches['jaar']%4 != 0 && matches['dag'] > 28) || (matches['jaar']%4 == 0 && matches['dag'] > 29)))
		{
			return false; // Januari moet 28 (geen schikkeljaar) of 29 (schrikkeljaar) dagen hebben
		}
		else if((matches['maand'] == '1' || matches['maand'] == '3' || matches['maand'] == '5' || matches['maand'] == '7' || matches['maand'] == '8' || matches['maand'] == '10' || matches['maand'] == '12') && matches['dag'] > 31) // Todo: omzetten naar in_array equivalent
		{
			return false; // Maanden met 31 dagen mogen niet meer dan 31 dagen hebben
		}
		else if((matches['maand'] == '4' || matches['maand'] == '6' || matches['maand'] == '9' || matches['maand'] == '11') && matches['dag'] > 30) // Todo: omzetten naar in_array equivalent
		{
			return false; // Same als hierboven, maar dan met 30 dagen
		}
		if(voor == 'aanvrager' && getAge(matches['jaar'],matches['maand'],matches['dag']) < 18)
		{
			return false; // De aanvrager moet minimaal 18 zijn.
		}
	}
	else
	{
		return false; // Geen match, geen geboortedatum
	}
	return true; // Jeej!
}