﻿// -----------------------------------------------------------------------------
// 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	= "russian";	// Choose between "english","danish","dutch","french","spanish","russian","portuguese","italian", "japanese"
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.italian		= new Array();
language.japanese		= 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.chars	= " characters";
	language.english.num		= " and must contain a number";
	language.english.email	= " must contain a valid e-mail address";
	
// 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 " // English: " and no more than ";
	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: 
	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.chars		= " karakters";
	language.dutch.num			= " en moet een nummer zijn";
	language.dutch.email		= " moet een geldig e-mail adres zijn.";

// Error messages in French: 
	language.french.header	= "L'erreur suivante s'est produite: "
	language.french.start		= "->";
	language.french.field		= " Le champs ";
	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.chars		= " caract\350res";
	language.french.num			= " et doit contenir un nombre ";
	language.french.email		= " doit contenir une adresse e-mail valide";

// Error messages in Spanish: 
	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.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: 
	language.russian.header		= " обнаружены следующие ошибки:"
	language.russian.start		= "->";
	language.russian.field		= " поле ";
	language.russian.require	= " необходимо";
	language.russian.min		  = " должно состоять не менее чем из ";
	language.russian.max	  	= " не должно содержать более чем ";
	language.russian.minmax		= " не более чем ";
	language.russian.chars		= " характеры";
	language.russian.num  		= " и должно содержать число";
	language.russian.email		= " должно содержать действующий адрес e-mail";
	
// Error messages in portuguese: 
	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.chars	= " caracteres";
	language.portuguese.num		= " e deve conter numero";
	language.portuguese.email	= " deve conter um e-mail valido";

// Error messages in Swedish: 
	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.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: 
	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.chars		= " znaki";
	language.polish.num			= " i musi zawieraæ liczbê";
	language.polish.email		= " musi zawieraæ prawid³owy adres e-mail";

// Error messages in brazilian portuguese: 
	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.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 italian:
	language.italian.header		= "Si sono verificati i seguenti errori:"
	language.italian.start		= "->";
	language.italian.field		= " Il campo ";
	language.italian.require	= " è necessario";
	language.italian.min		  = " e deve essere composto almeno da ";
	language.italian.max		  = " e non deve contenere più di ";
	language.italian.minmax		= " e non più di ";
	language.italian.chars		= " caratteri";
	language.italian.num		  = " e deve contenere un numero";
	language.italian.email		= " deve contenere un indirizzo e-mail valido";

// Error messages in Japanese:
	language.japanese.header	= "次のエラーが発生:";
	language.japanese.start		= "->";
	language.japanese.field		= " 分野、領域";
	language.japanese.require	= " 必要";
	language.japanese.min			= " ～から構成されるべき ";
	language.japanese.max			= " これ以上含まないでください ";
	language.japanese.minmax	= " これ以上ではありません ";
	language.japanese.chars		= " 文字、書体";
	language.japanese.num			= " 数字を含んでください";
	language.japanese.email		= " 有効なメールアドレスを記入";

// -----------------------------------------------------------------------------
// 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);
    }
	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;		
	}
	
	// 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);
}

// -----------------------------------------------------------------------------
// 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++){
			validateObject 			= new Object();
			validateObject.form 	= checkObjects[i].form;
			validateObject.HTMLname = checkObjects[i].HTMLname;
			validateObject.val 		= checkObjects[i].form.value;
			validateObject.len 		= checkObjects[i].form.value.length;
			validateObject.min 		= checkObjects[i].min;
			validateObject.max 		= checkObjects[i].max;
			validateObject.type 	= checkObjects[i].type;
			//if(checkObjects[i].checked!=undefined){
				if(checkObjects[i].form.type=="checkbox"){
					validateObject.val = (checkObjects[i].form.checked)?true:false;
				} else if(checkObjects[i].form.type=="select-one"){
					validateObject.val = checkObjects[i].form.options[checkObjects[i].form.options.selectedIndex].value;
				}
			//}
			
			//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"){
				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+"\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+"\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+"\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 == "chk"){
				if(validateObject.val!=true){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";}
			} else if(validateObject.type == "select"){
				if(validateObject.val=="+"){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\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;
	}
}

