var chkObj		= new Array();
var yetdefined = "0";
var errors		= "";
var hihh		= 0 ;
var htmll		= "" ;
var htmlo		= "";
var htmls		= "";
var errorbg   = "";
var normalbg   = "";
var returnVal	= false;
var lng			= new Array();
lng.english		= new Array();
lng.dutch		= new Array();
lng.french		= new Array();

// Error messages in english:
	lng.english.title		= "Form error"
	lng.english.header		= "The following error(s) occured:"
	lng.english.start		= "->";
	lng.english.field		= " The field ";
	lng.english.und	= " and the field ";
	lng.english.require	= " is required";
	lng.english.and	= " and";
	lng.english.min		= " must consist of at least ";
	lng.english.max		= " must not contain more than ";
	lng.english.minmax		= " and no more than ";
	lng.english.chars		= " character(s)";
	lng.english.digits		= " digit(s)";
	lng.english.selected	= " selection(s)";
	lng.english.num		= " must contain a number";
	lng.english.numbtwn		= " must contain a number between ";
	lng.english.email		= " must contain a valid e-mail address";
	lng.english.date		= " must be in DD/MM/YYYY format";
	lng.english.anddate	= " must be in DD/MM/YYYY format";
	lng.english.nodate		= " contains an invalid date";
	lng.english.option		= " must be selected";
	lng.english.compare		= " must be identical";
	
// Error messages in Dutch:
	lng.dutch.title		= "Fout in het formulier"
	lng.dutch.header		= "Fout in het formulier:"
	lng.dutch.start		= "->";
	lng.dutch.field		= " Het veld ";
	lng.dutch.und		= " en het veld ";
	lng.dutch.require		= " is verplicht";
	lng.dutch.and	= " en";
	lng.dutch.min		= " moet bestaan uit minstens ";
	lng.dutch.max		= " moet bestaan uit minder dan ";
	lng.dutch.minmax		= " en niet meer dan ";
	lng.dutch.chars		= " karakter(s)";
	lng.dutch.digits		= " cijfer(s)";
	lng.dutch.selected		= " selectie(s)";
	lng.dutch.num		= " moet een nummer zijn";
	lng.dutch.numbtwn		= " moet een nummer zijn tussen ";
	lng.dutch.email		= " moet een geldig e-mail adres zijn";
	lng.dutch.date		= " moet in DD/MM/JJJJ formaat zijn";
	lng.dutch.anddate		= " moet in DD/MM/JJJJ formaat zijn";
	lng.dutch.nodate		= " bevat een ongeldige datum";
	lng.dutch.option		= " moet een keuze bevatten";
	lng.dutch.compare		= " moeten identiek zijn";

// Error messages in French:
	lng.french.title		= "Erreur dans le formulaire"
	lng.french.header		= "L'erreur suivante s'est produite :"
	lng.french.start		= "->";
	lng.french.field		= " le champ ";
	lng.french.und		= " et le champ ";
	lng.french.require		= " est obligatoire";
	lng.french.and	= " et";
	lng.french.min		= " doit contenir au moins ";
	lng.french.max		= " ne doit pas contenir plus de ";
	lng.french.minmax		= " et pas plus de ";
	lng.french.chars		= " caract\350re(s)";
	lng.french.digits		= " chiffre(s)";
	lng.french.selected	= " s\351lection(s)";
	lng.french.num		= " doit contenir un nombre ";
	lng.french.numbtwn		= " doit contenir un nombre entre ";
	lng.french.email		= " doit contenir une adresse e-mail valide";
	lng.french.date		= " doit \352tre en format JJ/MM/AAAA";
	lng.french.hour		= " doit \352tre en format HH:MM";
	lng.french.mindate		= " doit contenir une ann\351e \340 partir de ";
	lng.french.maxdate		= " doit contenir une ann\351e jusqu'\340 maximum ";
	lng.french.mmdate		= " doit contenir une ann\351e comprise entre ";
	lng.french.nodate		= " ne contient pas une date correcte";
	lng.french.nohour		= " ne contient pas une heure correcte";
	lng.french.option		= " doit \352tre s\351lectionn\351";
	lng.french.compare		= " doivent \352tre identiques";
	lng.french.invalid		= " n'est pas dans le bon format";

function define(n,type,HTMLname,min,max,d){
	var p;
	var i;
	var x;
	if(!d) d=document;
	if((p=n.indexOf("?"))>0&&parent.frames.length){
    	d=parent.frames[n.substring(p+1)].document;
    	n=n.substring(0,p);
    	}
	if(!(x=d[n])&&d.all){
		x=d.all[n];
	}
	
  	for (i=0;!x&&i<d.forms.length;i++){
  		x=d.forms[i][n];
  	}
	for(i=0;!x&&d.layers&&i<d.layers.length;i++){
		x=define(n,type,HTMLname,min,max,d.layers[i].document);
		return x;
	}
	for (i=0;i<chkObj.length;i++){
		if (chkObj[i].form == x){
			yetdefined="1";
		}
	}
	if (yetdefined!="1"){
		eval("V_"+n+" = new formResult(x,type,HTMLname,min,max,n);");
		chkObj[eval(chkObj.length)] = eval("V_"+n);
	}	
	yetdefined="0";
	srtObj();
}

function formResult(form,type,HTMLname,min,max,n){
	this.form = form;
	this.type = type;
	this.HTMLname = HTMLname;
	this.min  = min;
	this.max  = max;
	for(var xxx=0;xxx<document.forms.length;xxx++){
		for(var xx=0;xx<document.forms[xxx].length;xx++){
			if (n==document.forms[xxx][xx].name){
				 this.order=xxx + "_" + xx;
			}
		}
	}
}

function htmllogo(src){
	htmll = "<img src=" + src + "> <br> <br>";
}
function htmlok(src){
	htmlo = "<a href=\"javascript:window.close()\"><img src=" + src + " border=\"0\"></a>";
}
function htmlstart(src){
	htmls = "<img src=" + src + " align=absmiddle>";
}

function textbg(a,b){
	if(a) normalbg="#"+a;
	if(b) errorbg="#"+b;
}

function rstCol(){
	if(chkObj.length>0){
		for(i=0;i<chkObj.length;i++){
			if (chkObj[i].type!="radio" && chkObj[i].type!="checkbox"){
				if (!document.layers && normalbg != "") chkObj[i].form.style.background=normalbg;
			}
		}
	}

}

function srtObj(){
	if(chkObj.length > 1){
		var tmpObj = new Array();	
		for(var xxx=0;xxx<document.forms.length;xxx++){
			for(var xx=0;xx<document.forms[xxx].length;xx++){
				for(i=0;i<chkObj.length;i++){
					if (chkObj[i].order==xxx + "_" + xx){
						tmpObj[tmpObj.length]=chkObj[i];
					}
				}
			}
		}
		chkObj = tmpObj;
	}
}

function validate(lang,html,bgcolor,txtcolor,fieldcolor,high,widd){
	if (!lang || (lang.toLowerCase() != "english" && lang.toLowerCase() != "french" && lang.toLowerCase() != "dutch" && lang.toLowerCase() != "en" && lang.toLowerCase() != "fr" && lang.toLowerCase() != "nl")){
		var secLng = "english";	// Choose between "english", "dutch", "french"
	} 
	else{
		var secLng = lang.toLowerCase();
	}
	if (secLng=="en") secLng = "english";
	if (secLng=="fr") secLng = "french";
	if (secLng=="nl") secLng = "dutch";
	rstCol(); //reset colors if any set for errored fields.

	if(chkObj.length>0){
		errorObject = "";
		for(i=0;i<chkObj.length;i++){
			valObj 			= new Object();
			valObj.form 	= chkObj[i].form;
			valObj.HTMLname = chkObj[i].HTMLname;
			valObj.type 	= chkObj[i].type;
			if (valObj.type!="radio" && valObj.type!="option" && valObj.type!="checkbox"){
				valObj.len 		= chkObj[i].form.value.length;
			}
			else{
				valObj.len 		= null;
			}
			if (valObj.type!="radio" && valObj.type!="checkbox"){
				valObj.val 		= chkObj[i].form.value;
			}
			else{
				valObj.val 		= null;
			}
			valObj.min 		= chkObj[i].min;
			valObj.max 		= chkObj[i].max;
			//**********************************************************************************************************************************
			//alert("valObj: "+valObj.HTMLname+"\nvalObj.val: "+valObj.val+"\nvalObj.len: "+valObj.len+"\nvalObj.min,valObj.max: "+valObj.min+","+valObj.max+"\nvalObj.type: "+valObj.type);
			//**********************************************************************************************************************************
			if(valObj.type == "string"){
				if (valObj.min && valObj.max && (valObj.len < valObj.min || valObj.len > valObj.max)){
					hihh++;
					errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].min+valObj.min+lng[secLng].minmax+valObj.max+lng[secLng].chars+( (html=="1") ? "<br>\n" : "\n");
 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
				} else if (valObj.min && !valObj.max && (valObj.len < valObj.min)){
					hihh++;
					errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].min+valObj.min+lng[secLng].chars+( (html=="1") ? "<br>\n" : "\n");
 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
				} else if (valObj.max && !valObj.min &&(valObj.len > valObj.max)){
					hihh++;
					errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].max+valObj.max+lng[secLng].chars+( (html=="1") ? "<br>\n" : "\n");
 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
				} else if (!valObj.min && !valObj.max && valObj.len <= 0){
					hihh++;
					errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].require+( (html=="1") ? "<br>\n" : "\n");
 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
				}
			}
			else if(valObj.type == "email"){
				if((valObj.val.indexOf("@") == -1) || (valObj.val.charAt(0) == ".") || (valObj.val.charAt(0) == "@") || (valObj.val.charAt(valObj.len-1) == ".") || (valObj.val.charAt(valObj.len-2) == ".") || (valObj.len < 6) || (valObj.val.indexOf(".") == -1) || (valObj.val.charAt(valObj.val.indexOf("@")+1) == ".") || (valObj.val.charAt(valObj.val.indexOf("@")-1) == ".")){
					hihh++;
					errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].email+( (html=="1") ? "<br>\n" : "\n");
 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
				}
			}
			else if(valObj.type == "date"){
				if (valObj.len == 0){
					hihh++;
					errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].require+lng[secLng].and+lng[secLng].date+( (html=="1") ? "<br>\n" : "\n");	
 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
				}

				else if (valObj.len != 10){
					hihh++;
					errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].date+( (html=="1") ? "<br>\n" : "\n");	
 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
				}
				else {
					var elems = valObj.val.split("/");
    				result = (elems.length == 3);
    				if (result){
    					var day = elems[0];
						var month = elems[1];
	   					var year = elems[2];
						if (elems[0].length==2 && elems[1].length==2 && elems[2].length==4){
       						if (month < 1 || month > 12) result=null;
							if (isNaN(year)) result=null;
	       					if ((month == 4 || month == 6 || month == 9 || month == 11) && (day > 30 || day < 1)) result=null;
    	   					if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && (day > 31 || day < 1)) result=null;
       						if ((month == 2) && (day > (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 ))) result=null;
       						if (valObj.min && !valObj.max && year<valObj.min){
								hihh++;
								errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].mindate+valObj.min+( (html=="1") ? "<br>\n" : "\n");	
			 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
							}
       						if (!valObj.min && valObj.max && year>valObj.max){
								hihh++;
								errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].maxdate+valObj.max+( (html=="1") ? "<br>\n" : "\n");	
			 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
							}
       						if (valObj.min && valObj.max && (year<valObj.min || year>valObj.max)){
								hihh++;
								errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].mmdate+valObj.min+lng[secLng].and+" "+valObj.max+( (html=="1") ? "<br>\n" : "\n");	
			 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
							}
						}
						else{
							hihh++;
							errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].date+( (html=="1") ? "<br>\n" : "\n");	
		 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
						}
					}
					if (!result){
						hihh++;
						errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].nodate+( (html=="1") ? "<br>\n" : "\n");	
	 					if (!document.layers && errorbg != "") valObj.form.style.background=errorbg;
					}
				}
			}
			else if(valObj.type == "radio"){
  				var selecion=null;

				if(valObj.form.length){
					for (var ii=0;ii<valObj.form.length;ii++){
						if (valObj.form[ii].checked){
							selecion="selected";
						}
					}
				}else{
					if(valObj.form.checked) selecion="selected";
				}

				if (!selecion){
					hihh++;
					errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].option+( (html=="1") ? "<br>\n" : "\n");	
				}
			}
			else if(valObj.type == "checkbox"){
				var total = 0;
				if(valObj.form.length){
					for (var ii=0;ii<valObj.form.length;ii++){
						if (valObj.form[ii].checked){
							total++;
						}
					}
					if (valObj.min && valObj.max && (total < valObj.min || total > valObj.max)){
						hihh++;
						errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].min+valObj.min+lng[secLng].minmax+valObj.max+lng[secLng].selected+( (html=="1") ? "<br>\n" : "\n");
					}
					else if (valObj.min && !valObj.max && (total < valObj.min)){
						hihh++;
						errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].min+valObj.min+lng[secLng].selected+( (html=="1") ? "<br>\n" : "\n");
					}
					else if (valObj.max && !valObj.min &&(total > valObj.max)){
						hihh++;
						errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].max+valObj.max+lng[secLng].selected+( (html=="1") ? "<br>\n" : "\n");
					}
				}else{
					if(!valObj.form.checked){
						hihh++;
						errors+=((html=="1" && htmls != "")? htmls : lng[secLng].start)+lng[secLng].field+"'"+((html=="1" && fieldcolor) ? "<b><font color=#"+ fieldcolor+">" : "")+valObj.HTMLname+((html=="1" && fieldcolor) ? "</font></b>" : "")+"'"+lng[secLng].option+( (html=="1") ? "<br>\n" : "\n");	
					}
				}
				
			}
		}
	}

	if(errors){
		if (html=="1"){
			var errWin = window.open('','error',"\'location=no,left="+ ((screen.width-(widd ? widd : 550))/2) +",top="+ ((screen.height-(high ? high : 160+hihh*16))/2)+",width="+ (widd ? widd : 550) +",height="+ (high ? high : 200+hihh*16) +"\'");
			var msg ="<html>\n<head>\n";
			msg += "<style type=text/css>\n<!--body {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 8pt; text-decoration: none;}-->\n</style>\n";
			msg += "<title>"+ lng[secLng].title +"</title>\n</head>\n";
			msg += "<body bgcolor=#"+(bgcolor ? bgcolor : "FFFFFF") + " text=#" + (txtcolor ? txtcolor : "000000") + ">\n";
			msg += htmll;
			msg += "<br><b>" + lng[secLng].header + "</b>\n<br><br><br>\n";
			msg += errors+"<br><br>\n<center>";
			msg += (htmlo != "" ? htmlo : (document.layers)? "" :"<input type=button value='    OK    ' onclick='window.close();'><br>");
			msg += "</center>\n</body>\n</html>";
			errWin.document.open();
			errWin.document.write(msg);
			errWin.document.close();
			errWin.focus();
		}
		else{
			alert(lng[secLng].header.concat("\n\n"+errors));
		}
		errors = "";
		hihh = 0 ;
		returnVal = false;
	} else {
		returnVal = true;
	}
}


