/*

Form constraints, om inputvelden te valideren op "iets" voordat het form
gesubmit wordt. Zorgt ook voor dubbelklikpreventie (submitbuttons etc. worden
disabled).

Maak form constraint (let op window!):

window.fc_formbla = new fc_formconstraint();

Zet handler op form open tag:

<form blawoei OnSubmit="return fc_submit(this, window.fc_formbla);">

Submit buttons worden nu al effectief disabled bij het submitten.

Om een typeconstraint te plaaten (bv: dit moet een getal zijn, dat
mag niet leeg zijn), doe je:

window.tc_formbla.addtypeconstraint('INPUTVELDID', FC_IETS, 'Hoe heet dit ding');

FC_IETS kan zijn bv. FC_NOT_EMPTY, FC_NUMERIC etc.

Dit levert bij het submitten en failen van de constraint een alertbox met:

Let op: Hoe heet dit ding mag niet leeg zijn.

Om ingewikkelder constraints te plaatsen, kun je ook een customconstraint
gebruiken:

window.tc_formbla.addcustomconstraint('INPUTVELDID', FUNCTIENAAM, 'Melding die moet verschijnen');

Dit kan elke functie zijn die je maar kan bedenken, met 1 argument: de waarde
van het invoerding. Bij het falen verschijnt de melding in een alertbox.

Constraints weer van een object afhalen doe je met:

window.tc_formbla.removetypeconstraint('INPuTVELDID', FC_IETS);

en

window.tc_formbla.removecustomconstraint('INPUTVELDID', FUNCTIENAAM);

Het is mogelijk om meerdere constraints (zowel type als custom) op een
inputveld te zetten.

*/

window.FC_NOT_EMPTY = 1;
window.FC_NUMERIC = 2;
window.FC_NUMERIC_IFNOTEMPTY = 3;
window.FC_DATE_DDMMJJ = 4;
window.FC_BANKNUMBER = 5;
window.FC_FLOAT = 6;
window.FC_FLOAT_IFNOTEMPTY = 7;
window.FC_MONEY = 8;
window.FC_INT = 9;
window.FC_INT_IFNOTEMPTY = 10;
window.FC_CREDITCARD = 11;
window.FC_DATE_DDMMJJJJ = 12;
window.FC_DATE_DDMMJJJJ_IFNOTEMPTY = 13;
window.FC_DATE_DDMMJJ_IFNOTEMPTY = 14;
window.FC_EMAIL = 15;
window.FC_EMAIL_IFNOTEMPTY = 17;
window.FC_TELEFOON = 16;

function fc_formconstraint()
{
	this.typeconstraints = new Array();
	this.customconstraints = new Array();
	this.needsinputclass = 'needsinput';

	this.addtypeconstraint = function addtypeconstraint(formelementid, constrainttype, constraintname)
	{
		var fc_constraint = {
			'element': formelementid,
			'constrainttype': constrainttype,
			'constraintname': constraintname
		};

		this.typeconstraints.push(fc_constraint);
	}

	this.removetypeconstraint = function removetypeconstraint(formelementid, elementconstrainttype)
	{
		for (var i = 0; i < this.typeconstraints.length; i++)
		{
			if (this.typeconstraints[i])
			{
				var elementid = this.typeconstraints[i]['element'];
				var constrainttype = this.typeconstraints[i]['constrainttype'];

				/* elementconstrainttype == "" => alle constraints verwijderen */
				if(elementconstrainttype == "") constrainttype = "";

				if (elementid == formelementid && elementconstrainttype == constrainttype)
				{
					this.typeconstraints.splice(i, i + 1);
				}
			}
		}
	}

	this.addcustomconstraint = function addcustomconstraint(formelementid, constraintfunction, constraintmessage, warning)
	{
		if (typeof(warning) == 'undefined')
		{
			warning = false;
		}

		var fc_constraint = {
			'element': formelementid,
			'constraintfunction': constraintfunction,
			'constraintmessage': constraintmessage,
			'warning': warning
		};

		this.customconstraints.push(fc_constraint);
	}

	this.removecustomconstraint = function removecustomconstraint(formelementid, elementconstraintfunction)
	{
		for (var i = 0; i < this.customconstraints.length; i++)
		{
			if (this.customconstraints[i])
			{
				var elementid = this.customconstraints[i]['element'];
				var constraintfunction = this.customconstraints[i]['constraintfunction'];

				/* elementconstraintfunction == "" => alle constraints verwijderen */
				if(elementconstraintfunction == "") constraintfunction = "";

				if (elementid == formelementid && elementconstraintfunction == constraintfunction)
				{
					this.customconstraints.splice(i, i + 1);
				}
			}
		}
	}
}

// voor manuele ajax gein
function fc_setNeedsInput(elementid)
{
	var needsinputclass = 'needsinput';
	var element=document.getElementById(elementid);

	element.className = element.className + ' ' + needsinputclass;
}

function fc_checkconstraints(constraintobject)
{
	var typeconstraints = constraintobject.typeconstraints;
	var customconstraints = constraintobject.customconstraints;

	var needsinputclass = constraintobject.needsinputclass;

	for (var i = 0; i < typeconstraints.length; i++)
	{
		if (typeconstraints[i])
		{
			var elementid = typeconstraints[i]['element'];
			var constrainttype = typeconstraints[i]['constrainttype'];
			var constraintname = typeconstraints[i]['constraintname'];

			if (!fc_checktypeconstraint(elementid, constrainttype))
			{
				fc_typeerrormessage(constraintname, constrainttype);

				var element = document.getElementById(elementid);

				/* kl0te IE, focus op hidden element geeft error */
				if (element.type != "hidden" && element.disabled != true)
				{
					if(element.focus) element.focus();
					if(element.select) element.select();
				}

				element.className = element.className + ' ' + needsinputclass;
				element.onkeydown = function()
				{
					element.className = '';
				}
				element.onclick = function()
				{
					element.className = '';
				}

				return false;
			}
		}
	}

	for (var i = 0; i < customconstraints.length; i++)
	{
		if (customconstraints[i])
		{
			var elementid = customconstraints[i]['element'];
			var constraintfunction = customconstraints[i]['constraintfunction'];
			var constraintmessage = customconstraints[i]['constraintmessage'];
			var warning = customconstraints[i]['warning'];

			if (!fc_checkcustomconstraint(elementid, constraintfunction))
			{
				if (warning)
				{
					var okornot = fc_customwarning(constraintmessage);
					if(! okornot) return false;
				}
				else if(elementid == "") {
					return false;
				}
				else
				{
					fc_customerrormessage(constraintmessage);

					element = document.getElementById(elementid);

					/* kl0te IE, focus op hidden element geeft error */
					if (element.type != "hidden" && element.disabled != true)
					{
						if(element.focus) element.focus();
						if(element.select) element.select();
					}

					element.className = element.className + ' ' + needsinputclass;
					element.onkeydown = function()
					{
						element.className = '';
					}
					element.onclick = function()
					{
						element.className = '';
					}

					return false;
				}
			}
		}
	}

	return true;
}

function fc_checktypeconstraint(elementid, constrainttype)
{
	var inputveld = document.getElementById(elementid);

	if (inputveld.value)
	{
		var inputwaarde = inputveld.value;
	} else
	{
		var inputwaarde = '';
	}

	switch(constrainttype)
	{
		case FC_NOT_EMPTY:
				switch (inputwaarde.type)
				{
					case "select-multiple":
							if (inputwaarde.selectedIndex != -1)
							{
								return true;
							}
					default:
							if (inputwaarde.length > 0)
							{
								return true;
							}
						break;
				}
			break;
		case FC_INT:
		case FC_NUMERIC:
				// ook kommagetallen goedkeuren
				inputwaarde = inputwaarde.replace(",", ".");
				if (!isNaN(inputwaarde))
				{
					return Math.round(inputwaarde) == inputwaarde;
				}
			break;
		case FC_NUMERIC_IFNOTEMPTY:
				// ook kommagetallen goedkeuren
				inputwaarde = inputwaarde.replace(",", ".");
				if (!isNaN(inputwaarde) || inputwaarde.length == 0)
				{
					return Math.round(inputwaarde) == inputwaarde;
				}
			break;
		case FC_FLOAT:
				// ook kommagetallen goedkeuren
				inputwaarde = inputwaarde.replace(",", ".");
				if (!isNaN(inputwaarde))
				{
					return true;
				}
			break;
		case FC_FLOAT_IFNOTEMPTY:
				// ook kommagetallen goedkeuren
				inputwaarde = inputwaarde.replace(",", ".");
				if (!isNaN(inputwaarde) || inputwaarde.length == 0)
				{
					return true;
				}
			break;
		case FC_DATE_DDMMJJ:
				inputwaarde = inputwaarde.replace(/-/g, '');
				if (!isNaN(inputwaarde))
				{
					if (inputwaarde.length == 6)
					{
						var dayfield=inputwaarde.substring(0,2)-0;
						var monthfield=inputwaarde.substring(2,4)-0;
						var yearfield=inputwaarde.substring(4,6)-0;

						if ((dayfield >= 1 && dayfield <= daysInMonth(monthfield, 2000+yearfield)) &&
							 (monthfield >= 1 && monthfield <= 12) &&
							 (yearfield >= 0 && yearfield <= 40)
							)
						{
							return true;
						}
					}
				}
			break;
		case FC_DATE_DDMMJJ_IFNOTEMPTY:
				inputwaarde = inputwaarde.replace(/-/g, '');
				if (inputwaarde.length == 0)
				{
					return true;
				}
				if (!isNaN(inputwaarde))
				{
					if (inputwaarde.length == 6)
					{
						var dayfield=inputwaarde.substring(0,2)-0;
						var monthfield=inputwaarde.substring(2,4)-0;
						var yearfield=inputwaarde.substring(4,6)-0;

						if ((dayfield >= 1 && dayfield <= daysInMonth(monthfield, 2000+yearfield)) &&
							 (monthfield >= 1 && monthfield <= 12) &&
							 (yearfield >= 0 && yearfield <= 40)
							)
						{
							return true;
						}
					}
				}
			break;
		case FC_DATE_DDMMJJJJ:
				inputwaarde = inputwaarde.replace(/-/g, '');
				if (!isNaN(inputwaarde))
				{
					if (inputwaarde.length == 8)
					{
						var dayfield=inputwaarde.substring(0,2)-0;
						var monthfield=inputwaarde.substring(2,4)-0;
						var yearfield=inputwaarde.substring(4,8)-0;

						if ((dayfield >= 1 && dayfield <= daysInMonth(monthfield, yearfield)) &&
							 (monthfield >= 1 && monthfield <= 12) &&
							 (yearfield >= 1900 && yearfield <= 2040)
							)
						{
							return true;
						}
					}
				}
			break;
		case FC_DATE_DDMMJJJJ_IFNOTEMPTY:
				inputwaarde = inputwaarde.replace(/-/g, '');
				if (inputwaarde.length == 0)
				{
					return true;
				}
				if (!isNaN(inputwaarde))
				{
					if (inputwaarde.length == 8)
					{
						var dayfield=inputwaarde.substring(0,2)-0;
						var monthfield=inputwaarde.substring(2,4)-0;
						var yearfield=inputwaarde.substring(4,8)-0;

						if ((dayfield >= 1 && dayfield <= daysInMonth(monthfield, yearfield)) &&
							 (monthfield >= 1 && monthfield <= 12) &&
							 (yearfield >= 1900 && yearfield <= 2040)
							)
						{
							return true;
						}
					}
				}
			break;
		case FC_BANKNUMBER:
				if (inputwaarde.length > 0)
				{
					return elfproef(inputwaarde);
				}
			break;
		case FC_MONEY:
				inputwaarde = inputwaarde.replace(",", ".");
				if (!isNaN(inputwaarde))
				{
					var isPrice = /^\d+\.?\d{0,2}$/;

					return isPrice.test(inputwaarde);
				}
			break;
		case FC_CREDITCARD:
				if (inputwaarde.length > 0)
				{
					return valideer_creditcardnummer(inputwaarde);
				}
			break;
		case FC_EMAIL_IFNOTEMPTY:
				var emailadres = inputwaarde.replace(/(^\s+)|(\s+$)/g, '');
				if (emailadres.length == 0)
				{
					return true;
				}
				// no break;
		case FC_EMAIL:
				var emailadres = inputwaarde.replace(/(^\s+)|(\s+$)/g, '');
				var reg = new RegExp('^[a-z0-9\\-\\_\\.]+@[a-z0-9\\-\\_\\.]+\\.[a-z]+$', 'i');
				var correctemail = reg.exec(emailadres);
				return correctemail != null;
			break;
		case FC_TELEFOON:
				inputwaarde = inputwaarde.replace("-", "");
				inputwaarde = inputwaarde.replace("+", "");
				inputwaarde = inputwaarde.replace(" ", "");
				return (inputwaarde.length >= 10 && !isNaN(inputwaarde));
			break;
	}

	return false;
}

function fc_checkcustomconstraint(elementid, constraintfunction)
{
	if(elementid == "") return constraintfunction("");

	var inputveld = document.getElementById(elementid);

	if (inputveld.value)
	{
		var inputwaarde = inputveld.value;
	} else
	{
		var inputwaarde = '';
	}

	return constraintfunction(inputwaarde);
}

function fc_typeerrormessage(naam, constrainttype)
{
	switch (constrainttype)
	{
		case FC_NOT_EMPTY:
				var message = ' mag niet leeg zijn';
			break;
		case FC_INT:
		case FC_NUMERIC:
				var message = ' moet een geheel getal zijn!';
			break;
		case FC_INT_IFNOTEMPTY:
		case FC_NUMERIC_IFNOTEMPTY:
				var message = ' moet een geheel getal zijn (indien ingevuld)!';
			break;
		case FC_FLOAT:
				var message = ' moet een getal zijn!';
			break;
		case FC_FLOAT_IFNOTEMPTY:
				var message = ' moet een getal zijn (indien ingevuld)!';
			break;
		case FC_DATE_DDMMJJ:
				var message = ' moet een geldige (6 cijferige, ddmmjj) datum zijn!';
			break;
		case FC_BANKNUMBER:
				var message = ' moet een geldig Bankrekeningnummer, of Gironummer (beginnende met P) zijn!';
			break;
		case FC_MONEY:
				var message = ' moet een getal zijn, maximaal 2 cijfers achter de comma!';
			break;
		case FC_DATE_DDMMJJJJ:
				var message = ' moet een geldige (8 cijferige, ddmmjjjj) datum zijn!';
			break;
		case FC_DATE_DDMMJJJJ_IFNOTEMPTY:
				var message = ' moet een geldige (8 cijferige, ddmmjjjj) datum zijn (indien ingevuld)!';
			break;
		case FC_DATE_DDMMJJ:
				var message = ' moet een geldige (6 cijferige, ddmmjj) datum zijn!';
			break;
		case FC_DATE_DDMMJJ_IFNOTEMPTY:
				var message = ' moet een geldige (6 cijferige, ddmmjj) datum zijn (indien ingevuld)!';
			break;
		case FC_CREDITCARD:
				var message = ' moet een geldig creditcardnummer zijn!';
			break;
		case FC_EMAIL:
				var message = ' moet een geldig email adres zijn!';
			break;
		case FC_EMAIL_IFNOTEMPTY:
				var message = ' moet een geldig email adres zijn of leeg gelaten worden.';
			break;
		case FC_TELEFOON:
				var message = ' is geen geldig 10 cijferig telefoon nummer!';
			break;
	}

	alert('Let op: ' + naam + message);
}

function fc_customerrormessage(message)
{
	if(message != "") {
		alert(message);
	}
}

function fc_customwarning(message)
{
	return window.confirm(message);
}

function fc_submit(form, constraintobject)
{
	if (fc_checkconstraints(constraintobject))
	{
		sd_disablesubmits();
		return true;
	} else
	{
		return false;
	}
}

// aangezien bij de fc_submit verloren gaat welke button er voor de submit gezorgd heeft,
// kan je hiermee op de button een onclick handler zetten die bv een hidden input element
// 'action' op 'update' of 'insert' zet ofzo.
function fc_setelement(element, value)
{
	document.getElementById(element).value = value;
}

function sd_index_submitbuttons()
{
	sd_submitbuttons = new Array();

	var inputitems = document.getElementsByTagName("INPUT");

	for (var i = 0; i < inputitems.length; i++)
	{
		var currentinputitem = inputitems[i];

		if (currentinputitem.type == 'submit' || currentinputitem.type == 'button')
		{
			sd_submitbuttons.push(currentinputitem);
		}
	}

	return sd_submitbuttons;
}

function sd_disablesubmits()
{
	var sd_submitbuttons = sd_index_submitbuttons();

	for (var i = 0; i < sd_submitbuttons.length; i++)
	{
		var currentbutton = sd_submitbuttons[i];
		currentbutton.disabled = 1;
	}
}

function sd_enablesubmits()
{
	var sd_submitbuttons = sd_index_submitbuttons();

	for (var i = 0; i < sd_submitbuttons.length; i++)
	{
		var currentbutton = sd_submitbuttons[i];
		currentbutton.disabled = 0;
	}
}

function sd_index_inputelements()
{
	var sd_inputelements = new Array();

	var inputitems = document.getElementsByTagName("INPUT");

	for (var i = 0; i < inputitems.length; i++)
	{
		var currentinputitem = inputitems[i];

		sd_inputelements.push(currentinputitem);
	}

	return sd_inputelements;
}

function sd_disableinputelements()
{
	var sd_inputelements = sd_index_inputelements();

	for (var i = 0; i < sd_inputelements.length; i++)
	{
		var currentinputelement = sd_inputelements[i];
		currentinputelement.disabled = 1;
	}
}

function sd_enableinputelements()
{
	var sd_inputelements = sd_index_inputelements();

	for (var i = 0; i < sd_inputelements.length; i++)
	{
		var currentinputelement = sd_inputelements[i];
		currentinputelement.disabled = 0;
	}
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function daysInMonth(month, year) {
	var days=31;
	if (month==4 || month==6 || month==9 || month==11) {days = 30}
	if (month==2) {days = daysInFebruary (year)}

	return days;
}

function elfproef(rekening)
{
    if(rekening.charAt(0) == 'P' && rekening.charAt(1) != ' ') return true;
    if(rekening.charAt(0) == 'p' && rekening.charAt(1) != ' ') return true;
    if(rekening.length != 9) return false;

    var j = 0;
    for(var i = 0; i < 9; i++)
    {
        j += ((9 - i) * parseInt(rekening.charAt(i)));
    }

    return ((j % 11) == 0);
}

function valideer_creditcardnummer(ccnummer)
{
	// lege ccnummers mogen ook
	if (ccnummer.length == 0)
	{
		return true;
	}

	// moet wel alleen uit getallen bestaan
	if (parseInt(ccnummer) != ccnummer || isNaN(ccnummer))
	{
		return false;
	}

	// paar vage checks d'roverheen om te kijken of het een valide CC nummer is
	if (!LuhnCheck(ccnummer))
	{
		return false;
	}

	return true;
}

function LuhnCheck(str)
{
	var sum = 0;
	var mul = 1;
	var strLen = str.length;

	for (i = 0; i < strLen; i++)
	{
		var digit = str.substring(strLen-i-1,strLen-i);
		var tproduct = parseInt(digit ,10)*mul;

		if (tproduct >= 10)
		{
			sum += (tproduct % 10) + 1;
		} else
		{
			sum += tproduct;
		}

		if (mul == 1)
		{
			mul++;
		} else
		{
			mul--;
		}
	}

	return sum % 10 == 0;
}

