// -----------------------------------------------------------------------------
// Generic Form Validation
//
// Copyright (C) 2000 Jacob Hage - [jacobhage@hotmail.com]
// Distributed under the terms of the GNU Library General Public License
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
// Initializing script  - setting global variables
// -----------------------------------------------------------------------------
var checkObjects		= new Array();	// Array containing the objects to validate.
var errors				= "";			// Variable holding the error message.
var returnVal			= false;		// General return value. The validated form will only be submitted if true.
var language			= new Array();	// Language independent error messages!
var selectecLanguage	= "french";		// Choose between "english", "danish", "dutch", "french", "spanish", "russian", "portuguese"
language.english		= new Array();
language.danish			= new Array();
language.dutch			= new Array();
language.french			= new Array();
language.spanish		= new Array();
language.russian		= new Array();
language.portuguese		= new Array();
language.swedish		= new Array();
language.polish			= new Array();
language.brazport		= new Array();	// Brazilian Portuguese
language.german			= new Array();

// Error messages in english:
	language.english.header		= "The following error(s) occured:";
	language.english.start		= "->";
	language.english.field		= " Field ";
	language.english.require	= " is required";
	language.english.min		= " and must consist of at least ";
	language.english.max		= " and must not contain more than ";
	language.english.minmax		= " and no more than ";
	language.english.minapres = "";
	language.english.maxapres = "";
	language.english.minmaxapres = "";
	language.english.chars		= " characters";
	language.english.num		= " and must contain a number";
	language.english.salaire_opt = " must contain a number lower than 1000000";
	language.english.email		= " must contain a valid e-mail address";
	language.english.radio		= " is not checked";
	language.english.date		= " contains an invalid data !";
	language.english.datefuture	= " contains an invalid data !";
	language.english.annee		= " contains a non-existant year !";
	
// Error messages in Danish:
	language.danish.header		= "Der opstod f\370lgende fejl:";
	language.danish.start		= "->";
	language.danish.field		= " Feltet ";
	language.danish.require		= " skal udfyldes";
	language.danish.min			= " og skal best\345 af mindst ";
	language.danish.max			= " og m\345 ikke best\345 af flere end ";
	language.danish.minmax		= " og ikke flere ";
	language.danish.minapres = "";
	language.danish.maxapres = "";
	language.danish.minmaxapres = "";
	language.danish.chars		= " tegn";
	language.danish.num			= " og m\345 kun best\345 af tal";
	language.danish.email		= " skal indeholde en korrekt e-mail addresse";
	
// Error messages in Dutch: Thanks to Benjo de Lange <webmaster@bennie-webdesign.com> for translation
	language.dutch.header		= "De volgende fout(en) zitten in het formulier:";
	language.dutch.start		= "->";
	language.dutch.field		= " Veld ";
	language.dutch.require		= " is verplicht";
	language.dutch.min			= " en moet bestaan uit minstens";
	language.dutch.max			= " en moet bestaan uit meer dan";
	language.dutch.minmax		= " en niet meer dan";
	language.dutch.minapres = "";
	language.dutch.maxapres = "";
	language.dutch.minmaxapres = "";
	language.dutch.chars		= " karakters";
	language.dutch.num			= " en moet een nummer zijn";
	language.dutch.email		= " moet een geldig e-mail adres zijn.";

// Error messages in French: Thanks to Christophe Lance <christophe@jcp-marketing-event.ch> for translation
	language.french.header		= "La ou les erreurs suivantes se sont produites: ";
	language.french.start		= "->";
	language.french.field		= " Le champ ";
	language.french.require		= " est obligatoire";
	language.french.min		= " et doit contenir au moins ";
	language.french.max		= " et ne doit pas contenir plus de ";
	language.french.minmax		= " et pas plus de ";
	language.french.minapres = "";
	language.french.maxapres = "";
	language.french.minmaxapres = "";
	language.french.chars		= " caract\350res";
	language.french.num		= " et doit contenir un nombre";
	language.french.salaire_opt	= " doit contenir un nombre inférieur à 1000000";
	language.french.email		= " doit contenir une adresse e-mail valide";
	language.french.radio		= " n'est pas coch\351";
	language.french.checkbox	= " doit avoir au moins une valeur coch\351e";
	language.french.multiselect	= " doit avoir au moins une valeur s\351lectionn\351e";
	language.french.date		= " contient une entr\351e non valide !";
	language.french.datefuture	= " contient une date trop r\351cente !";
	language.french.annee		= " contient une année non valide !";

// Error messages in Spanish: Thanks to Edu <edu@macneto.com>
	language.spanish.header		= "Se ha producido un error:";
	language.spanish.start		= "->";
	language.spanish.field		= " El campo ";
	language.spanish.require	= " es obligatorio";
	language.spanish.min		= " y debe contener al menos ";
	language.spanish.max		= " y no debe contener m\341s de ";
	language.spanish.minmax		= " y no m\341s de ";
	language.spanish.minapres = "";
	language.spanish.maxapres = "";
	language.spanish.minmaxapres = "";
	language.spanish.chars		= " caracteres";
	language.spanish.num		= " y debe contener un n\372mero";
	language.spanish.email		= " debe contener una direcci\363n de e-mail v\341lida";
	
// Error messages in russian: Thanks to: Alexander Presman <apresman@gosned.com>
	language.russian.header		= " Âîçíèêëà Îøèáêà(è):";
	language.russian.start		= "->";
	language.russian.field		= " Ïîëå ";
	language.russian.require	= " îáÿçàòåëüíî";
	language.russian.min		= " è äîëæíî ñîäåðæàòü íå ìåíåå ";
	language.russian.max		= " è íå äîëæíî ñîäåðæàòü áîëåå ";
	language.russian.minmax		= " è íå áîëåå ";
	language.russian.minapres = "";
	language.russian.maxapres = "";
	language.russian.minmaxapres = "";
	language.russian.chars		= " çíàêîâ";
	language.russian.num		= " è äîëæíî ñîäåðæàòü ÷èñëîâîå çíà÷åíèå";
	language.russian.email		= " äîëæíî ñîäåðæàòü äåéñòâèòåëüíûé e-mail àäðåñ";
	
// Error messages in portuguese: Thanks to: Marcelo Rodrigues de Camargo <marcelo@dechichi.com.br>
	language.portuguese.header	= "O(s) seguinte(s) erro(s) ocorreu(am):";
	language.portuguese.start	= "->";
	language.portuguese.field	= " Campo ";
	language.portuguese.require	= " e' necessario";
	language.portuguese.min		= " e deve conter pelo menos ";
	language.portuguese.max		= " e nao deve conter mais de ";
	language.portuguese.minmax	= " e nao mais que ";
	language.portuguese.minapres = "";
	language.portuguese.maxapres = "";
	language.portuguese.minmaxapres = "";
	language.portuguese.chars	= " caracteres";
	language.portuguese.num		= " e deve conter numero";
	language.portuguese.email	= " deve conter um e-mail valido";

// Error messages in Swedish: Thanks to Roger Edvardsson <roger.edvardsson@noed.com>
	language.swedish.header		= "F¨ljande fel uppstod:";
	language.swedish.start		= "->";
	language.swedish.field		= " F¦ltet ";
	language.swedish.require	= " m¼ste fyllas i";
	language.swedish.min		= " och skall best¼ av minst ";
	language.swedish.max		= " och skall inte best¼ av fler ¦n ";
	language.swedish.minmax		= " och inte fler ¦n ";
	language.swedish.minapres = "";
	language.swedish.maxapres = "";
	language.swedish.minmaxapres = "";
	language.swedish.chars		= " tecken";
	language.swedish.num		= " och m¼ste inneh¼lla ett nummer";
	language.swedish.email		= " m¼ste inneh¼lla en korrekt epost adress";

// Error messages in polish: Thanks to Marcin Maciukiewicz <ciukes@poczta.fm>
	language.polish.header		= "Wyst¹pi³ nastêpuj¹cy b³¹d(b³êdy):";
	language.polish.start		= "* ";
	language.polish.field		= " Pole <";
	language.polish.require		= "> jest wymagane";
	language.polish.min			= " i musi zawieraæ conajmniej ";
	language.polish.max			= " i nie mo¿e zawieraæ wiêcej ni¿ ";
	language.polish.minmax		= " i nie wiêcej ni¿ ";
	language.polish.minapres = "";
	language.polish.maxapres = "";
	language.polish.minmaxapres = "";
	language.polish.chars		= " znaki";
	language.polish.num			= " i musi zawieraæ liczbê";
	language.polish.email		= " musi zawieraæ prawid³owy adres e-mail";

// Error messages in brazilian portuguese: Thanks to Fernando D. de Castilhos <fernando.castilhos@edw3.com>
	language.brazport.header	= "O(s) seguinte(s) erro(s) ocorreu(ram):";
	language.brazport.start		= "->";
	language.brazport.field		= " O campo ";
	language.brazport.require	= " é obrigatório";
	language.brazport.min		= " e deve ser composto de no mínimo por ";
	language.brazport.max		= " e não deve conter mais de ";
	language.brazport.minmax	= " e não mais de ";
	language.brazport.minapres = "";
	language.brazport.maxapres = "";
	language.brazport.minmaxapres = "";
	language.brazport.chars		= " caracteres";
	language.brazport.num		= " e deve conter um número";
	language.brazport.email		= " deve conter um endereço de e-mail válido";

// Error messages in German
	language.german.header		= "Folgende Fehler sind aufgetreten: ";
	language.german.start		= "->";
	language.german.field		= " Das Feld ";
	language.german.require		= " ist obligatorisch";
	language.german.min		= " und muss mindestens ";
	language.german.max		= " und soll nicht mehr als ";
	language.german.minmax		= " und nicht mehr als ";
	language.german.minapres = " enthalten";
	language.german.maxapres = " enthalten";
	language.german.minmaxapres = " enthalten";
	language.german.chars		= " Buchstaben";
	language.german.num		= " und muss eine Anzahl enthalten";
	language.german.salaire_opt	= " muss eine Anzahl unter 1000000 enthalten";
	language.german.email		= " muss eine gültige E-Mail Adresse enthalten";
	language.german.radio		= " ist nicht angekreuzt";
	language.german.date		= " enthält eine nicht gültige Eintragung";
	language.german.datefuture	= " enthält ein zu neues Datum";
	language.german.annee		= " enthält ein nicht gültiges Jahr";
	
	
// Le calendrier
var calendrier = new Array();
calendrier.m01 = new Array();
calendrier.m02 = new Array();
calendrier.m03 = new Array();
calendrier.m04 = new Array();
calendrier.m05 = new Array();
calendrier.m06 = new Array();
calendrier.m07 = new Array();
calendrier.m08 = new Array();
calendrier.m09 = new Array();
calendrier.m10 = new Array();
calendrier.m11 = new Array();
calendrier.m12 = new Array();
calendrier.m01.jours = 31;
calendrier.m02.jours = 28;
calendrier.m03.jours = 31;
calendrier.m04.jours = 30;
calendrier.m05.jours = 31;
calendrier.m06.jours = 30;
calendrier.m07.jours = 31;
calendrier.m08.jours = 31;
calendrier.m09.jours = 30;
calendrier.m10.jours = 31;
calendrier.m11.jours = 30;
calendrier.m12.jours = 31;


// -----------------------------------------------------------------------------
// define - Call this function in the beginning of the page. I.e. onLoad.
//
// n = name of the input field (Required)
// type= string, num, email (Required)
// min = the value must have at least [min] characters (Optional)
// max = the value must have maximum [max] characters (Optional)
// d = (Optional)
// -----------------------------------------------------------------------------
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);
	}
//	var realn = n.replace('__', '.').replace('__', '.'); // alert(realn);
	var realn = n.replace(/__/g, '.');
	if ( !(x = d[realn]) && d.all ) x = d.all[realn];
	
  	for (i = 0; !x && i < d.forms.length; i++) {
		x = d.forms[i][realn];
  	}
	for (i = 0; !x && d.layers && i < d.layers.length; i++) {
		x = define(n, type, HTMLname, min, max, d.layers[i].document);
		return x;		
	}
	
	// Create Object. The name will be "V_something" where something is the "n" parameter above.
	eval("V_"+n+" = new formResult(x,type,HTMLname,min,max);");
	checkObjects[eval(checkObjects.length)] = eval("V_"+n); // alert("V_"+n);
}

// -----------------------------------------------------------------------------
// formResult - Used internally to create the objects
// -----------------------------------------------------------------------------
function formResult (form,type,HTMLname,min,max) {
	this.form = form;
	this.type = type;
	this.HTMLname = HTMLname;
	this.min  = min;
	this.max  = max;
}

// -----------------------------------------------------------------------------
// validate - Call this function onSubmit and return the "returnVal". (onSubmit="validate();return returnVal;")
// -----------------------------------------------------------------------------
function validate () {
	if ( checkObjects.length > 0 ) {
		errorObject = "";
		// for (i = 0; i < checkObjects.length; i++) alert(checkObjects[i].HTMLname);
		for (i = 0; i < checkObjects.length; i++) {
			validateObject			= new Object();
			validateObject.type		= checkObjects[i].type;
			validateObject.form		= checkObjects[i].form;
			validateObject.HTMLname		= checkObjects[i].HTMLname;
			if ( validateObject.type == "radio" ) {
				var vide = true;
				for (j = 0; j < validateObject.form.length; j++) {
					if ( validateObject.form[j].checked ) { vide = false; break; }
				}
				if ( vide ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].radio+"\n";}
			} else
			if ( validateObject.type == "checkbox" ) {
				var vide = true;
				for (j = 0; j < validateObject.form.length; j++) {
					if ( validateObject.form[j].checked ) { vide = false; break; }
				}
				if ( vide ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].checkbox+"\n";}
			} else
			if ( validateObject.type == "multiselect" ) {
				var vide = true;
				for (j = 0; j < validateObject.form.length; j++) {
					if ( validateObject.form[j].value != '' && validateObject.form[j].selected ) { vide = false; break; }
				}
				if ( vide ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].multiselect+"\n";}
			} else {
				validateObject.val 		= checkObjects[i].form.value;
				validateObject.len 		= checkObjects[i].form.value.length;
				validateObject.min 		= checkObjects[i].min;
				validateObject.max 		= checkObjects[i].max;

				//Debug alert line
				//alert("validateObject: "+validateObject+"\nvalidateObject.val: "+validateObject.val+"\nvalidateObject.len: "+validateObject.len+"\nvalidateObject.min,validateObject.max: "+validateObject.min+","+validateObject.max+"\nvalidateObject.type: "+validateObject.type);

				// Checking input. If "min" and/or "max" is defined the input has to be within the specific range
				if ( validateObject.type == "num" || validateObject.type == "string" || validateObject.type == "file" ){
					if ((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val))){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].num+"\n";
					} else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].minmax+validateObject.max+language[selectecLanguage].chars+language[selectecLanguage].minmaxapres+"\n";
					} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].chars+language[selectecLanguage].minapres+"\n";
					} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].max+validateObject.max+language[selectecLanguage].chars+language[selectecLanguage].maxapres+"\n";
					} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";
					}
				} else if (validateObject.type == "email") {
					// Checking existense of "@" and ".". The length of the input must be at least 5 characters. The "." must neither be preceding the "@" nor follow it.
					if ((validateObject.val.indexOf("@") == -1) || (validateObject.val.charAt(0) == ".") || (validateObject.val.charAt(0) == "@") ||(validateObject.len < 6) || (validateObject.val.indexOf(".") == -1) || (validateObject.val.charAt(validateObject.val.indexOf("@")+1) == ".") || (validateObject.val.charAt(validateObject.val.indexOf("@")-1) == ".")){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].email+"\n";
					}
				} else if (validateObject.type == "date"){
					var aujourdhui = new Date();
					var l = validateObject.len - 8;
					if ( validateObject.len > 0 ) {
						if ( validateObject.len < 9 || validateObject.len > 10 ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].date+"\n";
						} else if ( validateObject.val.charAt(l) != "/" || validateObject.val.charAt(l+3) != "/" || isNaN(validateObject.val.substring(0,l)) || isNaN(validateObject.val.substring(l+1,l+3)) || isNaN(validateObject.val.substring(l+4)) || parseInt(validateObject.val.substring(l+1,l+3)) > 12 || parseInt(validateObject.val.substring(0,l)) > calendrier['m'+validateObject.val.substring(l+1,l+3)].jours ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].date+"\n";
						}
					}
					else {errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";
					}
				} else if (validateObject.type == "datenaissance"){
					var aujourdhui = new Date();
					var l = validateObject.len - 8;
					if ( validateObject.len > 0 ) {
						if ( validateObject.len < 9 || validateObject.len > 10 ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].date+"\n";
						} else if ( validateObject.val.charAt(l) != "/" || validateObject.val.charAt(l+3) != "/" || isNaN(validateObject.val.substring(0,l)) || isNaN(validateObject.val.substring(l+1,l+3)) || isNaN(validateObject.val.substring(l+4)) || parseInt(validateObject.val.substring(l+1,l+3)) > 12 || parseInt(validateObject.val.substring(0,l)) > calendrier['m'+validateObject.val.substring(l+1,l+3)].jours ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].date+"\n";
						} else if ( parseInt(validateObject.val.substring(0,l)) >= aujourdhui.getDay() && parseInt(validateObject.val.substring(l+1,l+3)) > aujourdhui.getMonth() && parseInt(validateObject.val.substring(l+4)) >= aujourdhui.getFullYear() ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].datefuture+"\n";
						}
					}
				} else if ( validateObject.type == "salaire_opt" ) {
					if ( isNaN(validateObject.val) || (validateObject.val.indexOf(".") == -1 && validateObject.len > 6) || (validateObject.val.indexOf(".") != -1 && validateObject.val.substring(0,validateObject.val.indexOf(".")).length > 6) ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].salaire_opt+"\n";
					}
				} else if ( validateObject.type == "annee_req" ) {
					if ( validateObject.len <= 0 ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";
					} else if ( isNaN(validateObject.val) || validateObject.len != 4 ) { errors += language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].annee+"\n";
					}
				}
			}
		}
	}
	// Used to set the state of the returnVal. If errors -> show error messages in chosen language
	if ( errors ) {
		alert(language[selectecLanguage].header.concat("\n"+errors));
		errors = "";
		returnVal = false;
	} else {
		returnVal = true;
	}
}
