//
// Controle op form.fields....
// Controle wordt aangestuurd middels form.field.properties die bij de aanroep van deze module worden gezet.
// De volgende opties zijn beschikbaar:
// * optional
// * numeric
// * integer
// * telnr
// * bankrekeningnr
// * minVal = waarde
// * maxVal = waarde
// * minLen = waarde
// * maxLen = waarde
// * dirty = waarde --> regel met teksten, gescheiden door | die als ongewenst worden gezien
// *			begin de regel ZONDER quotes en met een / 
// *			eindig de regel ZONDER quotes en met een / (of /g om herhaald te zoeken
// * dag --> het volgende veld is automatisch maand en het daaropvolgende automatisch jaar
//       --> gebruik nooit losstaand de opties maand of jaar. Deze worden automatisch gezet na dag!
// * email
//

function isBankrekeningnr(s) {
	// verwijder alle tekens die geen cijfers zijn
	bankrekeningnummer=s.value;
	bankrekeningnummer=bankrekeningnummer.replace(/\D/g, "");
	aantalTekens=bankrekeningnummer.length;
	if (aantalTekens == 9) { // kortere nummers zijn postbanknummers
		var som=0;
		// loop door de 9 cijfers met de 11 proef formule
		for (i=1; i<10; i++) {
			getal=bankrekeningnummer.charAt(i-1);
			som+=getal*(10-i);
			} 
		// geef resultaat van check terug
		if (som % 11==0 && aantalTekens==9) {
			return true;
			} else {
			return false;
			}
		} else {
		return true;
		}
	}

function isTelnr(s) {
	var checkOK = "0123456789- ";
	var checkStr = s.value;
	var allValid = true;
	for (i = 0;  i < checkStr.length;  i++) {
		var ch = checkStr.charAt(i);
		var tekenOK = false;
		if (ch == "+" && i == 0) {
			tekenOK = true;
			}
		for (j = 0;  j < checkOK.length;  j++) {
			if (ch == checkOK.charAt(j)) {
				tekenOK = true;
				break;
				}
			}
		if (!tekenOK) {
			// stop met loop
			allValid = false;
			s.foundTelnr = ch;
			break;
			}
		}
	if (allValid) {
		//alert ("einde zonder fouten");
		return true;
		}
	//alert ("einde met fouten");
	return false;
	}


function isEmail(emailStr) {
	
	/* The following variable tells the rest of the function whether or not
	to verify that the address ends in a two-letter country or well-known
	TLD.  1 means check it, 0 means don't. */
	
	var checkTLD=1;
	
	/* The following is the list of known TLDs that an e-mail address must end with. */
	
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	
	/* The following pattern is used to check if the entered e-mail address
	fits the user@domain format.  It also is used to separate the username
	from the domain. */
	
	var emailPat=/^(.+)@(.+)$/;
	
	/* The following string represents the pattern for matching all special
	characters.  We don't want to allow special characters in the address. 
	These characters include ( ) < > @ , ; : \ " . [ ] */
	
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	
	/* The following string represents the range of characters allowed in a 
	username or domainname.  It really states which chars aren't allowed.*/
	
	var validChars="\[^\\s" + specialChars + "\]";
	
	/* The following pattern applies if the "user" is a quoted string (in
	which case, there are no rules about which characters are allowed
	and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
	is a legal e-mail address. */
	
	var quotedUser="(\"[^\"]*\")";
	
	/* The following pattern applies for domains that are IP addresses,
	rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
	e-mail address. NOTE: The square brackets are required. */
	
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	
	/* The following string represents an atom (basically a series of non-special characters.) */
	
	var atom=validChars + '+';
	
	/* The following string represents one word in the typical username.
	For example, in john.doe@somewhere.com, john and doe are words.
	Basically, a word is either an atom or quoted string. */
	
	var word="(" + atom + "|" + quotedUser + ")";
	
	// The following pattern describes the structure of the user
	
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	
	/* The following pattern describes the structure of a normal symbolic
	domain, as opposed to ipDomainPat, shown above. */
	
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	
	/* Finally, let's start trying to figure out if the supplied address is valid. */
	
	/* Begin with the coarse pattern to simply break up user@domain into
	different pieces that are easy to analyze. */
	
	var matchArray=emailStr.value.match(emailPat);
	
	if (matchArray==null) {
	
		/* Too many/few @'s or something; basically, this address doesn't
		even fit the general mould of a valid e-mail address. */
		
		emailStr.foundEmail="check @ and .'s";
		return false;
		}
	var user=matchArray[1];
	var domain=matchArray[2];
	
	// Start by checking that only basic ASCII characters are in the strings (0-127).
	
	for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) {
			emailStr.foundEmail="The username contains invalid characters.";
			return false;
		   }
		}
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			emailStr.foundEmail="The domain name contains invalid characters.";
			return false;
		   }
		}
	
	// See if "user" is valid 
	
	if (user.match(userPat)==null) {
		
		// user is not valid
		
		emailStr.foundEmail="The username doesn't seem to be valid.";
		return false;
		}
	
	/* if the e-mail address is at an IP address (as opposed to a symbolic
	host name) make sure the IP address is valid. */
	
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
		
		// this is an IP address
		
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				emailStr.foundEmail="Destination IP address is invalid!";
				return false;
			   }
			}
		return true;
		}
	
	// Domain is symbolic name.  Check if it's valid.
	 
	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) {
			emailStr.foundEmail="The domain name does not seem to be valid.";
			return false;
		   }
		}

	/* domain name seems valid, but now make sure that it ends in a
	known top-level domain (like com, edu, gov) or a two-letter word,
	representing country (uk, nl), and that there's a hostname preceding 
	the domain or country. */
	
	if (checkTLD && domArr[domArr.length-1].length!=2 && 
	domArr[domArr.length-1].search(knownDomsPat)==-1) {
		emailStr.foundEmail="The address must end in a well-known domain or two letter country.";
		return false;
		}
	
	// Make sure there's a host name preceding the domain.
	
	if (len<2) {
		emailStr.foundEmail="This address is missing a hostname!";
		return false;
		}
	
	// If we've gotten this far, everything's valid!
	return true;
	}
	
function isblank(s) {
    if (s == null || s == "")
    	return true;
    for(var i = 0; i < s.length; i++) {
       var c = s.charAt(i);
       if ((c != ' ') && (c != '\n') && (c != '\t')) return false;
    	}
    return true;
	}

function isInt(s) {
	if (isNumeric(s))
		if (parseInt(parseFloat(s.value)) == parseFloat(s.value))
			return true;
	return false;
	}

function isNumeric(s) {
  var checkOK = "0123456789-.";
  var checkStr = s.value;
  var allValid = true;
  var decPoints = 0;
  var allNum = "";
  for (i = 0;  i < checkStr.length;  i++) {
    ch = checkStr.charAt(i);
    for (j = 0;  j < checkOK.length;  j++)
      if (ch == checkOK.charAt(j))
        break;
    if (j == checkOK.length) {
      allValid = false;
      break;
      }
    if (ch == ".") {
      allNum += ".";
      decPoints++;
      }
    else
      allNum += ch;
    } 
   	if (allValid && decPoints <= 1)
		return true;
	return false;
  }

function isToSmall(s) {
	if (s.value < s.minVal) {
		return true;
		}
	return false;
	}

function isToBig(s) {
	if (s.value > s.maxVal) {
		return true;
		}
	return false;
	}

function isDirty(s) {
	zoek 		= new RegExp(s.dirty);
	gevonden 	= s.value.match(zoek);
	//alert("we zoeken : " + zoek + " in : " + s.value  + " we vonden : " + gevonden);
	if (gevonden != null) {
		s.foundDirty = gevonden;
		return true;
		}
	return false;
	}

// This is the function that performs form verification. It is invoked
// from the onsubmit event handler. The handler should return whatever
// value this function returns.
function verify(f) {
    var msg;
    var emptyFields = "";
    var intFields = "";
    var numericFields = "";
    var bankFields = "";
    var smallFields = "";
    var bigFields = "";
    var minLenFields = "";
    var maxLenFields = "";
    var dag28Fields = "";
    var dag30Fields = "";
    var dirtyFields = "";
    var emailFields = "";
    var telnrFields = "";

    // Loop door alle schermvelden heen.
    // text and textarea elementen zijn de enige die gecontroleerd moeten worden.
    // Als ze leeg zijn, en optioneel, dan kan met het volgende veld verder gegaan worden.
    // Daarna worden alle controlles uitgevoerd. 
    // Als een veld een bepaalde controle niet doorstaat, dan:
    // * wordt het veld aan een regel met foutmeldingen toegevoegd;
    // * wordt meteen met het volgende veld verder gegaan.
    // Als laatste stap wordt de totale foutmelding samengesteld.

    for(var i = 0; i < f.length; i++) {
        var e = f.elements[i];
        if (((e.type == "text") || (e.type == "textarea"))) {
				if (isblank(e.value)) {
				 	if (!e.optional)
						emptyFields 		+= "\n          " + e.name;
					continue;
					}
				if (e.dag) {
					e.integer = true;
					e.minVal = 1;
					e.maxVal = 31;
					f.elements[i + 1].integer = true;
					f.elements[i + 1].minVal = 1;
					f.elements[i + 1].maxVal = 12;
					f.elements[i + 2].integer = true;
					f.elements[i + 2].minVal = 1901;
					f.elements[i + 2].maxVal = 2099;
					f.elements[i + 2].jaar = true;
					}
				if (e.integer) {
					if (!isInt(e)) {
						intFields 			+= "\n          " + e.name;
						continue;
						}
					}
				if (e.numeric) {
					if (!isNumeric(e)) {
						numericFields 	+= "\n          " + e.name;
						continue;
						}
					}
				if (e.bankrekeningnr) {
					if (!isBankrekeningnr(e)) {
						bankFields 	+= "\n          " + e.name;
						continue;
						}
					}
				if (e.minVal != null) {
					if (isToSmall(e)) {
						smallFields 		+= "\n          " + e.name + " --> minimum waarde: " + e.minVal;
						continue;
						}
					}
				if (e.maxVal != null) {
					if (isToBig(e)) {
						bigFields 			+= "\n          " + e.name + " --> maximum waarde: " + e.maxVal;
						continue;
						}
					}
				if (e.minLen != null) {
					if (e.value.length < e.minLen) {
						minLenFields 		+= "\n          " + e.name + " --> minimum lengte: " + e.minLen;
						continue;
						}
					}
				if (e.maxLen != null) {
					if (e.value.length > e.maxLen) {
						maxLenFields 		+= "\n          " + e.name + " --> maximum lengte: " + e.maxLen;
						continue;
						}
					}
				if (e.dirty != null) {
					if (isDirty(e)) {
						dirtyFields 		+= "\n          " + e.name + " --> niet toegestane fragmenten: "+ e.foundDirty;
						continue;
						}
					}
				if (e.email != null) {
					if (!isEmail(e)) {
						emailFields 		+= "\n          " + e.name + " --> fout in email adres: "+ e.foundEmail;
						continue;
						}
					}
				if (e.telnr != null) {
					e.minLen = 7;
					if (e.value.length < e.minLen) {
						minLenFields 		+= "\n          " + e.name + " --> minimum lengte: " + e.minLen;
						}
					if (!isTelnr(e)) {
						telnrFields 		+= "\n          " + e.name + " --> niet toegestaan teken: "+ e.foundTelnr;
						continue;
						}
					}
				if (e.jaar) {
					dag = f.elements[i - 2];
					maand = f.elements[i - 1];
					jaar = e;
					if (dag.value == 31 && (maand.value == 4 || maand.value == 6 || maand.value == 9 || maand.value == 11)) {
						dag30Fields 		+= "\n          " + dag.name;
						continue;
						}
					if (maand.value == 2 && dag.value == 29 && (parseInt(jaar.value / 4) == (jaar.value / 4))) {
						continue;
						}
					if (maand.value == 2 && dag.value > 28)  {
						dag28Fields 		+= "\n          " + dag.name;
						continue;
						}
					}
            }
        }

    // Now, if there were any errors, display the messages, and
    // return false to prevent the form from being submitted. 
    // Otherwise return true.

    if (!emptyFields && !intFields & !numericFields & !bankFields & !smallFields & !bigFields & !minLenFields & !maxLenFields & !dag30Fields & !dag28Fields & !dirtyFields & !telnrFields) return true;

    msg  = "______________________________________________________\n\n"
    msg += "Het formulier kan niet worden verwerkt vanwege invoerfout(en).\n";
    msg += "Verbeter deze en verstuur het formulier opnieuw.\n";
    msg += "______________________________________________________\n\n"

    if (emptyFields) {
       msg += "- De volgende verplichte velden zijn leeg:" 
                + emptyFields + "\n";
    	}
    if (intFields) {
       msg += "- De volgende integer velden bevatten niet (gehele) getallen:" 
                + intFields + "\n";
    	}
    if (numericFields) {
       msg += "- De volgende numerieke velden bevatten niet numerieke (cijfers) gegevens:"  
                + numericFields + "\n";
    	}
    if (bankFields) {
       msg += "- De volgende banknummer-velden bevatten fouten:"  
                + bankFields + "\n";
    	}
    if (smallFields) {
       msg += "- De volgende velden bevatten gegevens die het opgegeven minimum onderschrijden:" 
                + smallFields + "\n";
    	}
    if (bigFields) {
       msg += "- De volgende velden bevatten gegevens die het opgegeven maximum overschrijden:" 
                + bigFields + "\n";
    	}
    if (minLenFields) {
       msg += "- De volgende velden bevatten gegevens die het opgegeven minimale lengte onderschrijden:" 
                + minLenFields + "\n";
    	}
    if (maxLenFields) {
       msg += "- De volgende velden bevatten gegevens die het opgegeven maximale lengte overschrijden:" 
                + maxLenFields + "\n";
    	}
    if (dag30Fields) {
       msg += "- De volgende velden bevatten dagnummer 31 in een maand waarin dat niet mag:" 
                + dag30Fields + "\n";
    	}
    if (dag28Fields) {
       msg += "- De volgende velden bevatten dagnummer 29 of hoger in februari:" 
                + dag28Fields + "\n";
	}
    if (dirtyFields) {
       msg += "- De volgende velden bevatten ongewenste tekstfragmenten" 
                + dirtyFields + "\n";
   	}
    if (emailFields) {
       msg += "- De volgende velden bevatten een onjuist email adres" 
                + emailFields + "\n";
   	}
    if (telnrFields) {
       msg += "- De volgende velden bevatten een onjuist telefoonnummer" 
                + telnrFields + "\n";
   	}

    alert(msg);
    return false;
}

