//globale vars
var _id=0
var _check  = new Object();
var myFirstTime = false

function getValidationrules(){
	var strValidationrules = "";
//	strValidationrules = "Function1" + "___" + "Rule1" + "\t";
	strValidationrules = "checkEmail(oElement)" + "___" + "e-mail adres" + "\t";
	strValidationrules += "checkTelephone(oElement)" + "___" + "telefoonnummer" + "\t";
	strValidationrules += "checkPostcode(oElement)" + "___" + "postcode veld" + "\t";
	strValidationrules += "checkIsNummeric(oElement)" + "___" + "nummeriek veld" + "\t";
	strValidationrules += "checkNotEmpty(oElement)" + "___" + "verplicht veld" + "\t";
	strValidationrules += "checkDD(oElement)" + "___" + "0-31 (dag)" + "\t";
	strValidationrules += "checkMM(oElement)" + "___" + "0-12 (maand)" + "\t";
	strValidationrules += "checkYYYY(oElement)" + "___" + "jaartal" + "\t";
	strValidationrules += "checkCaps(oElement)" + "___" + "Formateer Aaaa" + "\t";
	strValidationrules += "checkAllCaps(oElement)" + "___" + "Formateer AAAA" + "\t";
	strValidationrules += "checkCheckboxNotEmpty(oElement, prefix)" + "___" + "checkbox" + "\t";
	
	return strValidationrules;
	
}

function PPFormValidator(oForm){
	if (oForm.tagName.toLowerCase()!='form') return;
	var arrFormElements = oForm.elements;
	for (var iFormElement=0;iFormElement< arrFormElements.length; iFormElement++){
		if (arrFormElements[iFormElement].getAttribute('validationrules')) {
			if (!PPElementValidation(arrFormElements[iFormElement])) return false;
		}
	}
	return true;
}


function PPElementValidation(oElement){
	var strValidationRules = oElement.getAttribute('validationrules');
	if (strValidationRules !="") {
		var result = strValidationRules.split ("\t");
		if (result != null) {
			for (i=0;i<result.length;i++) {
				result[i].replace(/\&\#9\;/ig,"");
				arrOption = result[i].split ("___");
				if (arrOption.length>1) strCurRule = arrOption[0];
				else strCurRule = result[i];
				if (strCurRule) {
					if (!eval (strCurRule)) {		// hier wordt de validatiefunctie uitgevoerd
						var strMeldingType = oElement.getAttribute('errormsgtype');
						var strMeldingClass = oElement.getAttribute('errormsgstylename');
						var strMeldingTxt = oElement.getAttribute('errormsg');
//						if (strMeldingTxt == "" || strMeldingTxt == null || strMeldingTxt == undefined) strMeldingTxt = get_i18n_text(2,"U heeft het veld niet juist ingevuld!");
						if (strMeldingTxt == "") strMeldingTxt = "U heeft het veld niet juist ingevuld!"
						if (strMeldingType.toLowerCase()=='txtstring') {
							strErrorMsg = "<br><span class='"+strMeldingClass+"'>&nbsp;"+strMeldingTxt+"</span><br>";
							oElement.insertAdjacentHTML ('beforeBegin', strErrorMsg);
							oElement.focus();
							return false;
						} else {
							alert (strMeldingTxt);
							oElement.focus();
							return false;
						}
					}
				}
			}
		}
	}
	return true;
}



// de errorchecks per type

function checkEmail(myField){
	// uit de code snippets: check e-mailadres#2
	// daar staat ook al het comment
	// The JavaScript Source!! http://javascript.internet.com 
	// V1.1.3: Sandeep V. Tamhankar (stamhankar@hotmail.com) 
	// Original:  Sandeep V. Tamhankar (stamhankar@hotmail.com) 
	
	emailStr = myField.value
	var checkTLD=1;
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);
	if (matchArray==null) {
		return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];
	for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) {
			return false;
		}
	}
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			return false;
	   }
	}
	if (user.match(userPat)==null) {
		return false;
	}
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
	for (var i=1;i<=4;i++) {
		if (IPArray[i]>255) {
			return false;
	   }
	}
	return true;
	}
	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) {
		if (domArr[i].search(atomPat)==-1) {
			return false;
	   }
	}
	if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
		return false;
	}
	if (len<2) {
		return false;
	}
	return true;
}

function checkTelephone(myField){
	// een hele eenvoudige telefoonnummercheck
	if (myField.value.match(/^[0-9\-\s\(\)]{10,13}$/)) return true;
	else return false;
}

function checkIsNummeric(myField){
	if (myField.value.match(/^[0-9]+$/)) return true;
	else return false;
}

function checkIsNummeric2(myField,num){
	//nummeriek , eventueel met een komma en twee decimalen (00 of 00,00)
	if (myField.value.match(/^[0-9]+(\,[0-9]{2})?$/)) return true;
	else return false;
}

function checkDD( myField){
	if (myField.value.match(/^[0-9]{1,2}$/)){
		if (myField.value >=1 && myField.value <= 31) return true;
	}
	else return false;
}


function checkMM( myField){
	if (myField.value.match(/^[0-9]{1,2}$/)){
		if (myField.value >=1 && myField.value <= 12) return true;
	}
	else return false;
}

function checkYYYY( myField){
	if (myField.value.match(/^[0-9]{4}$/)){
		jaar= new Date()
		if (myField.value <= jaar.getFullYear()) return true;
		
	}
	else return false;
}


function checkPostcode(myField){
 	matchArr =  CheckPostcode2(myField)
	if (matchArr){ 
		myField.value = matchArr[1] + " " + matchArr[3].toUpperCase()
		return true;
	}
	else return false;
}

function CheckPostcode2(myField){
	return myField.value.match(/^([0-9]{4})(\s*)([a-zA-Z]{2})/)
}

function checkNotEmpty(myField){
	//is niet helemaal goed. Ook checken op rare tekens, anders dan [a-zA-Z0-9] - bv: _-()*&
	myValue = myField.value
	if (!myValue.match('[a-zA-Z0-9]') || myValue.length<1){
		return false;
	}
	return true;
}

function checkCaps(myField){
	//veranderd de ingevulde woorden in onderkast, en de eerste letter in een hoofdetter
	myValue = myField.value
	if (!myValue.match('[a-zA-Z0-9]') || myValue.length<1){
		return false;
	}else{
		return makeCaps(myField);
	}
}

function checkAllCaps(myField){
	//veranderd de ingevulde woorden in kapitalen
	myValue = myField.value
	if (!myValue.match('[a-zA-Z0-9]') || myValue.length<1){
		return false
	}else{
		return makeAllCaps(myField)
	}
}

function makeCaps (myField){
	myValueArray = myField.value.split(" ")
	var waarden = "";
	for(items in myValueArray){
		startCap = myValueArray[items].slice(0,1).toUpperCase();
		rest = myValueArray[items].slice(1, myValueArray[items].length).toLowerCase();
		if (waarden=="") waarden = startCap + rest;
		else waarden += " " + startCap + rest;
	}
	myValueArray = waarden.split("-")
	if (myValueArray.length>1){
		waarden="";
		for(items in myValueArray){
			startCap = myValueArray[items].slice(0,1).toUpperCase();
			rest = myValueArray[items].slice(1, myValueArray[items].length).toLowerCase();
			if (waarden=="") waarden = startCap + rest;
			else waarden += "-" + startCap + rest;
		}
	}
	myValueArray = waarden.split("- ")
	if (myValueArray.length>1){
		waarden="";
		for(items in myValueArray){
			startCap = myValueArray[items].slice(0,1).toUpperCase();
			rest = myValueArray[items].slice(1, myValueArray[items].length).toLowerCase();
			if (waarden=="") waarden = startCap + rest;
			else waarden += "- " + startCap + rest;
		}
	}
	myField.value = waarden;
	return true;
}

function makeAllCaps (myField){
	myField.value = myField.value.toUpperCase()
	return true;
}

function checkRadio(myObject){
	myRadios = document.getElementsByName(myObject.name)
	for(i=0;i<myRadios.length;i++){
		if (myRadios[i].checked==true) return true;
	}
	return false;
}

function checkChecked(myObject){
	if (myObject.checked!=true){
		return false;
	} 
	return true;
}


/**
 * 	@function		checkSelected
 *	@description	Controleert of er inderdaad een keuze is gemaakt middels een select-pulldown
 *	@input			Object om te checken
 *	@output 		{ true | false }
 */
function checkSelected(myObject){
	//
	//	** Nog invulling aan geven **
	//
	return true;
}


/**
 * 	@function		checkAtLeastOneChecked
 *	@description	Controleert of er niet minimaal 1 vinkvakje in een aangegeven element (span of div-je!) aangevinkt is of niet.
 *	@input			Object om te checken (meestal een DIV om de checkboxes heen)
 *	@output 		{ true | false }
 */
 function checkAtLeastOneChecked(myObject){
	if (myObject) {
		children = myObject.all;
		theValues = new Object ();
		for (var i=0;i< children.length; i++){
//			alert( "ID found: " + children[i].getAttribute("id") );
			if (children[i].checked==true) {
				return true;
			}
		}//End for
	}//End if
	return false;
}//End function


/**
 * 	@function		checkDomainnameSyntax
 *	@description	Controleert of ingevulde domeinnaam wel een correcte syntax heeft.
 *					Voorlopig alleen letters en cijfers toestaan.
 *	@input			Object om te checken
 *	@output 		{ true | false }
 */
 function checkDomainnameSyntax(myObject){
	if (myObject) {
		myValue = myObject.value

		//Alleen a-z, A-Z en 0-9
		if ( !myValue.match('[a-zA-Z0-9]') && myValue.length<2 ){
			return false;	//Did not match criteria
		}

		//De volgende leestekens blocken:
		var iChars = ".!?/^~`\\*|,\":<>[]{}`\';()@&$#%_ ";
		for (var i = 0; i < myValue.length; i++) {
			if (iChars.indexOf(myValue.charAt(i)) != -1) {
				return false;	//Did not match criteria
			}
		}

		myObject.value = myValue.toLowerCase();				//Convert de tekst naar lowercase, mocht er 1 of meerdere capital(s) in voor komen.
	}
	return true;
}//End function


/**
 * 	@function		checkEmailnameSyntax
 *	@description	Controleert of ingevulde e-mailnaam (gedeelte voor de @) wel een correcte syntax heeft.
 *					Voorlopig alleen letters en cijfers toestaan, leeg mag ook
 *	@input			Object om te checken
 *	@output 		{ true | false }
 */
 function checkEmailnameSyntax(myObject){
	if (myObject) {
		myValue = myObject.value

		if(myValue==""){
			return true;	//Leeg mag.
		}
		//Alleen a-z, A-Z en 0-9
		if ( !myValue.match('[a-zA-Z0-9]') && myValue.length<2 ){
			return false;	//Did not match criteria
		}

		//De volgende leestekens blocken:
		var iChars = "!?/^~`\\*|,\":<>[]{}`\';()@&$#% ";
		for (var i = 0; i < myValue.length; i++) {
			if (iChars.indexOf(myValue.charAt(i)) != -1) {
				return false;	//Did not match criteria
			}
		}

		myObject.value = myValue.toLowerCase();				//Convert de tekst naar lowercase, mocht er 1 of meerdere capital(s) in voor komen.
	}
	return true;
}//End function


/**
 * 	@function		checkBanknummer
 *	@description	Gebruik de 11-proef om te controleren of het meegegeven nummer mogelijkerwijs een legitiem banknummer is
 *	@input			myObject : HTML-Object met daarin als value de string met het te controleren banknummer
 *	@output 		true indien legitiem banknummer, false indien geen banknummer
 */
function checkBanknummer(myObject) {

	if (myObject) {
		BankNumber = myObject.value;
		if( BankNumber ) {
			var BankNumber_Length = BankNumber.length;

			//Negen getallen inclusief de punten is maximaal 12 lang. "123456789" als banknummer mag trouwens ook niet...
			if( BankNumber_Length > 12 || BankNumber_Length < 6 || BankNumber=="123456789" || BankNumber=="12.34.56.789" ) {

				return false;

			} else {

				var ValidChars = "0123456789.";						//Deze mogen dus wel
				var Char;
				for (i = 0; i < BankNumber.length; i++) { 
					Char = BankNumber.charAt(i); 
					if (ValidChars.indexOf(Char) == -1){
						return false;
					}
				}//End for

				BankNumber	= BankNumber.replace(/\./g, '');		//Haal eerst de punten er uit (12.34.56.789 wordt 123456789)
				var total	= 0;
				for(var c=0;c<BankNumber.length;c++){				//Doe nu de 11-proef.
					total	= total + parseInt( ( BankNumber.substring(c,c+1) * (9-c) ) );
				}//End for
				if( ( (total/11)+'' ).indexOf('.') > 0 ) {
					return false;
				} else {
					return true;
				}//End if deelbaar door 11 zonder restant

			}//End if

		} else {
			return false;					//Geen Banknummer als value gevondenmeegegeven
		}//End if

	} else {
			return false;					//Geen HTML-Object meegegeven
	}//End if

}//End function


/**
 * 	@function		checkSamePasswordValues
 *	@description	Controleert van twee invulvelden binnen het opgegeven HTML-Object (span of div)
 *					of de password bevestiging gelijk is aan het password zelf. De beide invulvelden moeten
 *					een attribuut met de naam "component_data_name" hebben, en elk heeft daarvoor een VERPLICHTE value.
 *					Deze values staan vast, en moeten hetzelfde blijven. Hooguit kun je in de case-statement een paar
 *					nieuwe cases toevoegen, zodat de controle ook reageert op andere values, maar deze values moeten wel
 *					ongewijzigd blijven, helaas.
 *					Als deze 2 values er niet zijn, dan pikt deze controle de waarden niet op en wordt een false teruggegeven!!!
 *					Voorbeeld van een correct stuk HTML:
 *
 *	<span id="wachtwoordspan" validationrules="checkSamePasswordValues(oElement)___verplicht veld&#9;" errormsg="FOUT!!!" errormsgtype="alert">
 *		<input type="password" name="co__1" id="co__1" component_data_name="ppadmin_password">
 *		<input type="password" name="co__2" id="co__2" component_data_name="ppadmin_password_check">
 *	</span>
 *
 *	@input			myObject : HTML-Object met daarin de te controleren Password-values
 *	@output 		true/false
 */
function checkSamePasswordValues(myObject) {

	if (myObject) {
		children = myObject.all;
		var password				= '';
		var password_confirmation	= '';

		//Haal de ingevulde waarden voor de passwords eerst op :
		for (var i=0;i< children.length; i++){
			var component_data_name		= '';
			oCurcomponent = children[i];
			component_data_name = oCurcomponent.getAttribute("component_data_name");
			if( component_data_name && (component_data_name!="") ){
				switch (component_data_name) {
				case 'ppadmin_password':			//Eerste verplichte veldnaam (zodat dit gaat werken)
					password = oCurcomponent.value;
					break;
				case 'ppadmin_password_check':		//Tweede verplichte veldnaam (zodat dit gaat werken)
					password_confirmation = oCurcomponent.value;
					break;
				default:
					break;
				}//End switch
			}
		}//End for

		//Controleer nu de Passwords :
		if ( password && password!='' ) {									//Hadden we een password gevonden?
			if ( password_confirmation && password_confirmation!='' ) {		//Hadden we een password bevestiging gevonden?
				if( password == password_confirmation ) {					//Waren ze dan ook exact gelijk?
					return true;											//ja, dus true.
				}//End if
			}//End if
		}//End if

	}//End if myObject

	return false;															//In alle andere gevallen: false, helaas.

}//End function

function checkCheckboxNotEmpty(myObject, prefix, minCount, maxCount) {

	var objForm=myObject.form;
	var countChecks=0;
	var found = false;
	var result;
		
	for (i=0; i<objForm.elements.length;i++) {
		if (objForm.elements[i].name.indexOf(prefix) >= 0) {
			found = true;
			if (objForm.elements[i].checked==true) {
				countChecks++;
			}
		}		
	}
	
	if (found) {
		result = (countChecks >= minCount) && (countChecks <= maxCount);
	} else {
		result = false;
	}
		
	return (result);
}

//Einde van de checks per type
